diff --git a/app-ios/tutanotaTests/CompatibilityTestData.json b/app-ios/tutanotaTests/CompatibilityTestData.json index eb65d02bcc5f..bdd7b2637b17 100644 --- a/app-ios/tutanotaTests/CompatibilityTestData.json +++ b/app-ios/tutanotaTests/CompatibilityTestData.json @@ -1,3942 +1,3973 @@ { - "___NOTE": "NEVER edit this file manually. It is mainted as part of tutadb (search for TestData).", - "rsaEncryptionTests": [ + "___NOTE" : "NEVER edit this file manually. It is mainted as part of tutadb (search for TestData).", + "rsaEncryptionTests" : [ { - "publicKey": "02008bb1bbcb2c6915c182b0c7cc93e1d8210181ffee4be4ae81f7a98fdba2d6e37cea72e2124ebb6b05d330ab1ddfbc6d85c9d1c90fc3b65bd9634c3b722fe77ab98f33cc28af975d51609e1c308324501d615cbb82836c33c2a240e00826ddf09460cee7a975c0607579d4f7b707e19287a1c754ba485e04aab664e44cae8fcab770b9bb5c95a271786aa79d6fa11dd21bdb3a08b679bd5f29fc95ab573a3dabcbd8e70aaec0cc2a817eefbc886d3eafea96abd0d5e364b83ccf74f4d18b3546b014fa24b90134179ed952209971211c623a2743da0c3236abd512499920a75651482b43b27c18d477e8735935425933d8f09a12fbf1950cf8a381ef5f2400fcf9", - "privateKey": "02008bb1bbcb2c6915c182b0c7cc93e1d8210181ffee4be4ae81f7a98fdba2d6e37cea72e2124ebb6b05d330ab1ddfbc6d85c9d1c90fc3b65bd9634c3b722fe77ab98f33cc28af975d51609e1c308324501d615cbb82836c33c2a240e00826ddf09460cee7a975c0607579d4f7b707e19287a1c754ba485e04aab664e44cae8fcab770b9bb5c95a271786aa79d6fa11dd21bdb3a08b679bd5f29fc95ab573a3dabcbd8e70aaec0cc2a817eefbc886d3eafea96abd0d5e364b83ccf74f4d18b3546b014fa24b90134179ed952209971211c623a2743da0c3236abd512499920a75651482b43b27c18d477e8735935425933d8f09a12fbf1950cf8a381ef5f2400fcf90200816022249104e1f94e289b6284b36d8f63ee1a31806852965be0d632fc25389ac02795e88eb254f4181bc2def00f7affa5627d6bf43e37e2a56c3cc20c4bbe058cf2d3e9fa759d1f78f3f5f797fd5195644e95fad1ecac235e51e72aa59476f374952b486e9db4b818157d362e3e638ee9edca329c4336df43fd3cd327f8542d1add9798af1d6a9e8cf8f54dd0b6a6f9ed9c3f5d803c220716757871e1442ef407ffe5df44c364bf57a60551b681173747b8df8e4138101f1d048cc1941a5d4c1fd3eda5bc96496eb1892477d811b845a7c9b3333e700989a1134e8f65edbf3a8332baa7195eb6aa33591b6ab41ec8215c6487979df5cf1b9736fd4fea73eee102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7a2e7a5cc651614fd17eb10765ef63462e5767745fc849e97095319d42f8cbb1485aba0f590b33208e666e949db0465e483a122467f771a986da6855abb148d0b5c1eefb08636d0aeb36b8ec161497cc9a64704f0976aceb33d09af5408ded1aec771b534f9a27fd9dc3303146ce98872915ed730ed9661eec46b8c0d6b6d37020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a632cb2e0a17ee6e363e3e056e5170480a3790023e342cb221431be37d63e692ce572390a379cf470c8a9fa4251a0af84d746b79ff91f6dcf168417137150d93049098ef747a601825982cbbd1ac1c20b3f3ee97b25e1739c31b43e78fc1cd53134dc4e82ebf98c720c34852fbd2288370421b848575f4d054e1d1e66b47f4f02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b09e8b48e56fd2859072135f4b129f62546228914b80fed239d1f756436f3a3c4faa98b2336bf0e6ded86771cc49beb1beab0b4b2a3bf8e20385e029e083b368d4579a9322a343da9ccadbe14edc527f5ef6754273fcd088e92c4a5d30934eeaccfcf05bbe17f66acc0055b92c72db229a50f3e2db40dda0b0c17e4b9cd3e3c30200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088861ee6e7e1a7f8c1287a40ce56b3ae159b79caf7f166057fd35fd1984aead1d313eb982942d897088d4a52b606bd13b9632d7400112b0bcdcf596b9693e42ccb982acdb43a35c0abe63fd5af1a54312604fdbb365d5f2afefaad2b798d6869d6a3aa15fb8c75170f5b5fae4f72ef7089462c136c55673f12ebeab0119e97dd02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d8538fe6ebe9514412692fc985f8fd62b237c51c160c3d49aeeafffa057f2feff8f29040a205895b61dfa3f6188851021dc9e50152f3ea69746f5eb491af4a6dde21db9fa2c6fa61198ea02d6b600ed4267c3871af686c8db12e4bcbaaaa552e157e66fda90d34fce11cfd0f5eea6fbb236818070fb3a13751ad408e4231f499", - "input": "35033b9b8bfb61b0b47113dff31c9eb8", - "seed": "23ad314acf7463a4a095603fda57a4efd05eba38fd628867c60d9aa82048f5b1", - "result": "1b6abd958e40f9ad0315ff46495e66ee63fcc39effcd88f9839faf4a2d28e21d3b75e9c998a8d53ebf3f99ccc774e35ad5e88feb3fe5b324ff0c5e146bfa157e9ca445b8695b1fb5a613e04eed4e7be6d560a2e2030bdd55750af10ae27e3013f7de01041333b70dfe499acb6b776314b4e59591249b41c2d4e1c8dec6a47e92eb5504089f06d8d0d8b7006f3cc2e7f6edcffb14a921b593e2119531328cacae8ca051bd49f8671a91e968dd6b83bfba10f991fc3e83ce1bef1fc2f3e4f03dd16210f40fb3a5776ba938f783036bcdad1b820ff1f87412549e5e17bf4a489bbeee14ee5d9604076e6a6155aa222588e00dccbeea2a2d28273996621b378c9cff" + "publicKey" : "02008bb1bbcb2c6915c182b0c7cc93e1d8210181ffee4be4ae81f7a98fdba2d6e37cea72e2124ebb6b05d330ab1ddfbc6d85c9d1c90fc3b65bd9634c3b722fe77ab98f33cc28af975d51609e1c308324501d615cbb82836c33c2a240e00826ddf09460cee7a975c0607579d4f7b707e19287a1c754ba485e04aab664e44cae8fcab770b9bb5c95a271786aa79d6fa11dd21bdb3a08b679bd5f29fc95ab573a3dabcbd8e70aaec0cc2a817eefbc886d3eafea96abd0d5e364b83ccf74f4d18b3546b014fa24b90134179ed952209971211c623a2743da0c3236abd512499920a75651482b43b27c18d477e8735935425933d8f09a12fbf1950cf8a381ef5f2400fcf9", + "privateKey" : "02008bb1bbcb2c6915c182b0c7cc93e1d8210181ffee4be4ae81f7a98fdba2d6e37cea72e2124ebb6b05d330ab1ddfbc6d85c9d1c90fc3b65bd9634c3b722fe77ab98f33cc28af975d51609e1c308324501d615cbb82836c33c2a240e00826ddf09460cee7a975c0607579d4f7b707e19287a1c754ba485e04aab664e44cae8fcab770b9bb5c95a271786aa79d6fa11dd21bdb3a08b679bd5f29fc95ab573a3dabcbd8e70aaec0cc2a817eefbc886d3eafea96abd0d5e364b83ccf74f4d18b3546b014fa24b90134179ed952209971211c623a2743da0c3236abd512499920a75651482b43b27c18d477e8735935425933d8f09a12fbf1950cf8a381ef5f2400fcf90200816022249104e1f94e289b6284b36d8f63ee1a31806852965be0d632fc25389ac02795e88eb254f4181bc2def00f7affa5627d6bf43e37e2a56c3cc20c4bbe058cf2d3e9fa759d1f78f3f5f797fd5195644e95fad1ecac235e51e72aa59476f374952b486e9db4b818157d362e3e638ee9edca329c4336df43fd3cd327f8542d1add9798af1d6a9e8cf8f54dd0b6a6f9ed9c3f5d803c220716757871e1442ef407ffe5df44c364bf57a60551b681173747b8df8e4138101f1d048cc1941a5d4c1fd3eda5bc96496eb1892477d811b845a7c9b3333e700989a1134e8f65edbf3a8332baa7195eb6aa33591b6ab41ec8215c6487979df5cf1b9736fd4fea73eee102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7a2e7a5cc651614fd17eb10765ef63462e5767745fc849e97095319d42f8cbb1485aba0f590b33208e666e949db0465e483a122467f771a986da6855abb148d0b5c1eefb08636d0aeb36b8ec161497cc9a64704f0976aceb33d09af5408ded1aec771b534f9a27fd9dc3303146ce98872915ed730ed9661eec46b8c0d6b6d37020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a632cb2e0a17ee6e363e3e056e5170480a3790023e342cb221431be37d63e692ce572390a379cf470c8a9fa4251a0af84d746b79ff91f6dcf168417137150d93049098ef747a601825982cbbd1ac1c20b3f3ee97b25e1739c31b43e78fc1cd53134dc4e82ebf98c720c34852fbd2288370421b848575f4d054e1d1e66b47f4f02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b09e8b48e56fd2859072135f4b129f62546228914b80fed239d1f756436f3a3c4faa98b2336bf0e6ded86771cc49beb1beab0b4b2a3bf8e20385e029e083b368d4579a9322a343da9ccadbe14edc527f5ef6754273fcd088e92c4a5d30934eeaccfcf05bbe17f66acc0055b92c72db229a50f3e2db40dda0b0c17e4b9cd3e3c30200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088861ee6e7e1a7f8c1287a40ce56b3ae159b79caf7f166057fd35fd1984aead1d313eb982942d897088d4a52b606bd13b9632d7400112b0bcdcf596b9693e42ccb982acdb43a35c0abe63fd5af1a54312604fdbb365d5f2afefaad2b798d6869d6a3aa15fb8c75170f5b5fae4f72ef7089462c136c55673f12ebeab0119e97dd02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d8538fe6ebe9514412692fc985f8fd62b237c51c160c3d49aeeafffa057f2feff8f29040a205895b61dfa3f6188851021dc9e50152f3ea69746f5eb491af4a6dde21db9fa2c6fa61198ea02d6b600ed4267c3871af686c8db12e4bcbaaaa552e157e66fda90d34fce11cfd0f5eea6fbb236818070fb3a13751ad408e4231f499", + "input" : "35033b9b8bfb61b0b47113dff31c9eb8", + "seed" : "23ad314acf7463a4a095603fda57a4efd05eba38fd628867c60d9aa82048f5b1", + "result" : "1b6abd958e40f9ad0315ff46495e66ee63fcc39effcd88f9839faf4a2d28e21d3b75e9c998a8d53ebf3f99ccc774e35ad5e88feb3fe5b324ff0c5e146bfa157e9ca445b8695b1fb5a613e04eed4e7be6d560a2e2030bdd55750af10ae27e3013f7de01041333b70dfe499acb6b776314b4e59591249b41c2d4e1c8dec6a47e92eb5504089f06d8d0d8b7006f3cc2e7f6edcffb14a921b593e2119531328cacae8ca051bd49f8671a91e968dd6b83bfba10f991fc3e83ce1bef1fc2f3e4f03dd16210f40fb3a5776ba938f783036bcdad1b820ff1f87412549e5e17bf4a489bbeee14ee5d9604076e6a6155aa222588e00dccbeea2a2d28273996621b378c9cff" }, { - "publicKey": "02008bb1bbcb2c6915c182b0c7cc93e1d8210181ffee4be4ae81f7a98fdba2d6e37cea72e2124ebb6b05d330ab1ddfbc6d85c9d1c90fc3b65bd9634c3b722fe77ab98f33cc28af975d51609e1c308324501d615cbb82836c33c2a240e00826ddf09460cee7a975c0607579d4f7b707e19287a1c754ba485e04aab664e44cae8fcab770b9bb5c95a271786aa79d6fa11dd21bdb3a08b679bd5f29fc95ab573a3dabcbd8e70aaec0cc2a817eefbc886d3eafea96abd0d5e364b83ccf74f4d18b3546b014fa24b90134179ed952209971211c623a2743da0c3236abd512499920a75651482b43b27c18d477e8735935425933d8f09a12fbf1950cf8a381ef5f2400fcf9", - "privateKey": "02008bb1bbcb2c6915c182b0c7cc93e1d8210181ffee4be4ae81f7a98fdba2d6e37cea72e2124ebb6b05d330ab1ddfbc6d85c9d1c90fc3b65bd9634c3b722fe77ab98f33cc28af975d51609e1c308324501d615cbb82836c33c2a240e00826ddf09460cee7a975c0607579d4f7b707e19287a1c754ba485e04aab664e44cae8fcab770b9bb5c95a271786aa79d6fa11dd21bdb3a08b679bd5f29fc95ab573a3dabcbd8e70aaec0cc2a817eefbc886d3eafea96abd0d5e364b83ccf74f4d18b3546b014fa24b90134179ed952209971211c623a2743da0c3236abd512499920a75651482b43b27c18d477e8735935425933d8f09a12fbf1950cf8a381ef5f2400fcf90200816022249104e1f94e289b6284b36d8f63ee1a31806852965be0d632fc25389ac02795e88eb254f4181bc2def00f7affa5627d6bf43e37e2a56c3cc20c4bbe058cf2d3e9fa759d1f78f3f5f797fd5195644e95fad1ecac235e51e72aa59476f374952b486e9db4b818157d362e3e638ee9edca329c4336df43fd3cd327f8542d1add9798af1d6a9e8cf8f54dd0b6a6f9ed9c3f5d803c220716757871e1442ef407ffe5df44c364bf57a60551b681173747b8df8e4138101f1d048cc1941a5d4c1fd3eda5bc96496eb1892477d811b845a7c9b3333e700989a1134e8f65edbf3a8332baa7195eb6aa33591b6ab41ec8215c6487979df5cf1b9736fd4fea73eee102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7a2e7a5cc651614fd17eb10765ef63462e5767745fc849e97095319d42f8cbb1485aba0f590b33208e666e949db0465e483a122467f771a986da6855abb148d0b5c1eefb08636d0aeb36b8ec161497cc9a64704f0976aceb33d09af5408ded1aec771b534f9a27fd9dc3303146ce98872915ed730ed9661eec46b8c0d6b6d37020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a632cb2e0a17ee6e363e3e056e5170480a3790023e342cb221431be37d63e692ce572390a379cf470c8a9fa4251a0af84d746b79ff91f6dcf168417137150d93049098ef747a601825982cbbd1ac1c20b3f3ee97b25e1739c31b43e78fc1cd53134dc4e82ebf98c720c34852fbd2288370421b848575f4d054e1d1e66b47f4f02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b09e8b48e56fd2859072135f4b129f62546228914b80fed239d1f756436f3a3c4faa98b2336bf0e6ded86771cc49beb1beab0b4b2a3bf8e20385e029e083b368d4579a9322a343da9ccadbe14edc527f5ef6754273fcd088e92c4a5d30934eeaccfcf05bbe17f66acc0055b92c72db229a50f3e2db40dda0b0c17e4b9cd3e3c30200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088861ee6e7e1a7f8c1287a40ce56b3ae159b79caf7f166057fd35fd1984aead1d313eb982942d897088d4a52b606bd13b9632d7400112b0bcdcf596b9693e42ccb982acdb43a35c0abe63fd5af1a54312604fdbb365d5f2afefaad2b798d6869d6a3aa15fb8c75170f5b5fae4f72ef7089462c136c55673f12ebeab0119e97dd02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d8538fe6ebe9514412692fc985f8fd62b237c51c160c3d49aeeafffa057f2feff8f29040a205895b61dfa3f6188851021dc9e50152f3ea69746f5eb491af4a6dde21db9fa2c6fa61198ea02d6b600ed4267c3871af686c8db12e4bcbaaaa552e157e66fda90d34fce11cfd0f5eea6fbb236818070fb3a13751ad408e4231f499", - "input": "f39d46f0cf129d30c60783a0ca5221d9c6bc5ac5f5de780c141582a691ee7fd1", - "seed": "23ad314acf7463a4a095603fda57a4efd05eba38fd628867c60d9aa82048f5b1", - "result": "1eaa7e3547aa3fc204c29b36ce4f184475278f922a1c4eca7e43229ce2e63431eca23f5dbcfdb974c05d23953c5b8a81f42583529cd40ca2818843f20cffa053f8dedb1f45ff30fa0f4d1e49e1778d8a8625d822c1a3b8952dc7a4902f433dc015518d18fcf42c2730692be30e145c279c79cc9fa1f63a1304e639d59c63ce1bdced8543dcccc8f8a27f533379d0c0beb850425379c93a09bd0eb11ed6f4af900ca9277402d3f5e8e51a74747dc392d17fdf26f44d91e03c0ff5e6d23d97c756dac7685c1e1a74b123141c744b17c1a8e486182ed022f2e94607d6d6428fde4bc09d5d204271d6268cb0e1c45ced70497dd8f24bebe25a946886bd57ddeb9f45" + "publicKey" : "02008bb1bbcb2c6915c182b0c7cc93e1d8210181ffee4be4ae81f7a98fdba2d6e37cea72e2124ebb6b05d330ab1ddfbc6d85c9d1c90fc3b65bd9634c3b722fe77ab98f33cc28af975d51609e1c308324501d615cbb82836c33c2a240e00826ddf09460cee7a975c0607579d4f7b707e19287a1c754ba485e04aab664e44cae8fcab770b9bb5c95a271786aa79d6fa11dd21bdb3a08b679bd5f29fc95ab573a3dabcbd8e70aaec0cc2a817eefbc886d3eafea96abd0d5e364b83ccf74f4d18b3546b014fa24b90134179ed952209971211c623a2743da0c3236abd512499920a75651482b43b27c18d477e8735935425933d8f09a12fbf1950cf8a381ef5f2400fcf9", + "privateKey" : "02008bb1bbcb2c6915c182b0c7cc93e1d8210181ffee4be4ae81f7a98fdba2d6e37cea72e2124ebb6b05d330ab1ddfbc6d85c9d1c90fc3b65bd9634c3b722fe77ab98f33cc28af975d51609e1c308324501d615cbb82836c33c2a240e00826ddf09460cee7a975c0607579d4f7b707e19287a1c754ba485e04aab664e44cae8fcab770b9bb5c95a271786aa79d6fa11dd21bdb3a08b679bd5f29fc95ab573a3dabcbd8e70aaec0cc2a817eefbc886d3eafea96abd0d5e364b83ccf74f4d18b3546b014fa24b90134179ed952209971211c623a2743da0c3236abd512499920a75651482b43b27c18d477e8735935425933d8f09a12fbf1950cf8a381ef5f2400fcf90200816022249104e1f94e289b6284b36d8f63ee1a31806852965be0d632fc25389ac02795e88eb254f4181bc2def00f7affa5627d6bf43e37e2a56c3cc20c4bbe058cf2d3e9fa759d1f78f3f5f797fd5195644e95fad1ecac235e51e72aa59476f374952b486e9db4b818157d362e3e638ee9edca329c4336df43fd3cd327f8542d1add9798af1d6a9e8cf8f54dd0b6a6f9ed9c3f5d803c220716757871e1442ef407ffe5df44c364bf57a60551b681173747b8df8e4138101f1d048cc1941a5d4c1fd3eda5bc96496eb1892477d811b845a7c9b3333e700989a1134e8f65edbf3a8332baa7195eb6aa33591b6ab41ec8215c6487979df5cf1b9736fd4fea73eee102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7a2e7a5cc651614fd17eb10765ef63462e5767745fc849e97095319d42f8cbb1485aba0f590b33208e666e949db0465e483a122467f771a986da6855abb148d0b5c1eefb08636d0aeb36b8ec161497cc9a64704f0976aceb33d09af5408ded1aec771b534f9a27fd9dc3303146ce98872915ed730ed9661eec46b8c0d6b6d37020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a632cb2e0a17ee6e363e3e056e5170480a3790023e342cb221431be37d63e692ce572390a379cf470c8a9fa4251a0af84d746b79ff91f6dcf168417137150d93049098ef747a601825982cbbd1ac1c20b3f3ee97b25e1739c31b43e78fc1cd53134dc4e82ebf98c720c34852fbd2288370421b848575f4d054e1d1e66b47f4f02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b09e8b48e56fd2859072135f4b129f62546228914b80fed239d1f756436f3a3c4faa98b2336bf0e6ded86771cc49beb1beab0b4b2a3bf8e20385e029e083b368d4579a9322a343da9ccadbe14edc527f5ef6754273fcd088e92c4a5d30934eeaccfcf05bbe17f66acc0055b92c72db229a50f3e2db40dda0b0c17e4b9cd3e3c30200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088861ee6e7e1a7f8c1287a40ce56b3ae159b79caf7f166057fd35fd1984aead1d313eb982942d897088d4a52b606bd13b9632d7400112b0bcdcf596b9693e42ccb982acdb43a35c0abe63fd5af1a54312604fdbb365d5f2afefaad2b798d6869d6a3aa15fb8c75170f5b5fae4f72ef7089462c136c55673f12ebeab0119e97dd02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d8538fe6ebe9514412692fc985f8fd62b237c51c160c3d49aeeafffa057f2feff8f29040a205895b61dfa3f6188851021dc9e50152f3ea69746f5eb491af4a6dde21db9fa2c6fa61198ea02d6b600ed4267c3871af686c8db12e4bcbaaaa552e157e66fda90d34fce11cfd0f5eea6fbb236818070fb3a13751ad408e4231f499", + "input" : "f39d46f0cf129d30c60783a0ca5221d9c6bc5ac5f5de780c141582a691ee7fd1", + "seed" : "23ad314acf7463a4a095603fda57a4efd05eba38fd628867c60d9aa82048f5b1", + "result" : "1eaa7e3547aa3fc204c29b36ce4f184475278f922a1c4eca7e43229ce2e63431eca23f5dbcfdb974c05d23953c5b8a81f42583529cd40ca2818843f20cffa053f8dedb1f45ff30fa0f4d1e49e1778d8a8625d822c1a3b8952dc7a4902f433dc015518d18fcf42c2730692be30e145c279c79cc9fa1f63a1304e639d59c63ce1bdced8543dcccc8f8a27f533379d0c0beb850425379c93a09bd0eb11ed6f4af900ca9277402d3f5e8e51a74747dc392d17fdf26f44d91e03c0ff5e6d23d97c756dac7685c1e1a74b123141c744b17c1a8e486182ed022f2e94607d6d6428fde4bc09d5d204271d6268cb0e1c45ced70497dd8f24bebe25a946886bd57ddeb9f45" } ], - "kyberEncryptionTests": [ + "kyberEncryptionTests" : [ { - "publicKey": "06001ca3c52629b5161c0ed6f100efe9650f7983652865a2e00049c7c840741238022170a89b7e4a001f014a62223e29d6693712428e415520487155078be8a78c6b92c628d667241174f7f2acc333bfe7db667063ce5d45b69afcc9f16b64d9a2ad48784b133963268a1ab2c9a8f76638de4280b3733c1752a09929203fb237a5dac0d5b37387181edcf3500755bb34f37b5cf7bb31266a7c49853276c95bb179595ca5833b25d4726b9014affafb2b074338885abdbe8c7915a12576565370c181f24b31cbb66ae4ca69c0452b9db632f0bc4179972922fb932c0364cc8763f6d7bbcf7531b7981442f583904937ab33bbd528754fc425e422b22eb66f45e16208ec49cdb0472829361e30af5dd24bccdca6cca7811bac40c0095fa128c60b202eda22435692aa67177f0e02c381f220249059e79b75aba5b04d39055b6cc9324641fef2bb978abe09ec9960b35bc8a94a1cd4445b702bca11a4336c261ed4738af0a7588c748bc1590f335757c8a4fc0a58ffe15c84691551f2c9f1202548e595c39b73d0c422557b34161813d93b4463a020db27c490aa6095f43cdab0b2d21b4bea66c09c9a5e56d2a79b8c7e958712b56996a67631514b7e97d849cc3a81b7a1bd4579930310a56b43a8654c7606d8c28acb8f2ac3b93b5857a43712f9193f65d2cf76fc422deb4ff85c6f4775a4b49cab655c3a5c5916707bc37525c43a914bbe22ae1c7b96143bab620189bcd98e52137950539526f5818a0a7a3919040e9790710b1eb5f73ed3359dfd1790491b492d38212c43a1ec30cdca66c46d98a80f957e9823084c6697219027a54b98d37811cc0a20bcac336eb85c3b3a2b31a26a28f6cabad7a13fa73887364d2993c2753a8dcfc0a769e2cb03025db349607e3c1a6f54861b79823943cbf091070fc3895d775a68441b41ea3d584c360546808cd3252a7b2baf7808930a7cf003718a30854d57450595a9f374236eb3a0d358396b972f05fc9ea9164abc3aa4e6b3a70679c4224479a5d84a4777041238278a4b657163b013667d7be35081c645e0fb4a07a20173f54dd92a6b64469f21f146530723c62503d2b331a7262b60540f50775eb5e06f1a0401e48072b3a736af250fea149a32f421cf560000fc7ed2e50bb6d096c2aa4f1fcc7680513699bcbedc59c8bfeabe05a9626b904fe9ac9cba19cd9704bf92c82380134f010322f90b78b23ca858215cb07b6bbdd434cd440af015844ef27b58297922a24d3d531de35734cbf552aed02963f1076785949301457035a5c51874a1b4ca2805cb0b07bd44f77a59a7c48e0a1dd7e69d4baa4f07472be82c58ee5b4fff093cdbbc6bfdd37aa8c5cb79dcbfda589cae8c8f6d3490386c531b98b83d008f440388418308211c6e48fc1153493d56f915e85aabd0052ed01b210a143c073cbef96192aa04a544330c87c5a344521f7d44835cba1b3ae1303fc215bcd99a20fa00395bc9edf74502981766f56e7b97398185915edb7c95dcc4859b9798d25f1eb5cfad85c698bcafe0b11744f1283c536188757c3ad505f05650320c2021667f4f978fb120635c036b4a34732f67a7017aa740ba7b7f269fa0e940c7d51bbe6b0cf7d4370dd4872831b3258b803a64cff331b6b880925fc260ba63930e3164d153285c5a45db620efad208104087653852e667af48aa5884a1660ce8519533851340c8286372b2eaaf7d5c20c2b84ae0b33acdf827960a73bdfa68c28bb2c8a6475998673f2c2c3ae4bf2740c925d556fdd259d2eab5b2204faac71109ec9e261a9825dc49c03c2b10b5a72b9ca003e02f948acc00393d51282e92c61f991a606a88438ddcb6be73b4341b1ada180dc1620390b033a5bc536e8b96ce9a89a7d5276913c19de78bd0c393a74c6c2bdbb0bd307d2ff5ad608bc0424230706915d563009f05422f595a0d51083b17253b12470f503e84058b32a290ded39d14d1136f0570fa43c174acb726293940f848186b85a2fc22d7cb103a08cbed438537a42cb495841b457c2901b179530105563288d6578ed81ec4d988a5b9b8c10898bef7bdef4300e694801fa3c8e9e90b7ae30eec349d6934668a4ba843203b86bb4745d5281870b9ee83547309268c9740e02001560409fcf4cb54c67bafb417be366d810c7854f9750020bd58d5134911f959fe588af8e73aefa60ed00a55e8acc8451f837be565e2e719", - "privateKey": "06004c04453f7506f72038b5c2a4f8f92c130a8e5bdc95f8f324a618ad66c65e8071014b62176957309aea5a921c5b09567b65c62231994da401306886126c25037f50a635360758217f7c6b1de0e65af134b88bf400ee9401c38382649a9c8790910ac679521a68a1f0958db310c9190120fa925a4c69de2b2772e10a01208e2276af79b82ddf7a8f46592ee9357be2661ca189742645aafbb507de439a3ae6c6030b872c2a96dbf38643338bc1f61ac797ac09aabcd1d6bc0830956668afc90ac3457401cf2a2cf129981cb5248a163393ea12cbd0b7ebda1aa1560cb2463111ecb9e7d88460c049d0084807e8128a361da69481063287c08a857f8c5553400c67e40724a8a2e54807c8bac508434cc6ccc70fe90ddff007f27647b3799a4aac5c8b5090d368c5bb3294cb67c3a636128d0c1e38a196bf446a12c6459cb2a5dc752394fc7f20942915f4b99758a969d356e551156292897db34be6565ce843bbe0b055b1970c06836523d6b2e447454b513e87564238d8984468482952a4154968a2f2cb5e43c1490a3b9ee91157ab6cdb64064e3cabab299a6b19614437c399589452889869ea7b5ed68eb82056b4a54789b034c8612615a2597f539348255c859b9d144bc4c9889b06579abc6b19b2968b962a08bf093ad5b7325f665ea6d58a60349d94a52149f198b20295b497173949929436a81ee46af5125db56183706aa576224947b804143658c196a1b62a6530814618743af7c02a06e03993b74bd98635ede3642a2c216688002aa90872f40395190a3c3a7efdfaa2b3b326d4806f55039cabb5166b3c8b88dbc963a90812298ae2307e134449e848c481b568a0064db2aa7c9c16cb8464acfd538e84bb494de5b99bf8b48fdb65e8c78f3797adcf1b9f72516ab391ce69306289f5af93647177573c8f1877c9601613823f97c025b35bc6bccc57d9f40f3e0113854694317b9a5a7766cd9ca6552b7be82caa3f284fb228c906164addc486b5670772906a152a580ea73fe6b6060c8627e7690232467c3c17cd430b077216089d1b630278948718c65e608f66979d90c28dad1398866732b5437b5646c6f251c63f152046305a227b5abf91a0aab1b9ef191a97cb5929c00a92495ec3b42771f958b450797a95476e9c5331b715274b894f073d671b553d699de84c361ae253aa69caa4677f63920fbfccc195fc5ae4529b353668c04c120295a937c2129ad0a0894175f004b88081a9b4a73848b13f18502f3ba5a0c78b05e7c85cf70450cf30345721701ba5cafc94885c4449987118501973ffaa6f6a73236945600027a4b7500734e03fb2d5b0fd03a3907a0ba37a65cdc6ccf44277a046c8e4f27b2bac3b576965aeb3100cb94a3c19168a666b153c1d2e74cc25e42db45079aa1c099ae397edb2235224ab1cc852a547b29d500e7a182b945b267fabb84d941a1888a627621042814a929141637873e309c04ef92c90501e0486cfe4353959072912723996609442c1a66b2045810994227aa2c263c13fba221a987a662c7d299808b29543bc678880700971b9a9412822a27b2156ca64d305a15af882d668705ca76490687ab979815ac70ecda47f394319c54487716405c2c99d4aa30ce988686bf510d16a9790b2425be12b26b2cb92aa3de6f59ebc0497b46764771a52663225c75670e551ae8a42250f396a990bc849f07a33239eb0ecc5a3ca06268bc39237a995443a45a62f4b27ca41e336ea044469a69f0a8a77f7a9bc669730f2b150c17a2ed949798c259a49e4715f906ac8c35dc5040e7c8089fc448c9e87b37a16601fc37b4c94b5cfc2ce6a12ce0a074e29449271ab9f801a5879b2c9e7c051ef42050ad08ced647f30263c85e4ca9a6cc5bcd6afd9eb32887707711c06dfc8a2e57963db2b30b1a718299186932a7d89207c7c6a030fabb738215b939358791496d7a72008c280c9867971f73823d6a72a635ab422183b04bd85602ed935085232cd7726bde1f78b6c7221a0e9cbd4e24a51c36d6c1634983a5d004a3a91fbc395c7b2c1142a2d49763fe3b4d7940ee4ba98a5b4c71ff63151975e87003a1752257c2a4b0d1b5612155abf064b1c20755c877625a8c176cbab3aeb96142658a01794db17a513b48bbcb747005602161a480b78430d6b1800206a0057312f5dc38c04a0b0190fee88c7f6f96f5f453e3bbf5a98ada10b64145600206bb0b827e28469737931032a75d8219ea09889824ef61cd69097e9f7eb9fd43306001ca3c52629b5161c0ed6f100efe9650f7983652865a2e00049c7c840741238022170a89b7e4a001f014a62223e29d6693712428e415520487155078be8a78c6b92c628d667241174f7f2acc333bfe7db667063ce5d45b69afcc9f16b64d9a2ad48784b133963268a1ab2c9a8f76638de4280b3733c1752a09929203fb237a5dac0d5b37387181edcf3500755bb34f37b5cf7bb31266a7c49853276c95bb179595ca5833b25d4726b9014affafb2b074338885abdbe8c7915a12576565370c181f24b31cbb66ae4ca69c0452b9db632f0bc4179972922fb932c0364cc8763f6d7bbcf7531b7981442f583904937ab33bbd528754fc425e422b22eb66f45e16208ec49cdb0472829361e30af5dd24bccdca6cca7811bac40c0095fa128c60b202eda22435692aa67177f0e02c381f220249059e79b75aba5b04d39055b6cc9324641fef2bb978abe09ec9960b35bc8a94a1cd4445b702bca11a4336c261ed4738af0a7588c748bc1590f335757c8a4fc0a58ffe15c84691551f2c9f1202548e595c39b73d0c422557b34161813d93b4463a020db27c490aa6095f43cdab0b2d21b4bea66c09c9a5e56d2a79b8c7e958712b56996a67631514b7e97d849cc3a81b7a1bd4579930310a56b43a8654c7606d8c28acb8f2ac3b93b5857a43712f9193f65d2cf76fc422deb4ff85c6f4775a4b49cab655c3a5c5916707bc37525c43a914bbe22ae1c7b96143bab620189bcd98e52137950539526f5818a0a7a3919040e9790710b1eb5f73ed3359dfd1790491b492d38212c43a1ec30cdca66c46d98a80f957e9823084c6697219027a54b98d37811cc0a20bcac336eb85c3b3a2b31a26a28f6cabad7a13fa73887364d2993c2753a8dcfc0a769e2cb03025db349607e3c1a6f54861b79823943cbf091070fc3895d775a68441b41ea3d584c360546808cd3252a7b2baf7808930a7cf003718a30854d57450595a9f374236eb3a0d358396b972f05fc9ea9164abc3aa4e6b3a70679c4224479a5d84a4777041238278a4b657163b013667d7be35081c645e0fb4a07a20173f54dd92a6b64469f21f146530723c62503d2b331a7262b60540f50775eb5e06f1a0401e48072b3a736af250fea149a32f421cf560000fc7ed2e50bb6d096c2aa4f1fcc7680513699bcbedc59c8bfeabe05a9626b904fe9ac9cba19cd9704bf92c82380134f010322f90b78b23ca858215cb07b6bbdd434cd440af015844ef27b58297922a24d3d531de35734cbf552aed02963f1076785949301457035a5c51874a1b4ca2805cb0b07bd44f77a59a7c48e0a1dd7e69d4baa4f07472be82c58ee5b4fff093cdbbc6bfdd37aa8c5cb79dcbfda589cae8c8f6d3490386c531b98b83d008f440388418308211c6e48fc1153493d56f915e85aabd0052ed01b210a143c073cbef96192aa04a544330c87c5a344521f7d44835cba1b3ae1303fc215bcd99a20fa00395bc9edf74502981766f56e7b97398185915edb7c95dcc4859b9798d25f1eb5cfad85c698bcafe0b11744f1283c536188757c3ad505f05650320c2021667f4f978fb120635c036b4a34732f67a7017aa740ba7b7f269fa0e940c7d51bbe6b0cf7d4370dd4872831b3258b803a64cff331b6b880925fc260ba63930e3164d153285c5a45db620efad208104087653852e667af48aa5884a1660ce8519533851340c8286372b2eaaf7d5c20c2b84ae0b33acdf827960a73bdfa68c28bb2c8a6475998673f2c2c3ae4bf2740c925d556fdd259d2eab5b2204faac71109ec9e261a9825dc49c03c2b10b5a72b9ca003e02f948acc00393d51282e92c61f991a606a88438ddcb6be73b4341b1ada180dc1620390b033a5bc536e8b96ce9a89a7d5276913c19de78bd0c393a74c6c2bdbb0bd307d2ff5ad608bc0424230706915d563009f05422f595a0d51083b17253b12470f503e84058b32a290ded39d14d1136f0570fa43c174acb726293940f848186b85a2fc22d7cb103a08cbed438537a42cb495841b457c2901b179530105563288d6578ed81ec4d988a5b9b8c10898bef7bdef4300e694801fa3c8e9e90b7ae30eec349d6934668a4ba843203b86bb4745d5281870b9ee83547309268c9740e02001560409fcf4cb54c67bafb417be366d810c7854f9750020bd58d5134911f959fe588af8e73aefa60ed00a55e8acc8451f837be565e2e719", - "seed": "6bb0b827e28469737931032a75d8219ea09889824ef61cd69097e9f7eb9fd433", - "cipherText": "52e60c800ba8a8b4f356582abf3cf650a6c63eb25d45bcbdf33f5c2247451daf76a8259722e81cf00450e304acb1be4bcbf72641593cce42f8d8291ded048d67f349c926ef47e6cf081faecc5f3cd6d0dad6a215b4229101a293d1e58f5f63b0f55177c6e0307c5b72b021daf6e71befd3281056942474a39a9c81594211c1852d5555a61259fbe58b42643a542334a53f0557ca801e860b8b379516d2870ccf07ed9bfe301cf7a13708998373284275908c2a94ffe4c38614923fc387115cdb84e8441b637122f4fdb489002bf9eac8988ccb37d1e9712bf8ec1d990f451f60bce849e00eac8b45c30c68faf4e3463e1da18a294a11b54e0d96eaecd94ec25bd1ad9737d0469231c320f80fd0b7261344736e1d8de5214a66095d84bc43401f1538949b2cb426a19b478a8eb3df56be916519846cf2f7f74e969ca0786ae80e7320f036f86c551cc6f881948aa35a239d11d7ed4615848fdfe32db707c93ca36215226b993d6a1312d97cabec44318cacc2a6539ced53bbd2e864502ae88f222a9f8a2b7335df26857c3106d0b5365b3abae80fa89c56b88c7a62439bac48335f881fbbd36dc00b2794e2f3f59dfe38e346f125aabb0189e9a7a0b00e0f0689156bd46a38bbddd3e11bc61e7b05b16ec70d38d6121a71e6353c2babebd1103c8a339903af164d1ec607e5149c034f2f78fb8aa56e49c1214c4a3590db386e1fcc9e6c6fa092023115784e61b552c9a4f37e5006fe37ad52284a2eb93ca5efbb798dac327d5367fe0345d520c4bce8f4da98f3380da554c5d3e3921dd8d1cee72c818d649bb293a7627e42b4f4da872067b06d6bceed12769eb9a0d59d4066d354e1fcbd1480ca360b0b241c61fb3688555030aa43208fe8497b74b0a737262d644e5c089f91c5d6a4aaff5c48569b790c9962d64b2c15c55c5257217d08fdf7012e743043866c285aff5d09b6fd796efa0ef9321a2f5c8baa573e41471f68f90dbb136a3ac5bf4f528012a7b1cc9dc16f62d450a08c5aec1277433c29e0195b023d2c26e960505fc10b3fa0995857cf626b9c620a9de5529bedae7922f8ba2618b26f72fffdf14b114c635407e4bbb5d11313070c8f53d766d6d76500a4368d194bd3be811da9d76301f9556e4b32ca4aba217d70f9959dc2eb2259bea3be3be8c41784ac45ea0c0f6f5b8bfbe45b318152b2395d4221ba0f73386c6404a3d4242dcb414f0530234801673f274d1700127d79cdf025d471f11df43352ff0b97e74b7320189004fe308b23c2b9f40da254274cb1c87e4ca5bbb16750f489473c1e14e77e3c02671c3b485be86b31b8ddfdf8acae61c58e25cc172d8aee7aaa16b545a72f723b1088c1747199c9e1ed787e29b43e2cb6ddcb69a90a6ef50d11082541c20be3b0f832e7dd91d461a4dcd143cb0a6b39a740844cacdd5a19d1927b9690b79d3f636e05f2e477678061eb68dcbbcd30c0f8857328d2ddfe14f37d1729fdbc08d42133c3698a450a3171ab4ae572f51e63bb38736a36f91cc8c7a417e97e6f8f27a70d7bd9f7041380f2c1e0226bf45c764a4b30892ad09047406a1555fb9e08a3d3c631c023a400a91f3a1831734a2c2a69c1f7dc3f83be15a71ac34fbb76af8ba94d1c0840466d5ca29430b40057f9a6639b8f3e5221b84892fb33760c16b1bd72a4e70a13a87ba3ac424e2c1d8ccab37cc4b473120dd15d7cfe1eaeef5c9fd0bdf0653c2ed2ab969a53586c50690b80a7e7da29e2d64cb97f94430371207d2bd936e264845509419ae8608b663c4f464dbc0c061532040d6a367a63c2f56d42179b922aead076cc3bc1e314983394ab6cd5601f2a250526f3db805dc6a6da0f11baad80cccbc07e568f8e305a8f753b5dccb0fc2b4c699a874ce28a479103b825bdcdc18b64d8e292dbb7712f50a1b74884f56f5842ac56146155719fd4e7eaff0417ef679bd1de0d678bf82d3bd6471a68bcd0ec5e0c9c682b3d6b20db1adaf48f59c10b7c4d49d9e00b4a92a82396592ad32df0bc6fd51db31f5d891fe5df89873a1f7081431340e47b1f0970884f77c4a6f58fff9ab15806c291145233fe1d934eb149297b2cce6ba5f21d0cc7a43fcbb7a63e5592faea5ab6f64ac464660b989915a10b12f1d1105bc321a36cfc6e4cdece56fe140ac23d082078a5509046385ed5cb9fe431b974308430c85807447bd6940491ad53c8b70f", - "sharedSecret": "f15fc68eeedecf8f0e720e39de35d50774c39bbc7cf4085edcadbc0d5341a603" + "publicKey" : "06001ca3c52629b5161c0ed6f100efe9650f7983652865a2e00049c7c840741238022170a89b7e4a001f014a62223e29d6693712428e415520487155078be8a78c6b92c628d667241174f7f2acc333bfe7db667063ce5d45b69afcc9f16b64d9a2ad48784b133963268a1ab2c9a8f76638de4280b3733c1752a09929203fb237a5dac0d5b37387181edcf3500755bb34f37b5cf7bb31266a7c49853276c95bb179595ca5833b25d4726b9014affafb2b074338885abdbe8c7915a12576565370c181f24b31cbb66ae4ca69c0452b9db632f0bc4179972922fb932c0364cc8763f6d7bbcf7531b7981442f583904937ab33bbd528754fc425e422b22eb66f45e16208ec49cdb0472829361e30af5dd24bccdca6cca7811bac40c0095fa128c60b202eda22435692aa67177f0e02c381f220249059e79b75aba5b04d39055b6cc9324641fef2bb978abe09ec9960b35bc8a94a1cd4445b702bca11a4336c261ed4738af0a7588c748bc1590f335757c8a4fc0a58ffe15c84691551f2c9f1202548e595c39b73d0c422557b34161813d93b4463a020db27c490aa6095f43cdab0b2d21b4bea66c09c9a5e56d2a79b8c7e958712b56996a67631514b7e97d849cc3a81b7a1bd4579930310a56b43a8654c7606d8c28acb8f2ac3b93b5857a43712f9193f65d2cf76fc422deb4ff85c6f4775a4b49cab655c3a5c5916707bc37525c43a914bbe22ae1c7b96143bab620189bcd98e52137950539526f5818a0a7a3919040e9790710b1eb5f73ed3359dfd1790491b492d38212c43a1ec30cdca66c46d98a80f957e9823084c6697219027a54b98d37811cc0a20bcac336eb85c3b3a2b31a26a28f6cabad7a13fa73887364d2993c2753a8dcfc0a769e2cb03025db349607e3c1a6f54861b79823943cbf091070fc3895d775a68441b41ea3d584c360546808cd3252a7b2baf7808930a7cf003718a30854d57450595a9f374236eb3a0d358396b972f05fc9ea9164abc3aa4e6b3a70679c4224479a5d84a4777041238278a4b657163b013667d7be35081c645e0fb4a07a20173f54dd92a6b64469f21f146530723c62503d2b331a7262b60540f50775eb5e06f1a0401e48072b3a736af250fea149a32f421cf560000fc7ed2e50bb6d096c2aa4f1fcc7680513699bcbedc59c8bfeabe05a9626b904fe9ac9cba19cd9704bf92c82380134f010322f90b78b23ca858215cb07b6bbdd434cd440af015844ef27b58297922a24d3d531de35734cbf552aed02963f1076785949301457035a5c51874a1b4ca2805cb0b07bd44f77a59a7c48e0a1dd7e69d4baa4f07472be82c58ee5b4fff093cdbbc6bfdd37aa8c5cb79dcbfda589cae8c8f6d3490386c531b98b83d008f440388418308211c6e48fc1153493d56f915e85aabd0052ed01b210a143c073cbef96192aa04a544330c87c5a344521f7d44835cba1b3ae1303fc215bcd99a20fa00395bc9edf74502981766f56e7b97398185915edb7c95dcc4859b9798d25f1eb5cfad85c698bcafe0b11744f1283c536188757c3ad505f05650320c2021667f4f978fb120635c036b4a34732f67a7017aa740ba7b7f269fa0e940c7d51bbe6b0cf7d4370dd4872831b3258b803a64cff331b6b880925fc260ba63930e3164d153285c5a45db620efad208104087653852e667af48aa5884a1660ce8519533851340c8286372b2eaaf7d5c20c2b84ae0b33acdf827960a73bdfa68c28bb2c8a6475998673f2c2c3ae4bf2740c925d556fdd259d2eab5b2204faac71109ec9e261a9825dc49c03c2b10b5a72b9ca003e02f948acc00393d51282e92c61f991a606a88438ddcb6be73b4341b1ada180dc1620390b033a5bc536e8b96ce9a89a7d5276913c19de78bd0c393a74c6c2bdbb0bd307d2ff5ad608bc0424230706915d563009f05422f595a0d51083b17253b12470f503e84058b32a290ded39d14d1136f0570fa43c174acb726293940f848186b85a2fc22d7cb103a08cbed438537a42cb495841b457c2901b179530105563288d6578ed81ec4d988a5b9b8c10898bef7bdef4300e694801fa3c8e9e90b7ae30eec349d6934668a4ba843203b86bb4745d5281870b9ee83547309268c9740e02001560409fcf4cb54c67bafb417be366d810c7854f9750020bd58d5134911f959fe588af8e73aefa60ed00a55e8acc8451f837be565e2e719", + "privateKey" : "06004c04453f7506f72038b5c2a4f8f92c130a8e5bdc95f8f324a618ad66c65e8071014b62176957309aea5a921c5b09567b65c62231994da401306886126c25037f50a635360758217f7c6b1de0e65af134b88bf400ee9401c38382649a9c8790910ac679521a68a1f0958db310c9190120fa925a4c69de2b2772e10a01208e2276af79b82ddf7a8f46592ee9357be2661ca189742645aafbb507de439a3ae6c6030b872c2a96dbf38643338bc1f61ac797ac09aabcd1d6bc0830956668afc90ac3457401cf2a2cf129981cb5248a163393ea12cbd0b7ebda1aa1560cb2463111ecb9e7d88460c049d0084807e8128a361da69481063287c08a857f8c5553400c67e40724a8a2e54807c8bac508434cc6ccc70fe90ddff007f27647b3799a4aac5c8b5090d368c5bb3294cb67c3a636128d0c1e38a196bf446a12c6459cb2a5dc752394fc7f20942915f4b99758a969d356e551156292897db34be6565ce843bbe0b055b1970c06836523d6b2e447454b513e87564238d8984468482952a4154968a2f2cb5e43c1490a3b9ee91157ab6cdb64064e3cabab299a6b19614437c399589452889869ea7b5ed68eb82056b4a54789b034c8612615a2597f539348255c859b9d144bc4c9889b06579abc6b19b2968b962a08bf093ad5b7325f665ea6d58a60349d94a52149f198b20295b497173949929436a81ee46af5125db56183706aa576224947b804143658c196a1b62a6530814618743af7c02a06e03993b74bd98635ede3642a2c216688002aa90872f40395190a3c3a7efdfaa2b3b326d4806f55039cabb5166b3c8b88dbc963a90812298ae2307e134449e848c481b568a0064db2aa7c9c16cb8464acfd538e84bb494de5b99bf8b48fdb65e8c78f3797adcf1b9f72516ab391ce69306289f5af93647177573c8f1877c9601613823f97c025b35bc6bccc57d9f40f3e0113854694317b9a5a7766cd9ca6552b7be82caa3f284fb228c906164addc486b5670772906a152a580ea73fe6b6060c8627e7690232467c3c17cd430b077216089d1b630278948718c65e608f66979d90c28dad1398866732b5437b5646c6f251c63f152046305a227b5abf91a0aab1b9ef191a97cb5929c00a92495ec3b42771f958b450797a95476e9c5331b715274b894f073d671b553d699de84c361ae253aa69caa4677f63920fbfccc195fc5ae4529b353668c04c120295a937c2129ad0a0894175f004b88081a9b4a73848b13f18502f3ba5a0c78b05e7c85cf70450cf30345721701ba5cafc94885c4449987118501973ffaa6f6a73236945600027a4b7500734e03fb2d5b0fd03a3907a0ba37a65cdc6ccf44277a046c8e4f27b2bac3b576965aeb3100cb94a3c19168a666b153c1d2e74cc25e42db45079aa1c099ae397edb2235224ab1cc852a547b29d500e7a182b945b267fabb84d941a1888a627621042814a929141637873e309c04ef92c90501e0486cfe4353959072912723996609442c1a66b2045810994227aa2c263c13fba221a987a662c7d299808b29543bc678880700971b9a9412822a27b2156ca64d305a15af882d668705ca76490687ab979815ac70ecda47f394319c54487716405c2c99d4aa30ce988686bf510d16a9790b2425be12b26b2cb92aa3de6f59ebc0497b46764771a52663225c75670e551ae8a42250f396a990bc849f07a33239eb0ecc5a3ca06268bc39237a995443a45a62f4b27ca41e336ea044469a69f0a8a77f7a9bc669730f2b150c17a2ed949798c259a49e4715f906ac8c35dc5040e7c8089fc448c9e87b37a16601fc37b4c94b5cfc2ce6a12ce0a074e29449271ab9f801a5879b2c9e7c051ef42050ad08ced647f30263c85e4ca9a6cc5bcd6afd9eb32887707711c06dfc8a2e57963db2b30b1a718299186932a7d89207c7c6a030fabb738215b939358791496d7a72008c280c9867971f73823d6a72a635ab422183b04bd85602ed935085232cd7726bde1f78b6c7221a0e9cbd4e24a51c36d6c1634983a5d004a3a91fbc395c7b2c1142a2d49763fe3b4d7940ee4ba98a5b4c71ff63151975e87003a1752257c2a4b0d1b5612155abf064b1c20755c877625a8c176cbab3aeb96142658a01794db17a513b48bbcb747005602161a480b78430d6b1800206a0057312f5dc38c04a0b0190fee88c7f6f96f5f453e3bbf5a98ada10b64145600206bb0b827e28469737931032a75d8219ea09889824ef61cd69097e9f7eb9fd43306001ca3c52629b5161c0ed6f100efe9650f7983652865a2e00049c7c840741238022170a89b7e4a001f014a62223e29d6693712428e415520487155078be8a78c6b92c628d667241174f7f2acc333bfe7db667063ce5d45b69afcc9f16b64d9a2ad48784b133963268a1ab2c9a8f76638de4280b3733c1752a09929203fb237a5dac0d5b37387181edcf3500755bb34f37b5cf7bb31266a7c49853276c95bb179595ca5833b25d4726b9014affafb2b074338885abdbe8c7915a12576565370c181f24b31cbb66ae4ca69c0452b9db632f0bc4179972922fb932c0364cc8763f6d7bbcf7531b7981442f583904937ab33bbd528754fc425e422b22eb66f45e16208ec49cdb0472829361e30af5dd24bccdca6cca7811bac40c0095fa128c60b202eda22435692aa67177f0e02c381f220249059e79b75aba5b04d39055b6cc9324641fef2bb978abe09ec9960b35bc8a94a1cd4445b702bca11a4336c261ed4738af0a7588c748bc1590f335757c8a4fc0a58ffe15c84691551f2c9f1202548e595c39b73d0c422557b34161813d93b4463a020db27c490aa6095f43cdab0b2d21b4bea66c09c9a5e56d2a79b8c7e958712b56996a67631514b7e97d849cc3a81b7a1bd4579930310a56b43a8654c7606d8c28acb8f2ac3b93b5857a43712f9193f65d2cf76fc422deb4ff85c6f4775a4b49cab655c3a5c5916707bc37525c43a914bbe22ae1c7b96143bab620189bcd98e52137950539526f5818a0a7a3919040e9790710b1eb5f73ed3359dfd1790491b492d38212c43a1ec30cdca66c46d98a80f957e9823084c6697219027a54b98d37811cc0a20bcac336eb85c3b3a2b31a26a28f6cabad7a13fa73887364d2993c2753a8dcfc0a769e2cb03025db349607e3c1a6f54861b79823943cbf091070fc3895d775a68441b41ea3d584c360546808cd3252a7b2baf7808930a7cf003718a30854d57450595a9f374236eb3a0d358396b972f05fc9ea9164abc3aa4e6b3a70679c4224479a5d84a4777041238278a4b657163b013667d7be35081c645e0fb4a07a20173f54dd92a6b64469f21f146530723c62503d2b331a7262b60540f50775eb5e06f1a0401e48072b3a736af250fea149a32f421cf560000fc7ed2e50bb6d096c2aa4f1fcc7680513699bcbedc59c8bfeabe05a9626b904fe9ac9cba19cd9704bf92c82380134f010322f90b78b23ca858215cb07b6bbdd434cd440af015844ef27b58297922a24d3d531de35734cbf552aed02963f1076785949301457035a5c51874a1b4ca2805cb0b07bd44f77a59a7c48e0a1dd7e69d4baa4f07472be82c58ee5b4fff093cdbbc6bfdd37aa8c5cb79dcbfda589cae8c8f6d3490386c531b98b83d008f440388418308211c6e48fc1153493d56f915e85aabd0052ed01b210a143c073cbef96192aa04a544330c87c5a344521f7d44835cba1b3ae1303fc215bcd99a20fa00395bc9edf74502981766f56e7b97398185915edb7c95dcc4859b9798d25f1eb5cfad85c698bcafe0b11744f1283c536188757c3ad505f05650320c2021667f4f978fb120635c036b4a34732f67a7017aa740ba7b7f269fa0e940c7d51bbe6b0cf7d4370dd4872831b3258b803a64cff331b6b880925fc260ba63930e3164d153285c5a45db620efad208104087653852e667af48aa5884a1660ce8519533851340c8286372b2eaaf7d5c20c2b84ae0b33acdf827960a73bdfa68c28bb2c8a6475998673f2c2c3ae4bf2740c925d556fdd259d2eab5b2204faac71109ec9e261a9825dc49c03c2b10b5a72b9ca003e02f948acc00393d51282e92c61f991a606a88438ddcb6be73b4341b1ada180dc1620390b033a5bc536e8b96ce9a89a7d5276913c19de78bd0c393a74c6c2bdbb0bd307d2ff5ad608bc0424230706915d563009f05422f595a0d51083b17253b12470f503e84058b32a290ded39d14d1136f0570fa43c174acb726293940f848186b85a2fc22d7cb103a08cbed438537a42cb495841b457c2901b179530105563288d6578ed81ec4d988a5b9b8c10898bef7bdef4300e694801fa3c8e9e90b7ae30eec349d6934668a4ba843203b86bb4745d5281870b9ee83547309268c9740e02001560409fcf4cb54c67bafb417be366d810c7854f9750020bd58d5134911f959fe588af8e73aefa60ed00a55e8acc8451f837be565e2e719", + "seed" : "6bb0b827e28469737931032a75d8219ea09889824ef61cd69097e9f7eb9fd433", + "cipherText" : "52e60c800ba8a8b4f356582abf3cf650a6c63eb25d45bcbdf33f5c2247451daf76a8259722e81cf00450e304acb1be4bcbf72641593cce42f8d8291ded048d67f349c926ef47e6cf081faecc5f3cd6d0dad6a215b4229101a293d1e58f5f63b0f55177c6e0307c5b72b021daf6e71befd3281056942474a39a9c81594211c1852d5555a61259fbe58b42643a542334a53f0557ca801e860b8b379516d2870ccf07ed9bfe301cf7a13708998373284275908c2a94ffe4c38614923fc387115cdb84e8441b637122f4fdb489002bf9eac8988ccb37d1e9712bf8ec1d990f451f60bce849e00eac8b45c30c68faf4e3463e1da18a294a11b54e0d96eaecd94ec25bd1ad9737d0469231c320f80fd0b7261344736e1d8de5214a66095d84bc43401f1538949b2cb426a19b478a8eb3df56be916519846cf2f7f74e969ca0786ae80e7320f036f86c551cc6f881948aa35a239d11d7ed4615848fdfe32db707c93ca36215226b993d6a1312d97cabec44318cacc2a6539ced53bbd2e864502ae88f222a9f8a2b7335df26857c3106d0b5365b3abae80fa89c56b88c7a62439bac48335f881fbbd36dc00b2794e2f3f59dfe38e346f125aabb0189e9a7a0b00e0f0689156bd46a38bbddd3e11bc61e7b05b16ec70d38d6121a71e6353c2babebd1103c8a339903af164d1ec607e5149c034f2f78fb8aa56e49c1214c4a3590db386e1fcc9e6c6fa092023115784e61b552c9a4f37e5006fe37ad52284a2eb93ca5efbb798dac327d5367fe0345d520c4bce8f4da98f3380da554c5d3e3921dd8d1cee72c818d649bb293a7627e42b4f4da872067b06d6bceed12769eb9a0d59d4066d354e1fcbd1480ca360b0b241c61fb3688555030aa43208fe8497b74b0a737262d644e5c089f91c5d6a4aaff5c48569b790c9962d64b2c15c55c5257217d08fdf7012e743043866c285aff5d09b6fd796efa0ef9321a2f5c8baa573e41471f68f90dbb136a3ac5bf4f528012a7b1cc9dc16f62d450a08c5aec1277433c29e0195b023d2c26e960505fc10b3fa0995857cf626b9c620a9de5529bedae7922f8ba2618b26f72fffdf14b114c635407e4bbb5d11313070c8f53d766d6d76500a4368d194bd3be811da9d76301f9556e4b32ca4aba217d70f9959dc2eb2259bea3be3be8c41784ac45ea0c0f6f5b8bfbe45b318152b2395d4221ba0f73386c6404a3d4242dcb414f0530234801673f274d1700127d79cdf025d471f11df43352ff0b97e74b7320189004fe308b23c2b9f40da254274cb1c87e4ca5bbb16750f489473c1e14e77e3c02671c3b485be86b31b8ddfdf8acae61c58e25cc172d8aee7aaa16b545a72f723b1088c1747199c9e1ed787e29b43e2cb6ddcb69a90a6ef50d11082541c20be3b0f832e7dd91d461a4dcd143cb0a6b39a740844cacdd5a19d1927b9690b79d3f636e05f2e477678061eb68dcbbcd30c0f8857328d2ddfe14f37d1729fdbc08d42133c3698a450a3171ab4ae572f51e63bb38736a36f91cc8c7a417e97e6f8f27a70d7bd9f7041380f2c1e0226bf45c764a4b30892ad09047406a1555fb9e08a3d3c631c023a400a91f3a1831734a2c2a69c1f7dc3f83be15a71ac34fbb76af8ba94d1c0840466d5ca29430b40057f9a6639b8f3e5221b84892fb33760c16b1bd72a4e70a13a87ba3ac424e2c1d8ccab37cc4b473120dd15d7cfe1eaeef5c9fd0bdf0653c2ed2ab969a53586c50690b80a7e7da29e2d64cb97f94430371207d2bd936e264845509419ae8608b663c4f464dbc0c061532040d6a367a63c2f56d42179b922aead076cc3bc1e314983394ab6cd5601f2a250526f3db805dc6a6da0f11baad80cccbc07e568f8e305a8f753b5dccb0fc2b4c699a874ce28a479103b825bdcdc18b64d8e292dbb7712f50a1b74884f56f5842ac56146155719fd4e7eaff0417ef679bd1de0d678bf82d3bd6471a68bcd0ec5e0c9c682b3d6b20db1adaf48f59c10b7c4d49d9e00b4a92a82396592ad32df0bc6fd51db31f5d891fe5df89873a1f7081431340e47b1f0970884f77c4a6f58fff9ab15806c291145233fe1d934eb149297b2cce6ba5f21d0cc7a43fcbb7a63e5592faea5ab6f64ac464660b989915a10b12f1d1105bc321a36cfc6e4cdece56fe140ac23d082078a5509046385ed5cb9fe431b974308430c85807447bd6940491ad53c8b70f", + "sharedSecret" : "f15fc68eeedecf8f0e720e39de35d50774c39bbc7cf4085edcadbc0d5341a603" }, { - "publicKey": "060087ea0dfb968b29cbb8dc8b83921514cb1097ec934db6335b5637c2a3800609cabde8513ac40009bdd5b3f1b02c79fa700c85869ae8a8e3166535aab5e2c17987910bd8345993995a47214d31133960011ca4b8740545cfd166c9fcc6ab02204a34b48194643520008c8d74b4bc37aab465799d1a4994151718460c6b5a63ecc909822c15abe1740c617cd26b5e597480087b5eff6a76c48b0c2bb04c5407b89d8708f4da3c644141e8977d6e2bcc1ed5a30d2215df159cb9d8b505ba95480c6418c4737036aa78e7a894397567e4556b759cb3596ce09465ad48c26db171a58c48cabb90b2d13eeca79ae0c72121059697166b35dca5dfd28d71188d71ac03a48cc5f9814b303a5b0a25bcba478c5f9968f2ca64bb97125b989658f27ee192b160f028d0d2c6c21a6127936fc8e81a5802aa7bcb2a3a18462dc5948b6254b89b1bfc08bd204a1c3440ba0b267d427b7aaaf029b0eac7de274cebf805c6499d43a911c902942fa181ee639b487848bde7c3152b055b912e3f758e586774f96a4e41ab1c0041381044802e722c4cb3069f515b45054e8119a3c05596f0f540c7910a3af824d5e2b3b591ab6f494f98aa873978a4514602bcd095f73136703c5ddbda22262ba64f84b03346027110370c1c61d98a08a9ac5114274292936f0035bf1161901a8601518bcff91613e867b934a23bef7a34337c3d9861679e3b07fb3b91f807a18f6463f643457f04028f0b8f0141023eeaa2df8744fd6199ccdc468fb710cd9a68977c18895a9f95352aa5c3c7c48a7e7ce31049826b42a6345c9acb0082865e79a11c307603a67cc31a8cfa361538d49c5f9986b0cc1c281b2e5ba40e9282483144984bd9740502a570bb344485c7ca5b89f1bcc730c2603fc9c86bfc65e7e47cc58b0f0a96619536cb3494ac3f7578ec08d084410445233814b4a0ac139f13bab5a12a569e945f80023f3ef90eeeec074542b9d927789fea2b9dbbbe60c062f66228c449af8498177856a004e0a0dada98d7f1388ef86a3ef24c88b69c66c20ac9a93cf019bb303a1b173061efc402778106c7484d0e0687a4936849610f738155b6d46b3c0019dd7a91cc646959e19afe7544f7200660381c2ef245893aafcf00330e8b3870bb4b3ab71c101338960171629a67a996c451798df4798e10f151c753395db37e50b99696906405f4974ae302f64ab7084b70ebfb15014470a5f9a13793a1df68ac9bc5c174a56e0c2637649ba6cc0760eeeabdf8d878adc075a13acd827b2ecb8472bad9b4580785d2e02b2de43a30ac419472be06a7c971b98649801c9e797b936b75e7c859fd2a22234195e77bb0e35aa0284b6674c1143190840a2bb80fb219af829baec920c278a705bc2c2850b3b3c04f5694288d30cf5ec1043fe84f32591b30a60bf247aa3a5c686588720dfb3b1e85866c51c5a497a126f152630b346e53af60d16b25976b1eb98cbb0ac81c6a245b5212e1d7a418f17b5c99b4c54c4801d24a1d4a1cb0393e99a72f86e8492be36993628d1a24ae538441fbf40611b502de5856c4f23f476aaccc296c1c2b697b819d7c9c54f14a1383598b4b395955b515483ab9ea2b53b9db94a535b7c0b675f2187ff348c2befa696b9a393aa680a5f4105593260525935deb15cd8183d79acce69bcdf7294950337473ca6e3464219b4804f5255da3d374ba427809d20ba38b37540415162594d989970d2b4ca3539f288c680eb1b166145923dac5bc9966ff352e3e4b441b322bd04c8da1474b45ba54692000e3a77e19ba96256a890ea70c8ae8506a00c66ba62fb86885606243fd6252b5f24de99c9f0190361eac1cccc06835b95e00f0cec574a847f3b9887876445425418345976b96dac49dfd75be11d220c9e1900316c9db09a44c652db3115acb4c6654f4b9b1135c91769ec56306cbf5810534bdc3ecc705913808285fe2ac2f9b40066bcb874146ce1f2811a5055939ba197754268a9220e264be528676eb462f1cac5c9b3b2dd68a940656536a1777d508ad5da0b19aac3f25d2c1b7d96bb6db756c245440b59ab5d3055b224122cc516ca6b54af077b4d6b6fcb83d4f3896ed5cb59c920567e3639e673e8fa7b17665082278c7731abb5fd06aaa952675bb25d6b8b7c409a01d73b30305a8668002002088bdc264100354ab2705f24ae0e77f28e11da0206e9f837acd4e2694eca66cf7", - "privateKey": "0600878722a435ad2af09750a5629881c3ec9313bfb68b70200ea1566a2c2a18918526f8a62f347a1c53b29be337346ad6c163b8875d11250f4a61af3c7e5f8a2e736b63c53c7a9d32a11de5812cba827c337b736c28a2a3b4ab757ca90a1969fc4c5d62594e3054b0796361825f9645a85d36aeae92cf4e27598abc9a99e715762053b2133c57e4ba18b9b9b200850eabb87835491e8aca9320b53c1a79d019c736f85c2e05c7caa88c272473c88c0acc7b38db7678b930999e83049811ab8a638be3f5527c5c1e55245c8f59578fb5b62bc51233583255b8670465a64c4aa598f3562d471dc88a5988ba970a389adb444df83511d0716a49c3450086102cb01f922092d997bc10a59ea84a3807001d6d07c759e02010012ddc60aee2705aa2159621bc9695b79a083b3dd398c0066a0b3c3b18a4d34b8502c4b9892689238bd8f96566e69229b67eec20b5456a9e285180c41acdc19227d7657a1e896e9cc52fadcc7a733880606b1adf060e51d18c61d23d5d140ff410c0db3c785c606bc358be5bb7c8c6c607037a782e997ce6980a3d7160d0349b0bd6c4729a9282f0b30956892f4469c53679acc6978092486cc52bad47b6a96c999a50296c28b372e39d787c5478c5bf01342947d9207d03495a086d0d615a540482704abe615c0b08dc2754c1a53da27cf0983780c969b8da37e3d37133b52bf43794bfcb7581a8ac6fa6711246bfbf9bbcadf1085e0cc8518841cab383abdcbd22874f884104cf012b33d80f7641ad5a5128bdfa664919a337b155919291f3cb3cfb226cd9b53acb930d88b0ce0a11b25852658beacfb4a9ab29160fdf029c4fe276ce70b3aafa3f57d67ec9e2541a3b80f5074b00ec218616775d772fc80c0bc5f709d207cb9ce55c6e96c2c6698aee9c8184491d7282ae7d81c7e0fbcbc18375da7030d2d117a1b11a0dcb62c8caa072519b733012e14a98de5986d644c78043c983836489342ed3744282c8212835936ea7622e94cef2fcba07f72a6f09a5e3a068ed6c599db6cf7868c978e923d291b87f12b3ca62bca98aa4682b273f6263eb7413ac4bb09d7bb123f1a71bf2234258baba3104aca6affe149a964c386bec68981a1c7af0c29bb8790a694a3872924acabf6249cf8cf3460ac2a2944687825133e3f43704f91a08a5593b8b07daa673f2d163f8ba359df231569275493bb5a4f8b07ff5a767e50017f189c720b34dd335a46b2b70ea6bf620c003d7b9d1c171704115d3c3113181c6d2e96b83eb5a8ee964aefb34e13a4ff2b184c87b72c97189b6ac921b57b9639aaea4b53bbf0048222257c709cb0d305a2be4768d420b9c2bc03596a057b157e62700db01196205083ac134975495f5e02ef0446ceda5433ea936efe60dd7e18e84b8467d62b3f45795113a122008bc8df4970d15c56416c87fc21b59d339df412317685d595ca3116859a3cab13b39aae4751456f74ee933bf48e0688f4cabebd6a84cda7bcffb2a5d9484d78a00639b24521c95bc785a73084f7521b6ae277dcb7a2fb3c97edc34a058cc22d8ac90c3a0024ddc9b46a415ad0335d798353e73555ac58057d91d83385061d64679e12ae7b91f12737d6f637b71e80b38d8a26c98a140e35419e9081d056add011f2c014357e9c885804ab91b53ea35187e268943e3a06a16c4dbabb90b45bfdb0936a9d1c79b48af79c628d9218d85827844ec46f9712feff8a44f823baf038a19a9ade65091ffa6c5ebc89fc3995e704c7e4b790e0f631d4fd4b191c485ed3b2749b59b1ec43759921715db5be93c385a15c27eaa64299394b45298efd81fe668b9db88b95b56be7e63c0f5211fb5139d154abb40712cc2dc225b1896363aaae6205b41a1cef9a28d670aba2e50b25c14553dda8cb3b078dd7b791ed65ca9f9628a1ca40380b00d801ef3585189d1a4c8d800fabb14f435ab2e7515eea7a523c25755763b86f8612e3450dda88c6f07254c75c8ac0b1c8cecb42fd661bea830426163ea8acc6c68313dec891360ad4d34a16ab4a91bd3c6f2c73d29d4cdcd48a64bb00fe9a9425600b2ef6a8e13fb650392583045c2d6fcc9a8a8b1743c5a54a08de2a48dc06abcbdd55cf8d8b8f50019bf224b881346bec17d29ab42e2288090547f35b026357b4b58b3b2e16bcf674c9900202a78ac1b587086bbc4b2ff0b138e4d49d9472db46f4f18fbb229cd1ef04b38d00020a2caccf783334ac2c167627d4cb9b6258013db8e75924c43efa44c4500c12e8b060087ea0dfb968b29cbb8dc8b83921514cb1097ec934db6335b5637c2a3800609cabde8513ac40009bdd5b3f1b02c79fa700c85869ae8a8e3166535aab5e2c17987910bd8345993995a47214d31133960011ca4b8740545cfd166c9fcc6ab02204a34b48194643520008c8d74b4bc37aab465799d1a4994151718460c6b5a63ecc909822c15abe1740c617cd26b5e597480087b5eff6a76c48b0c2bb04c5407b89d8708f4da3c644141e8977d6e2bcc1ed5a30d2215df159cb9d8b505ba95480c6418c4737036aa78e7a894397567e4556b759cb3596ce09465ad48c26db171a58c48cabb90b2d13eeca79ae0c72121059697166b35dca5dfd28d71188d71ac03a48cc5f9814b303a5b0a25bcba478c5f9968f2ca64bb97125b989658f27ee192b160f028d0d2c6c21a6127936fc8e81a5802aa7bcb2a3a18462dc5948b6254b89b1bfc08bd204a1c3440ba0b267d427b7aaaf029b0eac7de274cebf805c6499d43a911c902942fa181ee639b487848bde7c3152b055b912e3f758e586774f96a4e41ab1c0041381044802e722c4cb3069f515b45054e8119a3c05596f0f540c7910a3af824d5e2b3b591ab6f494f98aa873978a4514602bcd095f73136703c5ddbda22262ba64f84b03346027110370c1c61d98a08a9ac5114274292936f0035bf1161901a8601518bcff91613e867b934a23bef7a34337c3d9861679e3b07fb3b91f807a18f6463f643457f04028f0b8f0141023eeaa2df8744fd6199ccdc468fb710cd9a68977c18895a9f95352aa5c3c7c48a7e7ce31049826b42a6345c9acb0082865e79a11c307603a67cc31a8cfa361538d49c5f9986b0cc1c281b2e5ba40e9282483144984bd9740502a570bb344485c7ca5b89f1bcc730c2603fc9c86bfc65e7e47cc58b0f0a96619536cb3494ac3f7578ec08d084410445233814b4a0ac139f13bab5a12a569e945f80023f3ef90eeeec074542b9d927789fea2b9dbbbe60c062f66228c449af8498177856a004e0a0dada98d7f1388ef86a3ef24c88b69c66c20ac9a93cf019bb303a1b173061efc402778106c7484d0e0687a4936849610f738155b6d46b3c0019dd7a91cc646959e19afe7544f7200660381c2ef245893aafcf00330e8b3870bb4b3ab71c101338960171629a67a996c451798df4798e10f151c753395db37e50b99696906405f4974ae302f64ab7084b70ebfb15014470a5f9a13793a1df68ac9bc5c174a56e0c2637649ba6cc0760eeeabdf8d878adc075a13acd827b2ecb8472bad9b4580785d2e02b2de43a30ac419472be06a7c971b98649801c9e797b936b75e7c859fd2a22234195e77bb0e35aa0284b6674c1143190840a2bb80fb219af829baec920c278a705bc2c2850b3b3c04f5694288d30cf5ec1043fe84f32591b30a60bf247aa3a5c686588720dfb3b1e85866c51c5a497a126f152630b346e53af60d16b25976b1eb98cbb0ac81c6a245b5212e1d7a418f17b5c99b4c54c4801d24a1d4a1cb0393e99a72f86e8492be36993628d1a24ae538441fbf40611b502de5856c4f23f476aaccc296c1c2b697b819d7c9c54f14a1383598b4b395955b515483ab9ea2b53b9db94a535b7c0b675f2187ff348c2befa696b9a393aa680a5f4105593260525935deb15cd8183d79acce69bcdf7294950337473ca6e3464219b4804f5255da3d374ba427809d20ba38b37540415162594d989970d2b4ca3539f288c680eb1b166145923dac5bc9966ff352e3e4b441b322bd04c8da1474b45ba54692000e3a77e19ba96256a890ea70c8ae8506a00c66ba62fb86885606243fd6252b5f24de99c9f0190361eac1cccc06835b95e00f0cec574a847f3b9887876445425418345976b96dac49dfd75be11d220c9e1900316c9db09a44c652db3115acb4c6654f4b9b1135c91769ec56306cbf5810534bdc3ecc705913808285fe2ac2f9b40066bcb874146ce1f2811a5055939ba197754268a9220e264be528676eb462f1cac5c9b3b2dd68a940656536a1777d508ad5da0b19aac3f25d2c1b7d96bb6db756c245440b59ab5d3055b224122cc516ca6b54af077b4d6b6fcb83d4f3896ed5cb59c920567e3639e673e8fa7b17665082278c7731abb5fd06aaa952675bb25d6b8b7c409a01d73b30305a8668002002088bdc264100354ab2705f24ae0e77f28e11da0206e9f837acd4e2694eca66cf7", - "seed": "a2caccf783334ac2c167627d4cb9b6258013db8e75924c43efa44c4500c12e8b", - "cipherText": "f2196537741fd9194be3bee02b6974b1c2c80507567d19a0ccf62eb1f632e9a5b931815d5d6c3f800d0604e9f35f5941f6303f386f3af635538090de66c7f1a4832460456c578a9595994244980ae8e47d5ae24d92ef3b6431686f58b22bd76d7f9056f71f67428dda9f959acb9ffb4a439085debbf4689ce8786c0443e35a2843bf321e372a90f047be7619aa5c021cce7217298e321000117fd93cd3adba6f64dc882fbae394332e4c2d405f725cf6de252c247d6ee179660c9e517fafb072c01d3aaaa4cc7397132becdb320780465628f766375945665b4d33591406179dc63baf651a35d2d4a0159320b7e38d4e8ffcbf92822d9e1d2d0db8725a89c65224964b1171a5591b49025197a126f8a2dd3c2f40e10186a44ba861be4a23b694d745d86149b045af57a157bd7d210b5f1edccca2e803441814ff05771cfdd15bffe05b995718fcfb89ef2bb82642993c915e429468f22a0e861f47a4cf7823d81f98323b1c1958d32b08aa86dc089479410ed440ed344e32421e123451b0ea9cfdc80138dc8365ac83719366b32ad1254febd8fa200978d250b878eeadc2cd79d67dc70a0d79b018f85f9b0169092f381b9b1847d074b4b60625b0e07f1f4fde604d22575935b0a8fc8c0cdd2ccdc17c466a01eee39a0e62606c0076de013dd2b52a1ecd7e444e469de84b4c258233a7b01daced0ebfeaf0c37e814c467b373c1da43d9a4f0183a858028b3c61c483b32dada3d0073ca908594a4e61e5e35399fd352c2cf11b8d9382e6fc780fd2ddec4a6a33cda4e7b9edc7ca6c72a2179f533d457ddf89e14f837b6a39e5c4d330b891e49a05d3c3186c35eacb9d4f9777e2c62a75db2c2bb62f8fa89daa1024f8b433bbd5e52b085080af17a6851465c74fc00808076b44450081da62af3dbfde4f5b2f0c9a5686d87dbdab3331df053ec02176353ccc75bc361d7e3a689015e5451aed394f30ab5d60ff5f305f7f036a8a8ec6e190d9879f2a379e83e2084007f5f192ee48716b0d6b7e43ea53b34db5ac9d012ab73b62500a30e7cd770a8496ba80395192bf6edf9c86ffeee62b2e584988942e0af66027b759d8edd7d099fe0cae0f03a3751f246ac663ca1a65a927a85451eec38151986c76abee9a50437fb99ba12e560a58c5b97d25ba8c2c9ecfdbf5476e4fc66ecc8756cc9cff94ad9503596505601065670c5064aa14ddd6478672dc76ea2d0e5d6ec6adf4b27506bb612a09321f6f6c3e24b3160b65aa24b021b3c627ccbb134353a36e266d0bf76249860c63f2e8254719e00bc5fe85c69907372ca75fd37ac169e6b4c51bc7c069aa1e559d343068ceec7122b0de164cf4358c0b4b0ffd70d7b7ed7366bdba3397f5c8053fed0e7a37b4ba162096e54c2c0429f48d83d5ea41611413924dd505d934e59fbf1cdd23d7aefa2a6ffc86421e7936c05a4371731fbede3843e792f97befa9a4e8e48fe6fe0d0fad6171c9dadddda91f9b04ba64f372beea0fc3bbefc6f7f062bc0119462ba7f80cf92cb87c3b57db1e4dfd04b7ac4fed5589b7c63729e512f6fdc8851a3bcd790af5554e9ca1cd39ac7fc79a1486a41d3681b420c8688dc84c5825045e3afb629b01361048027936e9ea0738ffc69d9a0461650165814ccf2201057e914ca47de78f8142f28a3a7a048ed70ec87232bf625ecb95824a754014fcc8cfc67a954b8aaaca3bc50c9c6bf32d4119694efdc5d34611058a8b6b7385ced067089b6a227e74f0f5985e282d2bcecbbe1a1d1445700f0d464c0a04b517120bbc002618c76b41fdc878820dacbb98f472dd8acb1587abe34226d3795e160e3600d008f2a68a3fde79b6df31aa3c10c35450e46733b5ea2d241007224b68d4df60451c0e75f7acb857b893593a64bc09bc383c0e84466a1a33cb6aedee1be9d5d0250b0f28a39978db61edb6158e1d8651fde9f2a6c65803a82ea87feab816a893a0eb0dd83cbe23a6840d57c02314e1442eb534c1f72da626c6457e530e72af6e5023984e593485af3cfac4be0c325491fe0e2460c8f1785164a367ec60011cca9bf4bc212e322eebb48c891e085f7648ea8d9241a99ab39b56c6dd72600bbb581e1cbf44a1ac31f2b3b7f08d093c5a174bf8d16d8000daf556a401b74eb897d1ead96c491aba6209d407a372dd1a1279a7cbfd55cdee14651205d293242fd67a5407560e31dbd1cfea60c5", - "sharedSecret": "a6aacb7d10775f055f4f4b2bfcde9ac51b759938c5da7e64d3bcb2845bc67d51" + "publicKey" : "060087ea0dfb968b29cbb8dc8b83921514cb1097ec934db6335b5637c2a3800609cabde8513ac40009bdd5b3f1b02c79fa700c85869ae8a8e3166535aab5e2c17987910bd8345993995a47214d31133960011ca4b8740545cfd166c9fcc6ab02204a34b48194643520008c8d74b4bc37aab465799d1a4994151718460c6b5a63ecc909822c15abe1740c617cd26b5e597480087b5eff6a76c48b0c2bb04c5407b89d8708f4da3c644141e8977d6e2bcc1ed5a30d2215df159cb9d8b505ba95480c6418c4737036aa78e7a894397567e4556b759cb3596ce09465ad48c26db171a58c48cabb90b2d13eeca79ae0c72121059697166b35dca5dfd28d71188d71ac03a48cc5f9814b303a5b0a25bcba478c5f9968f2ca64bb97125b989658f27ee192b160f028d0d2c6c21a6127936fc8e81a5802aa7bcb2a3a18462dc5948b6254b89b1bfc08bd204a1c3440ba0b267d427b7aaaf029b0eac7de274cebf805c6499d43a911c902942fa181ee639b487848bde7c3152b055b912e3f758e586774f96a4e41ab1c0041381044802e722c4cb3069f515b45054e8119a3c05596f0f540c7910a3af824d5e2b3b591ab6f494f98aa873978a4514602bcd095f73136703c5ddbda22262ba64f84b03346027110370c1c61d98a08a9ac5114274292936f0035bf1161901a8601518bcff91613e867b934a23bef7a34337c3d9861679e3b07fb3b91f807a18f6463f643457f04028f0b8f0141023eeaa2df8744fd6199ccdc468fb710cd9a68977c18895a9f95352aa5c3c7c48a7e7ce31049826b42a6345c9acb0082865e79a11c307603a67cc31a8cfa361538d49c5f9986b0cc1c281b2e5ba40e9282483144984bd9740502a570bb344485c7ca5b89f1bcc730c2603fc9c86bfc65e7e47cc58b0f0a96619536cb3494ac3f7578ec08d084410445233814b4a0ac139f13bab5a12a569e945f80023f3ef90eeeec074542b9d927789fea2b9dbbbe60c062f66228c449af8498177856a004e0a0dada98d7f1388ef86a3ef24c88b69c66c20ac9a93cf019bb303a1b173061efc402778106c7484d0e0687a4936849610f738155b6d46b3c0019dd7a91cc646959e19afe7544f7200660381c2ef245893aafcf00330e8b3870bb4b3ab71c101338960171629a67a996c451798df4798e10f151c753395db37e50b99696906405f4974ae302f64ab7084b70ebfb15014470a5f9a13793a1df68ac9bc5c174a56e0c2637649ba6cc0760eeeabdf8d878adc075a13acd827b2ecb8472bad9b4580785d2e02b2de43a30ac419472be06a7c971b98649801c9e797b936b75e7c859fd2a22234195e77bb0e35aa0284b6674c1143190840a2bb80fb219af829baec920c278a705bc2c2850b3b3c04f5694288d30cf5ec1043fe84f32591b30a60bf247aa3a5c686588720dfb3b1e85866c51c5a497a126f152630b346e53af60d16b25976b1eb98cbb0ac81c6a245b5212e1d7a418f17b5c99b4c54c4801d24a1d4a1cb0393e99a72f86e8492be36993628d1a24ae538441fbf40611b502de5856c4f23f476aaccc296c1c2b697b819d7c9c54f14a1383598b4b395955b515483ab9ea2b53b9db94a535b7c0b675f2187ff348c2befa696b9a393aa680a5f4105593260525935deb15cd8183d79acce69bcdf7294950337473ca6e3464219b4804f5255da3d374ba427809d20ba38b37540415162594d989970d2b4ca3539f288c680eb1b166145923dac5bc9966ff352e3e4b441b322bd04c8da1474b45ba54692000e3a77e19ba96256a890ea70c8ae8506a00c66ba62fb86885606243fd6252b5f24de99c9f0190361eac1cccc06835b95e00f0cec574a847f3b9887876445425418345976b96dac49dfd75be11d220c9e1900316c9db09a44c652db3115acb4c6654f4b9b1135c91769ec56306cbf5810534bdc3ecc705913808285fe2ac2f9b40066bcb874146ce1f2811a5055939ba197754268a9220e264be528676eb462f1cac5c9b3b2dd68a940656536a1777d508ad5da0b19aac3f25d2c1b7d96bb6db756c245440b59ab5d3055b224122cc516ca6b54af077b4d6b6fcb83d4f3896ed5cb59c920567e3639e673e8fa7b17665082278c7731abb5fd06aaa952675bb25d6b8b7c409a01d73b30305a8668002002088bdc264100354ab2705f24ae0e77f28e11da0206e9f837acd4e2694eca66cf7", + "privateKey" : "0600878722a435ad2af09750a5629881c3ec9313bfb68b70200ea1566a2c2a18918526f8a62f347a1c53b29be337346ad6c163b8875d11250f4a61af3c7e5f8a2e736b63c53c7a9d32a11de5812cba827c337b736c28a2a3b4ab757ca90a1969fc4c5d62594e3054b0796361825f9645a85d36aeae92cf4e27598abc9a99e715762053b2133c57e4ba18b9b9b200850eabb87835491e8aca9320b53c1a79d019c736f85c2e05c7caa88c272473c88c0acc7b38db7678b930999e83049811ab8a638be3f5527c5c1e55245c8f59578fb5b62bc51233583255b8670465a64c4aa598f3562d471dc88a5988ba970a389adb444df83511d0716a49c3450086102cb01f922092d997bc10a59ea84a3807001d6d07c759e02010012ddc60aee2705aa2159621bc9695b79a083b3dd398c0066a0b3c3b18a4d34b8502c4b9892689238bd8f96566e69229b67eec20b5456a9e285180c41acdc19227d7657a1e896e9cc52fadcc7a733880606b1adf060e51d18c61d23d5d140ff410c0db3c785c606bc358be5bb7c8c6c607037a782e997ce6980a3d7160d0349b0bd6c4729a9282f0b30956892f4469c53679acc6978092486cc52bad47b6a96c999a50296c28b372e39d787c5478c5bf01342947d9207d03495a086d0d615a540482704abe615c0b08dc2754c1a53da27cf0983780c969b8da37e3d37133b52bf43794bfcb7581a8ac6fa6711246bfbf9bbcadf1085e0cc8518841cab383abdcbd22874f884104cf012b33d80f7641ad5a5128bdfa664919a337b155919291f3cb3cfb226cd9b53acb930d88b0ce0a11b25852658beacfb4a9ab29160fdf029c4fe276ce70b3aafa3f57d67ec9e2541a3b80f5074b00ec218616775d772fc80c0bc5f709d207cb9ce55c6e96c2c6698aee9c8184491d7282ae7d81c7e0fbcbc18375da7030d2d117a1b11a0dcb62c8caa072519b733012e14a98de5986d644c78043c983836489342ed3744282c8212835936ea7622e94cef2fcba07f72a6f09a5e3a068ed6c599db6cf7868c978e923d291b87f12b3ca62bca98aa4682b273f6263eb7413ac4bb09d7bb123f1a71bf2234258baba3104aca6affe149a964c386bec68981a1c7af0c29bb8790a694a3872924acabf6249cf8cf3460ac2a2944687825133e3f43704f91a08a5593b8b07daa673f2d163f8ba359df231569275493bb5a4f8b07ff5a767e50017f189c720b34dd335a46b2b70ea6bf620c003d7b9d1c171704115d3c3113181c6d2e96b83eb5a8ee964aefb34e13a4ff2b184c87b72c97189b6ac921b57b9639aaea4b53bbf0048222257c709cb0d305a2be4768d420b9c2bc03596a057b157e62700db01196205083ac134975495f5e02ef0446ceda5433ea936efe60dd7e18e84b8467d62b3f45795113a122008bc8df4970d15c56416c87fc21b59d339df412317685d595ca3116859a3cab13b39aae4751456f74ee933bf48e0688f4cabebd6a84cda7bcffb2a5d9484d78a00639b24521c95bc785a73084f7521b6ae277dcb7a2fb3c97edc34a058cc22d8ac90c3a0024ddc9b46a415ad0335d798353e73555ac58057d91d83385061d64679e12ae7b91f12737d6f637b71e80b38d8a26c98a140e35419e9081d056add011f2c014357e9c885804ab91b53ea35187e268943e3a06a16c4dbabb90b45bfdb0936a9d1c79b48af79c628d9218d85827844ec46f9712feff8a44f823baf038a19a9ade65091ffa6c5ebc89fc3995e704c7e4b790e0f631d4fd4b191c485ed3b2749b59b1ec43759921715db5be93c385a15c27eaa64299394b45298efd81fe668b9db88b95b56be7e63c0f5211fb5139d154abb40712cc2dc225b1896363aaae6205b41a1cef9a28d670aba2e50b25c14553dda8cb3b078dd7b791ed65ca9f9628a1ca40380b00d801ef3585189d1a4c8d800fabb14f435ab2e7515eea7a523c25755763b86f8612e3450dda88c6f07254c75c8ac0b1c8cecb42fd661bea830426163ea8acc6c68313dec891360ad4d34a16ab4a91bd3c6f2c73d29d4cdcd48a64bb00fe9a9425600b2ef6a8e13fb650392583045c2d6fcc9a8a8b1743c5a54a08de2a48dc06abcbdd55cf8d8b8f50019bf224b881346bec17d29ab42e2288090547f35b026357b4b58b3b2e16bcf674c9900202a78ac1b587086bbc4b2ff0b138e4d49d9472db46f4f18fbb229cd1ef04b38d00020a2caccf783334ac2c167627d4cb9b6258013db8e75924c43efa44c4500c12e8b060087ea0dfb968b29cbb8dc8b83921514cb1097ec934db6335b5637c2a3800609cabde8513ac40009bdd5b3f1b02c79fa700c85869ae8a8e3166535aab5e2c17987910bd8345993995a47214d31133960011ca4b8740545cfd166c9fcc6ab02204a34b48194643520008c8d74b4bc37aab465799d1a4994151718460c6b5a63ecc909822c15abe1740c617cd26b5e597480087b5eff6a76c48b0c2bb04c5407b89d8708f4da3c644141e8977d6e2bcc1ed5a30d2215df159cb9d8b505ba95480c6418c4737036aa78e7a894397567e4556b759cb3596ce09465ad48c26db171a58c48cabb90b2d13eeca79ae0c72121059697166b35dca5dfd28d71188d71ac03a48cc5f9814b303a5b0a25bcba478c5f9968f2ca64bb97125b989658f27ee192b160f028d0d2c6c21a6127936fc8e81a5802aa7bcb2a3a18462dc5948b6254b89b1bfc08bd204a1c3440ba0b267d427b7aaaf029b0eac7de274cebf805c6499d43a911c902942fa181ee639b487848bde7c3152b055b912e3f758e586774f96a4e41ab1c0041381044802e722c4cb3069f515b45054e8119a3c05596f0f540c7910a3af824d5e2b3b591ab6f494f98aa873978a4514602bcd095f73136703c5ddbda22262ba64f84b03346027110370c1c61d98a08a9ac5114274292936f0035bf1161901a8601518bcff91613e867b934a23bef7a34337c3d9861679e3b07fb3b91f807a18f6463f643457f04028f0b8f0141023eeaa2df8744fd6199ccdc468fb710cd9a68977c18895a9f95352aa5c3c7c48a7e7ce31049826b42a6345c9acb0082865e79a11c307603a67cc31a8cfa361538d49c5f9986b0cc1c281b2e5ba40e9282483144984bd9740502a570bb344485c7ca5b89f1bcc730c2603fc9c86bfc65e7e47cc58b0f0a96619536cb3494ac3f7578ec08d084410445233814b4a0ac139f13bab5a12a569e945f80023f3ef90eeeec074542b9d927789fea2b9dbbbe60c062f66228c449af8498177856a004e0a0dada98d7f1388ef86a3ef24c88b69c66c20ac9a93cf019bb303a1b173061efc402778106c7484d0e0687a4936849610f738155b6d46b3c0019dd7a91cc646959e19afe7544f7200660381c2ef245893aafcf00330e8b3870bb4b3ab71c101338960171629a67a996c451798df4798e10f151c753395db37e50b99696906405f4974ae302f64ab7084b70ebfb15014470a5f9a13793a1df68ac9bc5c174a56e0c2637649ba6cc0760eeeabdf8d878adc075a13acd827b2ecb8472bad9b4580785d2e02b2de43a30ac419472be06a7c971b98649801c9e797b936b75e7c859fd2a22234195e77bb0e35aa0284b6674c1143190840a2bb80fb219af829baec920c278a705bc2c2850b3b3c04f5694288d30cf5ec1043fe84f32591b30a60bf247aa3a5c686588720dfb3b1e85866c51c5a497a126f152630b346e53af60d16b25976b1eb98cbb0ac81c6a245b5212e1d7a418f17b5c99b4c54c4801d24a1d4a1cb0393e99a72f86e8492be36993628d1a24ae538441fbf40611b502de5856c4f23f476aaccc296c1c2b697b819d7c9c54f14a1383598b4b395955b515483ab9ea2b53b9db94a535b7c0b675f2187ff348c2befa696b9a393aa680a5f4105593260525935deb15cd8183d79acce69bcdf7294950337473ca6e3464219b4804f5255da3d374ba427809d20ba38b37540415162594d989970d2b4ca3539f288c680eb1b166145923dac5bc9966ff352e3e4b441b322bd04c8da1474b45ba54692000e3a77e19ba96256a890ea70c8ae8506a00c66ba62fb86885606243fd6252b5f24de99c9f0190361eac1cccc06835b95e00f0cec574a847f3b9887876445425418345976b96dac49dfd75be11d220c9e1900316c9db09a44c652db3115acb4c6654f4b9b1135c91769ec56306cbf5810534bdc3ecc705913808285fe2ac2f9b40066bcb874146ce1f2811a5055939ba197754268a9220e264be528676eb462f1cac5c9b3b2dd68a940656536a1777d508ad5da0b19aac3f25d2c1b7d96bb6db756c245440b59ab5d3055b224122cc516ca6b54af077b4d6b6fcb83d4f3896ed5cb59c920567e3639e673e8fa7b17665082278c7731abb5fd06aaa952675bb25d6b8b7c409a01d73b30305a8668002002088bdc264100354ab2705f24ae0e77f28e11da0206e9f837acd4e2694eca66cf7", + "seed" : "a2caccf783334ac2c167627d4cb9b6258013db8e75924c43efa44c4500c12e8b", + "cipherText" : "f2196537741fd9194be3bee02b6974b1c2c80507567d19a0ccf62eb1f632e9a5b931815d5d6c3f800d0604e9f35f5941f6303f386f3af635538090de66c7f1a4832460456c578a9595994244980ae8e47d5ae24d92ef3b6431686f58b22bd76d7f9056f71f67428dda9f959acb9ffb4a439085debbf4689ce8786c0443e35a2843bf321e372a90f047be7619aa5c021cce7217298e321000117fd93cd3adba6f64dc882fbae394332e4c2d405f725cf6de252c247d6ee179660c9e517fafb072c01d3aaaa4cc7397132becdb320780465628f766375945665b4d33591406179dc63baf651a35d2d4a0159320b7e38d4e8ffcbf92822d9e1d2d0db8725a89c65224964b1171a5591b49025197a126f8a2dd3c2f40e10186a44ba861be4a23b694d745d86149b045af57a157bd7d210b5f1edccca2e803441814ff05771cfdd15bffe05b995718fcfb89ef2bb82642993c915e429468f22a0e861f47a4cf7823d81f98323b1c1958d32b08aa86dc089479410ed440ed344e32421e123451b0ea9cfdc80138dc8365ac83719366b32ad1254febd8fa200978d250b878eeadc2cd79d67dc70a0d79b018f85f9b0169092f381b9b1847d074b4b60625b0e07f1f4fde604d22575935b0a8fc8c0cdd2ccdc17c466a01eee39a0e62606c0076de013dd2b52a1ecd7e444e469de84b4c258233a7b01daced0ebfeaf0c37e814c467b373c1da43d9a4f0183a858028b3c61c483b32dada3d0073ca908594a4e61e5e35399fd352c2cf11b8d9382e6fc780fd2ddec4a6a33cda4e7b9edc7ca6c72a2179f533d457ddf89e14f837b6a39e5c4d330b891e49a05d3c3186c35eacb9d4f9777e2c62a75db2c2bb62f8fa89daa1024f8b433bbd5e52b085080af17a6851465c74fc00808076b44450081da62af3dbfde4f5b2f0c9a5686d87dbdab3331df053ec02176353ccc75bc361d7e3a689015e5451aed394f30ab5d60ff5f305f7f036a8a8ec6e190d9879f2a379e83e2084007f5f192ee48716b0d6b7e43ea53b34db5ac9d012ab73b62500a30e7cd770a8496ba80395192bf6edf9c86ffeee62b2e584988942e0af66027b759d8edd7d099fe0cae0f03a3751f246ac663ca1a65a927a85451eec38151986c76abee9a50437fb99ba12e560a58c5b97d25ba8c2c9ecfdbf5476e4fc66ecc8756cc9cff94ad9503596505601065670c5064aa14ddd6478672dc76ea2d0e5d6ec6adf4b27506bb612a09321f6f6c3e24b3160b65aa24b021b3c627ccbb134353a36e266d0bf76249860c63f2e8254719e00bc5fe85c69907372ca75fd37ac169e6b4c51bc7c069aa1e559d343068ceec7122b0de164cf4358c0b4b0ffd70d7b7ed7366bdba3397f5c8053fed0e7a37b4ba162096e54c2c0429f48d83d5ea41611413924dd505d934e59fbf1cdd23d7aefa2a6ffc86421e7936c05a4371731fbede3843e792f97befa9a4e8e48fe6fe0d0fad6171c9dadddda91f9b04ba64f372beea0fc3bbefc6f7f062bc0119462ba7f80cf92cb87c3b57db1e4dfd04b7ac4fed5589b7c63729e512f6fdc8851a3bcd790af5554e9ca1cd39ac7fc79a1486a41d3681b420c8688dc84c5825045e3afb629b01361048027936e9ea0738ffc69d9a0461650165814ccf2201057e914ca47de78f8142f28a3a7a048ed70ec87232bf625ecb95824a754014fcc8cfc67a954b8aaaca3bc50c9c6bf32d4119694efdc5d34611058a8b6b7385ced067089b6a227e74f0f5985e282d2bcecbbe1a1d1445700f0d464c0a04b517120bbc002618c76b41fdc878820dacbb98f472dd8acb1587abe34226d3795e160e3600d008f2a68a3fde79b6df31aa3c10c35450e46733b5ea2d241007224b68d4df60451c0e75f7acb857b893593a64bc09bc383c0e84466a1a33cb6aedee1be9d5d0250b0f28a39978db61edb6158e1d8651fde9f2a6c65803a82ea87feab816a893a0eb0dd83cbe23a6840d57c02314e1442eb534c1f72da626c6457e530e72af6e5023984e593485af3cfac4be0c325491fe0e2460c8f1785164a367ec60011cca9bf4bc212e322eebb48c891e085f7648ea8d9241a99ab39b56c6dd72600bbb581e1cbf44a1ac31f2b3b7f08d093c5a174bf8d16d8000daf556a401b74eb897d1ead96c491aba6209d407a372dd1a1279a7cbfd55cdee14651205d293242fd67a5407560e31dbd1cfea60c5", + "sharedSecret" : "a6aacb7d10775f055f4f4b2bfcde9ac51b759938c5da7e64d3bcb2845bc67d51" } ], - "rsaSignatureTests": [ + "rsaSignatureTests" : [ { - "publicKey": "02008bb1bbcb2c6915c182b0c7cc93e1d8210181ffee4be4ae81f7a98fdba2d6e37cea72e2124ebb6b05d330ab1ddfbc6d85c9d1c90fc3b65bd9634c3b722fe77ab98f33cc28af975d51609e1c308324501d615cbb82836c33c2a240e00826ddf09460cee7a975c0607579d4f7b707e19287a1c754ba485e04aab664e44cae8fcab770b9bb5c95a271786aa79d6fa11dd21bdb3a08b679bd5f29fc95ab573a3dabcbd8e70aaec0cc2a817eefbc886d3eafea96abd0d5e364b83ccf74f4d18b3546b014fa24b90134179ed952209971211c623a2743da0c3236abd512499920a75651482b43b27c18d477e8735935425933d8f09a12fbf1950cf8a381ef5f2400fcf9", - "privateKey": "02008bb1bbcb2c6915c182b0c7cc93e1d8210181ffee4be4ae81f7a98fdba2d6e37cea72e2124ebb6b05d330ab1ddfbc6d85c9d1c90fc3b65bd9634c3b722fe77ab98f33cc28af975d51609e1c308324501d615cbb82836c33c2a240e00826ddf09460cee7a975c0607579d4f7b707e19287a1c754ba485e04aab664e44cae8fcab770b9bb5c95a271786aa79d6fa11dd21bdb3a08b679bd5f29fc95ab573a3dabcbd8e70aaec0cc2a817eefbc886d3eafea96abd0d5e364b83ccf74f4d18b3546b014fa24b90134179ed952209971211c623a2743da0c3236abd512499920a75651482b43b27c18d477e8735935425933d8f09a12fbf1950cf8a381ef5f2400fcf90200816022249104e1f94e289b6284b36d8f63ee1a31806852965be0d632fc25389ac02795e88eb254f4181bc2def00f7affa5627d6bf43e37e2a56c3cc20c4bbe058cf2d3e9fa759d1f78f3f5f797fd5195644e95fad1ecac235e51e72aa59476f374952b486e9db4b818157d362e3e638ee9edca329c4336df43fd3cd327f8542d1add9798af1d6a9e8cf8f54dd0b6a6f9ed9c3f5d803c220716757871e1442ef407ffe5df44c364bf57a60551b681173747b8df8e4138101f1d048cc1941a5d4c1fd3eda5bc96496eb1892477d811b845a7c9b3333e700989a1134e8f65edbf3a8332baa7195eb6aa33591b6ab41ec8215c6487979df5cf1b9736fd4fea73eee102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7a2e7a5cc651614fd17eb10765ef63462e5767745fc849e97095319d42f8cbb1485aba0f590b33208e666e949db0465e483a122467f771a986da6855abb148d0b5c1eefb08636d0aeb36b8ec161497cc9a64704f0976aceb33d09af5408ded1aec771b534f9a27fd9dc3303146ce98872915ed730ed9661eec46b8c0d6b6d37020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a632cb2e0a17ee6e363e3e056e5170480a3790023e342cb221431be37d63e692ce572390a379cf470c8a9fa4251a0af84d746b79ff91f6dcf168417137150d93049098ef747a601825982cbbd1ac1c20b3f3ee97b25e1739c31b43e78fc1cd53134dc4e82ebf98c720c34852fbd2288370421b848575f4d054e1d1e66b47f4f02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b09e8b48e56fd2859072135f4b129f62546228914b80fed239d1f756436f3a3c4faa98b2336bf0e6ded86771cc49beb1beab0b4b2a3bf8e20385e029e083b368d4579a9322a343da9ccadbe14edc527f5ef6754273fcd088e92c4a5d30934eeaccfcf05bbe17f66acc0055b92c72db229a50f3e2db40dda0b0c17e4b9cd3e3c30200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088861ee6e7e1a7f8c1287a40ce56b3ae159b79caf7f166057fd35fd1984aead1d313eb982942d897088d4a52b606bd13b9632d7400112b0bcdcf596b9693e42ccb982acdb43a35c0abe63fd5af1a54312604fdbb365d5f2afefaad2b798d6869d6a3aa15fb8c75170f5b5fae4f72ef7089462c136c55673f12ebeab0119e97dd02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d8538fe6ebe9514412692fc985f8fd62b237c51c160c3d49aeeafffa057f2feff8f29040a205895b61dfa3f6188851021dc9e50152f3ea69746f5eb491af4a6dde21db9fa2c6fa61198ea02d6b600ed4267c3871af686c8db12e4bcbaaaa552e157e66fda90d34fce11cfd0f5eea6fbb236818070fb3a13751ad408e4231f499", - "input": "a26fad70fda0e8c8bdd434a1b243ee58", - "seed": "c213bdfa841f6e9c22ee58dc2485927063eec5b3bad539dbd0e9420f49512baf", - "result": "489608baf9f3bd3eff74da1b05596822b8d9965a6b1b99febb5cb91721b0f7f47ebd6004867ed3dd1ec145c6f14da4e3c4c5415b08c5be7428f6087b347f3bd1d16f1e88734b7c26ec539eded40702ca2d6547b96c73799634ebce78e6b89c300544ed4104b85f869b58d9a14542434421b142700c11edf85f78a657bffa65a21d7eb11f6801b8ced89a56f6c0dec6bb91929e1f5cef69f7bcc1e28c30a117088365627d7fb21a9e50faae6799f0046365d464d8d9dd17689a3a44254a9335700abf879354820274caf1a073b708d5d38108c244704c49d4cb0441bc5c575a0b55830992cd5f40ec3d4c98941dcfd94816a86ffe969f9f1ba8ae0ae98071be18" + "publicKey" : "02008bb1bbcb2c6915c182b0c7cc93e1d8210181ffee4be4ae81f7a98fdba2d6e37cea72e2124ebb6b05d330ab1ddfbc6d85c9d1c90fc3b65bd9634c3b722fe77ab98f33cc28af975d51609e1c308324501d615cbb82836c33c2a240e00826ddf09460cee7a975c0607579d4f7b707e19287a1c754ba485e04aab664e44cae8fcab770b9bb5c95a271786aa79d6fa11dd21bdb3a08b679bd5f29fc95ab573a3dabcbd8e70aaec0cc2a817eefbc886d3eafea96abd0d5e364b83ccf74f4d18b3546b014fa24b90134179ed952209971211c623a2743da0c3236abd512499920a75651482b43b27c18d477e8735935425933d8f09a12fbf1950cf8a381ef5f2400fcf9", + "privateKey" : "02008bb1bbcb2c6915c182b0c7cc93e1d8210181ffee4be4ae81f7a98fdba2d6e37cea72e2124ebb6b05d330ab1ddfbc6d85c9d1c90fc3b65bd9634c3b722fe77ab98f33cc28af975d51609e1c308324501d615cbb82836c33c2a240e00826ddf09460cee7a975c0607579d4f7b707e19287a1c754ba485e04aab664e44cae8fcab770b9bb5c95a271786aa79d6fa11dd21bdb3a08b679bd5f29fc95ab573a3dabcbd8e70aaec0cc2a817eefbc886d3eafea96abd0d5e364b83ccf74f4d18b3546b014fa24b90134179ed952209971211c623a2743da0c3236abd512499920a75651482b43b27c18d477e8735935425933d8f09a12fbf1950cf8a381ef5f2400fcf90200816022249104e1f94e289b6284b36d8f63ee1a31806852965be0d632fc25389ac02795e88eb254f4181bc2def00f7affa5627d6bf43e37e2a56c3cc20c4bbe058cf2d3e9fa759d1f78f3f5f797fd5195644e95fad1ecac235e51e72aa59476f374952b486e9db4b818157d362e3e638ee9edca329c4336df43fd3cd327f8542d1add9798af1d6a9e8cf8f54dd0b6a6f9ed9c3f5d803c220716757871e1442ef407ffe5df44c364bf57a60551b681173747b8df8e4138101f1d048cc1941a5d4c1fd3eda5bc96496eb1892477d811b845a7c9b3333e700989a1134e8f65edbf3a8332baa7195eb6aa33591b6ab41ec8215c6487979df5cf1b9736fd4fea73eee102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7a2e7a5cc651614fd17eb10765ef63462e5767745fc849e97095319d42f8cbb1485aba0f590b33208e666e949db0465e483a122467f771a986da6855abb148d0b5c1eefb08636d0aeb36b8ec161497cc9a64704f0976aceb33d09af5408ded1aec771b534f9a27fd9dc3303146ce98872915ed730ed9661eec46b8c0d6b6d37020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a632cb2e0a17ee6e363e3e056e5170480a3790023e342cb221431be37d63e692ce572390a379cf470c8a9fa4251a0af84d746b79ff91f6dcf168417137150d93049098ef747a601825982cbbd1ac1c20b3f3ee97b25e1739c31b43e78fc1cd53134dc4e82ebf98c720c34852fbd2288370421b848575f4d054e1d1e66b47f4f02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b09e8b48e56fd2859072135f4b129f62546228914b80fed239d1f756436f3a3c4faa98b2336bf0e6ded86771cc49beb1beab0b4b2a3bf8e20385e029e083b368d4579a9322a343da9ccadbe14edc527f5ef6754273fcd088e92c4a5d30934eeaccfcf05bbe17f66acc0055b92c72db229a50f3e2db40dda0b0c17e4b9cd3e3c30200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088861ee6e7e1a7f8c1287a40ce56b3ae159b79caf7f166057fd35fd1984aead1d313eb982942d897088d4a52b606bd13b9632d7400112b0bcdcf596b9693e42ccb982acdb43a35c0abe63fd5af1a54312604fdbb365d5f2afefaad2b798d6869d6a3aa15fb8c75170f5b5fae4f72ef7089462c136c55673f12ebeab0119e97dd02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d8538fe6ebe9514412692fc985f8fd62b237c51c160c3d49aeeafffa057f2feff8f29040a205895b61dfa3f6188851021dc9e50152f3ea69746f5eb491af4a6dde21db9fa2c6fa61198ea02d6b600ed4267c3871af686c8db12e4bcbaaaa552e157e66fda90d34fce11cfd0f5eea6fbb236818070fb3a13751ad408e4231f499", + "input" : "a26fad70fda0e8c8bdd434a1b243ee58", + "seed" : "c213bdfa841f6e9c22ee58dc2485927063eec5b3bad539dbd0e9420f49512baf", + "result" : "489608baf9f3bd3eff74da1b05596822b8d9965a6b1b99febb5cb91721b0f7f47ebd6004867ed3dd1ec145c6f14da4e3c4c5415b08c5be7428f6087b347f3bd1d16f1e88734b7c26ec539eded40702ca2d6547b96c73799634ebce78e6b89c300544ed4104b85f869b58d9a14542434421b142700c11edf85f78a657bffa65a21d7eb11f6801b8ced89a56f6c0dec6bb91929e1f5cef69f7bcc1e28c30a117088365627d7fb21a9e50faae6799f0046365d464d8d9dd17689a3a44254a9335700abf879354820274caf1a073b708d5d38108c244704c49d4cb0441bc5c575a0b55830992cd5f40ec3d4c98941dcfd94816a86ffe969f9f1ba8ae0ae98071be18" }, { - "publicKey": "02008bb1bbcb2c6915c182b0c7cc93e1d8210181ffee4be4ae81f7a98fdba2d6e37cea72e2124ebb6b05d330ab1ddfbc6d85c9d1c90fc3b65bd9634c3b722fe77ab98f33cc28af975d51609e1c308324501d615cbb82836c33c2a240e00826ddf09460cee7a975c0607579d4f7b707e19287a1c754ba485e04aab664e44cae8fcab770b9bb5c95a271786aa79d6fa11dd21bdb3a08b679bd5f29fc95ab573a3dabcbd8e70aaec0cc2a817eefbc886d3eafea96abd0d5e364b83ccf74f4d18b3546b014fa24b90134179ed952209971211c623a2743da0c3236abd512499920a75651482b43b27c18d477e8735935425933d8f09a12fbf1950cf8a381ef5f2400fcf9", - "privateKey": "02008bb1bbcb2c6915c182b0c7cc93e1d8210181ffee4be4ae81f7a98fdba2d6e37cea72e2124ebb6b05d330ab1ddfbc6d85c9d1c90fc3b65bd9634c3b722fe77ab98f33cc28af975d51609e1c308324501d615cbb82836c33c2a240e00826ddf09460cee7a975c0607579d4f7b707e19287a1c754ba485e04aab664e44cae8fcab770b9bb5c95a271786aa79d6fa11dd21bdb3a08b679bd5f29fc95ab573a3dabcbd8e70aaec0cc2a817eefbc886d3eafea96abd0d5e364b83ccf74f4d18b3546b014fa24b90134179ed952209971211c623a2743da0c3236abd512499920a75651482b43b27c18d477e8735935425933d8f09a12fbf1950cf8a381ef5f2400fcf90200816022249104e1f94e289b6284b36d8f63ee1a31806852965be0d632fc25389ac02795e88eb254f4181bc2def00f7affa5627d6bf43e37e2a56c3cc20c4bbe058cf2d3e9fa759d1f78f3f5f797fd5195644e95fad1ecac235e51e72aa59476f374952b486e9db4b818157d362e3e638ee9edca329c4336df43fd3cd327f8542d1add9798af1d6a9e8cf8f54dd0b6a6f9ed9c3f5d803c220716757871e1442ef407ffe5df44c364bf57a60551b681173747b8df8e4138101f1d048cc1941a5d4c1fd3eda5bc96496eb1892477d811b845a7c9b3333e700989a1134e8f65edbf3a8332baa7195eb6aa33591b6ab41ec8215c6487979df5cf1b9736fd4fea73eee102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7a2e7a5cc651614fd17eb10765ef63462e5767745fc849e97095319d42f8cbb1485aba0f590b33208e666e949db0465e483a122467f771a986da6855abb148d0b5c1eefb08636d0aeb36b8ec161497cc9a64704f0976aceb33d09af5408ded1aec771b534f9a27fd9dc3303146ce98872915ed730ed9661eec46b8c0d6b6d37020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a632cb2e0a17ee6e363e3e056e5170480a3790023e342cb221431be37d63e692ce572390a379cf470c8a9fa4251a0af84d746b79ff91f6dcf168417137150d93049098ef747a601825982cbbd1ac1c20b3f3ee97b25e1739c31b43e78fc1cd53134dc4e82ebf98c720c34852fbd2288370421b848575f4d054e1d1e66b47f4f02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b09e8b48e56fd2859072135f4b129f62546228914b80fed239d1f756436f3a3c4faa98b2336bf0e6ded86771cc49beb1beab0b4b2a3bf8e20385e029e083b368d4579a9322a343da9ccadbe14edc527f5ef6754273fcd088e92c4a5d30934eeaccfcf05bbe17f66acc0055b92c72db229a50f3e2db40dda0b0c17e4b9cd3e3c30200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088861ee6e7e1a7f8c1287a40ce56b3ae159b79caf7f166057fd35fd1984aead1d313eb982942d897088d4a52b606bd13b9632d7400112b0bcdcf596b9693e42ccb982acdb43a35c0abe63fd5af1a54312604fdbb365d5f2afefaad2b798d6869d6a3aa15fb8c75170f5b5fae4f72ef7089462c136c55673f12ebeab0119e97dd02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d8538fe6ebe9514412692fc985f8fd62b237c51c160c3d49aeeafffa057f2feff8f29040a205895b61dfa3f6188851021dc9e50152f3ea69746f5eb491af4a6dde21db9fa2c6fa61198ea02d6b600ed4267c3871af686c8db12e4bcbaaaa552e157e66fda90d34fce11cfd0f5eea6fbb236818070fb3a13751ad408e4231f499", - "input": "33ee4979343dac9a03e7068f1fb3dc9f", - "seed": "c213bdfa841f6e9c22ee58dc2485927063eec5b3bad539dbd0e9420f49512baf", - "result": "242e865b4e60ac178c8ae906fc386ea0fffe3284db9212f7c92593c9765ea4777c8bf5193f2ae643c324089728bf2a742a0fda1bf5fe1b46d090d63bf8130a02fae30f2dc1a87ca0305b31b23a44e05ece3075401f2bb1918b3ac2221c92ef5a5c235036566d6ab46755aab114284a905e53bdd025676962f02df94150921074b946d10aa3a670e24d0f7481b99eb2db152f333aa5f4a31bad371fd6f2049b0c1ae61adf1b8fcd5f2605bc0038194a1db2342b93832f740c6ecaaa805c53349c4f43ad49ef63b734942e80aeb96bb96a3dd974ab6d4849cf9da74cdf338e7cb53ee31606c3be537ec4727c824dc9108afb66a6db683486306cf95eeef5519735" + "publicKey" : "02008bb1bbcb2c6915c182b0c7cc93e1d8210181ffee4be4ae81f7a98fdba2d6e37cea72e2124ebb6b05d330ab1ddfbc6d85c9d1c90fc3b65bd9634c3b722fe77ab98f33cc28af975d51609e1c308324501d615cbb82836c33c2a240e00826ddf09460cee7a975c0607579d4f7b707e19287a1c754ba485e04aab664e44cae8fcab770b9bb5c95a271786aa79d6fa11dd21bdb3a08b679bd5f29fc95ab573a3dabcbd8e70aaec0cc2a817eefbc886d3eafea96abd0d5e364b83ccf74f4d18b3546b014fa24b90134179ed952209971211c623a2743da0c3236abd512499920a75651482b43b27c18d477e8735935425933d8f09a12fbf1950cf8a381ef5f2400fcf9", + "privateKey" : "02008bb1bbcb2c6915c182b0c7cc93e1d8210181ffee4be4ae81f7a98fdba2d6e37cea72e2124ebb6b05d330ab1ddfbc6d85c9d1c90fc3b65bd9634c3b722fe77ab98f33cc28af975d51609e1c308324501d615cbb82836c33c2a240e00826ddf09460cee7a975c0607579d4f7b707e19287a1c754ba485e04aab664e44cae8fcab770b9bb5c95a271786aa79d6fa11dd21bdb3a08b679bd5f29fc95ab573a3dabcbd8e70aaec0cc2a817eefbc886d3eafea96abd0d5e364b83ccf74f4d18b3546b014fa24b90134179ed952209971211c623a2743da0c3236abd512499920a75651482b43b27c18d477e8735935425933d8f09a12fbf1950cf8a381ef5f2400fcf90200816022249104e1f94e289b6284b36d8f63ee1a31806852965be0d632fc25389ac02795e88eb254f4181bc2def00f7affa5627d6bf43e37e2a56c3cc20c4bbe058cf2d3e9fa759d1f78f3f5f797fd5195644e95fad1ecac235e51e72aa59476f374952b486e9db4b818157d362e3e638ee9edca329c4336df43fd3cd327f8542d1add9798af1d6a9e8cf8f54dd0b6a6f9ed9c3f5d803c220716757871e1442ef407ffe5df44c364bf57a60551b681173747b8df8e4138101f1d048cc1941a5d4c1fd3eda5bc96496eb1892477d811b845a7c9b3333e700989a1134e8f65edbf3a8332baa7195eb6aa33591b6ab41ec8215c6487979df5cf1b9736fd4fea73eee102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7a2e7a5cc651614fd17eb10765ef63462e5767745fc849e97095319d42f8cbb1485aba0f590b33208e666e949db0465e483a122467f771a986da6855abb148d0b5c1eefb08636d0aeb36b8ec161497cc9a64704f0976aceb33d09af5408ded1aec771b534f9a27fd9dc3303146ce98872915ed730ed9661eec46b8c0d6b6d37020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a632cb2e0a17ee6e363e3e056e5170480a3790023e342cb221431be37d63e692ce572390a379cf470c8a9fa4251a0af84d746b79ff91f6dcf168417137150d93049098ef747a601825982cbbd1ac1c20b3f3ee97b25e1739c31b43e78fc1cd53134dc4e82ebf98c720c34852fbd2288370421b848575f4d054e1d1e66b47f4f02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b09e8b48e56fd2859072135f4b129f62546228914b80fed239d1f756436f3a3c4faa98b2336bf0e6ded86771cc49beb1beab0b4b2a3bf8e20385e029e083b368d4579a9322a343da9ccadbe14edc527f5ef6754273fcd088e92c4a5d30934eeaccfcf05bbe17f66acc0055b92c72db229a50f3e2db40dda0b0c17e4b9cd3e3c30200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088861ee6e7e1a7f8c1287a40ce56b3ae159b79caf7f166057fd35fd1984aead1d313eb982942d897088d4a52b606bd13b9632d7400112b0bcdcf596b9693e42ccb982acdb43a35c0abe63fd5af1a54312604fdbb365d5f2afefaad2b798d6869d6a3aa15fb8c75170f5b5fae4f72ef7089462c136c55673f12ebeab0119e97dd02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d8538fe6ebe9514412692fc985f8fd62b237c51c160c3d49aeeafffa057f2feff8f29040a205895b61dfa3f6188851021dc9e50152f3ea69746f5eb491af4a6dde21db9fa2c6fa61198ea02d6b600ed4267c3871af686c8db12e4bcbaaaa552e157e66fda90d34fce11cfd0f5eea6fbb236818070fb3a13751ad408e4231f499", + "input" : "33ee4979343dac9a03e7068f1fb3dc9f", + "seed" : "c213bdfa841f6e9c22ee58dc2485927063eec5b3bad539dbd0e9420f49512baf", + "result" : "242e865b4e60ac178c8ae906fc386ea0fffe3284db9212f7c92593c9765ea4777c8bf5193f2ae643c324089728bf2a742a0fda1bf5fe1b46d090d63bf8130a02fae30f2dc1a87ca0305b31b23a44e05ece3075401f2bb1918b3ac2221c92ef5a5c235036566d6ab46755aab114284a905e53bdd025676962f02df94150921074b946d10aa3a670e24d0f7481b99eb2db152f333aa5f4a31bad371fd6f2049b0c1ae61adf1b8fcd5f2605bc0038194a1db2342b93832f740c6ecaaa805c53349c4f43ad49ef63b734942e80aeb96bb96a3dd974ab6d4849cf9da74cdf338e7cb53ee31606c3be537ec4727c824dc9108afb66a6db683486306cf95eeef5519735" } ], - "aes256Tests": [ - { - "plainTextBase64": "", - "ivBase64": "aP3qcxnGlXHvKWkWIfKr2w==", - "cipherTextBase64": "AWj96nMZxpVx7ylpFiHyq9tPvhNhhrfFVqKV5G+5t0USPvkNuNwqqs0x4YZmD18jXfCzBFogwbIu+/s7QaX+AQI=", - "hexKey": "ee66b6c2a9951718d686dd933aa7a3281fd3d0b131527c13cdec6f90ea1dbce2", - "keyToEncrypt256": "1c17ec5390a7d53027f3c4a42587a19fa896e5e3007ffbcd1499817a27b10ea7", - "keyToEncrypt128": "9c1984090c9e58684ed60fee0595eab5", - "encryptedKey256": "AWj96nMZxpVx7ylpFiHyq9tZQzK2T78QtJgcU/GBTOxcixbzhCcQX8OQs9Hlu/JWJ8f18wXeip13vUvWG2fo+h7f6xh3p/db8FDxYGvZp6/q", - "encryptedKey128": "AWj96nMZxpVx7ylpFiHyq9t/WoFjA7K8Ak+e7U3cBMmCYsHEHb5Lmv/yv/5Fr0oYga4TfYDoG9s6fMoyc/J/JMU=" - }, - { - "plainTextBase64": "wg==", - "ivBase64": "HtLKEspo732MEKkTNLi4bw==", - "cipherTextBase64": "AR7SyhLKaO99jBCpEzS4uG/5teD3iwyFEcONHeVCLO1+oxQLDfv2nQtEWKxMYFv5GPpYE4Vfofuff49IhYcYGfo=", - "hexKey": "9b421b7a1a70617c71bd16d39445cfb46b87bf5ed8a69295cbf0bbe98bf4f9ae", - "keyToEncrypt256": "df7b39284e88f19c0ac0abd40ad4d4f167ea165810658257cb35ba6657963e56", - "keyToEncrypt128": "820a56448523ea4acf46113aa55eb887", - "encryptedKey256": "AR7SyhLKaO99jBCpEzS4uG961FuY9cKRkoTxRaPkRAYaYWjCtbP85tvUvsecszrNgvY1JY4+dNOZjIYJ+zDmBNDa+B5OG4X3MwOaVe+Jg8cA", - "encryptedKey128": "AR7SyhLKaO99jBCpEzS4uG9hG+wZduW5uUS8lU7Ug2vo1HlAtx9Y9s/LyYgYWYI/FxGPyD/NpDhV3MVb1tCWol0=" - }, - { - "plainTextBase64": "zNc=", - "ivBase64": "Zu31rkPTKH/OSKmT7zKzWg==", - "cipherTextBase64": "AWbt9a5D0yh/zkipk+8ys1owUExxvCav/b9j6gXE1XFdx/euQmsWvWM4KdMDY0Vi+3izofFO1iIkjJG0D8GhglQ=", - "hexKey": "6577853a0ba55ff979efdf3895d7aaf47d9beb0ce01d41fcf0102ac982219de0", - "keyToEncrypt256": "10553fdf58f799374ba72300fa012f2128700ac6f2b398ceed8ad80c22557a52", - "keyToEncrypt128": "a09eae23058dd77287c7fa71591b5e42", - "encryptedKey256": "AWbt9a5D0yh/zkipk+8ys1rCDZir7QOVvOyOk0WO0dzTJg1lnuw09yWxWqSLvdWMTQU9GaA/ptsWxCS0i6AmUugNEVH/a6WtzVc0qzyPtMuf", - "encryptedKey128": "AWbt9a5D0yh/zkipk+8ys1oPE5OtkyRt6fyA36EypVuuZyQRetLfCZzlkPKhl2I+9/Xxrf6g6BUgnk3aPzxcagc=" - }, - { - "plainTextBase64": "rfGd", - "ivBase64": "LFV+8jVwaktB4aw6GmmyKQ==", - "cipherTextBase64": "ASxVfvI1cGpLQeGsOhppsilUIbRNeTNoYXhvWK1ufMRzu0/le6vqRF2az/aE20UC4lBPkEdWmxNvH0b0wpuM3PY=", - "hexKey": "44be4520be070415c0102d30c52145a2d4b887da3d946cfbcfcd410b47320830", - "keyToEncrypt256": "07028d67af5776e43542bbc351ce1d3568d7e03a6dc40ef64abcb9bfaf5a05c6", - "keyToEncrypt128": "3474809e5ccbac3e2fa67e425ad123f0", - "encryptedKey256": "ASxVfvI1cGpLQeGsOhppsilLVMehqDzDi0x7yoT8qOfp5nb6NqB2hkF4wfuls2v1yx/FfoHodbAsFeRf05D+xjySSb0AYcdhNxLSrpCF+Kqn", - "encryptedKey128": "ASxVfvI1cGpLQeGsOhppsikOAfPyzLPoHzGSsFjkqZ/hM+wi/huelxf5uiJi/eXwtLIEr3n5PHB4Gxax9RHKYak=" - }, - { - "plainTextBase64": "G3NCfw==", - "ivBase64": "4Kn5SbpuYDJR+88RZTXm3w==", - "cipherTextBase64": "AeCp+Um6bmAyUfvPEWU15t+9T5GT82wnSXnjFJyddez69NE7rrgG6eIXERWQKhJLUd0b1Xv7KMy5s5xnXdmOtsg=", - "hexKey": "1e800c0c29a01ca77f7389d65ee4ab634b6cd016354bef53ab16d94bc96e4d95", - "keyToEncrypt256": "675e38a27fab76cb7cca8155ba442679cfcdf0a3b50dae7a4a64abc53ef8706a", - "keyToEncrypt128": "ba725951a633f1cae8005e20495ed684", - "encryptedKey256": "AeCp+Um6bmAyUfvPEWU15t95xOY4QSpDck7AsGF7Ltm1G1hwzelQK00lShxY3wNS0CRIj/Wj1JP4Xg23gsG5MVV5NJR5ePHegd7uGaAYleFz", - "encryptedKey128": "AeCp+Um6bmAyUfvPEWU15t8tZm7NLXHUGzrqK/MZXviIyLn7eOzOXH7/fR60EgxucQ6SvE0+c/Kyr4a2xXhrI4E=" - }, - { - "plainTextBase64": "6890TzA=", - "ivBase64": "m21L5KGLB5qUuLET3B7V7Q==", - "cipherTextBase64": "AZttS+ShiwealLixE9we1e3SE30Cc73wylpm7ALJzwO0z50mNRc/tHlaqyVw2siFyucT4UZgeI26eEdRRWgJ6L0=", - "hexKey": "8142a100a944b7b2189f12f86b209ba3c84feab263f4ae4c63375493283c87b8", - "keyToEncrypt256": "8ad087653b22e2cb6c8f4de56855c90d4927631475746244ebe538e5b3af0ede", - "keyToEncrypt128": "b518c68b060cac294e13a93712a5a299", - "encryptedKey256": "AZttS+ShiwealLixE9we1e3z9gHmFM9r79eoa1/CXvlYtL/d895vzucNkYNGm9z7pQFxpL2OQTD40jG4btSwU1x4f+cQTB3dzp0iJIJR4H33", - "encryptedKey128": "AZttS+ShiwealLixE9we1e1ocKG9hmJu52u8M1GUtg0/uH7ouY7CRfQs1py/jG/KEBOSl+w1geK68kZoezCzIbI=" - }, - { - "plainTextBase64": "Ql6D/TNX", - "ivBase64": "Fd2+X3R9Nc+4QqVhEjnPiA==", - "cipherTextBase64": "ARXdvl90fTXPuEKlYRI5z4gmZnz0qAj1n75+tocfE2PYbJ/B76b0K/PtwGU8o1n5QWJTqaDXIGRbuFwDYGeI+8w=", - "hexKey": "606068f7375388096486eebb62e1801e34ac9f320e30a5b1702fc3a066b29864", - "keyToEncrypt256": "5e6880da101e3cceeec57feba663bc1db154802822a6c7b9711eab6d87862efd", - "keyToEncrypt128": "c5a6e2bbf45c6f90a8db403d94fd933a", - "encryptedKey256": "ARXdvl90fTXPuEKlYRI5z4gCyXAgho3DjAhhv7CYHWLtnKRagJrtKmM/M3+/TlXUQnPZU0cybfrHILrHmgRa3f+d8qLc4frUdgV2KjZUKA9T", - "encryptedKey128": "ARXdvl90fTXPuEKlYRI5z4jHL8svI8vx+qM9GKSzKFJq0rfY9d0hEJvlqv4Mh0h/jGeQZmQEfH1Gwh0EJ04DLlA=" - }, - { - "plainTextBase64": "IF4oNGM6fg==", - "ivBase64": "GqAjRs8PzXTaZMGnVCJysQ==", - "cipherTextBase64": "ARqgI0bPD8102mTBp1QicrEyEfM7hrYogtsslTSPTK5a/cpGahfHeeqYPcVY8oWWtIBhFeu+uWvE5j3KXIQfg18=", - "hexKey": "3dda9c483db26dc68f78c0fc4782a740b4f57d944b4522d05f21f95a4a856978", - "keyToEncrypt256": "8d68f9de678b07f2350a2d68dff035bf7af89b20bde4c4dc1970880fa39eda50", - "keyToEncrypt128": "35d21c2626a9905238444046bb1e9283", - "encryptedKey256": "ARqgI0bPD8102mTBp1QicrHGKoReniu0P7BOH2cNcfEp+CX7h2wa56IGQ+cRTrJwO91tBlnMo+9tTOzlzvK8mPBlimfxoI3VocC12rkR8CBY", - "encryptedKey128": "ARqgI0bPD8102mTBp1QicrFQVgBztnrHCOX9MWB0Clc6Abq58X54F7T4u7n/ZW3A0NJwah75l035F3F17K7MPrY=" - }, - { - "plainTextBase64": "DnYL9GMY6xQ=", - "ivBase64": "ZV3/QhEOEYbYnCkldEXXuA==", - "cipherTextBase64": "AWVd/0IRDhGG2JwpJXRF17hg0C1uA+1k7Z0eKInZND3dstEscy005i0CugYCVbXOKDrC1ij5NPIfRLDg5KHASjk=", - "hexKey": "7ef3c30f371689a92a6397364bc1fef60db1db8beb64004a841eb506dc830f3d", - "keyToEncrypt256": "2a85868cc771299849bc71436f5b1e72264a9fb32192ffee7411b9debdb6ebc2", - "keyToEncrypt128": "d07486799325d681da6203deada1e581", - "encryptedKey256": "AWVd/0IRDhGG2JwpJXRF17gTltNU7s+RcdBdax89AccjdqFkbngIRI30SOydwSewZr7Acw3/GcgR8RejIi8fFye8No1scf+qO9nXPjWNwMjp", - "encryptedKey128": "AWVd/0IRDhGG2JwpJXRF17hVngt/kW/mPrRDMKGInPXhkHZlFiwjcAY5mrFfMRCz0+BT4ylytmHmwW1kCZm2l5c=" - }, - { - "plainTextBase64": "NONJkrmsymfz", - "ivBase64": "3wlJMg8e2WTMeuWCs693mQ==", - "cipherTextBase64": "Ad8JSTIPHtlkzHrlgrOvd5nZzpe45BFGSjbWCdCxavpi+p3UI11Owr9s7vPv33eMy5Tel9l55cxMtP3KTR5ajSQ=", - "hexKey": "8a3bd5ea4658503cfbe4ee93560a7fdbc0dcd64378183b82f9276ace8d606aa8", - "keyToEncrypt256": "648b8448ec881f855e06b56918cb999aaf8dedd4606091cd7f17470eb096dcfd", - "keyToEncrypt128": "2880c5f29b645a6f309c2e2a2e6ea0f5", - "encryptedKey256": "Ad8JSTIPHtlkzHrlgrOvd5nJv1hisyk/NSXsUYVnbiRfkcAHNJpfrYyddI7bDu0xg247rqq+GvHw5nINO5K0J80FsLyfnPHQonqodkQB2+22", - "encryptedKey128": "Ad8JSTIPHtlkzHrlgrOvd5n0NzPeKvjJ7msdypLhQID7L2GY+srpf4RSGvjhLgNMvSj2wL1Pz41brftaFK2fPeU=" - }, - { - "plainTextBase64": "KUmUz+uyROKgaQ==", - "ivBase64": "2rN/svzWWISu6qQGbiI9dw==", - "cipherTextBase64": "Adqzf7L81liEruqkBm4iPXfpvelHMiH6cHfjS8ThTmeF+huunuQpbXTmAk5bjgMY7yy2KysXZv2mbxiVuUTL7sw=", - "hexKey": "c8a2b3ea5cb1270f664fe0c35e58037a8ead720f3d49c60bdfea278d2aafa14a", - "keyToEncrypt256": "8f60e4a5f740cccceb7b698e23ae4d8c0c7ba69c287d5a550bb711b50e8c5a30", - "keyToEncrypt128": "d67cd3c03a091e51e20a40778c974698", - "encryptedKey256": "Adqzf7L81liEruqkBm4iPXe0TTwZS76kMYMh3Nc0kYIT4sfOd0YR/jVlp6+GGPOYmSF23yZ5e5Hs9Pwd/+Ge4jIepT3545vWeOiUV44iU3tX", - "encryptedKey128": "Adqzf7L81liEruqkBm4iPXdGDHGU7uFfyJcl2nWAfTq002/h84sdkFJVxEAVBU3WMIUCDoLuaqtnNYOw304bMRE=" - }, - { - "plainTextBase64": "HLdQQ3mTWa6VC8Q=", - "ivBase64": "xuxyFUgc2aK0J7xy6/ilIA==", - "cipherTextBase64": "AcbschVIHNmitCe8cuv4pSAJyKtRm7a2Svj06Zxf+2HIMcyl7Gksro+OM9vEJlOGC/QXQ+J89FzcVafpc5e/a2Q=", - "hexKey": "d1b8e6fe6f85525be41308d0344f46dfabb26f51846429194d58e460b4174b11", - "keyToEncrypt256": "630607dbb5cba571cff254237056bd5fcf6374a5742e3f37c6fcfe18b25b49c1", - "keyToEncrypt128": "e9fe0e6b35e928984399eeff006cb52e", - "encryptedKey256": "AcbschVIHNmitCe8cuv4pSCccIxiF2jB7Y0sZ1ndl+F9xZMOW/0GW3ecGh07YNSadRiwXaQJt+RzrvqoXkErGmZsY6AE7SS1HROu/FQv64w8", - "encryptedKey128": "AcbschVIHNmitCe8cuv4pSD3iLcCc4u+Xbx/R08yGN8Mqs80vU39Rz8nPmTknnDO6Ijlwew1/2vXr3+9pcGNcu0=" - }, - { - "plainTextBase64": "cVJMnK31+t4Z0J20", - "ivBase64": "tv6qHvyzX4h+zQNQ0bDKeA==", - "cipherTextBase64": "Abb+qh78s1+Ifs0DUNGwynjON+jMe11WAqTs4PlCnXs3oHdxMr5qf9n4cKX3XNGfjimGvmoA37b0XrygmdZAcFg=", - "hexKey": "900408bbe3435f2f134cdb55a8b9aa535d9eb6965c7b9dd0a370ace104136899", - "keyToEncrypt256": "b04390af3d06e849df390c8684ec5e1680a50a2ded700d841b9e4e147f3ad6bd", - "keyToEncrypt128": "f24d8b1c9089df6066c79481d5141917", - "encryptedKey256": "Abb+qh78s1+Ifs0DUNGwyngxYXpZ2tVIdaxE+j5JId1oSb0T0eHZIxg71GPRz+KK8UlPP72VrKXrCgQPVfzaWkTEEUWIq0dCtwRLHj1lfvEw", - "encryptedKey128": "Abb+qh78s1+Ifs0DUNGwyniw4zkn8Fr0pxNsIruqs/8CUs5BFz1urDCOI0zfCj5jk99Z0strYZ2FCyPLJaPnmP8=" - }, - { - "plainTextBase64": "MGwqthek1g8cuIt3cA==", - "ivBase64": "h1ldnPF/No9UULC2DAJltQ==", - "cipherTextBase64": "AYdZXZzxfzaPVFCwtgwCZbUYYuFI8dVm+v6U50f0MTGDi0VkILfwk9dyPNuZRVPt354qZbMZ0nrfAJCL3qnWgPs=", - "hexKey": "30e39292a7bcf6081b2a262a18ea9b9e4cd6eae64a9998fd2d9e2149008b8862", - "keyToEncrypt256": "2761cb53a9e8714a36ef558438f8532247b29af9482ff08a418fc4cd23d1bff4", - "keyToEncrypt128": "4c4c7ee3c2031c832bcd62104fbc5d31", - "encryptedKey256": "AYdZXZzxfzaPVFCwtgwCZbXGyhK/xOxN7RRopFvQDan8+KcbYEFJm4OY0BLuo2L05Dk23uZL5zF7PL+ONPNTcPlu0pOUumucGbtMEkGcvaZ1", - "encryptedKey128": "AYdZXZzxfzaPVFCwtgwCZbWr/ieFpU4uFWqfbjhfigGYrNNV1Ze4r/Lc1Mi1cV0s6IbtDg5SNAZca8LPyUltCR4=" - }, - { - "plainTextBase64": "PYotYZZxSY98qu4E8JE=", - "ivBase64": "nseypLJ3W3XK38iLfo6nbg==", - "cipherTextBase64": "AZ7HsqSyd1t1yt/Ii36Op24y+wrxLWeBuujAJop4OWDQ2danjqDCvDCYVHyfVAh7qcvVSGlSCwhm0jJn/Fqs9Hg=", - "hexKey": "ffba271fcb1919725d79a8f4a7e3f29972864ddc62a5c70849e208e415923a8c", - "keyToEncrypt256": "41ba1d3bc70c3969d41f60042bb6be7b2023d9e1cc8a5f6a0cb435f45db5b69c", - "keyToEncrypt128": "0109e832d7cb6f0bd943dfc2596c9f71", - "encryptedKey256": "AZ7HsqSyd1t1yt/Ii36Op24v1zST1gCFGG7n/tg3WARXbr9AsU2IyLEgcHDlolDDdy55psuv6s0Ub0gqj5DFv78amyfAtUuPzsA0XPTX57zG", - "encryptedKey128": "AZ7HsqSyd1t1yt/Ii36Op25EoX2rchP98hads0RAFzCgGFXa7MVPQzFM5i/X5nnuCNDe/DRvNWIe7xKZZVppJrs=" - }, - { - "plainTextBase64": "Pqfj2CKHybRVwUUDijAQ", - "ivBase64": "Qw4Q61tem/2+PMvMqXVjfQ==", - "cipherTextBase64": "AUMOEOtbXpv9vjzLzKl1Y30upQdEtvFolBcxU1EOkYZEyNecSe997OaAsEHYdp1B5tF2T/FIBYFqnUQr+jGoRiM=", - "hexKey": "2e265f54862db23dab3cceaaa19d5230d6a7a8b2227613e7371e8d01deb0a07f", - "keyToEncrypt256": "3c894fea7d992ac8fe696ea039158e78e327eeac9b0510bd9999a479feeffee1", - "keyToEncrypt128": "1789d2b8a8223089e62f4667884a02cb", - "encryptedKey256": "AUMOEOtbXpv9vjzLzKl1Y30YL6q4gYJWAFh5xywNAl+qwwP/XK9wYHilPHYU8UGpg+IYPXM2/ed9YzpjFHgJcnVn4dhZcDrnp7isDDy1uYJS", - "encryptedKey128": "AUMOEOtbXpv9vjzLzKl1Y31srw7Y1i2T6BqC619R5bOQc37TZQBMBBYFpYO7SSv0m4ai3Z1Wr2M3YMtQ590soRA=" - }, - { - "plainTextBase64": "RMX6WHWTC8sBGv+p2oeaTg==", - "ivBase64": "BSg38k0X7e885E7Fk/9NOA==", - "cipherTextBase64": "AQUoN/JNF+3vPOROxZP/TTiHvn5/GcO5Y5A61eg83W0E5F4ozs7Rkfuof40kP9fBHq4klYJ5ezwdQGg+QeGidPqV5IXrwuNtnfr7FDT72qQ/", - "hexKey": "4c513a7684b400e00c0001e34b96f4892000e9513a0467db360f84c8276022e8", - "keyToEncrypt256": "b5db363e1076240911efd988af6353355f4096383e6a5236c2ffbcc1397a3e5b", - "keyToEncrypt128": "dccc12f20cb454d15dd1668c1405412c", - "encryptedKey256": "AQUoN/JNF+3vPOROxZP/TTib5jjRcxqlsPijZkHfLhCbT4oIKBM2ySsxCy465MsqL5gOdDa1F/HQU5JnHgWOSVfxi2bOAj061ld+AW086Lg9", - "encryptedKey128": "AQUoN/JNF+3vPOROxZP/TTjMIpX4KDM0lKfCI4TaNg5qT7G+/42pw8KqkVOKE1TRK7dsex/FTkE/2Fvm02seOgA=" - }, - { - "plainTextBase64": "eOnO0eH7k3EgDEnwkrEg6is=", - "ivBase64": "r0XgfxS4ZcGzxkpTG6Tv8A==", - "cipherTextBase64": "Aa9F4H8UuGXBs8ZKUxuk7/D9L3+6znCMUQ6l7RRMWA8QgCzlxRK/rO0SBAh4ZkFO3EQHYets86Odjgo3mOXcCtNhiwnSV2mnC8RVXFOYom4T", - "hexKey": "e0d04e22ad35900fde204b053b70820ae90310441cd7a947c6bbdf98a15732c5", - "keyToEncrypt256": "8356e6e224d52d50b33aaf7c7d17547fe64402f75cc91ce2523c5801e608704c", - "keyToEncrypt128": "c5cafbc49b7f1569b73f7d6336435c57", - "encryptedKey256": "Aa9F4H8UuGXBs8ZKUxuk7/BC80OZ4jiICZoOEldzNDY57uKhKL060bV2fOZkg6fA6aWR8XpiB7gsACwUqdZvXwMl5dlbfAPVpSYlGjazXT1d", - "encryptedKey128": "Aa9F4H8UuGXBs8ZKUxuk7/DCiQOD+aHcIJ8FwhpJXHRUDwznBtpDOBfgjtk12qxG70Ru2giW8X+saj53PDF3PR0=" - }, - { - "plainTextBase64": "tRnRdj1yTWPc+ioQILtYtbJt", - "ivBase64": "TpWLqwivXR9QBNsKstg6UA==", - "cipherTextBase64": "AU6Vi6sIr10fUATbCrLYOlC/zuNHLFHVIdgENAZtt0+qTANKMAebQkJfalrUClrg1ZaHPbGuR2qe49BNggqLdyTLfYLnXHW1WhbE2k4Nlofy", - "hexKey": "22c604513522da25e0dfd51437753a4d6d9c13a39c9eed81a1737e5824e54037", - "keyToEncrypt256": "9a42c2fba2839ed5e384d3328d18049cf17ae692e1125e28058f8a489e1d5abf", - "keyToEncrypt128": "abc808d6b49b068f1e48c2468ee38389", - "encryptedKey256": "AU6Vi6sIr10fUATbCrLYOlAbtfsOqJxrLCLXvo4v/o+8VBP1MgHO3tVMNivs4/vzoZrM5rqU74ls/hd3yYie+UqDT1JlqoX3LzS9YgwYmvml", - "encryptedKey128": "AU6Vi6sIr10fUATbCrLYOlCZQ0cP78d71iVycDxVM2Jtlnba3dFQBtvOi78Gkrm+d6UanRALH8+vA3NyBfqzt9c=" - }, - { - "plainTextBase64": "7W4nxXw/PFWdvEG43Pg1IgsRGQ==", - "ivBase64": "xLEZAdR7n6UX7v8SDe29jA==", - "cipherTextBase64": "AcSxGQHUe5+lF+7/Eg3tvYyF0l2YZIg2esidBwepzNzcelPYf2r65lY/ckzFa4q2Uo5BdF0OQ/2g7z8w6guPKXPPxNU1ADJ37uMIgOa0r2dz", - "hexKey": "50d5cf6ea26feacc4bafcfe89cd4ba1b591e032115956418877e0c1532d84dd5", - "keyToEncrypt256": "dd66fcff6c56b7cf6a20d6d081670bd5ea362bf461f53262bab490a75e1a008e", - "keyToEncrypt128": "7861c4534444ae59f117eeb66322afae", - "encryptedKey256": "AcSxGQHUe5+lF+7/Eg3tvYyym5MFHoB2kXF3E59uTv7I6C7mQfvAU8wXcEPgeIfAoeLgsnvMf3RLjWlQBeoSYZQOVEbQ9R4tVn63K7qC5cza", - "encryptedKey128": "AcSxGQHUe5+lF+7/Eg3tvYwwrxP/PkCqZoTHB5tBaIQkOZEGftesBFzSULj2J4S60b2V4RgKPBWQGTG6vq8QAUc=" - }, - { - "plainTextBase64": "4ShH1moCATBuDDEoJbaVOHwn5gA=", - "ivBase64": "h3we5Qf9qwc/BtXm2mh8TA==", - "cipherTextBase64": "AYd8HuUH/asHPwbV5tpofEzA+y/QWXso9LPdxR4lWf9ZJPZMVixYcITVvtopjsgfmU6Acev8ARAWrVn34S7GgIetVP+m2C9eXjPWl2Ej4qY5", - "hexKey": "67cd9e7a7b80fc0bca91f062ce6f903acc1280582e218b092ce3a208f20c1168", - "keyToEncrypt256": "35a095ee0a56de56aadaea5123f4d153305b9e872f361eb76f9e30c1bf865d31", - "keyToEncrypt128": "4bf5a6fa9f7b59e628bf55d993c97c65", - "encryptedKey256": "AYd8HuUH/asHPwbV5tpofExsGj35vtda1CjHcIsWTh0RBvf1fT30FoyOEnlrP3DTIs4QRhoy9BGKzWk6Nttan1i4avEG4MEmBX+pvKkV1QMy", - "encryptedKey128": "AYd8HuUH/asHPwbV5tpofEzH5UmoMDtJEDdqDfmBxtxcMn8OOR+yY8ZymDS1PDTTyRmmaLg4MlV6IfrTDuiqTxk=" - }, - { - "plainTextBase64": "6gm07/ayzsbk8jLDEE1zqFOg8fJo", - "ivBase64": "YhkbZdLCOxR/K6n/t8Y2fw==", - "cipherTextBase64": "AWIZG2XSwjsUfyup/7fGNn+fdTXH5J5Wxzt5MAXRve7MUhgHUY4Py/QVgqNcAfN2+fn1mlRpfzGZxbumcdKFziu3bzK4evS6Kglhujjs9Ryq", - "hexKey": "08c8a23791b89aba0bca788a063fcc5760f9fe4e510451ea00b275bbbbcfa476", - "keyToEncrypt256": "ef05bc1fdbcc8f205e12f56423a1c24392f32cfafd8fb22ccb1487cb4236a8f5", - "keyToEncrypt128": "aff20db41768e323d5a86551b7f8ac1f", - "encryptedKey256": "AWIZG2XSwjsUfyup/7fGNn9WOEqUTnS6Xi5p/Ye4EmCEfKLcgYOGqrTzWJZmPp+wvIIEjDWayAF145oNXP1jydSlE6gsl4iLwRTzqwMQFUQT", - "encryptedKey128": "AWIZG2XSwjsUfyup/7fGNn+mAXX/HKerwpNnPViiqQmoqzAHj7uWknm/sXuXUvuSGzyEBPikTbM/MQxm979sKn8=" - }, - { - "plainTextBase64": "ptfY3B7m+w/iF/r7kOKHFQZx40peaQ==", - "ivBase64": "VrGR0lsRznifyM7CsAJm+g==", - "cipherTextBase64": "AVaxkdJbEc54n8jOwrACZvqenPkEdgETMnuJsjMIFNlPJ4rAydwTHFhilMeFgy3GNp1MyjBs7WyCZXEHMFLw2Uasd/vIxryeTqxwinRlKZEW", - "hexKey": "9081ab9b98b9a015ca7e9e17536f3177653708eb9bc0b52c8267c4246a3a1fc5", - "keyToEncrypt256": "74470df846dbf380f465d3dc9133939827e3474636e3219d65a53e2812ea30e0", - "keyToEncrypt128": "daf198e1f40c45ec260132497b0deff1", - "encryptedKey256": "AVaxkdJbEc54n8jOwrACZvrAH9dX9W+Kq0nf/16VN4VopcSlhDFJamzBPqJefSieEiTM3pbSDk9Go+C18dgas4bkh0wpNlYovX7UZSdxMTex", - "encryptedKey128": "AVaxkdJbEc54n8jOwrACZvoS/OzJaS88hECyjK4jfMaw9pjr2bLGw4oqUJxWkrZzPat2ZulKvJLVRw02j+S9QdE=" - }, - { - "plainTextBase64": "KkjBAz6G1AWZRFvm1HoP1D8Uo3FuM0Y=", - "ivBase64": "OtAkrRysMWcvLP5U1HJaRA==", - "cipherTextBase64": "ATrQJK0crDFnLyz+VNRyWkT31wUdtYC4w6VCeUL56Bjf2TFyw9pwBm3NCwy8qRBvCfELv157jPa56N92sMYw6bbGEGn5KSzz6Dujy3In0Ejm", - "hexKey": "43797bf457c189e48d71bd310b82877cd4bc27e443ee6d5e325091999604cfd3", - "keyToEncrypt256": "799377252fd6d88b3daebbda98cfd8b73256d66742f216000d5d8297c0bcc113", - "keyToEncrypt128": "2c011a96cc3650775f8f232c3289956b", - "encryptedKey256": "ATrQJK0crDFnLyz+VNRyWkRfRubQ6Dmyu0DwTSmOkJlkHq6/Eci2Cmxh3CiY4T2rJ6bo5eWpYhMEmR8x+OnPyh3yVwl14mwSO+xysv6rx4zM", - "encryptedKey128": "ATrQJK0crDFnLyz+VNRyWkQULWz5VlCj3uI+zygXRJ6z7bZn+dwYmufGFlVC8woc6xSHTBT1y0fvwLbQ+mHPJd4=" - }, - { - "plainTextBase64": "UEbtJsekN8F0gskOAAeOC9fT+VqVdeI7", - "ivBase64": "uHTBZReEqW0avOFATQEsrQ==", - "cipherTextBase64": "Abh0wWUXhKltGrzhQE0BLK3qtGDor0LQuDNz5T4UAf0tlNj4YQ/LbvFVibTDLaZ9MqrQHrJrU2ifFP967M052m8DVjq/jk2Fc6KYDIsyzvj5", - "hexKey": "9098a69cd774d598d11ce7355d3322df3cb44f369bcfbd1e0bd04b046d747763", - "keyToEncrypt256": "f91be0b668e999d43d4a8d3d798cb6642d00f45cde9be8a8c5a05fdce76c3864", - "keyToEncrypt128": "df52a3ca6c6930b93847268b4b16501b", - "encryptedKey256": "Abh0wWUXhKltGrzhQE0BLK2kV6x96SWI74j8fIiz1sXrGUNlb3wKPHKfteoIVszuWcJQXGVzmjqS+TTsnRAeoQHYENZFuvMU3sxx+iCPg1ko", - "encryptedKey128": "Abh0wWUXhKltGrzhQE0BLK2MRnMAqrrf/qK6QQjB22D2/PcTH5jzmY/bJzwrWRZnjCnjH3mWg6AbuxcEsJwo1AM=" - }, - { - "plainTextBase64": "VuXic9aRBU9cdoI1i6WhCvttdPEfZNzFSg==", - "ivBase64": "ciigJMNvq4FDlYnxTIYyQQ==", - "cipherTextBase64": "AXIooCTDb6uBQ5WJ8UyGMkGcKBPD3bMZC6ioXCXAp1SBNzha2FrO2TNhVZrwyNK1278wMKMAZAXkg9GOIbRRyvw4QMO6SmfRtRR4HiB1VOzT", - "hexKey": "4e33a8bdd6c231a471cbfee50c03c8409b17bc45d8e4047663d49e974a20f9a7", - "keyToEncrypt256": "757f220c35cbe924f12daf1d2b9d92922522e0560f5fb66f85e7230bcabec585", - "keyToEncrypt128": "af0625067ab05fab6761c2998a441bc7", - "encryptedKey256": "AXIooCTDb6uBQ5WJ8UyGMkEmNwF23Zq2WdthR5zNMJukw5L7pTmYqyZFuhD7cs/bEqc25XOAujCZBtWMuLK6D5xBeSUtHMLMg+oqH0WbbzmV", - "encryptedKey128": "AXIooCTDb6uBQ5WJ8UyGMkE/YsgkAA+P0EbzdxjFI5aFCdxXc9tixDP5iT6aMVj7+7DLQL4rlR2x4ODMEE6owxI=" - }, - { - "plainTextBase64": "fpAP5mA3G8YtWkJUIP51rk3ehkwm9tKUaKw=", - "ivBase64": "TUoMWEX0jMVpqph//PFV1g==", - "cipherTextBase64": "AU1KDFhF9IzFaaqYf/zxVdaAjpRMfGtbqUhtWrmNSQAGa9BnBu/1E6R6b/AZJx12lrgItl+xI+5mz3sokPSDjPc8bSZlYtW67iFlQG5IEhfm", - "hexKey": "5906e8a39d405d4f0d71a5467ed1ed885ec5e7eb701bf40629f65dd7575baa36", - "keyToEncrypt256": "467e1b15adf01bf0b20fbebf1d05426dc9af6bc8789c4beab8a50e19a8d342af", - "keyToEncrypt128": "8517092ad367b56ef5895fed54a8d2f1", - "encryptedKey256": "AU1KDFhF9IzFaaqYf/zxVdaa5UyjlpszdI/rS3hbULDAtVYiGNsGKzVpKEVAsG4XZw1kXpQs8u3TceoZpRxT0ysSineUu5Pn0IxFi9Jnl9Zj", - "encryptedKey128": "AU1KDFhF9IzFaaqYf/zxVda/MFmQbWanhIEHBu3xjMLDyVRd8ooTcMIpWaBNiX/Ctp0xLEh+Dikxi5HbGbAlPvc=" - }, - { - "plainTextBase64": "T9RhN02XrRmfwstXPQg97fRTMUwCaAUmQqhy", - "ivBase64": "9lToeThyh9oNV3rAk9gHJQ==", - "cipherTextBase64": "AfZU6Hk4cofaDVd6wJPYByVJ7ZK5Iq/4q2bmfrSDC/oKZFy0Zh5I/i8qSDL4eptxNGvL5KD6IzKTWZvHmQx1gi0Y4cSFEJG3TBSz+WTuNcon", - "hexKey": "b4ffd7b89daa868222ee5de25f2c74458c26e72093cb4fbf7aa3e6412a04aab6", - "keyToEncrypt256": "618ba3aa10bad997c2832cc3ffc090be648014f5f4c5c0bfcd8631907ae34ed5", - "keyToEncrypt128": "fe0764688b4a415481aad9cc5363cb55", - "encryptedKey256": "AfZU6Hk4cofaDVd6wJPYByWlPWYFmc3bNfUroNtMru6+GBFEydzS1aS7OtAgZWvCbFLRiRZpUN01PmAGNFE1Z3UR5eeuoUwdIgLYdgdgrlY9", - "encryptedKey128": "AfZU6Hk4cofaDVd6wJPYByXIgkKUqUj97malrNBQn9HYd6TOrzgX0+Lm9lxuKyuFcPgyeZtFwtJ2V7OUffgw0vE=" - }, - { - "plainTextBase64": "tMAHeYJhlahssqPc5KxWAJrO5/Tis/1Ok9iYPg==", - "ivBase64": "YAxW07g2s91UX/4nyxnWlQ==", - "cipherTextBase64": "AWAMVtO4NrPdVF/+J8sZ1pXRIhF1N/CB+4K3S8pA1+eomBoJ3JjSxvqi9Yq+DKnWc5/DaTvmi4RTQBOsqASUaPRTJ9Idt1POpD2OJ+u9Bkf4", - "hexKey": "0c9acd2f2a46a57f7573ee5c90cc4ffe62598ad9011b59b92bea341a432e74a8", - "keyToEncrypt256": "f48fd097f2ef257999e426ef78b4065511e3fe7c8cb92e428307a2e7e1213a06", - "keyToEncrypt128": "6198526384af2e63642834a3cea68719", - "encryptedKey256": "AWAMVtO4NrPdVF/+J8sZ1pWorIHY80+KeUy8zS8Mrq67PDEZuCLDxt5JI4KVXWanrAch2EtZNOK5YxYhS56jUxy3/iKUOAwwZE2BU1M4oGfL", - "encryptedKey128": "AWAMVtO4NrPdVF/+J8sZ1pUIo1nfyhdadIDUR5FpDkH+oZw3M1DWaBVTmx8M02ngcDs02KmuGrzhuH5Z/4iEQY8=" - }, - { - "plainTextBase64": "8kK/hUszzRcUJWuzOv+RcvZSqiPQW7zw3X7qwPg=", - "ivBase64": "J14LPDY9z7Sb6g6kOVyl6Q==", - "cipherTextBase64": "ASdeCzw2Pc+0m+oOpDlcpemN1QjsHB4tC6JBSTZmZ6ZbppupemZwpF8W8m4PtMi7xcsH0+P5amGenslf75kc6545NgdAkVghoYCbza69GhG6", - "hexKey": "33eee06bb3820d759a7d3313bef15c2a37dd3d18b12bdb0a36a90521457ddc96", - "keyToEncrypt256": "abece3fdcc12b7fd387f7c65d2aad451b75f97fd0f24bf046f84a2641a0b444b", - "keyToEncrypt128": "88195c08e31d8e8fbd8faef2a27558d7", - "encryptedKey256": "ASdeCzw2Pc+0m+oOpDlcpelAwhM/S7J35sUb8yksGJUEhpvhahiUxPceqkTNLuiGN8QlBhSKbhXSS+uAtCzE0eqi/cK6dPEVJagO1+Wmet0J", - "encryptedKey128": "ASdeCzw2Pc+0m+oOpDlcpem8aapw5OVcah8jJUEmFZ+THI7HsHldjrshEqcC+2TuRLcp3rPhZQNFGRbuBeMXnDU=" - }, - { - "plainTextBase64": "yumT4Tf46zsr1l08ELZDf7aUebxsfjN/307eo/sI", - "ivBase64": "f/lw/JBHilEnnAJ8cch2Wg==", - "cipherTextBase64": "AX/5cPyQR4pRJ5wCfHHIdlrB9FEwe9B62Lq4lHFg4WIpgdQZLJfaPAZbgm6nXvl6p9f5eOstC1MhpGH3/8Q2iFHnvbJrQJUMSXekGR8C2Hrs", - "hexKey": "9b8553b5c01afc748f911d5c2d7f04659f955ea53e5830dbd05bee1bbb6b207f", - "keyToEncrypt256": "18c05af49a243b8911784150c123c3327d47ee9bb887e4df339c7934bc427cd0", - "keyToEncrypt128": "916920eb57ca5f045e5f708d0ac01ff5", - "encryptedKey256": "AX/5cPyQR4pRJ5wCfHHIdlode0IFgysMT7g1R1k25426DhIo19mn1OrU8pnL6EQkNgy9UtlMXTltL6RVWUN2zwwhYTJgck6QZG3+CY45Pzt+", - "encryptedKey128": "AX/5cPyQR4pRJ5wCfHHIdlqelsuoxbjzGGBPUf4oAmBf9rxzgVxILhbkGBJgr0PpM3ah+FedIch1l8XUM6hu0T4=" - }, - { - "plainTextBase64": "LXEzmX5vBPLocHKJb279PRSpgQCfCQ5hUmEM9Acihg==", - "ivBase64": "wZT4FUExxS4sB46KH+7vcg==", - "cipherTextBase64": "AcGU+BVBMcUuLAeOih/u73KggEfW2lFatLjY/WbgB5Snpq1n34F9cVdhol0+4JyLQU1mXfpLzl4S3SitGQsouIpul60n7dUnB4RJGa79wJj2", - "hexKey": "e526fa9adc3ce87ba97d1d66a2ec2297cf20c3b83c60d400dca91395b519b663", - "keyToEncrypt256": "b7be94d320cfbe916f27ddb2a8b86db8636950eecc74f95e1647b18785b11cdf", - "keyToEncrypt128": "89003a077b4b02be63dafe344a6c0f83", - "encryptedKey256": "AcGU+BVBMcUuLAeOih/u73L6aqiceY6WSku/SwDBKNXU957Dfmuuk2akUV79+UiF7m7v0q7ozxGiXWvrrMvv6nmtHCALkp5PCfkti1XFY4f3", - "encryptedKey128": "AcGU+BVBMcUuLAeOih/u73IPx9vdJDvfJ43tki0kYoXIMuLtVkFLE9U5tO2i9O/FrfYqkllo6rIS6lJKvkJ+JDM=" - }, - { - "plainTextBase64": "xmRQ0KlvDmDC3OIAByrkXXLQYzOebEJLDkgjzfkYuYE=", - "ivBase64": "NI5IiNIRdQjNcgdO3yv3NQ==", - "cipherTextBase64": "ATSOSIjSEXUIzXIHTt8r9zX/ZG1bdJszno6sTpksORbi4e4LdzNXwsmIPGS9fIHq1NzWD/Kg4SsEQCyBO9q6bqI0BpplyrbtF6KdQM1MzraEg9EVe/9KtlcsB6p3LEBLkg==", - "hexKey": "0763e156c88a2203cea6aaa0f8b15853f678c9cae0e0a3383bc398129168b32d", - "keyToEncrypt256": "9bd30ac38e28537f81b28a8569b7045dd8c0ac456214cded4573bfd1ea4a1d22", - "keyToEncrypt128": "73e1cd9f9433c58e205c6de0e69709ff", - "encryptedKey256": "ATSOSIjSEXUIzXIHTt8r9zUiEdCbMhqlkmJRX0TWcm2D98BtOQ15D1ZBiKR/ZZ64xJrJC0IgJLkH73ZBXmg/CtjtOx9DeyNNHIiRuxbpbB+Z", - "encryptedKey128": "ATSOSIjSEXUIzXIHTt8r9zUeZrnjsKgaLMDA7NqSX7QyUntEzAajewe4PE513cZ4xp6wNVKTzhZtSscGuuPifOM=" - }, - { - "plainTextBase64": "gHYT1k0oebdv53SpqxECpwRDhfs8xt8vBEVlFTs0u+Yl", - "ivBase64": "b2bmn3l5EkdWoo4dFTbVKA==", - "cipherTextBase64": "AW9m5p95eRJHVqKOHRU21SgGkRbPmMQhoFTACJ2CZsXtg8tcNCKMk9DBEeNW6G1xFmZlZOrNJyFzUHfT7jl+qgN6dTwxNbmWJCNGBcC6ABWnNgAhIuHLhqNv6YPd2PxB8Q==", - "hexKey": "174c039a6e808c63486d3c694e6e8acc3e5687210151ca27257f2302a8250b91", - "keyToEncrypt256": "e0f61c5dc7cb47644ed6ed8d1959f01e0dea6bffce3dc3346d6e652725d05a64", - "keyToEncrypt128": "67c360088de6768e45304c2a50f1a95d", - "encryptedKey256": "AW9m5p95eRJHVqKOHRU21ShZ8SXgXYyejs0I6n3oNcbrRFGIyPysZjhVhscu332n4TNRlpJcDo18i2sQ3VOmTrGAexSdrS9GlWIjGhAiKrXR", - "encryptedKey128": "AW9m5p95eRJHVqKOHRU21ShAFbwrnF69YT7Gwzqn7RRhmaAofaGozCB9kBEalvlXYrHSgB9SExFwCls9RA34sc8=" - }, - { - "plainTextBase64": "CHZKpF1OS6rNDv/Qd/sLodE/3IOmGQhj6fLkETk2FSfquw==", - "ivBase64": "UfQ+opiSqqlWuyb4oVXJKg==", - "cipherTextBase64": "AVH0PqKYkqqpVrsm+KFVySqVgPy7jJP9doTiZ/XWdSfOc5mcqEBbA3psVGT9geFkN5xhiuculBDN4sXm/R3mMM/MHj8D1ox+R3zf6hUg2/PPa+G4SqizH9wtWJ9uemnlXA==", - "hexKey": "ea70d1be321f66c2741c29e842b6003fd61d5f25957331f9342533449adda21e", - "keyToEncrypt256": "4583abe6617fe0aa4919c3861a0fc17ac742ba8d4f13277da0dbcecd628cdaa7", - "keyToEncrypt128": "45101741be96627f55338733b8339356", - "encryptedKey256": "AVH0PqKYkqqpVrsm+KFVySo2pJYBe1FFdmyayTViw0dzlLF9BrmKZs5oX/166pRzQZjJDCFVhS4s66YcBX6WjUB5TjzTJ4LlaAVaBu50zCxh", - "encryptedKey128": "AVH0PqKYkqqpVrsm+KFVySowM8EqLPaWQ5aSCgdhn8aQ8rzYcRSt8AeG13gWSDJbpJnVOnxJ3FEbT0CJqGPoGh4=" - }, - { - "plainTextBase64": "naON4JDHGQOC0ey7XQYpiWkGGOPeBYVIkGtW+uWi6DqATyI=", - "ivBase64": "STCznQGnrh9gwtEBQWHRhw==", - "cipherTextBase64": "AUkws50Bp64fYMLRAUFh0Ye4rEwYDwCPbi81Iwotw1otKoNY6UnQcJFqog5iQJiVp2QrrT75VVvehufexg/k3TZOyrnmWVA9Biuwp/2EBn9ypWlPm8UBGQvqsyrv+L7iRA==", - "hexKey": "a108e4104a7d6ddd9c12805a25445fbe5d310cebebf2c777599553d6608fd926", - "keyToEncrypt256": "938d52508014298613d5cf102b62c704b3b33211f91018a9aff20745f11a979f", - "keyToEncrypt128": "0ddcd2c57b476b137eb0e121a01b869a", - "encryptedKey256": "AUkws50Bp64fYMLRAUFh0Yfvk4E/7SGKA8hw8/mpydoDuqf+uxo0CE7BhO8e8e7cDXL7ytg0kpHkps/xteBp6XqmHlJem85Jyf/Mf4223Aa9", - "encryptedKey128": "AUkws50Bp64fYMLRAUFh0YeLe7uAF6prAN9gaji+35xHtbM6mXZOEhnRHxZ11lXs13yPu5XcYMhL0H0RgRQS9qk=" - }, - { - "plainTextBase64": "UtP6hKcBTOwITEg60rmVdyI21aFLTDTL4fbF3zQAKcfmFdCW", - "ivBase64": "lCOZxhyWTvwLBzGQWN2EQg==", - "cipherTextBase64": "AZQjmcYclk78CwcxkFjdhEIWAzPdM0Nj6RGN25C/rejihRBUUjpfTJuJ4PLnsubIS2jmfYpp6DcVQXUpJ/smCNf0FPik7eiGAs1+BlKt9KeQXr6as6o9MLfcGj50YV6Wog==", - "hexKey": "ca8b8e3e1006bf34341d731931c6b486c5eb4b6e2e7877efffa2f01dc53ebeb5", - "keyToEncrypt256": "a2484e99917d3ae19bc504556f6f20179d5e0df15368a1a7c3653297558092ab", - "keyToEncrypt128": "e3a32c16fdd40015de546881dc65c083", - "encryptedKey256": "AZQjmcYclk78CwcxkFjdhEKhwzy+vkcSa8UvPJqVGQY7cTpig5yyGTF5rlqvZGw8Ut8aX2Yd+mQS54xzmTumHN1CfJB/5q5Oy3FaQrm+VoFu", - "encryptedKey128": "AZQjmcYclk78CwcxkFjdhEIdOLnsafHAeUqwFGE6/zzdmsk/HoSEY8xxmPYdyAT2Pqw5nnDbO4URMeSifasYVoE=" - }, - { - "plainTextBase64": "MUSjxO7NW2btos/qIRZxwE7x9wJQPX4T29rjCp0s6o3d+L/IYQ==", - "ivBase64": "f6GoRvyYa7Hp2bd+kSJ4tQ==", - "cipherTextBase64": "AX+hqEb8mGux6dm3fpEieLWshd24e8ShK8ypoyJW8lIZJjGYq1658sW5hrbCvFUSHHt58bSAdRrQGfXQjkcNJg5z3vzlbCX/AG/0TjEFX7UI4r5zhhhp54/DI3zmm2+aQw==", - "hexKey": "e87cdad2a3a353db4d8b8d37671d620ba7fbcaa78d59dd10476f06d101b3048d", - "keyToEncrypt256": "06aa9f01a211e0c5954a5f9e546e66269714a9d8490649e0b4cbf841e814cf3f", - "keyToEncrypt128": "8c56b2bcf6d5e7cbb141b47f07cc9306", - "encryptedKey256": "AX+hqEb8mGux6dm3fpEieLVu1kiNbp/Ua3lctWurizp776ei0411ojsP187OFsOUVYo75c5jpOTeqs856My1/TJEcqb8I4MY/60qQr/StPBR", - "encryptedKey128": "AX+hqEb8mGux6dm3fpEieLXZShwt3FUgayRYq4fTPM1sICeccher84+ziB54yjhNHwK+NbV+WB8tHUQl/5YLxPA=" - }, - { - "plainTextBase64": "y+T3PzD2G0g9/GRJCL3RAttmw6MXUjUGJvaBQdQUuCQdONQvX/4=", - "ivBase64": "1B2b0IbxgnqeOxlzNeWiiA==", - "cipherTextBase64": "AdQdm9CG8YJ6njsZczXlooi7DDMa3VinnIX05rp7szAqgaP3aTeQ0Btlgse2tY6WKgBASS3tdzWk52LiZ8vNN0ypYds6cf2s/FubY2m8G/5F6fcNvVtXX7wkV1Jn7znD8w==", - "hexKey": "7ff04a3f19f424a8c41fcf55c71cbd47b92f50350a253f3638c14b963344c0d2", - "keyToEncrypt256": "f90a65a1e650463f3f00f9488c1a5621542b9c2dcb57d7df4e2c98874bc8eac4", - "keyToEncrypt128": "5e4c0fd5f3a58d465ee9dfa852af16c7", - "encryptedKey256": "AdQdm9CG8YJ6njsZczXloohuu0wWjvMyCDEEmYNTFmYXc5Yf1oqnqLlrccjz1OuPwZZ6mezJLQConi9gASkSwr5L8ww6M4Y3tswhbEn+djzb", - "encryptedKey128": "AdQdm9CG8YJ6njsZczXlooi/yB4vjHt1qMFGHV7X8FV803WfFzaMRmFnyrvg3A7kf9z5coGEb9JAcWiTdTNKsSE=" - }, - { - "plainTextBase64": "PRGuPFNdETMMDybn+tLjoG9U5enH9QHhbfKvsXTUEOM+Q2X2GY0I", - "ivBase64": "hEyzgQyOXCWjKS3z/s44Aw==", - "cipherTextBase64": "AYRMs4EMjlwloykt8/7OOAOsY3eUn+vtV11eDxVPbPURKDDlDlW0kJ2MuaJta852RpmQbJFj4+IBd8HOYxATuayq/wUU+cWrjPJe+V9G20OKHWkHbLIygxOGpLFcOfZmHA==", - "hexKey": "711dafbf991b460920b1ed5b2240a6ce36ddc94edce41b7b9c4eccf7661d6c5d", - "keyToEncrypt256": "0c00fafd6cbb5f891226bc4e36714adfa9b3be110b7498984218c537d7c18fa5", - "keyToEncrypt128": "6468138dbb58a0484f8a69d538745657", - "encryptedKey256": "AYRMs4EMjlwloykt8/7OOAOikFI84/dwe1NrQZ4ZpjXDzg4CciRwKGCdv2CtoVc5TfslXM5bBFGCqA3WUTCdal2kGqcAFro12JnzoOm3t770", - "encryptedKey128": "AYRMs4EMjlwloykt8/7OOAPKnvekYvogmwAd6Ta8SSEo0mwQ9rVBqPE+Q9NRSO90CknjKLrhN9iFCmr+gtCVlRc=" - }, - { - "plainTextBase64": "Ck8t/qqoSKS/D7sDfJRqxLHK4PcyFOBFOklhYYPQwTObDTpbP/SYVA==", - "ivBase64": "5CLORNJHT9+g596HeAWCDg==", - "cipherTextBase64": "AeQizkTSR0/foOfeh3gFgg6YI5cz5hXvnyBIjkUQ5YlBTi5ky7GMZXATClby0nJnTwkBf6EVeSi8VzfeR++o+nGFnLuuJ4L+qVqqo0ZAOQabbPp2YC/1Ppmd6NxYYdRf9Q==", - "hexKey": "dbe5d0940c8067d15929d578bb3aa9281b720e0cbdd1565f1b72c6ff834d5f98", - "keyToEncrypt256": "64128b22a03a8a3ddc3717d702e8f15598aa325ac5a5d7c61126d25a86f0f81d", - "keyToEncrypt128": "9c44282d03e99056dd1e27d421877164", - "encryptedKey256": "AeQizkTSR0/foOfeh3gFgg6aU2E7JNJock9WbpbfkqLLexYJFPAdO57hDMkL0z1ZBfo+SB98Bx68OTxpDf+DCL/DoBn+Bd+2pAxWn6V/mHb2", - "encryptedKey128": "AeQizkTSR0/foOfeh3gFgg5az0h7UIjQGSbVl/X6xAJiEqbQ8LHXUSYKF3rp6TBL5yGaadIxANE0nPMnt2UE6+M=" - }, - { - "plainTextBase64": "GUP/8ePmDWQi4wel8yjSlgCDZtyyIAEoxtcDHgnNSRmF5E5WyaKiVuM=", - "ivBase64": "SL36q3exvYk8Lwvn4tqXeg==", - "cipherTextBase64": "AUi9+qt3sb2JPC8L5+Lal3qa1WsH1NgP+z0Wzo1L/YQXSB9V5Dg0/4HfrTbLK9lbiYWnC5cKowx4DpJ8VILdswk6CgDLdXvFMQiaxjPoYQ0K2GaUEtxXDIpLC3M3HzXKhw==", - "hexKey": "fc9f48fa700c132fa66f366558e1baf70df516d6d96f0daf3f9260e157c309b5", - "keyToEncrypt256": "807c667065d6c2ac7906d7007b1a751b6dd7cccd10aa9750fedfd24d17a3c70b", - "keyToEncrypt128": "01df890e072897a461048d7c14556200", - "encryptedKey256": "AUi9+qt3sb2JPC8L5+Lal3pLH68VbN4boVpRyI0dLU5VnowkQI/k76PFsRN87rwODBU+Ew++J0f0vV7aNxflB4SDS07PgjR9pltP2KooRNz3", - "encryptedKey128": "AUi9+qt3sb2JPC8L5+Lal3opQQGRo792MAAOKjTN+qoVPRYBuajIPmWfw6DgSBBwzvBSbbTGKJPZEsxaGAsvRvc=" - }, - { - "plainTextBase64": "a2iQjBJl67EEuNTZh/cSG+1GI2bFcRt4l1Sziv7loPdhE+k8Fzh2mRJi", - "ivBase64": "4Az6nuzm1HC2HEofwuyYSw==", - "cipherTextBase64": "AeAM+p7s5tRwthxKH8LsmEufwapoNJY7blkXnaKBfPO8vKdAiwJabA962u+otppG9IJrY6fjmiPgULldHuM9nBC6Q/7ZgYJed8OjlG9B4eklBu2xP869kNF5KWVMI/Clag==", - "hexKey": "db2ac64d818f99bb6efd5e9ae5c2911d80b9b97731c7171868278c5d284bc320", - "keyToEncrypt256": "59d00c4dee1d993646af42f20a5330e7dd325096cc03156b55579dfc73e71ca2", - "keyToEncrypt128": "6aafe75effe6001fee486861a79076f4", - "encryptedKey256": "AeAM+p7s5tRwthxKH8LsmEv56L/+HaeUmLZzIgtMc4Oy69+xrQMj9lIUx0DTa9ikKX+D04ri2Xl6z52yH4ijoXLybJtAzpya4YreH6jyJsWH", - "encryptedKey128": "AeAM+p7s5tRwthxKH8LsmEvVkwGS/dZ2eBFasbovQfohqUMpCwSpWPFJGSiDZzOT27Hg4R7vXn8oRui8UE0UJcc=" - }, - { - "plainTextBase64": "wjfapz0zCP6NHB95n3goljyuIWaGOv2MrXmQw+VjpYOiig1131lp5lsAKQ==", - "ivBase64": "MGciPZxEdZGGybwR9iHgIA==", - "cipherTextBase64": "ATBnIj2cRHWRhsm8EfYh4CCaDC9izsFqxHG2JTXJR4AXAfnmEcUP3xDlog9rZ9rFkemeszzeyQcppz6IXFCb3uRe0KIHAFL0k11R2AS+dueNexUEi/u8p6h2WN4kjmsefQ==", - "hexKey": "e721575d07b9f4af96775cd6e8e1c097cea66b151a84a22a755b13057efbe389", - "keyToEncrypt256": "cf0db1ea0b89fa30c239a3bf4f9f627c63e0c382684e7092f31a521db27a73b8", - "keyToEncrypt128": "9edb304d58567f168a528ece1e0358c7", - "encryptedKey256": "ATBnIj2cRHWRhsm8EfYh4CB2Rfy46r3Qn/+7hXnJiyXgAkQnPgPa339lQjcepAqYucf8Yxpc1yTcIzv9RJipkphrJlL651yn8Bw/XJsBFEm8", - "encryptedKey128": "ATBnIj2cRHWRhsm8EfYh4CCgNMmpuDPZBmt7HC+E/ki23VnyK1oz9cLNPA+fj4tzyV5GQvRogV6kN7x5IT0Z7S0=" - }, - { - "plainTextBase64": "MWDMJAACnwupcB/ZdU+1YYTi8BoPLewzWx1sID015ckfJHG5xUqrtoITtWA=", - "ivBase64": "zq0SPVv1A/F8L+2/AKnwPw==", - "cipherTextBase64": "Ac6tEj1b9QPxfC/tvwCp8D+nZfvj/e5iVN+EuE3jhPPrmZZmukfj7J47nQvQXXMR4yirxroOjqMaRrp5SOXT8HLJfUNax7XCSM4NnDshO1+wEAX2m+tzG/R/UApTIyKTwA==", - "hexKey": "0757ba27987720099f96abb70f8a79b23c02b6d934098b50a2ef2001fcaf40f7", - "keyToEncrypt256": "e76c5c734ef46a487df55428000e2698bab7569828d9dcce769ee3fd20965271", - "keyToEncrypt128": "1c6ef8a74ca76153f5b61ef9e6fabe0b", - "encryptedKey256": "Ac6tEj1b9QPxfC/tvwCp8D+VbdAP53tiaQtq+gYAnzuyWk3oGaW/OPGb/9xeSCdMQXtL+j0bILlTgqNBmYOR41ft0A/V4L89WRiFBKY+Zil6", - "encryptedKey128": "Ac6tEj1b9QPxfC/tvwCp8D+6oz6vPTdbWU7e/FVockyWpu0x+077hQ54BD1jzbEqKIeVB9DOJ9hTqKWE1WEAGiw=" - }, - { - "plainTextBase64": "cK9qq2jGZTS6XurGcFX7ntF8wFoHlEvQbTM4erXY6ntHR2bEgpSBWjYw4Sie", - "ivBase64": "j/GeiqADzaDh/RCNXaP8Pw==", - "cipherTextBase64": "AY/xnoqgA82g4f0QjV2j/D8NaGyXEDDSejxyMFi2uDs//QFmSpXsc/t0zoFJy59n6+Cf+1CIkdPvkiNbvl9+yrlKy2fz94taHoUpw4wHOdb5kZqg5jqQzE19nsvYW//HwA==", - "hexKey": "57a3af880fd9c35fe40258fd2a862691d2084b30eee5b3396b00eee57870406f", - "keyToEncrypt256": "465d034a2febfbf129eac917f7743ab96407458332615bc5a5e7241caac81e11", - "keyToEncrypt128": "6faac475a450f7649879fd6bea53f134", - "encryptedKey256": "AY/xnoqgA82g4f0QjV2j/D+tl8CS+7UjsmiIDS9NRdjK19YaeejVJiWMANSq7+9kStqAlndF9I0nyV0qQf15vK72DFGfCDputqP0jIFPqHQ0", - "encryptedKey128": "AY/xnoqgA82g4f0QjV2j/D9CdCD5GVxxK441UtI0UQPzMpFQFKRfgKHhkCb8MdZmn/7/g/637oRhJs10wkyeEcM=" - }, - { - "plainTextBase64": "pbJ9Qp8XuMFbmGowlT+21YYKeVKaUmfwLywNp6GXaqa38I6Lo6uaQXOfO4ohCQ==", - "ivBase64": "EPVlVkEueTTpY096cNORvA==", - "cipherTextBase64": "ARD1ZVZBLnk06WNPenDTkbw3Cs0Dnq/h8588KTSVCThBo528BYhgPg4F6uNcG5k2PNQuSsRZfnQLCUZXbvHKDpa2lKEUVGHwXvS+r7rdH600d+T9C1eUi1HqMz0ceF1xVQ==", - "hexKey": "6e82e8ee19cb880f3dbc5b2ba533277a5be31c96a0ec1ee7cacce05e90867f5a", - "keyToEncrypt256": "d2a3d0784f443f8d4ac65a1cd558e98281dcb9af517215fad2f1d17c4278c83c", - "keyToEncrypt128": "ae81e49648307fd5ec56c10ace4cabfd", - "encryptedKey256": "ARD1ZVZBLnk06WNPenDTkbzArS4Twn43ke9jxg/8E9rVlO59M4AMRKhurvmaIIxA+dhayU7ZzJYF74D6Hiy9rGlcIjouP32IVgU1w1iuzFFA", - "encryptedKey128": "ARD1ZVZBLnk06WNPenDTkbxRl6JOkFEfyvHhV7hldMdEL6vb5gfKDnJD1VCFzjiX9E+Or1bdftfj8uUnwARPMG0=" - }, - { - "plainTextBase64": "rmEohUAf6H4pENVLrFjrFU9dwrImxP1fI+rKp4cUvii0ITjtt1Mb7THt1NRpsw0=", - "ivBase64": "gsGERW/+KZwOOMbdUu+wrg==", - "cipherTextBase64": "AYLBhEVv/imcDjjG3VLvsK7ggJY3pks6UHSREiS3sGDaMSqsJQlT5P0JyxcOcolo78DfXaZF70Sogi2MlXLv4SYQm2anwjy5JR81i0p4gXWf/rwTjIzRLQY5w42g1VJ0VA==", - "hexKey": "36d135a47462543a7682ab679f741abd4813c5d08aab057d876f591622c1440b", - "keyToEncrypt256": "e4235caff1c047f30ff8e4b65443e8ea51edf3a59ae368904744d0362a959b30", - "keyToEncrypt128": "4f16b6180fce9fab5cc040199502feba", - "encryptedKey256": "AYLBhEVv/imcDjjG3VLvsK77Zf4BWTBtgmdWTv5ZWL4g32VDZyBWg28MHOfEhMe8nitbnr44YClRMHcNsDpUcaWb/jKVVk021z2IXY44crgQ", - "encryptedKey128": "AYLBhEVv/imcDjjG3VLvsK6xnrtI4uLE+tw4rtcMEOVcxe2zAMurvCXYK++MI3pyfDaenOKrfMdF4CarcjwVMKM=" - }, - { - "plainTextBase64": "wpAn3LSpLZlmuBgOJ0GVMq2JxgU9cdn5myjqhByLdYi+YLl50FZwMqoT8c85YWD2", - "ivBase64": "2/bHkpY4A7nISDOxU7bWjg==", - "cipherTextBase64": "Adv2x5KWOAO5yEgzsVO21o4Oa3b+kfwV8V597fddty0PPcu1rSVd6Ekh/O/4Io7hTuFsZ/Tah/6qEOlpNnFE/hWX4ziKPZPc5zGjurU/lU8EVrlDkS1szFQBKP9hQOHLaCQCrOiL1IgWZgHcFuNNTHw=", - "hexKey": "16f1ea9c4b87299804e15265696dbf3226bb506b99353990f1dd7bbf2f3285ed", - "keyToEncrypt256": "32b2216581211ad11970f4746f204637a77711d52b5cded836cdb005bd499436", - "keyToEncrypt128": "cf086eda0a00eb9034e0952e206ce724", - "encryptedKey256": "Adv2x5KWOAO5yEgzsVO21o48R6EDPCkzp2hHH77ajaT2Okr+TyJT30HRl1SZh3r3V7lDiHL03saYL55dUqjR7JyKLhCpO9qjNevPQ/MDtNk3", - "encryptedKey128": "Adv2x5KWOAO5yEgzsVO21o5nDWHRmKnTBlK6Wga32LO+TmS6oEMVaBAXiW6TraTOgYJfjt7PB983Xa57xPoCaUM=" - }, - { - "plainTextBase64": "rAXJXledP5MNb7OBa+YoW3ozFzmhVSzceZp00kmH4WPt94h1yzBj9ROTayDRmtVLlA==", - "ivBase64": "/AXYICd0fhLS2Vw2QGlqbw==", - "cipherTextBase64": "AfwF2CAndH4S0tlcNkBpam8lESeHMejlfpkwyye2F+HA644uyhyIND/GrECkvm5GE0TU0zCiSvsODVbLpFniavdjqzOxl7ZQOCMircKcSvqoVvIwD01g19e8fjcL2uo0uEIm+4XD6FMhbbPMlkHjwaE=", - "hexKey": "e60929b6fafa74dbfd260d7999da8756609d91d21ce908313dbf2af577d303a0", - "keyToEncrypt256": "7c715cc3caf407222e19df58e8d092a4da763498b0e8a70d1c013677da793114", - "keyToEncrypt128": "c0f2def124ac065cf7af7371220c0bcf", - "encryptedKey256": "AfwF2CAndH4S0tlcNkBpam96tdVhS2lxSMKL4KY5NzMSMBK36x5zWx4gvMTiTxSuhj2zwuwAeAAv4dHC3Xd7ILK0t+SaDMPpFaMqaqQsUwV7", - "encryptedKey128": "AfwF2CAndH4S0tlcNkBpam/YHOd0XWE58VlDDFQ2Ms0vZ79UBVZsUk9PP3g0qHGN0njFYYHrRzipR3eP75kt1t4=" - }, - { - "plainTextBase64": "vdDuaAG32G7vxasN030I6EyjDdNOVBrdARooNA/+XPE9fuUtdySlmsa6k7ECoFAFcZw=", - "ivBase64": "g24zNDsDj7qEDlPoZYIcIw==", - "cipherTextBase64": "AYNuMzQ7A4+6hA5T6GWCHCNOq4t9T98x01L5d9pQkWxJvGettMCcaTwgcWmZD7gmgdl6CjloSeA4yosgdORbuh13DbrFnIBtNxgeoZimC/EgM3gduCaiZz1ITgT/brk7yysmih7GECk52t1rvZl3vVU=", - "hexKey": "8f9db14112a49b6598c3ee3d0bc9ae741a47412c1d298f75ce66e549f5547108", - "keyToEncrypt256": "55c27db061c1fb2a86351d2047c45d64d26ad07557379c10fcb8b2a0828c4d6d", - "keyToEncrypt128": "f887667230a279dc3d7bdd1458fa5881", - "encryptedKey256": "AYNuMzQ7A4+6hA5T6GWCHCP2zfQtd01sKvuvbDrI2Gr8fY2vFSQAlfsVasRnXP+kJkWUjK7d2jFZgjl8J8bn145w16sHPwl2hbacX7QJifTk", - "encryptedKey128": "AYNuMzQ7A4+6hA5T6GWCHCPpcTVFmOLUPlnP98PH+5KqOWJAOumy7HlvhMWzF+1y92T5V0JXNcjv9gWFfEKLm5w=" - }, - { - "plainTextBase64": "4Jr9fhg6+1zNpS/Qlxb6hG4gXo9N8vuvhE/LGF8Q/LhGvgwLjyzMTeTy5Z4GxQ4LpDr5", - "ivBase64": "3fchUuQLZaE3sKQ5xJ9CBg==", - "cipherTextBase64": "Ad33IVLkC2WhN7CkOcSfQgZc4i7CyETtaPyA/2Uh2tE++3R8OKqU0WWhUdkb3Keof+Ol77bhmFQP4Kkkesg8WeG5GrtOe2rGiL3wA+cCxQ50xPa3e47wbiC2S4Rrarov0UfEPIzsrL65Nac8JNTgEV4=", - "hexKey": "5823b018db0f63ff0900ecc57ca0591ceb2c1386274d29d4c6f15dbfac4f251c", - "keyToEncrypt256": "f759db875ede9da19fe9c17aee0aa64ab2ecc9031ffd2681c072f037118022fe", - "keyToEncrypt128": "87c49f33fe59649c13193f92c9dc1fe4", - "encryptedKey256": "Ad33IVLkC2WhN7CkOcSfQgapPBfd5lhVyEipTOilvcIWDVH0wDz9yock/fTnqz7jk3eKuy05Dr0SGE/wwxxy50ozjkbacP34pV5LtVSt2RL/", - "encryptedKey128": "Ad33IVLkC2WhN7CkOcSfQgYkx8v0m6myO2jEdFOIwR0IqcfytkZbRmEqnflVIB6vYTmGgtlfC3NgmDOiXo4MXDA=" - }, - { - "plainTextBase64": "nPX05o2PnnuoN/SKFR4RQo1hqzu5YHbYlffUZEN2JW5BspbsH3Xi0uMSuegQ+ZjI4Zm0QQ==", - "ivBase64": "bfE6nFjjWltSNKbWYuJ4jA==", - "cipherTextBase64": "AW3xOpxY41pbUjSm1mLieIyCdatqOBLdwOGJEh0yj9BvmBlaXQVto3ucwZWeMARdZaoMmiyyJxxrxNhWqFZ75DOvCRieeN/W/QFmvh4XOngT83CgbnVF9uZUREwS60Ou9oc6FIAxsNObY8rcD4KUNA4=", - "hexKey": "2a2795afafa2d06c9d5eca681c04f29e19e388484d1db0eea4c128b3c1ae7adf", - "keyToEncrypt256": "5777a6c790358d5c9ed556c500352dc63eda6ab4c6e17f90719a386900e4ecb9", - "keyToEncrypt128": "f4e0c1552343a072b6257e355e03edfc", - "encryptedKey256": "AW3xOpxY41pbUjSm1mLieIyIA7gnr5/eJ4ECqfk0uHTXLyRlYt5A3F6orGCt0UjStAcEL83Gusg5X+wQfvX0Rlp5Le1rwoMDEO1DC7xUhKzl", - "encryptedKey128": "AW3xOpxY41pbUjSm1mLieIxkYMcemGiyXcLC7FZfyKxfmtznq7o1DP6uibACh//72vdDowd38ZGUSZjgRf/SZ3A=" - }, - { - "plainTextBase64": "iwUwZrB6SALd7ldVzpVuVZt8Jh4+Brt0437W2Vihkf14ZA7j8yO0ic+6fIMv/Rxkco6mlmY=", - "ivBase64": "ZDYrRN/IuBJ+eXe7GnIyxw==", - "cipherTextBase64": "AWQ2K0TfyLgSfnl3uxpyMseTwMTnVcfVgcBxeHhZ6NUIO/tsLpJUCHPPI78LfphBrYGBVACCV2s8u6Ncp9f5faAd1qpGOBnVUlpwQeEDS+vNkR5cEYWPbegdmN/ouL4Zn5hZ01LVvp8iCBt82nCb7YE=", - "hexKey": "a72147b3994d27823045431af180e28f102eb128c856cf2670d0bb7812fa1185", - "keyToEncrypt256": "4055f6c21151d20c591c66d074282998c8f858e7e30332b86726644a410d6eb2", - "keyToEncrypt128": "b453028fef43b42ee6db4db1668e4fbf", - "encryptedKey256": "AWQ2K0TfyLgSfnl3uxpyMseuvvusTOqn9CZVnPNGgSvRmkMBhNva/4rfg7PRekh43YEZKQJOzRyqs+f2IYB6osUJ+5qPFBBgDFVZQf5nqkfW", - "encryptedKey128": "AWQ2K0TfyLgSfnl3uxpyMsfB1FjvwUwxhk0R+fWgXY+FrPALYnKWhuetEknmRvFAIkxAZdF0v7CK92jeTOPjJgo=" - }, - { - "plainTextBase64": "5iXDfBRFqBywYufzEogT3gvJ/Ez1Dxh1JvalYYuF+9xfq4akyx2T1nzsRlUia+gjDj3CBy5G", - "ivBase64": "JzgGcI/2zsYX7NyqUVc9lQ==", - "cipherTextBase64": "ASc4BnCP9s7GF+zcqlFXPZV3iMclCFGnweIhmpzQkuYp7BZGXd3l5hFoRmVcadm4e3Hpf3kaEkceqQi6QPnhysjsjeC5C+2PPs3k6i23UTXT2IfqIH+M7DWeG1b20QqsbTnXLv/kDrLzRFci3zbhObQ=", - "hexKey": "51244a5cabf5104788a04fa393214ea6a635a9e3b91665b5b87b29691cb2a123", - "keyToEncrypt256": "f1a5e81970eb1c512a4f4351d95d39b575397b98b72c033bc63b7c415dd02981", - "keyToEncrypt128": "b499ac36a1813917886d6641edd60827", - "encryptedKey256": "ASc4BnCP9s7GF+zcqlFXPZWrgEN5xtqVWXtlxYrKwMYA0n99fvQhdG04kOaQI0+F4qh8GpJmCER52Qz41PThSek8xcAKTeamMLEIFlr5tMfC", - "encryptedKey128": "ASc4BnCP9s7GF+zcqlFXPZWD13rGJksZoj9joJAcigun8n8TWH6ZGYC80j9MhMHqXRhIIuvuRji/ifvOMFMXeG0=" - }, - { - "plainTextBase64": "ypr67oS75L9vwlyFrVeDV4uVKZ3iTtrtfZ1L2uyvsStxjSLEI/lyXJP6o6rLZlbswvV43fqUrA==", - "ivBase64": "vtAf0uFqujm0uKi5GyBIXA==", - "cipherTextBase64": "Ab7QH9Lharo5tLiouRsgSFzi72q2w0GjYSLkPlNoLwEUaWk2GGKZrOesLP+46Gz65IE1f+6JA2zfvY+FrMRVg4BXe1YJy8sSwspsl5rsS1EXxTbQzKFJYm26AppDIWT2DEV7EKCEIvr9KRDItfHy7XE=", - "hexKey": "37bc274e24dfdca30a01e1c6eee17e79061838ed32c4e29c6fbca112bd4436ed", - "keyToEncrypt256": "a10e4270e27310637818129aecb95b852b6c3bcff81b08423d68f7dfb8debba7", - "keyToEncrypt128": "cd92d5659a2d097c83358c09c3edb096", - "encryptedKey256": "Ab7QH9Lharo5tLiouRsgSFz6FcfTpdM/5sk5zFIFvH4cdLQaFCoJtmkiyUC3gjYalc4A+OeaUlmIRMxsiPdSDV3xXErEVoRDu4fBjhLsrBAh", - "encryptedKey128": "Ab7QH9Lharo5tLiouRsgSFyZLdVH9l8K4NcgFfUBfqsPH4jrNWMmxluax6pP3iOKWjJACylXG8+IoICkOjguYaY=" - }, - { - "plainTextBase64": "A1KJ59+5rg8H1G5WaGyJkeHnd7ZHu1U+WJaCO5F40XLvyvgMmFgn5f6zIOqoZ9t0AV7W9X2Ddf8=", - "ivBase64": "0ig0xL93maqArAciw81wUg==", - "cipherTextBase64": "AdIoNMS/d5mqgKwHIsPNcFIPa2rZNjZl+F1KyIqsTY1Fci6q/+DqG7IiFfoJLZs/us4f4KFKwgtwNrU1TpAcU5l4UOTRvZ7vvX4tydI0GVJJ6oB4my+4yQZIvrj57OPPEeA89lZE0TjMkIJoLMFgtOs=", - "hexKey": "9ef8eb881aec852f6cad380ca603d1ae71fad77ffb00844583a6c4e4083e9293", - "keyToEncrypt256": "138e2b18bf3d677e5f77b1b389363d523a20f59e821677c18ea06e4555e3141b", - "keyToEncrypt128": "8e4334920678940f5009c299ecd2e9d9", - "encryptedKey256": "AdIoNMS/d5mqgKwHIsPNcFL0sOL8Ten98nEPoPDOuMMG1fkAgbVvvfwO5EZwZMjXH8RXdorxwKyquqjBbRvAwJ0E4mNunl58fIGjawCceztt", - "encryptedKey128": "AdIoNMS/d5mqgKwHIsPNcFILl0CW1fRZGg6ihtzkxpssF7ZqTIDX9D9Gv5WC8+0UbApagWK752m3SyeD397oPNU=" - }, - { - "plainTextBase64": "YcBi/+tlz+EV44YnOfE06PIYBqYdy7HCk0Qy/ll6R04RvDgFcp7pRgg6U2z35GQpqd4Py07VqmrC", - "ivBase64": "ltWniJOLW8R5Jmz8LB72tw==", - "cipherTextBase64": "AZbVp4iTi1vEeSZs/Cwe9rfz5pSrGcGtfPPoJQnNicIqzzvR6KPDOtAU2znlhDy7bRKTmAkwubmB7iSyPVYrJDBGgMY3KXHE4FJl7mUv9EIPOot8SMTd40HBJHC6K60hoDh6luRIb8Q+zWWKi+/SVMg=", - "hexKey": "c7f041ca7d06483029967d2c2a63c719f038258bc24faa4d196689bcc9f07bb1", - "keyToEncrypt256": "aa3a8e0a559bb8125bc5a57767d323f9b1511ee08d4a846fcae24eeef9dfed57", - "keyToEncrypt128": "c61be8849103caac53c5ea41237d0058", - "encryptedKey256": "AZbVp4iTi1vEeSZs/Cwe9redunC8JTDnY0f7UUxkqf6MajVglYocPUJKWQo81WYuqrF2Z2sVrwmDvLorrntGe9Y6/yk6hTprzAkSMt3ndqul", - "encryptedKey128": "AZbVp4iTi1vEeSZs/Cwe9rf6+A7hRnPI1PwPsj5DVOTwnGVJ8aDnWyYvMzM4ioxbVPQKKd6+Ux7v+nw1tWTa4gw=" - }, - { - "plainTextBase64": "UjxKD60aO/94T2lNx7h45j83lGNRe54tgvdwIl0UvnwQkRFzgObWz0D7m8p+AxngtjjeBNlu7mor0w==", - "ivBase64": "pWgJMrRFnNtxUALtwhHfnQ==", - "cipherTextBase64": "AaVoCTK0RZzbcVAC7cIR353vHLSoPG8Wllnr2t5zzlHmtg8+raSh92GGMcM0A8/C+rehzfSmysuh05CKTveZw9x3QXsbXER82tgDT+At0ONsq00o9s/MMaodMf7sXlrktMNN4nGAx41CKLiTItygeW8=", - "hexKey": "54681c5e21de6ba8be38812169c0decaf66a4d794e4b0ff50c955e36c492af1f", - "keyToEncrypt256": "86f6b79d48b88cddb34afa2a4a1278b98877f9b402fd3a051d6f184afce9f631", - "keyToEncrypt128": "7793702243e5fbd7df2ded0c20126e62", - "encryptedKey256": "AaVoCTK0RZzbcVAC7cIR353k7VaVOctTQ5hn/w9X/XPNBMgzmshZ80/M0yoTyxxVFSmGPgQP2+yrP38S6OOV9W0UlE7Ku+XxTTOQdvzifVWN", - "encryptedKey128": "AaVoCTK0RZzbcVAC7cIR353UlhUqKNHqASs9T2ZZgp4uaD863WoUP1b3F77bf3wyWg8jkE3jB+AJlsq470xY4+Y=" - }, - { - "plainTextBase64": "BoYp+cktbU5pt5NsHfTrQQYv1OgGE3JCTjOmpHUZ+NUyWH5r6qef6qVh6ZYcsUW+Cr38UxWXUhwvM6w=", - "ivBase64": "7CAcFWcPXA3FjKT3yYx6vg==", - "cipherTextBase64": "AewgHBVnD1wNxYyk98mMer42ZFNyD2asaOzD3Qpdx1yc17g0HmJgBQKIisYhpZIoMb+FnrSi3Bxo0v/lJcggbnYU9FuSlzcEqPe+mLt4plj+XSnILZv6tPsmKEjgMZnFykr+Y0IJcbK7SVPM5i0/dOk=", - "hexKey": "d23771886b5cd961beb61bb7d3c43dca091f038bc47409f2b4823a7a65c374e8", - "keyToEncrypt256": "5578849db83eed86662e2230f307347e37d39a89ce5bf3b9047520f23e13d627", - "keyToEncrypt128": "848fd079f86d8dd25f54502793eee49a", - "encryptedKey256": "AewgHBVnD1wNxYyk98mMer54cMMWocNHspSB5YiZsZTRdlzgGwzhFdWtJsJRzV/vkOcWF9uGIJZtUZmW2Z2PVhWsGYIRGwvx0KyiHTkXVbdo", - "encryptedKey128": "AewgHBVnD1wNxYyk98mMer6uIisBrlZx8mI/QaLbUER4HZGyQbd0T6RKcUN440gUY+WWlxDazRskpjkOXXJmBVg=" - }, - { - "plainTextBase64": "b43cjk/Xj/wWqVw8SveFShNeXb3OJP9EogjTe57TijHSGJ/i/2qrqgrVzJgXUUXoNo7oUPFjUkSbyw3X", - "ivBase64": "/xj5jP4Cio1+PUWlcRN0YA==", - "cipherTextBase64": "Af8Y+Yz+AoqNfj1FpXETdGCLCJiq52/Mw76OtW9QU5hp1vN/gXselnBoIP/MdMoyYefxYvoPAHitIvUJ8ZCbDmLy29ZAXDGnmwfl0V4clyKv1g7bdcirUlZqaZDe/VcMnPLGno/IHfW9U+ZMH5qcNRE=", - "hexKey": "b9b2d62c194a4143627e7e6dad774202e678428c469eb619f7bb9e8d7debac98", - "keyToEncrypt256": "c38751b1cc7a3203066759be9fab9a63d2c6fcacf95c61346b56794ce925ebee", - "keyToEncrypt128": "91ec4752c0c4f86529c8f39b5525cfe8", - "encryptedKey256": "Af8Y+Yz+AoqNfj1FpXETdGAKfZ2us0GAtPYtyKXKQ/G3jOlkljP+SMZfwR/BGoxktbM7wBrTU1Ezeu6cjYodJ+rcPEyhbxdZo2J0Ry2Y2eE7", - "encryptedKey128": "Af8Y+Yz+AoqNfj1FpXETdGC1UXb3w5in22bvnYJ73au8kRdScTfqGmeQSSwdBVl6v+QH+oU8bMYH0q6Mh3zxuTg=" - }, - { - "plainTextBase64": "KJCgjHhHQkWPgVtPztM6YlaAhUMSZZa3cBawVproPtBYB5Ut9qNzsWOhZgerQJp/O5XoTN7OCNJGv7pL+A==", - "ivBase64": "aEBYYgxfQ20LlwrRnT3WbA==", - "cipherTextBase64": "AWhAWGIMX0NtC5cK0Z091mzD6/VAel/kCXoOq2jRVPMa0CwHIoUnabcGSSPSe3JeRIjaGK2TkE8PU7JD2QXa7H21XACsPwP2QxR/fYRqa3Ij37I5moyeMlQ5+YSryEIE2NyUsKSW63RFiYH+h7eyZvQ=", - "hexKey": "f3162043e05b04fe5248e673d30357bf597920a3efd9fdaa89d0369a7b74ccc6", - "keyToEncrypt256": "57d6eca23aef10df8f5cb7188696686610381ab08bab563012e9dcb5c6cb27c4", - "keyToEncrypt128": "a9cada9188425c218c2a96cbfb1ef4af", - "encryptedKey256": "AWhAWGIMX0NtC5cK0Z091mzHfKr0uGiFKNk8FMxpX6adfZEGbC8BWQmAWA9qoIVdk/Vx80dpO2dbdaYHLDB3h+wwpdHUj0pnndcqyMq/u+0h", - "encryptedKey128": "AWhAWGIMX0NtC5cK0Z091mxWXCgXOYV2HcxZsAbpKcgMP9gMGrdj/dcDrLGRlh6rhuiYHcV11xd/psAOwb2IKI0=" - }, - { - "plainTextBase64": "QidMAJ1e4klT01iWUtoTOsLKJUN8CcyOUHpUREADW8IJnOpdQB1WlKlbakhsce80JP05iuP5BbG2SbF5TJo=", - "ivBase64": "gN6gQNmihClfiLboJ8fcCQ==", - "cipherTextBase64": "AYDeoEDZooQpX4i26CfH3An+xvnfpLK8K0jDTswLweYl8NYZKC8nERkAigX0hLm+SgKw4ozJ2DdLPmUyBgnh7sMr5Yw5AfAj/YLkMzIoc4YLfTBAYP4UKBYnmJOXyT3xO2uE5kBArXHAb3LgZKO0zw8=", - "hexKey": "8f0d5d2c64d57f83d818445e6be65c7c108e50d2972c33d5e74440d5a11e93ce", - "keyToEncrypt256": "6419531f4621adb75599fb3d9f4c7d0a4bd8665cf919815393ffb6334a347a76", - "keyToEncrypt128": "92355cfca80588a8983188eead61716c", - "encryptedKey256": "AYDeoEDZooQpX4i26CfH3Anyc5LJjPq3iE3Gtgm8aO3TyI2Qyohcus+KQblF3GqO/9qc0bmURcwTxfFIzcxuhJIQWtFSQQ2E+AVNq2a0X0X/", - "encryptedKey128": "AYDeoEDZooQpX4i26CfH3Am9Tgy+08n7spV0TOq7YXAt1pnbY/sFqwqXj/h9P3+LPdRqo6TerIh2sbwZijV9/3U=" - }, - { - "plainTextBase64": "XqH5HX6NZbzdHuX7KCKrQKuBrnPsXFfzm5T4sUfYGdM8Ds2ly0NKyXGOP34qGHyfd4O7ZpcSp1uxnWLSzxxQ", - "ivBase64": "IBw0Y92nRBhNfWDizwibBQ==", - "cipherTextBase64": "ASAcNGPdp0QYTX1g4s8ImwUiVOsSEsHVWkZozizKSCwegF/SxxJqusVp455iWspcp1c3nMq2gqZ6NG8fGJuJSGykyHiVXw6icz715HCJ6mAl/EVG2xQrS6AK4ZZmehie0C9VH3u4Qd/DlOleH2hcejs=", - "hexKey": "37d2c45f8c26ee66430f6be132285d4f4ef517ad28cee47e65ef4c24aac24f48", - "keyToEncrypt256": "0e2076bf39b719e5e400de978abf78c8cf2103783f421745be02e503dc44df7e", - "keyToEncrypt128": "22628a6de492b78c70a0517bd017c99f", - "encryptedKey256": "ASAcNGPdp0QYTX1g4s8ImwWIdCfSxufm7M3L3Yecy8PVtF3MkLdXHSdS+1voqcKuAKvkVuhPHRZ3UKzxpvqDvMRMp5F16saCJl+yhrvLIt3R", - "encryptedKey128": "ASAcNGPdp0QYTX1g4s8ImwU8fENePzI9UxwK3KXO32lW6PzykUEr1QlLLj+kjY/wwIsBLSyRqbRBkAyjISyULiw=" - }, - { - "plainTextBase64": "UqW59r2EwnSN+24xqfJ2DVF+ppVD0yV++Fbo/vME8DpYAj6ZzoQPcGjV6P6ksiOh8/YxiBTdhE1rISc6AZNXNQ==", - "ivBase64": "afdaqL0pNGYlRgyOcVw0eQ==", - "cipherTextBase64": "AWn3Wqi9KTRmJUYMjnFcNHnSYkf7TpoBAoVKfYIdle7tGhdNzh424AlRYhM3orRsv89A+eXNFn/kO/O5NS6S2wJcLWc8GFSsUqeR2jEby91os+OzHuZX/ikIKYXH/IQvujfm5ut7KIYI9gmH/3FtjEd0pYa5m9lu4DEfLq0erWOL", - "hexKey": "09e4881363fefd22dcf8e62c6a5bfd041454cbeb06ebbe41912ffb57429d0abb", - "keyToEncrypt256": "280674bbcc79113ca661e4f2ba289a181c3f06c06461335e9641aeadf27f3530", - "keyToEncrypt128": "cf20ff55a1d44a11711fa5ecd3afa97a", - "encryptedKey256": "AWn3Wqi9KTRmJUYMjnFcNHkfG28Nh8N3seK5JoMrz5x46zy7Wx+rOL1e2r8+1ItjI+1jAkONbZ1cNF1DsPeQkWvfmXd/JFbXDuP1xSDbAw+K", - "encryptedKey128": "AWn3Wqi9KTRmJUYMjnFcNHkyYrwARgKK+FY8cCvVTIoVYyw6+TnlPzZHkqCAbqTOu1tUX/iqp03Fd6NR5PoHNC0=" - }, - { - "plainTextBase64": "RqwPxbVNaNdtjr57k1wkG6J2TUA7Kith7RvD0VRFT19wXqXnkML9hjrykxSD7WrT6YxcXlxL+ktH4TT1sW24jiM=", - "ivBase64": "afgBxM63XJ8xXdB88xrc3g==", - "cipherTextBase64": "AWn4AcTOt1yfMV3QfPMa3N6N5Qb2QjmO0t1AtGsLKXU2/d2fHcsCx9yA2+mvr58xFUcEVArsmby+rSK2YSCS6Q84AbOw2TndG5t3SqG9uiD9J3wQrc/1xyKNY8ibgt27ANUz1Ky8ytqY8crTMQMFCOmffol9KgnnqBezVfRf7A1a", - "hexKey": "47a866a43e01d106fdcfb7b77f4a176b589cf0939c523509acaf2d6d38c06184", - "keyToEncrypt256": "c35c5802cb9e79c5a0a035dcd6237d88936f6172d6f57064e206328f0f0c97ab", - "keyToEncrypt128": "2e4533f47fe653eb8b5d66c180c314a1", - "encryptedKey256": "AWn4AcTOt1yfMV3QfPMa3N7okMvZmqDs2k9WLZEMiyJ745qu4CFt5YJXjzvrUt8AVsu26ikIiDKH6ngw8AHXdmEQZph5o3wgFH2hiFKnagcW", - "encryptedKey128": "AWn4AcTOt1yfMV3QfPMa3N6bfrEMg/hm0DFB7Da0sBPkHt+n5Y2txZwtuCmho40LrVxp4akF41yKqy1gq+lldmk=" - }, - { - "plainTextBase64": "7euI2CXiKBFJXxiB+NCj6I6CUJUByH0OCKS1jJV+duw18UOuUknuNt01QgV2aDrAr3Jr7qK/KRnBzaeHZvgiKVbU", - "ivBase64": "DtBiUk6Hcc+jkAyezlqsXA==", - "cipherTextBase64": "AQ7QYlJOh3HPo5AMns5arFyB17pb5IxGfFbOtsXS+z6DAfsJkV9h44DxgaHhbDL6k/lYGwPHKUbz3hHOtFGHFevLQTgYRQwfb7zSU+ImSyeAo8zZb5lt+N8vCzQxVLl5Cp//tgiy0iH1b63/BT4/CphwJLnq/y4IAualC6SYCo8M", - "hexKey": "a674f6af3ea20bd651018dfeba3bf27cef6ee06ecf5e2eefb54fa95f2059898c", - "keyToEncrypt256": "712dd825b5010e0bb7b2a3ad51ed8afe7ac15228724e92000019877d40415efd", - "keyToEncrypt128": "49e0e573d79434cd0fe6c4fca0a8a21e", - "encryptedKey256": "AQ7QYlJOh3HPo5AMns5arFw7Vpf1DWYsEzRbGySpSXecQyPp8pSNTNm1etIgCyZgH+hyZoYgXFlIWuB4WA1/3oER3jjc6TMbNvNvci5ViG2G", - "encryptedKey128": "AQ7QYlJOh3HPo5AMns5arFxCycsK759o4vu2OX27kNueZuKo9MYnChgP/LGCLhvQLBC/VgmUISaGi7jzINzU5fw=" - }, - { - "plainTextBase64": "/Gw895SGwDx7kc79qzxVgkENruxlQsAUzTrYlZ/QIvNZfqn5oVPP8euRJdk6va30OySxGYhaXerCMp/A8XbSV35uLw==", - "ivBase64": "jGQlEOUiMEJZpfi3SFmEWw==", - "cipherTextBase64": "AYxkJRDlIjBCWaX4t0hZhFsqbuaVTEHCdUgxgC3SYNqzm5whW6nDPeZjVxWk/wnUVQcCHLBbY40hE1PokH39q0aZHt1GdhdClzf5W5PqGnW0CpuNe5zggOYx4F42LUiskv7YguKIwG5P1gYf1uAazAWkaCdtL93JMjz7sBivgKbp", - "hexKey": "50cb306f4d0ebb08580ce693df482ac72dcb5b928dd7a0af6ab8ea890cd4d6e7", - "keyToEncrypt256": "cacff5d379629987c841df34c32dd6dab583937bcc36ecc73b372dc699a81f56", - "keyToEncrypt128": "1da7c69adbfe81b668b989a669a835bc", - "encryptedKey256": "AYxkJRDlIjBCWaX4t0hZhFubEuQS8KJIfSupM7Q3woO+Gk118ouoSwhPCz3uzADgMB1hEyuXKRNOmuK+IFCjmJOP7i3yR2K6pe815Xq+B6yE", - "encryptedKey128": "AYxkJRDlIjBCWaX4t0hZhFuy48AXZFC+Av1xr81EdTvG8yhIiXxs22BXPzyJrXsqgt/vVz+FNSe/TXwQpAaD//M=" - }, - { - "plainTextBase64": "m+V+96E6g+bQcmR8hXMoWOPLaPprIDLSBT2g/2j+Nm6gOtG4KxtTkoByeTc/xkHXDyofpTonut53P0jR0xrXkbWFmOk=", - "ivBase64": "/L261aGcp2cGe2pQYiXQ4w==", - "cipherTextBase64": "Afy9utWhnKdnBntqUGIl0OMli9uMU1cEX6KvVDUdqINMHh/nYtJ/22XJDPDG4/SkkDNeUwfGaEGkNyEvlJw3/Krhshzw5t41Gid6RstrXf1nrsatEFdAGyaickOvqtbpYlLEWd9ZIexvAdbr/7QFpPHBDMjrGWJnGHLGcnlJLeHM", - "hexKey": "cb756a89d5870d414dbb32b38391c9bda5a9ff54b472e2fa18234d23a65ddd0c", - "keyToEncrypt256": "e407771b6a8d9f895fbf5ee480784dc879774a5c98fcab060801089fbd7de153", - "keyToEncrypt128": "60a80c5f16501e47e6bad1418816cac3", - "encryptedKey256": "Afy9utWhnKdnBntqUGIl0OOnjNM+VNLYbyOIdNOJjP1ikTtq1VFM9+VCQSrOyFO47sdLd+BpiuHGHInqVlCHgEBbHxoOagXBhNjhQ1wiDocr", - "encryptedKey128": "Afy9utWhnKdnBntqUGIl0OMnfMyKeOgmW0WYwMqOHjjFpEGRuVRjdPSeq0ixgPNrI8FHUB5HrQJ3Cjrbmj/mTXU=" - }, - { - "plainTextBase64": "/xYBy919GleDNHx8IYSdAKClw65a9qhzwDQpAyr3f79XjYKg880i6llywJIy+2Bi6iPGFwSYSM07jOxy54ynDLsG4xnt", - "ivBase64": "ZPJtPU+Qk3hNm+0MxJ4u1A==", - "cipherTextBase64": "AWTybT1PkJN4TZvtDMSeLtRlUuE7wCzNo2BnqHROJ6W8zPcPR48g57DlMyFf7LLrsKynCHghJao0l5imfbdHDXCtK8szqxq2ePNaDFFlKNnJ7P2uBaqitRPW50LaBM5bR6+RIBP5aPJCJxZlUgMVgjX/mjGVT6rmW/xz3L42JuZk", - "hexKey": "a51914eb7ff61e4860262d38ecaf54aed2871371d38bedc17a63022920575887", - "keyToEncrypt256": "ddfae209ac394277366816c46423e4d6c4726939e27bbde1feea26a4f9eed231", - "keyToEncrypt128": "b87676defbbaf41c0278d27bbbf5b11c", - "encryptedKey256": "AWTybT1PkJN4TZvtDMSeLtR9Rr0+yEhWalIEPAWEWLJeiNfHRk8XXG6PUC5qNw5sKS1q+HnMS6WJQ50OI8rO7VUUvr/+O9a4iCRya9K+T8qZ", - "encryptedKey128": "AWTybT1PkJN4TZvtDMSeLtQ1T5OtSMctUQrQ+iDHbvTq9diM8f0TdMdgniWxvATGg02PTYgTybNgYGd5TZ2KuNg=" - }, - { - "plainTextBase64": "n1dr/8f7dwaThD4ISPyICcBDc+Y0GweiywXMvLKrBV+GzNSzIJn/ZBc8xWyD4vGb3dXZ5Et/51fF+d7yOnwCxfuX9MlsNQ==", - "ivBase64": "E+8oajFaMnx1I0fHOiXXjw==", - "cipherTextBase64": "ARPvKGoxWjJ8dSNHxzol149RRQKFi9vODlRx5D2UlKb26o+1/1G2nwTSpRx5+kjgGZPEW7eOUIMxyWkfHVT24B3g1Brs5qlpWrc+ka7B1gEh1ReN9WLTM5T8cfMsxtDXTldkijfJVvW/NKoQkp/GDkQbloTqeQXVOw1OXBCE4j6I", - "hexKey": "f769b491110893ab802cbe045e4be337ba768d16b2804a7c39bfd52d89dca4fb", - "keyToEncrypt256": "55538b9fea8b9bf6e9758b3c70950dbcbdea0ff9f40204c12c8e21e43e8df2f3", - "keyToEncrypt128": "240f5baa71bb6b7761a790d98aae4b8c", - "encryptedKey256": "ARPvKGoxWjJ8dSNHxzol14+Q8BuReNDjz2BSFbly1M6+r6z30DZX7wQqrw3Db67ztT5+9d2xlpQltfDumLy1AjYxtVWri06AljHMmCYeRaxG", - "encryptedKey128": "ARPvKGoxWjJ8dSNHxzol14/pnuA/k8At5gBx26HpLLES5WHri3N22bZGGuYZKdcvvhLIoUAhyqd+bLnZapv3n4s=" - }, - { - "plainTextBase64": "C6oyjckl8vnzNucjzAh2gef8WioSPL72z1EusQDzMYlpo9VH50KQyk6BSEYhSJM7kXi1oGg9KNzU7hUlatBnpeyg1kDka5Q=", - "ivBase64": "+/Ir1hrGYHg4uyI7C8M29g==", - "cipherTextBase64": "AfvyK9YaxmB4OLsiOwvDNvbMHDK/uIw2Y5zhI3ldxWxd633WXwc7Gkfl9UNpsvEsvrOsCgF/lW2iMGZYdFjy9zR9utzsKFmuraSH7U8uElzVMn/OS+FDwRpcroaDLLpduANhy5NylRi610IOo8lwNl3aJtE0Sc3xtQjz7kwhMTwY", - "hexKey": "04978affe301103dbf32dd471078710ef2cfa1801d5f98fd0ce2a782e5a6b31b", - "keyToEncrypt256": "67c8c49ebd08c861595390b48171e6c4bacc1475b95858b2287c040165019224", - "keyToEncrypt128": "a633296edb3b13683bb97001afc45e53", - "encryptedKey256": "AfvyK9YaxmB4OLsiOwvDNvbn+QYepSLZFEI3GCgt9ieealW3jhO1KZTQ/E2AllmDX+cqBkzlB9xiKCVwfhsnecRVoCY4sqK8dw0hZMq2eqxZ", - "encryptedKey128": "AfvyK9YaxmB4OLsiOwvDNvYirD2q7PsYIR/SVq40+9LmAbZ5bC37xQxtpAY4OpdZdt6dnSij6dcfAp99uRvfgfc=" - }, - { - "plainTextBase64": "J4V6FJatYbnLXdoOHpUerHHwg7t7+L2PXc3Mzc1WwyGv1dd1NXfRaegq0Ke7yoOSH4V+02AP4Ar6Q8M7gIgGKo5asFrWLv4L", - "ivBase64": "uW6CavsUHk10+U/izdtT/w==", - "cipherTextBase64": "Ablugmr7FB5NdPlP4s3bU/8yu7CLuOvK6a5hsiE3o1dY+0RBoWEhVTx44yI9rA4yXATxhExPXyT4kSatveIPPJWNBetLU9XYlAebgs3et2Zsz+DzVXqWESKvWNsiVpIO6UsM3qCUfzefNbCLF+WS6avVUiw8YU10cuT0AD6yKu6N", - "hexKey": "1198c4c83d357c20bc7bd02e0f4f2397cac986d325fb45dd159848c5d0deee47", - "keyToEncrypt256": "fe8693d5ee28ca6c635aeb8b47322ab76a2d81422d509e10135e4e5237bfdae9", - "keyToEncrypt128": "00bd20f92a6e965f8be3acf3d1acb18a", - "encryptedKey256": "Ablugmr7FB5NdPlP4s3bU/+lWNS7fLLGpy7ywiy+VsP75pBof4BBX88PqPM4L4B79cs1wxfegIDQxhL9c2lsByAbYy0quDhL5PFXREUQc+1j", - "encryptedKey128": "Ablugmr7FB5NdPlP4s3bU/8WXpGp+G93cBHNHoM1GUoL2rSPr+gcWTz43rx1W6tGhiTcyxu2323LJK1k9fIxHLk=" - }, - { - "plainTextBase64": "rv5YEsC01kRWxJqGkFN5tDNjaOEdnOWdgntha8rao6S4A8CuvcO4jbA54ocEcnC7WDn6adnxp8kZnLY3SdaF0WvB0WbnrssqUw==", - "ivBase64": "vPcHj7BOoppnOdHD36dQ6A==", - "cipherTextBase64": "Abz3B4+wTqKaZznRw9+nUOhZ/cyQmkPnI0fDWaeW4yqZfPb6APrKetFzWQKNlw8cvMIpxi0S70RCPXD/EiFY/wmGFWFSHnoxapc0W7ZiaHNgXnpl8OoelLuLLYq+CN3/w6Iw3E89koEnBP5WU5I8OIETAhh3Ch6/lPcVhGMszUj+", - "hexKey": "10eebc38b8d93fc9ccf1a06ea475b8505baf3f41a2965dda9bc7872134eea886", - "keyToEncrypt256": "9c8a7298c32b895d81df168da647aca018fbd4b66ca7929c2a17253a023220a7", - "keyToEncrypt128": "e652684b1e1ca151934e4f5076b3d715", - "encryptedKey256": "Abz3B4+wTqKaZznRw9+nUOjMprNpuT9kgNf1Ri37uVhbXipw/IKKou/b8sHGtU393pCf3Fun342TOa0EW53OBwHN77NyOQC6YaZyid/d7FJt", - "encryptedKey128": "Abz3B4+wTqKaZznRw9+nUOhT7A8/vJwQj/6NNeOjIFwf8Fxg73IQTTSlMApK5vSrpsN7R8NDVOAPn6cQnOVqns8=" - }, - { - "plainTextBase64": "mfhdVjwftsonb0LQxgUGOQZMpP79XfmMmE6zszaoi5LKoPlx92j9qH8EwMMgSKHdEzqhzSYEzhOEpt6sLCLg0jV/g3r1+kfGYBc=", - "ivBase64": "mxPrSQtiCLgQAPSxP8iEeQ==", - "cipherTextBase64": "AZsT60kLYgi4EAD0sT/IhHnYuoD64AIRIEVqiNGBVnD9ENsLN3Z5u3jLyJktRZpH8wuknu6lZHF7QNUQsGShnpYEOMXoXbE2XGQ0yJmZEd4L3gCW7F1vI4gM8W+KJtIVlNuV6XKHZ1twL/HA5Is22CipqeHljOhbJyrF7N7Jyh3B", - "hexKey": "378d6104ebac3ed5d624db7fdc505d20e66a3e47d33ec28a92c9b200399710d7", - "keyToEncrypt256": "aae64ebd2658e6cb13ee873b99967cb6c9411d145b735f81eb6ce2ad6b7ac1b2", - "keyToEncrypt128": "c634c1ff078cdce265b271bc8f90d9ee", - "encryptedKey256": "AZsT60kLYgi4EAD0sT/IhHnz1feQmwaQeRG2swxvBABxIms4bK/XV+J88Twy5yGY2mY0AyxR/yWt/C4o3HjIenx4gq2Gh9QVkMAzbI/ikTD6", - "encryptedKey128": "AZsT60kLYgi4EAD0sT/IhHnW1PrYhOII4SczzOVQccsgdm+kHGf6JU2mcSCWcyK59apjFDhGwxCdBj+0Od7DqQg=" - }, - { - "plainTextBase64": "fRDtrAAamvkU49Dn/jsP63uRtMFfqk4mbPdk6Xnb0zz67Wf2C2Ghgwv9H7Eu1pcKLq3Jg89FY1i9PGZzxvcnlH/ivVrXAD/EL/II", - "ivBase64": "xCmXdGvU5qlAoBFdPplULw==", - "cipherTextBase64": "AcQpl3Rr1OapQKARXT6ZVC8BIbF3nZLzG8qm+m7ySgG12XuHFdRjfONPtIc9qP9lPv3dlaWOtEzgIbUHdawHbKef1okf3K6es19kwDYSKblPYswC1TOZz6q10cIHgimdpD1pqOLfOfdiDusmlEDL8uQCAKsl+RgG/a5LwC5XIOJq", - "hexKey": "671a6f9aeee9af14ef88e126a048c71d121ec86726f9e13d1420e4c77b0f4e96", - "keyToEncrypt256": "7067e86eab30417a8f451f7c993ab4899a2d67df8047c1debe77d2d7e84f9fd1", - "keyToEncrypt128": "5fa57e485cfdc5c4771fb1053a7d42d0", - "encryptedKey256": "AcQpl3Rr1OapQKARXT6ZVC8O0H0K9uh071M0hEu1CHnBBQYzP5s3X/CkuX10zIKnFExdVMP49ZYRNcrZ9wam7ltLU2LPUgpgDDWRc89wPVk+", - "encryptedKey128": "AcQpl3Rr1OapQKARXT6ZVC/qP9olBQv7Ym4aUI/nsiFAxzNhPNSd9GkV70MNDwPDfPTHQoAEC7Xw4bszt81xxak=" - }, - { - "plainTextBase64": "OjPexD2qdQPYTAWljqkXYxYENIxjOoTwl4vn1DVwfsu2iUhFxvJbmuJTZXi+Wbag2EKl8uWfbv9QiqZpy/hMpSMNFM/j1fGo8wYf+w==", - "ivBase64": "EUSnP5PNdlct0TzM+82fpw==", - "cipherTextBase64": "ARFEpz+TzXZXLdE8zPvNn6f6rMPgbmxUyi8HJ7KOAdzcGZCw1584ktvwRuyZhHfIKQrTSDKL1zMAmpK7BRCBOtgN+bAbfP180ibWhyUDtx3fJlWajsNyPEfptzSxwv4jUG2Wd1eAu8zeMlqiAyu2fgtbZm/YASX/lyzB6GzxiMUq", - "hexKey": "20f58a4b12aee6a844bef26d041834e3091972448c711f3d1d2a7c1994b7934a", - "keyToEncrypt256": "2f2e38e695abee73619d07823f2902131d6c864c70d6a16094df7b03df31555e", - "keyToEncrypt128": "3c19561a184cff82aec0d38ac3c35654", - "encryptedKey256": "ARFEpz+TzXZXLdE8zPvNn6fFr7hdc5eA4MYn+dgxzxhQiSVoaf6pDAGLE6IGDyPJgSiTi0LBOS4uHuwApzQjOULOEt7rHQfh/FSuhDZx0EnS", - "encryptedKey128": "ARFEpz+TzXZXLdE8zPvNn6ddQRdHhWm/mFfIEb63XoWrFPRkD9n8PY17n9z7PpfvMMY3mDlIdhgBh0KS8KbrDgA=" - }, - { - "plainTextBase64": "ZQPTDtqmjiBoDXtEtNy0aBlZQsT48aRXBbU9tEm7hdnGNCFmJIHTF5ymQx5S0+2AtwEIfRH5S49DgVRtD74uUXdk8HWzqKmrL3fT0kA=", - "ivBase64": "P581+ievEuf7zyCVlQfRHw==", - "cipherTextBase64": "AT+fNfonrxLn+88glZUH0R/Fb0QYOlQ6L3uoS2qQRLzylEN9BYm81yAjPOFuuS6585z3lQRJQnaEoH3c/zzPhfujf17P63i0Yd7gGhhQsX4nx2yySNdXMEYPf56nZAwGRhoKt3fKLokLqkdI1DuMK/eo206trmtQas+VuMhplt1/", - "hexKey": "3d1d1ce69444e14d9846f0c3cf9bd50bd8219679975a6a3599c7909bd909c195", - "keyToEncrypt256": "51666c2f0e009f03b5c0a7fa3f4a51fd899c93df84c6e939b5cda7bf13f51cf9", - "keyToEncrypt128": "3f46eff42e70be471ae025e95e2cb7c3", - "encryptedKey256": "AT+fNfonrxLn+88glZUH0R/yKCf+jrObwHaTBIVFOwtcg0ooGH2SY4h885c/ZbQmnzbIx5UBC+q/SZvZkHTSUj/NR/Ql5LMFTbT+G8dzdFG/", - "encryptedKey128": "AT+fNfonrxLn+88glZUH0R+YqoryYxgF9FGpzaYt1hcrGqe1kkjCX8T4NOZZXpDcy68BBujvoZPH1NXf/ZBhLrc=" - }, - { - "plainTextBase64": "91fT6eXTvt/zHqIX+Tq3nFvRhiPEHrfIDItcotSmsXMtI2eEdnTE2GsKL00u8unsKGkJk1A/J3aVa3hc+eJ8YRzxyxbQmg0hqCKJPkHi", - "ivBase64": "WTR8WkV/vJY0C+UzuuI1Cw==", - "cipherTextBase64": "AVk0fFpFf7yWNAvlM7riNQvOm7P7DPOaGjhYuWe6D+horajUypqazynsA2JqrAUMGC4PHQdRMPhtEr/d0l7RL8/y3M1ERKSTUgBunkulBn+Lx62+Xpb8bv9cUtXr7gLeE3p4iITU3KrAQiUVKiauieCxDsuZ5rKG0wIQFo574bh+", - "hexKey": "f000fa8b180896d9cc6ff520d88d74c1a9d151458d1a830d3c6e9ed73d8c02b3", - "keyToEncrypt256": "edb2db93d671b94a792f66e4a81bf28c929a66182a26965820375c07203b2888", - "keyToEncrypt128": "4fc65a6225dd3f2ac3522df76999e70c", - "encryptedKey256": "AVk0fFpFf7yWNAvlM7riNQuuEl9Gcjr4nYi8GnXkjjUnIuC2tQ4NkNOQD/iCe2JYdtGwkBPhJ8eadX+QuKdL3L1VyECaXJec6Em5BWA+4x/o", - "encryptedKey128": "AVk0fFpFf7yWNAvlM7riNQuB2Iqm9DXDfGh4KfS/msZYE2LYP1CyHICNzCJ/wowlS/LYdCYVR3EiMlPz0Hqd0ds=" - }, - { - "plainTextBase64": "VWSMmaPzHwNVcjUkdQTs0gXd3FAISilkj37fNjBFYmcKzoZOaFfx57kcRS2LFpudGTfXgMuPgCYsg7KhjHQVtNmYt578gwQbStQci5W4PA==", - "ivBase64": "5tbwzxMk8+qSPsahsGlslA==", - "cipherTextBase64": "AebW8M8TJPPqkj7GobBpbJQJsw9nhBT47UNHuiR1k0JjeE5RGaTa6ANUWzBP2G9urgEgpxm9lCZnR/SRuNk4nMBMoetEY9YoKUO6KA1gYhERDheUmZ2LEh0rrhLWwdurt4KsZb1CN4eSVjufHZiQR9KzsG/guRAuVkvryBhRVFFy", - "hexKey": "91d43d78d3bae2f4c04382524b8c4d6b6e7cd9e48061eba870817a63d6814b74", - "keyToEncrypt256": "bbc7764486d0f85d150d8c8acb29ae18ad659e20a43b1219f10f834075353157", - "keyToEncrypt128": "e008389b570333ce3efdacb7faa47f29", - "encryptedKey256": "AebW8M8TJPPqkj7GobBpbJSUkveU7p9M21P+liEPt0cELnuza6fuvzlcDXGcQVW6nYpm51eGZD/eI1J4iiEKf812jFvXsAwljSGf3A3zhx+R", - "encryptedKey128": "AebW8M8TJPPqkj7GobBpbJTQzWaId96iWlVKHGM5IScJk9f0ddI1we+p/9K/s+QKe4WenWHv8gI45v8J8C5dZ2E=" - }, - { - "plainTextBase64": "Rp+Y93fWAZN2Y/7kXe6LreiaTqrtJPMerlCF5gIm1O/gAKQKIKOKB3VJqU9WyTAPaa9gXVCQHOL1d3G9iu9noAzKUm7jWk3gXLgUJPstYrE=", - "ivBase64": "cE//BbGwLhhFVmPhWGOLRA==", - "cipherTextBase64": "AXBP/wWxsC4YRVZj4Vhji0ShBNUkbTQEYs6Iu1+FSbxbtvCHzmEJTpZ+ru+5T8rLrjW321tQuYkmKictT570taDuvo4lU83rdBTBPhjXxYBKhaT3GFpqD72Kb0h32YdgA1IrRJ55yCrKc7xvkC62Ufk9d2z20WchTZgGpdiXFSLOh774S3PkhYD2BdwNDX9o/Q==", - "hexKey": "eae1b8a9348b514ac31b7959cbae05c1b0d2167d202722e17527c6b392f7437d", - "keyToEncrypt256": "ecc624272e332de169266f2b264441a0964e793ae77888fb3fce8b0c701be4ae", - "keyToEncrypt128": "ffa8f96111a91aeb14177c61246044d7", - "encryptedKey256": "AXBP/wWxsC4YRVZj4Vhji0RhVQ3MLCvnSsusYI44BdV/V1GgkSStQozVkA8Rli4OJ+Ax0tUx+qkDz/29R6TB0arNx4tC2IWJ6RxRANfzSA5T", - "encryptedKey128": "AXBP/wWxsC4YRVZj4Vhji0TgIuNAHLXPecJcmmnKLKoCkHXlxzB0TKvITZlFZl5WoaGmidQOMBlY/sROa3LorpM=" - }, - { - "plainTextBase64": "gsoaBy3o9l88JkMC/lIhIbKRE/Zd90osP8nXWhKIM9047uQgHxfD4acSXPQQRTKQ/hsoFW25RvchgwBtxZ26Lmi4wa8W3BP9ZxRiiX1oZ/WU", - "ivBase64": "N8rs7zfSR2EsrPLGCUsOng==", - "cipherTextBase64": "ATfK7O830kdhLKzyxglLDp5PraOtB4IgN8HBKB88hXv9XLBdCwBYX4ddHbERy/vNY8hUAx6m34cSaVcrnroM2125VsoV6F3mPQ03GltV/E0Btsro7LwG3L6HmrNiwa/7mx3q7LhPFfW2sItS4TAelJXa9uloUNts8WfFpsvwXN0WLnNWzhAm8qdmVaQjRxNVBw==", - "hexKey": "653ae1ae7c526f81820d0d3243f47032f58722dac12e6f7ed7a6df78bee913cb", - "keyToEncrypt256": "11fc07fd8968bf459a6e40812bdaafe0608a01823a6760d223159956a35dab1e", - "keyToEncrypt128": "a35c4ddd42e85022d4d6aba5dd467e28", - "encryptedKey256": "ATfK7O830kdhLKzyxglLDp4BO78V8m0TeGT4HIukleP5qwOU+XLvwy2XgjZp9Vo9XGdlwBwG3NEGm+lI3p2846Zqm+b2IDJIDnRUwLhYQksr", - "encryptedKey128": "ATfK7O830kdhLKzyxglLDp7Hf/l0qmY7t1jrYoPc9K2X4hnDz0R1yujPi7uFmD7tvXjt89LWxgkLFrHbKXkAUWM=" - }, - { - "plainTextBase64": "vEVCcM7tdzfTwFP+w01RId4Nyr6OCugZOgqGe2h8JBH9bKfGPT2Cdb5Wt+9i9gY6+HtjGy/oAnocLtZvlrXawoUQApEVKzZZ1kZs6qwnYDKAUw==", - "ivBase64": "gFZoKp5v2Vu3Y6cw39GRHw==", - "cipherTextBase64": "AYBWaCqeb9lbt2OnMN/RkR/0PG5U/IyHso3LLi/tysGoCkodazMZ9w3E/Q+a1QsQUPfL06y17ZVMgUnGAJVyVhSAzeQwdw2uYhr0ykGXSY1XS65FRYSrE8GJm8GsKQTTULy3nhsUoEdKETrcoSJ8I7wQ5rDh5jZjzXPbrcOUW8tuTikCGn8bwzAwxwp/l5qlfA==", - "hexKey": "d337287a0a02296f764247d08074f658a1244a731202adfd8c1985805cd64879", - "keyToEncrypt256": "bdee450e8c895edc277152a635aa397768585fc4a04c8bacb6af8befeebc28f4", - "keyToEncrypt128": "29a6d39e0bb95616c4f22edec88bf23f", - "encryptedKey256": "AYBWaCqeb9lbt2OnMN/RkR+clCfelBkAeg49B88Rq6uWl/lw6l1hv5Zow8aoS1jDsNjXl4uIp0Kph3cpP0KQJ/A3Eo+hRrS4FzsMcdOoEvKa", - "encryptedKey128": "AYBWaCqeb9lbt2OnMN/RkR84oPcf5rYwbyiqAARcQhFSCkJZ9LS8ksGTBpm6KFbNwVbcjhWxf0sIp7k3ElpbRwI=" - }, - { - "plainTextBase64": "Um640ahLcxMn3cezH5w1b9K82Yf08u++LXSetUVJG/CYW6DMRn/r/budbInnfpMyvzkqJYUwEUmNkTcJMNUYf+pDrRKioDf7h0fzFfOha0lAhLY=", - "ivBase64": "kiq0n9yWC5SV6Vnkt43AEg==", - "cipherTextBase64": "AZIqtJ/clguUlelZ5LeNwBLg0DVJJCTc2qmZvSlktjdfPZeb8KVAAKSKKP5uUJY17KgQ6Dv08dXZ61wNISl0uAK2uFN4Ts2aHVbamHx2K4d+5dBLyk571myU6N41WGMzG/qFaEl7Enr+u40H6ab8qXdcFEsMhUJnOxNLPevOxrPeJpFFSVmJQyb15+NkEqCgUQ==", - "hexKey": "eae1fbcda31b1d19a526518fd685fe84b8fe97cfbd97979c3fe661396ab67e2d", - "keyToEncrypt256": "d28ed81e5d80ead8edfb243d731e9b0dd550f28ed48cd70e3f286c4f37bf33eb", - "keyToEncrypt128": "87bfb817c3ea46264eefb0611e8873d4", - "encryptedKey256": "AZIqtJ/clguUlelZ5LeNwBJFeHzYF8ojP7Mz3nUV+RA/A4DtcH/Fkzg5cqRsJh8j6nQzbzuQVCznyvRDF5WJXX32jCFH28v87yWu75clBMaD", - "encryptedKey128": "AZIqtJ/clguUlelZ5LeNwBIVit4vXKYLkHiY7iCt5ivE4qJU+z7ZyNoxThv+mY4+sCtWyYLRJDk7KalAE4dEZaI=" - }, - { - "plainTextBase64": "Q5NmsL81XvmZLuQ5/3zwAI90gWb2hu9fle1atQ6DaWQsVR0dbVreoaEgEbN6A29gqS4ief5VDyh7zhK1npkCvCOAGDqKeBAnEjyfdYkENsNHFdwz", - "ivBase64": "M6M3jClrMzY3TF9hAIZflw==", - "cipherTextBase64": "ATOjN4wpazM2N0xfYQCGX5cTXxkE+GHhiNkw6PqTpZ1HzEQQ1jhPbI3ZUfeaeQCeZB24bVMkj0sSkivLXO5grqEXt++iIg/7rBv9enJmoICPqxk0wGIJiugxgw2cEIPSjNvrgyI3KxejC8FvebbXbaDz/SqxydjBr3BKn+MSPabUec8hMJoT2t9X5UBUqWajKg==", - "hexKey": "31adba7bb14fdcb7172424a1106f65915e52755e7ce1b564baf8eb8dc6010628", - "keyToEncrypt256": "8b877e3e7f4fe5849f29818cf0396292994e0217f20adfa4246a829eedb29444", - "keyToEncrypt128": "4c18e7a42beebe3cd598a8c57cf3b9b1", - "encryptedKey256": "ATOjN4wpazM2N0xfYQCGX5cnlJnQp6OYQN9BaolaZV+seF/IFxJXDNSbwCDr/b0zEMBbqO5QqdhE4t0V8YyvSwzVbbSMBxdm5QmFBhk5HsJg", - "encryptedKey128": "ATOjN4wpazM2N0xfYQCGX5fbUwIE256saeCZuo6a10laF0/P/72+Rv4f53tPuNH4Pt1J3Y4DUfTw5pFRYHW59eM=" - }, - { - "plainTextBase64": "2gm7VIl4fWZ82/mZhneict9DPffPzNWuD1aGIheHzTDUSRfWIZwbGmyTDhI0vRXpvOmMcSAvl4s37w6AFpV/OsqkBCfd2exdkOPYpzeipvIhg9iiag==", - "ivBase64": "c9l9zZMPMIxhEo72CKyjzA==", - "cipherTextBase64": "AXPZfc2TDzCMYRKO9giso8x307IJZvYDff9kwm5m5aVRYcZ6fl2rD6PrL9tYfzX1x2POH820cb4EajT7vfPvdtykdxjKa0DGKblhNy7LopcCRS7qKLnwbbgSsFX/4lznJp/ay42hF7cPa+xwE2uR/0IsmVXUesZBQHl9WaOMeeezllSXIozIVWf6NzkD8IN1XQ==", - "hexKey": "cddb467c459cb66fa490ec63c5f299502c3800ae4e5bdfc2c24f91b23e9d154b", - "keyToEncrypt256": "c171df49be9ba74545cb86e18eca0e6033cbe5acd26c06cf3f9f78500991a17b", - "keyToEncrypt128": "e2efa1195095c2b6b294ab18695213c7", - "encryptedKey256": "AXPZfc2TDzCMYRKO9giso8y4jkCAKaZZRzb8sVZ7jDLRMkJrw0ugBystjSqreXwVXT4LkPTakKHuF7foT80pjWJtDCit65Svgc+USHZ62ue2", - "encryptedKey128": "AXPZfc2TDzCMYRKO9giso8wUeFvjzYbFi5GopRfQMCIUeErHatuq5+mWLYiVJzW8Wq2fyHCyFFecicjsvRxcPqs=" - }, - { - "plainTextBase64": "GEFCterMNFLN1dx6LBgnahdtHsvyw66lOHLFLM+8PyMSwFNB0S179E42NxFMyjSVL9IOW01Z/cx9wXDOLOnoCjntClgidkOGFPIS++HpiavGgEi8lr8=", - "ivBase64": "WW63eeIu7tKpqLxbxI1xog==", - "cipherTextBase64": "AVlut3niLu7Sqai8W8SNcaLFPFeZPrCmGS/wXUNlQUpbuGzJu8oX3LgHQd5wBeN3jhVhTyrJvbZelxLcldyeachlUXiA65xQjzGCMkNMstvZteif1Uvmb5qaBfk/6ShO8eObo1wv8SKN3nJ3V/Oqm8lZhs//gGjQbUpS/zst+E64C1i6lMIuXKOAj1YJcUtWRQ==", - "hexKey": "03d07c6ddd9ae257841d6778f65cfbce91f23986a0dcb1323e661dc36447f645", - "keyToEncrypt256": "cf5ed55e3181efc4a51e8004fd3cef1f2ef42c5cb2f66c7af915787e8ca136b2", - "keyToEncrypt128": "a0629dbf4d64ae323fa4b353f5f0eb15", - "encryptedKey256": "AVlut3niLu7Sqai8W8SNcaICdPY/usRnJ4e49VtdG4igqTsqA9QMltmLALMP2AuUAhGKmi4Rv48W9KpwIuYluqW6YEfhEnnnhdMekLk5UHTF", - "encryptedKey128": "AVlut3niLu7Sqai8W8SNcaIYNbc5uUCLk/GY9uMCwuQyQi9OodAsgaAMBtY75U75iiPZ6Qykg1diiJ+y9Vkslpc=" - }, - { - "plainTextBase64": "2pLQmAywzLicnEMoSTkZXjN3jfI37JJM3ApvyDW+aHoiH6F/NWcy+3vMujGIIrz4++FloAA2asY29gzfre6Bb7zGX4y44uURwfh9QhrQG87glZsSK1Ct", - "ivBase64": "sQpI6kTLzE12JsCFqIgtUQ==", - "cipherTextBase64": "AbEKSOpEy8xNdibAhaiILVFAN0CYsBUuUjc5UEL9vpiT10LJcNBUqIYb0WdmyFLpdmbwhPwKIIx9eDWGuovQDAjRTunzWSWUnbl5Uradr4e7Ec+Qpad/rUzTToMtiGktwETJgXNPgI9svCsG9X65QNV0JHnP/6tuYMd9gStbf7Z64zfkMWHaxMwusmTD0kwHQA==", - "hexKey": "32616dd22fcb4c2c2aa301721c048f51cf7f56cf70ad596003e306fdb0b68d73", - "keyToEncrypt256": "96516691ee4cd800f382a6f05124fe574d742929c7b7478d29a3a533ee057f3b", - "keyToEncrypt128": "f091125768571e27b93b163ced5b6148", - "encryptedKey256": "AbEKSOpEy8xNdibAhaiILVFpXqUijtD1QzpY+3I8pfV/BT5q+GdU4B6uebgQvtoXUX47Dw1YOrXRlGZJU5zfLQHeRahalIY29MxConqEAQmD", - "encryptedKey128": "AbEKSOpEy8xNdibAhaiILVHvQRMRGKiRWJwMoygsUy37+BPhcc+/6DUfqxXjTgi3d+hhZJWQqoq6bWQIyNQ8tl4=" - }, - { - "plainTextBase64": "VBK0bBxeKSoqPiOqro4WbDX/H4RssT3hSYdazXH1qfOXuNstb3KF31jeicI2CO+HFpxY3S0lnxZRA3bIqGe0f33d8NwcbWY3k56nOaFOe6OjjonrT3WkKg==", - "ivBase64": "Ya/xiC/QQXk8O8w+dEdF/Q==", - "cipherTextBase64": "AWGv8Ygv0EF5PDvMPnRHRf3rhs07OYmtgE5ZNBAKfioOaj3A/kDUPfZecBMIL1OR0LTpEgMVuwn245RujDoj9UKl+jSPad5zHcl3YUVajRVrE9FfBptBhUCU2SPSb529x2ftQLnBCSVn1bCFJ/1k55JRv8o5TQCXqHM8dUGrSzv1AHXsAOfXCUKTKvqX4Vz6iw==", - "hexKey": "887886aa5f5b9532bf1173c9a9ec4527f58b19a5db8a4aefd3227d13b5460a50", - "keyToEncrypt256": "4fe23f176f4a070dacbcb6455f1cd702fc8409083621efbf5e386eb10861c782", - "keyToEncrypt128": "240639aebfcc686ec03b4b1351d4c483", - "encryptedKey256": "AWGv8Ygv0EF5PDvMPnRHRf3W+OenPeTVr/gB7K3+zvLSdRY2apkwHzJZL63BfNOrsrIbrNRunFyglo87M/0hPcUxuqcRCU4bvdJmDnAt/tst", - "encryptedKey128": "AWGv8Ygv0EF5PDvMPnRHRf0CkuyMZ4fnVSURUBK4s7wA1c6QbprPKtfZigdSpPVhOscGEzKNifYgK7foJ0MSIZ4=" - }, - { - "plainTextBase64": "Lh53XU3vNtk8eDdVt1rkDFy1aOCnCFuWIFhb6vwL8Tyt6jRtxy/Xonzmy2RcJWTnY0Ih+3xabpV5RXGvIEPipoCIGDu+Gu2x0ED1oylKdqEFLfaxZRfGb9Q=", - "ivBase64": "EDwg6MlcnMNdqB8aG/Q8Eg==", - "cipherTextBase64": "ARA8IOjJXJzDXagfGhv0PBKHRRHGTOQQZRZj0CbRmZXqlr1+wvm53b1KcfyR60v0ak+RG7EpWqYehwSyRWeZc7Wx8gTAmT+kbJZLsWrSefbrS6/CwF6YAQBSt6xZfa9BJhGy2wjzzQhoYLMILac/Iuz+3nFLtWpyDOZrA+NfCxu2eB/UkifQlPRgzTdUZTFjzA==", - "hexKey": "e4f1253cf1c2b5346c6d16194aabd248afa0815c39cd3ec65fe5eedea6bf0f90", - "keyToEncrypt256": "a8daba0ca6a0f1ac94e1cf9a4c3e1a29bf383cf2a7138466404ba5b486c0e0fe", - "keyToEncrypt128": "f1719c59c6be7a190c51a4331e6fe6d6", - "encryptedKey256": "ARA8IOjJXJzDXagfGhv0PBLG23lGeULHS0qYi5iJgE4XRK9j5B84eo2D8TDlN6ltbppu4DFotUSZzotC/BWXGdK3N8WAY2mXyO0+hEQCfn6h", - "encryptedKey128": "ARA8IOjJXJzDXagfGhv0PBIp/8rfZp9SypJxjJ6wDuXtVeBECPAt75Fk2M7T0Y9C4QdsYE6YcM2Cuq0xFdPcl84=" - }, - { - "plainTextBase64": "5eCi/i+HvuA6pvrCPoxpZvvEnvux+FIQYXm3eTDNAGLK4wgJluLlc6k/ojdg0lL3xN0vZ9Zxdsksm0mxcbvxcoLUfAVCZc1pdij6fEx77/ybmiLyK65VJvPL", - "ivBase64": "gbszvfbQoweFhXkA7mXcMw==", - "cipherTextBase64": "AYG7M7320KMHhYV5AO5l3DNKIg+hpa1KNSa4iDNnYUvCXiXPxRzbfT+N5U0GakfdqzcLaCmItZsDqOwH/l314QIu1X2wqxXjiSsjwZtnBtgcHPBW5Em4OhDWkbhKQYwGejfAPjKnO44Zed1x3irJcMbwWbxvaob61ii3aRcnqXF7Hq/fxGyUDbXuL8W99ahWqA==", - "hexKey": "d8502793f98ec3a4bc8ab3d939cf6bed3e4ee72e8de5fc113481db1a0bd61c97", - "keyToEncrypt256": "88c613c529a3bcea6af467af838381f298fcbadc2c6b10eeeed89d3b9e4dc2ad", - "keyToEncrypt128": "f0cbebfe8f4be318791a7f457c621ec1", - "encryptedKey256": "AYG7M7320KMHhYV5AO5l3DNfLjd+RZcC6lcKyt/8F4Uqdo8wOf6AEnTvg2DjaSCXwDrxqVyMOpmi98E/I5Mm+/DoAq+RNJg87uB9y01Gy2uU", - "encryptedKey128": "AYG7M7320KMHhYV5AO5l3DOh6LOO8XcuZ4YcDOHP6H2ohRZ3b8Lu5pOwqhTr0NtiTtfLj1ymUdGZ00oDWyr8Z8Q=" - }, - { - "plainTextBase64": "UTBuP6nD1V6wWXqxAOIE1O5b7KnbHy5YEo7BpK5XHFzezrlyiBhA+HKwzJSpjoZkHa2a8xvuehOMVSaKnIc4MdHhWgBhBbWX5s8TSZ2SSXKmSbW3vcyiOG5+jQ==", - "ivBase64": "1GxsWePCOYwIjFcnTm9WOA==", - "cipherTextBase64": "AdRsbFnjwjmMCIxXJ05vVjhdse4RHE1pSi5OOr4wUqJnzDyUq389uNKqs0UDlaYBsAmPoQxi52wDnfJxhzVGqD92Lateyaiv4hd0qxDrOIHj1k1qwwls/RSvv4Qwlf9O+nV88euXptlY5Akj62BXZAv/EGJRrwh5Uwsksr2lefsrM8KijkAOjmZiOeyEw61UnA==", - "hexKey": "1f084a76fe9739d59f92c62a01b8990061d676ed59268a829811a1a46f2badb5", - "keyToEncrypt256": "68a0c5d8381c46e7e87d69dae8d898343cf6a981697d866f6cd31f2ee9f747c9", - "keyToEncrypt128": "d3bc709a443fc4711565e6a4648f4549", - "encryptedKey256": "AdRsbFnjwjmMCIxXJ05vVjjqWiQAOjRDcX9rqTZfGlI0yXvfnEvnkp1nFhuLhLO5oE6sEdNz7cZE0KBHMPvdD/AcwWUoHSbE/PWpsWQR8gzW", - "encryptedKey128": "AdRsbFnjwjmMCIxXJ05vVjgHaIuPYYScq7sIJhMTtIw7ZcAVgzFoHyDsUUwsrhkU+bi54JIz7c/Oy+wxjkgVpek=" - }, - { - "plainTextBase64": "Or/cdJ3QSn2cMQqQpwuys/Gkp0EWPip1pqknDcCInzLQprs/jnK7a6cU3dxBeOQoV/1/2Cx+3QKSwOLFgXkg/oZ2Sj7wske+J4T/xqFgGsHtLWT12nAqw3wxExA=", - "ivBase64": "u1jIEfUNg51OvpVSxLMykw==", - "cipherTextBase64": "AbtYyBH1DYOdTr6VUsSzMpONplY566jp2l8Vtx3HwP0WyTJS3dw5U7oJ6nhxFQwcZ1V0B6/i7AXGtve3U5qCL1w7wFtKzHYnVVabPlG3z2dc/u4jhLA5V62nWLS79yvXqVyBpmJ/6AiVe2vtjSeJjkX08JfxN988GBaLy+O3tVWIzQEgw+XhaeZVU5Bmrhv6DA==", - "hexKey": "147e6a6b708354b4700d1362bf9de8026f2445a4f9631e9208dedfaa45aad8e2", - "keyToEncrypt256": "f628aac55a9e3a233fb11fbd7cb3c3ea7b926f6201ba3a99fa5ed48ed26d441a", - "keyToEncrypt128": "9ba50b0598a243a9d1e6952a6551e128", - "encryptedKey256": "AbtYyBH1DYOdTr6VUsSzMpPj1U2bsd5rQKnpajhE0mQ3U7VgP2n8rbq0djm98j2mlb5k/hTDpHJ/qzVQEdbWQdP/z4KMnpDqy7LOfZbaxBmz", - "encryptedKey128": "AbtYyBH1DYOdTr6VUsSzMpNwQYCuE2KTEohWHfoATs+078aacjEs51d90fIC1uPHwEfY9eIH3Xh+TPLCGzsIago=" - }, - { - "plainTextBase64": "ydT6a9PTM3FToSXS7cuRZNvND6sH/x9NVmT/+OQQ6Usxfq+myQakotZSwXwKvmKl0yacL13WFu3u/paIVTDoDLVNhfi1Z5QVSA0C/3i2RZlx6hE8xyuvBkyG5hs1", - "ivBase64": "fhPWU4bVDnhEcObSdyWjuQ==", - "cipherTextBase64": "AX4T1lOG1Q54RHDm0nclo7mWmXixMPm9BWiLIZVozuKQSWiEaPxhAJY1AHMY9nQhuCkOcN3aFZCSQ6eK/HCY6P3el1MnpR5oRNd+eiJdDy9mjKkb9c1UFGiPjM3j3fnXmLhXXx1nWpPhq0ZabebuRQ5qJHvvNIEd1QW9xFmjVyxOS5lZ5Dd6unXuW4FxRtIzjQ==", - "hexKey": "cb7ad5c62c0141e15effbf13d7611a8f28b9e1bf81f9b3b88f0f4197052da208", - "keyToEncrypt256": "3cc6450c00519d36a27fa3369096fd34d7edfed60be1492a1024ab7836998c48", - "keyToEncrypt128": "2838765c179409dc6cdbcaf3b3383f70", - "encryptedKey256": "AX4T1lOG1Q54RHDm0nclo7mPM5NsDg09uuS9AqR7x+3CAIqs/LsI8IBWvNiGotfA6oqNibvDdpd/F0aPqU/eZPiCAd40T78PfilQDmh8/LK/", - "encryptedKey128": "AX4T1lOG1Q54RHDm0nclo7mZ+VRspMY0Z2nWXMxUfMPLOc6hjXSMJ2zUPppEGiSy68/rFXw6FSkrtdcmgdw8pXk=" - }, - { - "plainTextBase64": "PVV5COwAZvoIQmyPvtg8DMWg5Bu11So8XvX6/nlIbdER7eUu95yaM5b721KoACugM0F/Z305uRG3d6k8WmTesE7Trk9dygCOiBqR21EWjYgybbYUEpled7Zs/OzBWg==", - "ivBase64": "baBftIqPcBW/eL5qnRJRUA==", - "cipherTextBase64": "AW2gX7SKj3AVv3i+ap0SUVDFQng0pHN2ezLSYXCyGD4XTcMRmMot05mYHFT8GX5bURK+jNAQvDundVhMQ04wlizGl6/bvkM9pVGzWcTdTAdzPQ6ynkFYYxpjDNGp02eGD35VvsiRGpDot1PaQ6cUQeL71NoSHVFFukP/OgV9WQPrVsleB6xvJiToSM+e0aqWTQ==", - "hexKey": "b3eaecec26fcee6e6e47f5bac6998c7c4603502e787b93154851ab78c7e19cbc", - "keyToEncrypt256": "ed65dc415e4923eef92964e10ef32cab6c81449d27f084d1c0fa207c91ae3def", - "keyToEncrypt128": "aa611360ad743ce1b81c8d70b08d36ae", - "encryptedKey256": "AW2gX7SKj3AVv3i+ap0SUVA/+PIRDCxZz78av9M+SeijZaDQSRPivdo7tUXHeI97zLJfa/W1dUzEbWQejys8rxIcBfYyZgd/x+eT7izzuRit", - "encryptedKey128": "AW2gX7SKj3AVv3i+ap0SUVCOyeFpmBNFU75zpj8pGfXCOaRPT1rX6lP5OwV9S5WCb+kpNJzM2zzv1GqidoZp+1g=" - }, - { - "plainTextBase64": "TBo0w1nOASQybIZKZD+22eA52DZeQeKwvzaTFLHrqSsj776J7qKZ7pY/Dwq9xbe5lTtZC1bf9DZ9sQ1caJQGaLSs9KyT5dDNSKpgbMiLzZ+BWXqKQ2ssvDUgb7/xgZA=", - "ivBase64": "H8XfkGGxCLyVH1/opHNrRw==", - "cipherTextBase64": "AR/F35BhsQi8lR9f6KRza0dAo3qHBFlnpb3EuY+pH/UaqVwAEkcnWR0xpCxhk1Ec5qrWQ1tRC9425S+edK3616YPbZxTgsu5mVKyniNINkRTrtTTRgmd0SS3cKDqIhzP8wCUapLMm9HT9m4uG2r4bjdT7EAr7Hz//ea/LgfpkM4kjokxaQB7j0hypsbSDJ0nFg==", - "hexKey": "beb93e7d3afd66a1956a9ef14b750d8892c0f81621e29ff8e90b03e81567c999", - "keyToEncrypt256": "fd0fa80388d33572fc7b443cc2da3aadaf53db8e48cf16ce2b9e9ec89670fc0a", - "keyToEncrypt128": "590839037103a6a450c991e7cbb14115", - "encryptedKey256": "AR/F35BhsQi8lR9f6KRza0e8JLZ6OJf5UEko8vqduiGEJaZT1hlGqt63FrxCGnNGybYQVWrT9kPfVqzeOK8mUlnjgemq93vNa9pZUernSMps", - "encryptedKey128": "AR/F35BhsQi8lR9f6KRza0fCwY8zB8DbvughMJ8DSqEe9kvC8A/H+D0RpL/vugbyYl5oCaRDoYQ3gWY/Pxe0F7A=" - }, - { - "plainTextBase64": "FsjCimZotaPAONmiHdls9vmWClGViuTMwcUP1mjTmNfdcxyz1Kg/B16TKU+fICjmA9EjNZ+PADAP0x/AlR5NkHAt9Dpn/h/BTWb81tWPyXhSdcb9RC6j0leL/807dSkn", - "ivBase64": "T7iP5+Z2WtOeIvXxO3exTQ==", - "cipherTextBase64": "AU+4j+fmdlrTniL18Tt3sU1K9rRhCIgtqDmX8KfLcL3hZqSv+D5nN43W3FhjGQNkyPKqir8J73MxNhcCZrIA5dhJ5EQ3q0Dj2e18ojinIb12HDhIur8cPWEtb43bxesHLUb7nLq51REv/Su4yNaajkIEnt1PUrvrCFCdR9Xqg7eag/Qq5wjpbYUC/rSjwaIMtoot7pLu1haAz2l4BmfCnwg=", - "hexKey": "4ac6df55b701a2ecc3b338845361d5313863dfd9f0cf7520bbbe13932e0bd60b", - "keyToEncrypt256": "84aecf2eb9d254a2a8e49e1cde5b23ba114ba24b1ea6b08069cf5d391206ba71", - "keyToEncrypt128": "dfca6aca9ba293aa9867e923da7ce8d0", - "encryptedKey256": "AU+4j+fmdlrTniL18Tt3sU1rY0NCkbCK8k+krsDBjN1VL7Q4u5dLV/9MPOzdIhsovco6u8QR05l9c2LvnJi159JMS5SY7r1HkRWhpXp4LuRZ", - "encryptedKey128": "AU+4j+fmdlrTniL18Tt3sU0mps1ucZb1XulDEd19Fwb03GTD5WhDpHiqgG87J987Ar8psXGoLDvWNDrpZyoJeVA=" - }, - { - "plainTextBase64": "OR/e3pgn743+gt+MvAxIXp57jXMZe5SHCKyvzeJaj5E/vhjl28whfqWg5M502HcQy0f7Eby6dgVswvwF0LjIVlibFPjPnhWZdsVEaX4+I/82nCf1KaH6nP+0QLdltkLqiQ==", - "ivBase64": "Fm7as9deTwnpVZeyMObvQQ==", - "cipherTextBase64": "ARZu2rPXXk8J6VWXsjDm70Hz+SPUwExu6fMwrHILfZGIzOtJbxBJ0B5rSIvoOuul4l7t3YDuvZKO7WiDx++EV4WkPJBhcO9y4fW2iLrZDB2GMy2LQhi89pt0NAJ3/OTUAtrX9V+pwq8V3pfpEJyGQ0jW/E2czaY+34YuPrhCgoXH+t/GpNlcW4JbdN2hnd7wsioLXbWlWChJruxVYp8Eyo8=", - "hexKey": "0b026d45eb691d6af410c60425fdfc90573a457d37976fc155b07a6c6850d9f0", - "keyToEncrypt256": "ad85f19996140a7490eb7d078c1c5ac22f3632108a45918559f0df1a36dcb165", - "keyToEncrypt128": "9c2cdcadc696400517ee67ddd266e497", - "encryptedKey256": "ARZu2rPXXk8J6VWXsjDm70FLDQRBAfGFQjLyKGpvadJgGkUmaYtfcao9HEH/OdGp1yM/vsj7PxF1UwzSR2WU9TBmoFMaj2WyGyK++xQ1Royb", - "encryptedKey128": "ARZu2rPXXk8J6VWXsjDm70FkAcLUYHSXSykmQpQmJ0uwgtcTGbTXF/vDMlCZ4wRwkebsGgxztivw3e/GprRCduM=" - }, - { - "plainTextBase64": "eUs6sbJtux/oOEdAgH4EPNOwHE3OWjwPgV7rvboYN7uhTKEQIae1gdIbU8n/wA0JSebb04YNsI1JAHqYvt1vnXYEjL3c8LCpSsmi0K4WFJsdOJM/s7slMo0YUnXXnRvTSVE=", - "ivBase64": "VULvd2vbPbFQBk1wAk9Fdw==", - "cipherTextBase64": "AVVC73dr2z2xUAZNcAJPRXehspj00u8oIN3ZkaOiDNPtNOv1imS5hM+c3k56pkXeLzYsNERAIrlVyiY5nKk+LcuGkiNiczvpdLEj2p0nPnne9UNAgCaNA8Hw4siG+b4O+ajWT3OUCCQXinBSwSzOKN/NAqHe9Rmz2iX2YVgO2z8z4pH1DkWwXUj3bWMV2Dfk/52NsbuwqTWi8K25GiLA5B4=", - "hexKey": "de429adc6ddf66b5ed8617ddb355a9670e16a689b2bad62174751ebed66ae060", - "keyToEncrypt256": "012ee7b3ea34950977a63c8ae0493100cd6043b315ad9764a7d3f4d7899f0f2f", - "keyToEncrypt128": "4acb6af27d31c427859baf3469ef9e70", - "encryptedKey256": "AVVC73dr2z2xUAZNcAJPRXeOKqH718cU/FCyH9aOr9aGFuFpOGjJQWGdCBT8UDqJiob2CJC0zIhnP/sYeMnkWTJGDN3ZZpv+OgVlvpRnCJCy", - "encryptedKey128": "AVVC73dr2z2xUAZNcAJPRXcbpzSElC2xeOKQkFO0/oBKG/Xi3wu1W9cgxs6a6vjX+KALiBID3k+ez6ayyXf1ZTM=" - }, - { - "plainTextBase64": "nv/TOsoNbzre97e9SBUY5603Hnfk0bqd/vsBJW5ccNHVAkiW9wZnYulQbnSCQO7y0RvrNFX144l1ljGK1UGU7uCOcMckiDtPyxp5F/Zdpz9g1ld7QLvQFxpcmO3DfUwrvvVP", - "ivBase64": "f6zK5YQt2KL+9Cdrcpolvg==", - "cipherTextBase64": "AX+syuWELdii/vQna3KaJb69FraUfsFJ6kqR7c8qdyeVV79lPw7URbCHcrW+F0OL6BwpJLppZTbCjFTwoP3iHICv+6Leh67MqyMYIgkTzWlUMCPdQa36DtZz2ph3GAupM8mf5XU1DMHPjuB0hWDbML71wE4V3bgVh0BoBvpZEcsw++nqlrq0gsev2MHSkrYNSMMUcea4xsCxrLu8NikvxEU=", - "hexKey": "9322f28f606a9ada88bafbe20e8cb2ffbe45feb19f511d1bbc8185e83376c0b9", - "keyToEncrypt256": "8acce5acdcb4e75100b83540dcfe8d57746591e7425628b32c865049542fe349", - "keyToEncrypt128": "6980ca3a5d0961481dd0380712237a5f", - "encryptedKey256": "AX+syuWELdii/vQna3KaJb6fHaZ8fjdmY44zStAapdt1DC4503bEMdK3tm+rWKF1t4WEmyAL+Pv5r9J0E0wmzJK6xC55nuKkQEM0saNaYudC", - "encryptedKey128": "AX+syuWELdii/vQna3KaJb5vtK3heTGndT/zH31iKDuo4sjybNE45fqNHoGULWC6EkQt2Y2Qf5cnfFmvVnW8+lI=" + "aes256Tests" : [ + { + "plainTextBase64" : "", + "ivBase64" : "aP3qcxnGlXHvKWkWIfKr2w==", + "cipherTextBase64" : "AWj96nMZxpVx7ylpFiHyq9tPvhNhhrfFVqKV5G+5t0USPvkNuNwqqs0x4YZmD18jXfCzBFogwbIu+/s7QaX+AQI=", + "hexKey" : "ee66b6c2a9951718d686dd933aa7a3281fd3d0b131527c13cdec6f90ea1dbce2", + "keyToEncrypt256" : "1c17ec5390a7d53027f3c4a42587a19fa896e5e3007ffbcd1499817a27b10ea7", + "keyToEncrypt128" : "9c1984090c9e58684ed60fee0595eab5", + "encryptedKey256" : "AWj96nMZxpVx7ylpFiHyq9tZQzK2T78QtJgcU/GBTOxcixbzhCcQX8OQs9Hlu/JWJ8f18wXeip13vUvWG2fo+h7f6xh3p/db8FDxYGvZp6/q", + "encryptedKey128" : "AWj96nMZxpVx7ylpFiHyq9t/WoFjA7K8Ak+e7U3cBMmCYsHEHb5Lmv/yv/5Fr0oYga4TfYDoG9s6fMoyc/J/JMU=" + }, + { + "plainTextBase64" : "wg==", + "ivBase64" : "HtLKEspo732MEKkTNLi4bw==", + "cipherTextBase64" : "AR7SyhLKaO99jBCpEzS4uG/5teD3iwyFEcONHeVCLO1+oxQLDfv2nQtEWKxMYFv5GPpYE4Vfofuff49IhYcYGfo=", + "hexKey" : "9b421b7a1a70617c71bd16d39445cfb46b87bf5ed8a69295cbf0bbe98bf4f9ae", + "keyToEncrypt256" : "df7b39284e88f19c0ac0abd40ad4d4f167ea165810658257cb35ba6657963e56", + "keyToEncrypt128" : "820a56448523ea4acf46113aa55eb887", + "encryptedKey256" : "AR7SyhLKaO99jBCpEzS4uG961FuY9cKRkoTxRaPkRAYaYWjCtbP85tvUvsecszrNgvY1JY4+dNOZjIYJ+zDmBNDa+B5OG4X3MwOaVe+Jg8cA", + "encryptedKey128" : "AR7SyhLKaO99jBCpEzS4uG9hG+wZduW5uUS8lU7Ug2vo1HlAtx9Y9s/LyYgYWYI/FxGPyD/NpDhV3MVb1tCWol0=" + }, + { + "plainTextBase64" : "zNc=", + "ivBase64" : "Zu31rkPTKH/OSKmT7zKzWg==", + "cipherTextBase64" : "AWbt9a5D0yh/zkipk+8ys1owUExxvCav/b9j6gXE1XFdx/euQmsWvWM4KdMDY0Vi+3izofFO1iIkjJG0D8GhglQ=", + "hexKey" : "6577853a0ba55ff979efdf3895d7aaf47d9beb0ce01d41fcf0102ac982219de0", + "keyToEncrypt256" : "10553fdf58f799374ba72300fa012f2128700ac6f2b398ceed8ad80c22557a52", + "keyToEncrypt128" : "a09eae23058dd77287c7fa71591b5e42", + "encryptedKey256" : "AWbt9a5D0yh/zkipk+8ys1rCDZir7QOVvOyOk0WO0dzTJg1lnuw09yWxWqSLvdWMTQU9GaA/ptsWxCS0i6AmUugNEVH/a6WtzVc0qzyPtMuf", + "encryptedKey128" : "AWbt9a5D0yh/zkipk+8ys1oPE5OtkyRt6fyA36EypVuuZyQRetLfCZzlkPKhl2I+9/Xxrf6g6BUgnk3aPzxcagc=" + }, + { + "plainTextBase64" : "rfGd", + "ivBase64" : "LFV+8jVwaktB4aw6GmmyKQ==", + "cipherTextBase64" : "ASxVfvI1cGpLQeGsOhppsilUIbRNeTNoYXhvWK1ufMRzu0/le6vqRF2az/aE20UC4lBPkEdWmxNvH0b0wpuM3PY=", + "hexKey" : "44be4520be070415c0102d30c52145a2d4b887da3d946cfbcfcd410b47320830", + "keyToEncrypt256" : "07028d67af5776e43542bbc351ce1d3568d7e03a6dc40ef64abcb9bfaf5a05c6", + "keyToEncrypt128" : "3474809e5ccbac3e2fa67e425ad123f0", + "encryptedKey256" : "ASxVfvI1cGpLQeGsOhppsilLVMehqDzDi0x7yoT8qOfp5nb6NqB2hkF4wfuls2v1yx/FfoHodbAsFeRf05D+xjySSb0AYcdhNxLSrpCF+Kqn", + "encryptedKey128" : "ASxVfvI1cGpLQeGsOhppsikOAfPyzLPoHzGSsFjkqZ/hM+wi/huelxf5uiJi/eXwtLIEr3n5PHB4Gxax9RHKYak=" + }, + { + "plainTextBase64" : "G3NCfw==", + "ivBase64" : "4Kn5SbpuYDJR+88RZTXm3w==", + "cipherTextBase64" : "AeCp+Um6bmAyUfvPEWU15t+9T5GT82wnSXnjFJyddez69NE7rrgG6eIXERWQKhJLUd0b1Xv7KMy5s5xnXdmOtsg=", + "hexKey" : "1e800c0c29a01ca77f7389d65ee4ab634b6cd016354bef53ab16d94bc96e4d95", + "keyToEncrypt256" : "675e38a27fab76cb7cca8155ba442679cfcdf0a3b50dae7a4a64abc53ef8706a", + "keyToEncrypt128" : "ba725951a633f1cae8005e20495ed684", + "encryptedKey256" : "AeCp+Um6bmAyUfvPEWU15t95xOY4QSpDck7AsGF7Ltm1G1hwzelQK00lShxY3wNS0CRIj/Wj1JP4Xg23gsG5MVV5NJR5ePHegd7uGaAYleFz", + "encryptedKey128" : "AeCp+Um6bmAyUfvPEWU15t8tZm7NLXHUGzrqK/MZXviIyLn7eOzOXH7/fR60EgxucQ6SvE0+c/Kyr4a2xXhrI4E=" + }, + { + "plainTextBase64" : "6890TzA=", + "ivBase64" : "m21L5KGLB5qUuLET3B7V7Q==", + "cipherTextBase64" : "AZttS+ShiwealLixE9we1e3SE30Cc73wylpm7ALJzwO0z50mNRc/tHlaqyVw2siFyucT4UZgeI26eEdRRWgJ6L0=", + "hexKey" : "8142a100a944b7b2189f12f86b209ba3c84feab263f4ae4c63375493283c87b8", + "keyToEncrypt256" : "8ad087653b22e2cb6c8f4de56855c90d4927631475746244ebe538e5b3af0ede", + "keyToEncrypt128" : "b518c68b060cac294e13a93712a5a299", + "encryptedKey256" : "AZttS+ShiwealLixE9we1e3z9gHmFM9r79eoa1/CXvlYtL/d895vzucNkYNGm9z7pQFxpL2OQTD40jG4btSwU1x4f+cQTB3dzp0iJIJR4H33", + "encryptedKey128" : "AZttS+ShiwealLixE9we1e1ocKG9hmJu52u8M1GUtg0/uH7ouY7CRfQs1py/jG/KEBOSl+w1geK68kZoezCzIbI=" + }, + { + "plainTextBase64" : "Ql6D/TNX", + "ivBase64" : "Fd2+X3R9Nc+4QqVhEjnPiA==", + "cipherTextBase64" : "ARXdvl90fTXPuEKlYRI5z4gmZnz0qAj1n75+tocfE2PYbJ/B76b0K/PtwGU8o1n5QWJTqaDXIGRbuFwDYGeI+8w=", + "hexKey" : "606068f7375388096486eebb62e1801e34ac9f320e30a5b1702fc3a066b29864", + "keyToEncrypt256" : "5e6880da101e3cceeec57feba663bc1db154802822a6c7b9711eab6d87862efd", + "keyToEncrypt128" : "c5a6e2bbf45c6f90a8db403d94fd933a", + "encryptedKey256" : "ARXdvl90fTXPuEKlYRI5z4gCyXAgho3DjAhhv7CYHWLtnKRagJrtKmM/M3+/TlXUQnPZU0cybfrHILrHmgRa3f+d8qLc4frUdgV2KjZUKA9T", + "encryptedKey128" : "ARXdvl90fTXPuEKlYRI5z4jHL8svI8vx+qM9GKSzKFJq0rfY9d0hEJvlqv4Mh0h/jGeQZmQEfH1Gwh0EJ04DLlA=" + }, + { + "plainTextBase64" : "IF4oNGM6fg==", + "ivBase64" : "GqAjRs8PzXTaZMGnVCJysQ==", + "cipherTextBase64" : "ARqgI0bPD8102mTBp1QicrEyEfM7hrYogtsslTSPTK5a/cpGahfHeeqYPcVY8oWWtIBhFeu+uWvE5j3KXIQfg18=", + "hexKey" : "3dda9c483db26dc68f78c0fc4782a740b4f57d944b4522d05f21f95a4a856978", + "keyToEncrypt256" : "8d68f9de678b07f2350a2d68dff035bf7af89b20bde4c4dc1970880fa39eda50", + "keyToEncrypt128" : "35d21c2626a9905238444046bb1e9283", + "encryptedKey256" : "ARqgI0bPD8102mTBp1QicrHGKoReniu0P7BOH2cNcfEp+CX7h2wa56IGQ+cRTrJwO91tBlnMo+9tTOzlzvK8mPBlimfxoI3VocC12rkR8CBY", + "encryptedKey128" : "ARqgI0bPD8102mTBp1QicrFQVgBztnrHCOX9MWB0Clc6Abq58X54F7T4u7n/ZW3A0NJwah75l035F3F17K7MPrY=" + }, + { + "plainTextBase64" : "DnYL9GMY6xQ=", + "ivBase64" : "ZV3/QhEOEYbYnCkldEXXuA==", + "cipherTextBase64" : "AWVd/0IRDhGG2JwpJXRF17hg0C1uA+1k7Z0eKInZND3dstEscy005i0CugYCVbXOKDrC1ij5NPIfRLDg5KHASjk=", + "hexKey" : "7ef3c30f371689a92a6397364bc1fef60db1db8beb64004a841eb506dc830f3d", + "keyToEncrypt256" : "2a85868cc771299849bc71436f5b1e72264a9fb32192ffee7411b9debdb6ebc2", + "keyToEncrypt128" : "d07486799325d681da6203deada1e581", + "encryptedKey256" : "AWVd/0IRDhGG2JwpJXRF17gTltNU7s+RcdBdax89AccjdqFkbngIRI30SOydwSewZr7Acw3/GcgR8RejIi8fFye8No1scf+qO9nXPjWNwMjp", + "encryptedKey128" : "AWVd/0IRDhGG2JwpJXRF17hVngt/kW/mPrRDMKGInPXhkHZlFiwjcAY5mrFfMRCz0+BT4ylytmHmwW1kCZm2l5c=" + }, + { + "plainTextBase64" : "NONJkrmsymfz", + "ivBase64" : "3wlJMg8e2WTMeuWCs693mQ==", + "cipherTextBase64" : "Ad8JSTIPHtlkzHrlgrOvd5nZzpe45BFGSjbWCdCxavpi+p3UI11Owr9s7vPv33eMy5Tel9l55cxMtP3KTR5ajSQ=", + "hexKey" : "8a3bd5ea4658503cfbe4ee93560a7fdbc0dcd64378183b82f9276ace8d606aa8", + "keyToEncrypt256" : "648b8448ec881f855e06b56918cb999aaf8dedd4606091cd7f17470eb096dcfd", + "keyToEncrypt128" : "2880c5f29b645a6f309c2e2a2e6ea0f5", + "encryptedKey256" : "Ad8JSTIPHtlkzHrlgrOvd5nJv1hisyk/NSXsUYVnbiRfkcAHNJpfrYyddI7bDu0xg247rqq+GvHw5nINO5K0J80FsLyfnPHQonqodkQB2+22", + "encryptedKey128" : "Ad8JSTIPHtlkzHrlgrOvd5n0NzPeKvjJ7msdypLhQID7L2GY+srpf4RSGvjhLgNMvSj2wL1Pz41brftaFK2fPeU=" + }, + { + "plainTextBase64" : "KUmUz+uyROKgaQ==", + "ivBase64" : "2rN/svzWWISu6qQGbiI9dw==", + "cipherTextBase64" : "Adqzf7L81liEruqkBm4iPXfpvelHMiH6cHfjS8ThTmeF+huunuQpbXTmAk5bjgMY7yy2KysXZv2mbxiVuUTL7sw=", + "hexKey" : "c8a2b3ea5cb1270f664fe0c35e58037a8ead720f3d49c60bdfea278d2aafa14a", + "keyToEncrypt256" : "8f60e4a5f740cccceb7b698e23ae4d8c0c7ba69c287d5a550bb711b50e8c5a30", + "keyToEncrypt128" : "d67cd3c03a091e51e20a40778c974698", + "encryptedKey256" : "Adqzf7L81liEruqkBm4iPXe0TTwZS76kMYMh3Nc0kYIT4sfOd0YR/jVlp6+GGPOYmSF23yZ5e5Hs9Pwd/+Ge4jIepT3545vWeOiUV44iU3tX", + "encryptedKey128" : "Adqzf7L81liEruqkBm4iPXdGDHGU7uFfyJcl2nWAfTq002/h84sdkFJVxEAVBU3WMIUCDoLuaqtnNYOw304bMRE=" + }, + { + "plainTextBase64" : "HLdQQ3mTWa6VC8Q=", + "ivBase64" : "xuxyFUgc2aK0J7xy6/ilIA==", + "cipherTextBase64" : "AcbschVIHNmitCe8cuv4pSAJyKtRm7a2Svj06Zxf+2HIMcyl7Gksro+OM9vEJlOGC/QXQ+J89FzcVafpc5e/a2Q=", + "hexKey" : "d1b8e6fe6f85525be41308d0344f46dfabb26f51846429194d58e460b4174b11", + "keyToEncrypt256" : "630607dbb5cba571cff254237056bd5fcf6374a5742e3f37c6fcfe18b25b49c1", + "keyToEncrypt128" : "e9fe0e6b35e928984399eeff006cb52e", + "encryptedKey256" : "AcbschVIHNmitCe8cuv4pSCccIxiF2jB7Y0sZ1ndl+F9xZMOW/0GW3ecGh07YNSadRiwXaQJt+RzrvqoXkErGmZsY6AE7SS1HROu/FQv64w8", + "encryptedKey128" : "AcbschVIHNmitCe8cuv4pSD3iLcCc4u+Xbx/R08yGN8Mqs80vU39Rz8nPmTknnDO6Ijlwew1/2vXr3+9pcGNcu0=" + }, + { + "plainTextBase64" : "cVJMnK31+t4Z0J20", + "ivBase64" : "tv6qHvyzX4h+zQNQ0bDKeA==", + "cipherTextBase64" : "Abb+qh78s1+Ifs0DUNGwynjON+jMe11WAqTs4PlCnXs3oHdxMr5qf9n4cKX3XNGfjimGvmoA37b0XrygmdZAcFg=", + "hexKey" : "900408bbe3435f2f134cdb55a8b9aa535d9eb6965c7b9dd0a370ace104136899", + "keyToEncrypt256" : "b04390af3d06e849df390c8684ec5e1680a50a2ded700d841b9e4e147f3ad6bd", + "keyToEncrypt128" : "f24d8b1c9089df6066c79481d5141917", + "encryptedKey256" : "Abb+qh78s1+Ifs0DUNGwyngxYXpZ2tVIdaxE+j5JId1oSb0T0eHZIxg71GPRz+KK8UlPP72VrKXrCgQPVfzaWkTEEUWIq0dCtwRLHj1lfvEw", + "encryptedKey128" : "Abb+qh78s1+Ifs0DUNGwyniw4zkn8Fr0pxNsIruqs/8CUs5BFz1urDCOI0zfCj5jk99Z0strYZ2FCyPLJaPnmP8=" + }, + { + "plainTextBase64" : "MGwqthek1g8cuIt3cA==", + "ivBase64" : "h1ldnPF/No9UULC2DAJltQ==", + "cipherTextBase64" : "AYdZXZzxfzaPVFCwtgwCZbUYYuFI8dVm+v6U50f0MTGDi0VkILfwk9dyPNuZRVPt354qZbMZ0nrfAJCL3qnWgPs=", + "hexKey" : "30e39292a7bcf6081b2a262a18ea9b9e4cd6eae64a9998fd2d9e2149008b8862", + "keyToEncrypt256" : "2761cb53a9e8714a36ef558438f8532247b29af9482ff08a418fc4cd23d1bff4", + "keyToEncrypt128" : "4c4c7ee3c2031c832bcd62104fbc5d31", + "encryptedKey256" : "AYdZXZzxfzaPVFCwtgwCZbXGyhK/xOxN7RRopFvQDan8+KcbYEFJm4OY0BLuo2L05Dk23uZL5zF7PL+ONPNTcPlu0pOUumucGbtMEkGcvaZ1", + "encryptedKey128" : "AYdZXZzxfzaPVFCwtgwCZbWr/ieFpU4uFWqfbjhfigGYrNNV1Ze4r/Lc1Mi1cV0s6IbtDg5SNAZca8LPyUltCR4=" + }, + { + "plainTextBase64" : "PYotYZZxSY98qu4E8JE=", + "ivBase64" : "nseypLJ3W3XK38iLfo6nbg==", + "cipherTextBase64" : "AZ7HsqSyd1t1yt/Ii36Op24y+wrxLWeBuujAJop4OWDQ2danjqDCvDCYVHyfVAh7qcvVSGlSCwhm0jJn/Fqs9Hg=", + "hexKey" : "ffba271fcb1919725d79a8f4a7e3f29972864ddc62a5c70849e208e415923a8c", + "keyToEncrypt256" : "41ba1d3bc70c3969d41f60042bb6be7b2023d9e1cc8a5f6a0cb435f45db5b69c", + "keyToEncrypt128" : "0109e832d7cb6f0bd943dfc2596c9f71", + "encryptedKey256" : "AZ7HsqSyd1t1yt/Ii36Op24v1zST1gCFGG7n/tg3WARXbr9AsU2IyLEgcHDlolDDdy55psuv6s0Ub0gqj5DFv78amyfAtUuPzsA0XPTX57zG", + "encryptedKey128" : "AZ7HsqSyd1t1yt/Ii36Op25EoX2rchP98hads0RAFzCgGFXa7MVPQzFM5i/X5nnuCNDe/DRvNWIe7xKZZVppJrs=" + }, + { + "plainTextBase64" : "Pqfj2CKHybRVwUUDijAQ", + "ivBase64" : "Qw4Q61tem/2+PMvMqXVjfQ==", + "cipherTextBase64" : "AUMOEOtbXpv9vjzLzKl1Y30upQdEtvFolBcxU1EOkYZEyNecSe997OaAsEHYdp1B5tF2T/FIBYFqnUQr+jGoRiM=", + "hexKey" : "2e265f54862db23dab3cceaaa19d5230d6a7a8b2227613e7371e8d01deb0a07f", + "keyToEncrypt256" : "3c894fea7d992ac8fe696ea039158e78e327eeac9b0510bd9999a479feeffee1", + "keyToEncrypt128" : "1789d2b8a8223089e62f4667884a02cb", + "encryptedKey256" : "AUMOEOtbXpv9vjzLzKl1Y30YL6q4gYJWAFh5xywNAl+qwwP/XK9wYHilPHYU8UGpg+IYPXM2/ed9YzpjFHgJcnVn4dhZcDrnp7isDDy1uYJS", + "encryptedKey128" : "AUMOEOtbXpv9vjzLzKl1Y31srw7Y1i2T6BqC619R5bOQc37TZQBMBBYFpYO7SSv0m4ai3Z1Wr2M3YMtQ590soRA=" + }, + { + "plainTextBase64" : "RMX6WHWTC8sBGv+p2oeaTg==", + "ivBase64" : "BSg38k0X7e885E7Fk/9NOA==", + "cipherTextBase64" : "AQUoN/JNF+3vPOROxZP/TTiHvn5/GcO5Y5A61eg83W0E5F4ozs7Rkfuof40kP9fBHq4klYJ5ezwdQGg+QeGidPqV5IXrwuNtnfr7FDT72qQ/", + "hexKey" : "4c513a7684b400e00c0001e34b96f4892000e9513a0467db360f84c8276022e8", + "keyToEncrypt256" : "b5db363e1076240911efd988af6353355f4096383e6a5236c2ffbcc1397a3e5b", + "keyToEncrypt128" : "dccc12f20cb454d15dd1668c1405412c", + "encryptedKey256" : "AQUoN/JNF+3vPOROxZP/TTib5jjRcxqlsPijZkHfLhCbT4oIKBM2ySsxCy465MsqL5gOdDa1F/HQU5JnHgWOSVfxi2bOAj061ld+AW086Lg9", + "encryptedKey128" : "AQUoN/JNF+3vPOROxZP/TTjMIpX4KDM0lKfCI4TaNg5qT7G+/42pw8KqkVOKE1TRK7dsex/FTkE/2Fvm02seOgA=" + }, + { + "plainTextBase64" : "eOnO0eH7k3EgDEnwkrEg6is=", + "ivBase64" : "r0XgfxS4ZcGzxkpTG6Tv8A==", + "cipherTextBase64" : "Aa9F4H8UuGXBs8ZKUxuk7/D9L3+6znCMUQ6l7RRMWA8QgCzlxRK/rO0SBAh4ZkFO3EQHYets86Odjgo3mOXcCtNhiwnSV2mnC8RVXFOYom4T", + "hexKey" : "e0d04e22ad35900fde204b053b70820ae90310441cd7a947c6bbdf98a15732c5", + "keyToEncrypt256" : "8356e6e224d52d50b33aaf7c7d17547fe64402f75cc91ce2523c5801e608704c", + "keyToEncrypt128" : "c5cafbc49b7f1569b73f7d6336435c57", + "encryptedKey256" : "Aa9F4H8UuGXBs8ZKUxuk7/BC80OZ4jiICZoOEldzNDY57uKhKL060bV2fOZkg6fA6aWR8XpiB7gsACwUqdZvXwMl5dlbfAPVpSYlGjazXT1d", + "encryptedKey128" : "Aa9F4H8UuGXBs8ZKUxuk7/DCiQOD+aHcIJ8FwhpJXHRUDwznBtpDOBfgjtk12qxG70Ru2giW8X+saj53PDF3PR0=" + }, + { + "plainTextBase64" : "tRnRdj1yTWPc+ioQILtYtbJt", + "ivBase64" : "TpWLqwivXR9QBNsKstg6UA==", + "cipherTextBase64" : "AU6Vi6sIr10fUATbCrLYOlC/zuNHLFHVIdgENAZtt0+qTANKMAebQkJfalrUClrg1ZaHPbGuR2qe49BNggqLdyTLfYLnXHW1WhbE2k4Nlofy", + "hexKey" : "22c604513522da25e0dfd51437753a4d6d9c13a39c9eed81a1737e5824e54037", + "keyToEncrypt256" : "9a42c2fba2839ed5e384d3328d18049cf17ae692e1125e28058f8a489e1d5abf", + "keyToEncrypt128" : "abc808d6b49b068f1e48c2468ee38389", + "encryptedKey256" : "AU6Vi6sIr10fUATbCrLYOlAbtfsOqJxrLCLXvo4v/o+8VBP1MgHO3tVMNivs4/vzoZrM5rqU74ls/hd3yYie+UqDT1JlqoX3LzS9YgwYmvml", + "encryptedKey128" : "AU6Vi6sIr10fUATbCrLYOlCZQ0cP78d71iVycDxVM2Jtlnba3dFQBtvOi78Gkrm+d6UanRALH8+vA3NyBfqzt9c=" + }, + { + "plainTextBase64" : "7W4nxXw/PFWdvEG43Pg1IgsRGQ==", + "ivBase64" : "xLEZAdR7n6UX7v8SDe29jA==", + "cipherTextBase64" : "AcSxGQHUe5+lF+7/Eg3tvYyF0l2YZIg2esidBwepzNzcelPYf2r65lY/ckzFa4q2Uo5BdF0OQ/2g7z8w6guPKXPPxNU1ADJ37uMIgOa0r2dz", + "hexKey" : "50d5cf6ea26feacc4bafcfe89cd4ba1b591e032115956418877e0c1532d84dd5", + "keyToEncrypt256" : "dd66fcff6c56b7cf6a20d6d081670bd5ea362bf461f53262bab490a75e1a008e", + "keyToEncrypt128" : "7861c4534444ae59f117eeb66322afae", + "encryptedKey256" : "AcSxGQHUe5+lF+7/Eg3tvYyym5MFHoB2kXF3E59uTv7I6C7mQfvAU8wXcEPgeIfAoeLgsnvMf3RLjWlQBeoSYZQOVEbQ9R4tVn63K7qC5cza", + "encryptedKey128" : "AcSxGQHUe5+lF+7/Eg3tvYwwrxP/PkCqZoTHB5tBaIQkOZEGftesBFzSULj2J4S60b2V4RgKPBWQGTG6vq8QAUc=" + }, + { + "plainTextBase64" : "4ShH1moCATBuDDEoJbaVOHwn5gA=", + "ivBase64" : "h3we5Qf9qwc/BtXm2mh8TA==", + "cipherTextBase64" : "AYd8HuUH/asHPwbV5tpofEzA+y/QWXso9LPdxR4lWf9ZJPZMVixYcITVvtopjsgfmU6Acev8ARAWrVn34S7GgIetVP+m2C9eXjPWl2Ej4qY5", + "hexKey" : "67cd9e7a7b80fc0bca91f062ce6f903acc1280582e218b092ce3a208f20c1168", + "keyToEncrypt256" : "35a095ee0a56de56aadaea5123f4d153305b9e872f361eb76f9e30c1bf865d31", + "keyToEncrypt128" : "4bf5a6fa9f7b59e628bf55d993c97c65", + "encryptedKey256" : "AYd8HuUH/asHPwbV5tpofExsGj35vtda1CjHcIsWTh0RBvf1fT30FoyOEnlrP3DTIs4QRhoy9BGKzWk6Nttan1i4avEG4MEmBX+pvKkV1QMy", + "encryptedKey128" : "AYd8HuUH/asHPwbV5tpofEzH5UmoMDtJEDdqDfmBxtxcMn8OOR+yY8ZymDS1PDTTyRmmaLg4MlV6IfrTDuiqTxk=" + }, + { + "plainTextBase64" : "6gm07/ayzsbk8jLDEE1zqFOg8fJo", + "ivBase64" : "YhkbZdLCOxR/K6n/t8Y2fw==", + "cipherTextBase64" : "AWIZG2XSwjsUfyup/7fGNn+fdTXH5J5Wxzt5MAXRve7MUhgHUY4Py/QVgqNcAfN2+fn1mlRpfzGZxbumcdKFziu3bzK4evS6Kglhujjs9Ryq", + "hexKey" : "08c8a23791b89aba0bca788a063fcc5760f9fe4e510451ea00b275bbbbcfa476", + "keyToEncrypt256" : "ef05bc1fdbcc8f205e12f56423a1c24392f32cfafd8fb22ccb1487cb4236a8f5", + "keyToEncrypt128" : "aff20db41768e323d5a86551b7f8ac1f", + "encryptedKey256" : "AWIZG2XSwjsUfyup/7fGNn9WOEqUTnS6Xi5p/Ye4EmCEfKLcgYOGqrTzWJZmPp+wvIIEjDWayAF145oNXP1jydSlE6gsl4iLwRTzqwMQFUQT", + "encryptedKey128" : "AWIZG2XSwjsUfyup/7fGNn+mAXX/HKerwpNnPViiqQmoqzAHj7uWknm/sXuXUvuSGzyEBPikTbM/MQxm979sKn8=" + }, + { + "plainTextBase64" : "ptfY3B7m+w/iF/r7kOKHFQZx40peaQ==", + "ivBase64" : "VrGR0lsRznifyM7CsAJm+g==", + "cipherTextBase64" : "AVaxkdJbEc54n8jOwrACZvqenPkEdgETMnuJsjMIFNlPJ4rAydwTHFhilMeFgy3GNp1MyjBs7WyCZXEHMFLw2Uasd/vIxryeTqxwinRlKZEW", + "hexKey" : "9081ab9b98b9a015ca7e9e17536f3177653708eb9bc0b52c8267c4246a3a1fc5", + "keyToEncrypt256" : "74470df846dbf380f465d3dc9133939827e3474636e3219d65a53e2812ea30e0", + "keyToEncrypt128" : "daf198e1f40c45ec260132497b0deff1", + "encryptedKey256" : "AVaxkdJbEc54n8jOwrACZvrAH9dX9W+Kq0nf/16VN4VopcSlhDFJamzBPqJefSieEiTM3pbSDk9Go+C18dgas4bkh0wpNlYovX7UZSdxMTex", + "encryptedKey128" : "AVaxkdJbEc54n8jOwrACZvoS/OzJaS88hECyjK4jfMaw9pjr2bLGw4oqUJxWkrZzPat2ZulKvJLVRw02j+S9QdE=" + }, + { + "plainTextBase64" : "KkjBAz6G1AWZRFvm1HoP1D8Uo3FuM0Y=", + "ivBase64" : "OtAkrRysMWcvLP5U1HJaRA==", + "cipherTextBase64" : "ATrQJK0crDFnLyz+VNRyWkT31wUdtYC4w6VCeUL56Bjf2TFyw9pwBm3NCwy8qRBvCfELv157jPa56N92sMYw6bbGEGn5KSzz6Dujy3In0Ejm", + "hexKey" : "43797bf457c189e48d71bd310b82877cd4bc27e443ee6d5e325091999604cfd3", + "keyToEncrypt256" : "799377252fd6d88b3daebbda98cfd8b73256d66742f216000d5d8297c0bcc113", + "keyToEncrypt128" : "2c011a96cc3650775f8f232c3289956b", + "encryptedKey256" : "ATrQJK0crDFnLyz+VNRyWkRfRubQ6Dmyu0DwTSmOkJlkHq6/Eci2Cmxh3CiY4T2rJ6bo5eWpYhMEmR8x+OnPyh3yVwl14mwSO+xysv6rx4zM", + "encryptedKey128" : "ATrQJK0crDFnLyz+VNRyWkQULWz5VlCj3uI+zygXRJ6z7bZn+dwYmufGFlVC8woc6xSHTBT1y0fvwLbQ+mHPJd4=" + }, + { + "plainTextBase64" : "UEbtJsekN8F0gskOAAeOC9fT+VqVdeI7", + "ivBase64" : "uHTBZReEqW0avOFATQEsrQ==", + "cipherTextBase64" : "Abh0wWUXhKltGrzhQE0BLK3qtGDor0LQuDNz5T4UAf0tlNj4YQ/LbvFVibTDLaZ9MqrQHrJrU2ifFP967M052m8DVjq/jk2Fc6KYDIsyzvj5", + "hexKey" : "9098a69cd774d598d11ce7355d3322df3cb44f369bcfbd1e0bd04b046d747763", + "keyToEncrypt256" : "f91be0b668e999d43d4a8d3d798cb6642d00f45cde9be8a8c5a05fdce76c3864", + "keyToEncrypt128" : "df52a3ca6c6930b93847268b4b16501b", + "encryptedKey256" : "Abh0wWUXhKltGrzhQE0BLK2kV6x96SWI74j8fIiz1sXrGUNlb3wKPHKfteoIVszuWcJQXGVzmjqS+TTsnRAeoQHYENZFuvMU3sxx+iCPg1ko", + "encryptedKey128" : "Abh0wWUXhKltGrzhQE0BLK2MRnMAqrrf/qK6QQjB22D2/PcTH5jzmY/bJzwrWRZnjCnjH3mWg6AbuxcEsJwo1AM=" + }, + { + "plainTextBase64" : "VuXic9aRBU9cdoI1i6WhCvttdPEfZNzFSg==", + "ivBase64" : "ciigJMNvq4FDlYnxTIYyQQ==", + "cipherTextBase64" : "AXIooCTDb6uBQ5WJ8UyGMkGcKBPD3bMZC6ioXCXAp1SBNzha2FrO2TNhVZrwyNK1278wMKMAZAXkg9GOIbRRyvw4QMO6SmfRtRR4HiB1VOzT", + "hexKey" : "4e33a8bdd6c231a471cbfee50c03c8409b17bc45d8e4047663d49e974a20f9a7", + "keyToEncrypt256" : "757f220c35cbe924f12daf1d2b9d92922522e0560f5fb66f85e7230bcabec585", + "keyToEncrypt128" : "af0625067ab05fab6761c2998a441bc7", + "encryptedKey256" : "AXIooCTDb6uBQ5WJ8UyGMkEmNwF23Zq2WdthR5zNMJukw5L7pTmYqyZFuhD7cs/bEqc25XOAujCZBtWMuLK6D5xBeSUtHMLMg+oqH0WbbzmV", + "encryptedKey128" : "AXIooCTDb6uBQ5WJ8UyGMkE/YsgkAA+P0EbzdxjFI5aFCdxXc9tixDP5iT6aMVj7+7DLQL4rlR2x4ODMEE6owxI=" + }, + { + "plainTextBase64" : "fpAP5mA3G8YtWkJUIP51rk3ehkwm9tKUaKw=", + "ivBase64" : "TUoMWEX0jMVpqph//PFV1g==", + "cipherTextBase64" : "AU1KDFhF9IzFaaqYf/zxVdaAjpRMfGtbqUhtWrmNSQAGa9BnBu/1E6R6b/AZJx12lrgItl+xI+5mz3sokPSDjPc8bSZlYtW67iFlQG5IEhfm", + "hexKey" : "5906e8a39d405d4f0d71a5467ed1ed885ec5e7eb701bf40629f65dd7575baa36", + "keyToEncrypt256" : "467e1b15adf01bf0b20fbebf1d05426dc9af6bc8789c4beab8a50e19a8d342af", + "keyToEncrypt128" : "8517092ad367b56ef5895fed54a8d2f1", + "encryptedKey256" : "AU1KDFhF9IzFaaqYf/zxVdaa5UyjlpszdI/rS3hbULDAtVYiGNsGKzVpKEVAsG4XZw1kXpQs8u3TceoZpRxT0ysSineUu5Pn0IxFi9Jnl9Zj", + "encryptedKey128" : "AU1KDFhF9IzFaaqYf/zxVda/MFmQbWanhIEHBu3xjMLDyVRd8ooTcMIpWaBNiX/Ctp0xLEh+Dikxi5HbGbAlPvc=" + }, + { + "plainTextBase64" : "T9RhN02XrRmfwstXPQg97fRTMUwCaAUmQqhy", + "ivBase64" : "9lToeThyh9oNV3rAk9gHJQ==", + "cipherTextBase64" : "AfZU6Hk4cofaDVd6wJPYByVJ7ZK5Iq/4q2bmfrSDC/oKZFy0Zh5I/i8qSDL4eptxNGvL5KD6IzKTWZvHmQx1gi0Y4cSFEJG3TBSz+WTuNcon", + "hexKey" : "b4ffd7b89daa868222ee5de25f2c74458c26e72093cb4fbf7aa3e6412a04aab6", + "keyToEncrypt256" : "618ba3aa10bad997c2832cc3ffc090be648014f5f4c5c0bfcd8631907ae34ed5", + "keyToEncrypt128" : "fe0764688b4a415481aad9cc5363cb55", + "encryptedKey256" : "AfZU6Hk4cofaDVd6wJPYByWlPWYFmc3bNfUroNtMru6+GBFEydzS1aS7OtAgZWvCbFLRiRZpUN01PmAGNFE1Z3UR5eeuoUwdIgLYdgdgrlY9", + "encryptedKey128" : "AfZU6Hk4cofaDVd6wJPYByXIgkKUqUj97malrNBQn9HYd6TOrzgX0+Lm9lxuKyuFcPgyeZtFwtJ2V7OUffgw0vE=" + }, + { + "plainTextBase64" : "tMAHeYJhlahssqPc5KxWAJrO5/Tis/1Ok9iYPg==", + "ivBase64" : "YAxW07g2s91UX/4nyxnWlQ==", + "cipherTextBase64" : "AWAMVtO4NrPdVF/+J8sZ1pXRIhF1N/CB+4K3S8pA1+eomBoJ3JjSxvqi9Yq+DKnWc5/DaTvmi4RTQBOsqASUaPRTJ9Idt1POpD2OJ+u9Bkf4", + "hexKey" : "0c9acd2f2a46a57f7573ee5c90cc4ffe62598ad9011b59b92bea341a432e74a8", + "keyToEncrypt256" : "f48fd097f2ef257999e426ef78b4065511e3fe7c8cb92e428307a2e7e1213a06", + "keyToEncrypt128" : "6198526384af2e63642834a3cea68719", + "encryptedKey256" : "AWAMVtO4NrPdVF/+J8sZ1pWorIHY80+KeUy8zS8Mrq67PDEZuCLDxt5JI4KVXWanrAch2EtZNOK5YxYhS56jUxy3/iKUOAwwZE2BU1M4oGfL", + "encryptedKey128" : "AWAMVtO4NrPdVF/+J8sZ1pUIo1nfyhdadIDUR5FpDkH+oZw3M1DWaBVTmx8M02ngcDs02KmuGrzhuH5Z/4iEQY8=" + }, + { + "plainTextBase64" : "8kK/hUszzRcUJWuzOv+RcvZSqiPQW7zw3X7qwPg=", + "ivBase64" : "J14LPDY9z7Sb6g6kOVyl6Q==", + "cipherTextBase64" : "ASdeCzw2Pc+0m+oOpDlcpemN1QjsHB4tC6JBSTZmZ6ZbppupemZwpF8W8m4PtMi7xcsH0+P5amGenslf75kc6545NgdAkVghoYCbza69GhG6", + "hexKey" : "33eee06bb3820d759a7d3313bef15c2a37dd3d18b12bdb0a36a90521457ddc96", + "keyToEncrypt256" : "abece3fdcc12b7fd387f7c65d2aad451b75f97fd0f24bf046f84a2641a0b444b", + "keyToEncrypt128" : "88195c08e31d8e8fbd8faef2a27558d7", + "encryptedKey256" : "ASdeCzw2Pc+0m+oOpDlcpelAwhM/S7J35sUb8yksGJUEhpvhahiUxPceqkTNLuiGN8QlBhSKbhXSS+uAtCzE0eqi/cK6dPEVJagO1+Wmet0J", + "encryptedKey128" : "ASdeCzw2Pc+0m+oOpDlcpem8aapw5OVcah8jJUEmFZ+THI7HsHldjrshEqcC+2TuRLcp3rPhZQNFGRbuBeMXnDU=" + }, + { + "plainTextBase64" : "yumT4Tf46zsr1l08ELZDf7aUebxsfjN/307eo/sI", + "ivBase64" : "f/lw/JBHilEnnAJ8cch2Wg==", + "cipherTextBase64" : "AX/5cPyQR4pRJ5wCfHHIdlrB9FEwe9B62Lq4lHFg4WIpgdQZLJfaPAZbgm6nXvl6p9f5eOstC1MhpGH3/8Q2iFHnvbJrQJUMSXekGR8C2Hrs", + "hexKey" : "9b8553b5c01afc748f911d5c2d7f04659f955ea53e5830dbd05bee1bbb6b207f", + "keyToEncrypt256" : "18c05af49a243b8911784150c123c3327d47ee9bb887e4df339c7934bc427cd0", + "keyToEncrypt128" : "916920eb57ca5f045e5f708d0ac01ff5", + "encryptedKey256" : "AX/5cPyQR4pRJ5wCfHHIdlode0IFgysMT7g1R1k25426DhIo19mn1OrU8pnL6EQkNgy9UtlMXTltL6RVWUN2zwwhYTJgck6QZG3+CY45Pzt+", + "encryptedKey128" : "AX/5cPyQR4pRJ5wCfHHIdlqelsuoxbjzGGBPUf4oAmBf9rxzgVxILhbkGBJgr0PpM3ah+FedIch1l8XUM6hu0T4=" + }, + { + "plainTextBase64" : "LXEzmX5vBPLocHKJb279PRSpgQCfCQ5hUmEM9Acihg==", + "ivBase64" : "wZT4FUExxS4sB46KH+7vcg==", + "cipherTextBase64" : "AcGU+BVBMcUuLAeOih/u73KggEfW2lFatLjY/WbgB5Snpq1n34F9cVdhol0+4JyLQU1mXfpLzl4S3SitGQsouIpul60n7dUnB4RJGa79wJj2", + "hexKey" : "e526fa9adc3ce87ba97d1d66a2ec2297cf20c3b83c60d400dca91395b519b663", + "keyToEncrypt256" : "b7be94d320cfbe916f27ddb2a8b86db8636950eecc74f95e1647b18785b11cdf", + "keyToEncrypt128" : "89003a077b4b02be63dafe344a6c0f83", + "encryptedKey256" : "AcGU+BVBMcUuLAeOih/u73L6aqiceY6WSku/SwDBKNXU957Dfmuuk2akUV79+UiF7m7v0q7ozxGiXWvrrMvv6nmtHCALkp5PCfkti1XFY4f3", + "encryptedKey128" : "AcGU+BVBMcUuLAeOih/u73IPx9vdJDvfJ43tki0kYoXIMuLtVkFLE9U5tO2i9O/FrfYqkllo6rIS6lJKvkJ+JDM=" + }, + { + "plainTextBase64" : "xmRQ0KlvDmDC3OIAByrkXXLQYzOebEJLDkgjzfkYuYE=", + "ivBase64" : "NI5IiNIRdQjNcgdO3yv3NQ==", + "cipherTextBase64" : "ATSOSIjSEXUIzXIHTt8r9zX/ZG1bdJszno6sTpksORbi4e4LdzNXwsmIPGS9fIHq1NzWD/Kg4SsEQCyBO9q6bqI0BpplyrbtF6KdQM1MzraEg9EVe/9KtlcsB6p3LEBLkg==", + "hexKey" : "0763e156c88a2203cea6aaa0f8b15853f678c9cae0e0a3383bc398129168b32d", + "keyToEncrypt256" : "9bd30ac38e28537f81b28a8569b7045dd8c0ac456214cded4573bfd1ea4a1d22", + "keyToEncrypt128" : "73e1cd9f9433c58e205c6de0e69709ff", + "encryptedKey256" : "ATSOSIjSEXUIzXIHTt8r9zUiEdCbMhqlkmJRX0TWcm2D98BtOQ15D1ZBiKR/ZZ64xJrJC0IgJLkH73ZBXmg/CtjtOx9DeyNNHIiRuxbpbB+Z", + "encryptedKey128" : "ATSOSIjSEXUIzXIHTt8r9zUeZrnjsKgaLMDA7NqSX7QyUntEzAajewe4PE513cZ4xp6wNVKTzhZtSscGuuPifOM=" + }, + { + "plainTextBase64" : "gHYT1k0oebdv53SpqxECpwRDhfs8xt8vBEVlFTs0u+Yl", + "ivBase64" : "b2bmn3l5EkdWoo4dFTbVKA==", + "cipherTextBase64" : "AW9m5p95eRJHVqKOHRU21SgGkRbPmMQhoFTACJ2CZsXtg8tcNCKMk9DBEeNW6G1xFmZlZOrNJyFzUHfT7jl+qgN6dTwxNbmWJCNGBcC6ABWnNgAhIuHLhqNv6YPd2PxB8Q==", + "hexKey" : "174c039a6e808c63486d3c694e6e8acc3e5687210151ca27257f2302a8250b91", + "keyToEncrypt256" : "e0f61c5dc7cb47644ed6ed8d1959f01e0dea6bffce3dc3346d6e652725d05a64", + "keyToEncrypt128" : "67c360088de6768e45304c2a50f1a95d", + "encryptedKey256" : "AW9m5p95eRJHVqKOHRU21ShZ8SXgXYyejs0I6n3oNcbrRFGIyPysZjhVhscu332n4TNRlpJcDo18i2sQ3VOmTrGAexSdrS9GlWIjGhAiKrXR", + "encryptedKey128" : "AW9m5p95eRJHVqKOHRU21ShAFbwrnF69YT7Gwzqn7RRhmaAofaGozCB9kBEalvlXYrHSgB9SExFwCls9RA34sc8=" + }, + { + "plainTextBase64" : "CHZKpF1OS6rNDv/Qd/sLodE/3IOmGQhj6fLkETk2FSfquw==", + "ivBase64" : "UfQ+opiSqqlWuyb4oVXJKg==", + "cipherTextBase64" : "AVH0PqKYkqqpVrsm+KFVySqVgPy7jJP9doTiZ/XWdSfOc5mcqEBbA3psVGT9geFkN5xhiuculBDN4sXm/R3mMM/MHj8D1ox+R3zf6hUg2/PPa+G4SqizH9wtWJ9uemnlXA==", + "hexKey" : "ea70d1be321f66c2741c29e842b6003fd61d5f25957331f9342533449adda21e", + "keyToEncrypt256" : "4583abe6617fe0aa4919c3861a0fc17ac742ba8d4f13277da0dbcecd628cdaa7", + "keyToEncrypt128" : "45101741be96627f55338733b8339356", + "encryptedKey256" : "AVH0PqKYkqqpVrsm+KFVySo2pJYBe1FFdmyayTViw0dzlLF9BrmKZs5oX/166pRzQZjJDCFVhS4s66YcBX6WjUB5TjzTJ4LlaAVaBu50zCxh", + "encryptedKey128" : "AVH0PqKYkqqpVrsm+KFVySowM8EqLPaWQ5aSCgdhn8aQ8rzYcRSt8AeG13gWSDJbpJnVOnxJ3FEbT0CJqGPoGh4=" + }, + { + "plainTextBase64" : "naON4JDHGQOC0ey7XQYpiWkGGOPeBYVIkGtW+uWi6DqATyI=", + "ivBase64" : "STCznQGnrh9gwtEBQWHRhw==", + "cipherTextBase64" : "AUkws50Bp64fYMLRAUFh0Ye4rEwYDwCPbi81Iwotw1otKoNY6UnQcJFqog5iQJiVp2QrrT75VVvehufexg/k3TZOyrnmWVA9Biuwp/2EBn9ypWlPm8UBGQvqsyrv+L7iRA==", + "hexKey" : "a108e4104a7d6ddd9c12805a25445fbe5d310cebebf2c777599553d6608fd926", + "keyToEncrypt256" : "938d52508014298613d5cf102b62c704b3b33211f91018a9aff20745f11a979f", + "keyToEncrypt128" : "0ddcd2c57b476b137eb0e121a01b869a", + "encryptedKey256" : "AUkws50Bp64fYMLRAUFh0Yfvk4E/7SGKA8hw8/mpydoDuqf+uxo0CE7BhO8e8e7cDXL7ytg0kpHkps/xteBp6XqmHlJem85Jyf/Mf4223Aa9", + "encryptedKey128" : "AUkws50Bp64fYMLRAUFh0YeLe7uAF6prAN9gaji+35xHtbM6mXZOEhnRHxZ11lXs13yPu5XcYMhL0H0RgRQS9qk=" + }, + { + "plainTextBase64" : "UtP6hKcBTOwITEg60rmVdyI21aFLTDTL4fbF3zQAKcfmFdCW", + "ivBase64" : "lCOZxhyWTvwLBzGQWN2EQg==", + "cipherTextBase64" : "AZQjmcYclk78CwcxkFjdhEIWAzPdM0Nj6RGN25C/rejihRBUUjpfTJuJ4PLnsubIS2jmfYpp6DcVQXUpJ/smCNf0FPik7eiGAs1+BlKt9KeQXr6as6o9MLfcGj50YV6Wog==", + "hexKey" : "ca8b8e3e1006bf34341d731931c6b486c5eb4b6e2e7877efffa2f01dc53ebeb5", + "keyToEncrypt256" : "a2484e99917d3ae19bc504556f6f20179d5e0df15368a1a7c3653297558092ab", + "keyToEncrypt128" : "e3a32c16fdd40015de546881dc65c083", + "encryptedKey256" : "AZQjmcYclk78CwcxkFjdhEKhwzy+vkcSa8UvPJqVGQY7cTpig5yyGTF5rlqvZGw8Ut8aX2Yd+mQS54xzmTumHN1CfJB/5q5Oy3FaQrm+VoFu", + "encryptedKey128" : "AZQjmcYclk78CwcxkFjdhEIdOLnsafHAeUqwFGE6/zzdmsk/HoSEY8xxmPYdyAT2Pqw5nnDbO4URMeSifasYVoE=" + }, + { + "plainTextBase64" : "MUSjxO7NW2btos/qIRZxwE7x9wJQPX4T29rjCp0s6o3d+L/IYQ==", + "ivBase64" : "f6GoRvyYa7Hp2bd+kSJ4tQ==", + "cipherTextBase64" : "AX+hqEb8mGux6dm3fpEieLWshd24e8ShK8ypoyJW8lIZJjGYq1658sW5hrbCvFUSHHt58bSAdRrQGfXQjkcNJg5z3vzlbCX/AG/0TjEFX7UI4r5zhhhp54/DI3zmm2+aQw==", + "hexKey" : "e87cdad2a3a353db4d8b8d37671d620ba7fbcaa78d59dd10476f06d101b3048d", + "keyToEncrypt256" : "06aa9f01a211e0c5954a5f9e546e66269714a9d8490649e0b4cbf841e814cf3f", + "keyToEncrypt128" : "8c56b2bcf6d5e7cbb141b47f07cc9306", + "encryptedKey256" : "AX+hqEb8mGux6dm3fpEieLVu1kiNbp/Ua3lctWurizp776ei0411ojsP187OFsOUVYo75c5jpOTeqs856My1/TJEcqb8I4MY/60qQr/StPBR", + "encryptedKey128" : "AX+hqEb8mGux6dm3fpEieLXZShwt3FUgayRYq4fTPM1sICeccher84+ziB54yjhNHwK+NbV+WB8tHUQl/5YLxPA=" + }, + { + "plainTextBase64" : "y+T3PzD2G0g9/GRJCL3RAttmw6MXUjUGJvaBQdQUuCQdONQvX/4=", + "ivBase64" : "1B2b0IbxgnqeOxlzNeWiiA==", + "cipherTextBase64" : "AdQdm9CG8YJ6njsZczXlooi7DDMa3VinnIX05rp7szAqgaP3aTeQ0Btlgse2tY6WKgBASS3tdzWk52LiZ8vNN0ypYds6cf2s/FubY2m8G/5F6fcNvVtXX7wkV1Jn7znD8w==", + "hexKey" : "7ff04a3f19f424a8c41fcf55c71cbd47b92f50350a253f3638c14b963344c0d2", + "keyToEncrypt256" : "f90a65a1e650463f3f00f9488c1a5621542b9c2dcb57d7df4e2c98874bc8eac4", + "keyToEncrypt128" : "5e4c0fd5f3a58d465ee9dfa852af16c7", + "encryptedKey256" : "AdQdm9CG8YJ6njsZczXloohuu0wWjvMyCDEEmYNTFmYXc5Yf1oqnqLlrccjz1OuPwZZ6mezJLQConi9gASkSwr5L8ww6M4Y3tswhbEn+djzb", + "encryptedKey128" : "AdQdm9CG8YJ6njsZczXlooi/yB4vjHt1qMFGHV7X8FV803WfFzaMRmFnyrvg3A7kf9z5coGEb9JAcWiTdTNKsSE=" + }, + { + "plainTextBase64" : "PRGuPFNdETMMDybn+tLjoG9U5enH9QHhbfKvsXTUEOM+Q2X2GY0I", + "ivBase64" : "hEyzgQyOXCWjKS3z/s44Aw==", + "cipherTextBase64" : "AYRMs4EMjlwloykt8/7OOAOsY3eUn+vtV11eDxVPbPURKDDlDlW0kJ2MuaJta852RpmQbJFj4+IBd8HOYxATuayq/wUU+cWrjPJe+V9G20OKHWkHbLIygxOGpLFcOfZmHA==", + "hexKey" : "711dafbf991b460920b1ed5b2240a6ce36ddc94edce41b7b9c4eccf7661d6c5d", + "keyToEncrypt256" : "0c00fafd6cbb5f891226bc4e36714adfa9b3be110b7498984218c537d7c18fa5", + "keyToEncrypt128" : "6468138dbb58a0484f8a69d538745657", + "encryptedKey256" : "AYRMs4EMjlwloykt8/7OOAOikFI84/dwe1NrQZ4ZpjXDzg4CciRwKGCdv2CtoVc5TfslXM5bBFGCqA3WUTCdal2kGqcAFro12JnzoOm3t770", + "encryptedKey128" : "AYRMs4EMjlwloykt8/7OOAPKnvekYvogmwAd6Ta8SSEo0mwQ9rVBqPE+Q9NRSO90CknjKLrhN9iFCmr+gtCVlRc=" + }, + { + "plainTextBase64" : "Ck8t/qqoSKS/D7sDfJRqxLHK4PcyFOBFOklhYYPQwTObDTpbP/SYVA==", + "ivBase64" : "5CLORNJHT9+g596HeAWCDg==", + "cipherTextBase64" : "AeQizkTSR0/foOfeh3gFgg6YI5cz5hXvnyBIjkUQ5YlBTi5ky7GMZXATClby0nJnTwkBf6EVeSi8VzfeR++o+nGFnLuuJ4L+qVqqo0ZAOQabbPp2YC/1Ppmd6NxYYdRf9Q==", + "hexKey" : "dbe5d0940c8067d15929d578bb3aa9281b720e0cbdd1565f1b72c6ff834d5f98", + "keyToEncrypt256" : "64128b22a03a8a3ddc3717d702e8f15598aa325ac5a5d7c61126d25a86f0f81d", + "keyToEncrypt128" : "9c44282d03e99056dd1e27d421877164", + "encryptedKey256" : "AeQizkTSR0/foOfeh3gFgg6aU2E7JNJock9WbpbfkqLLexYJFPAdO57hDMkL0z1ZBfo+SB98Bx68OTxpDf+DCL/DoBn+Bd+2pAxWn6V/mHb2", + "encryptedKey128" : "AeQizkTSR0/foOfeh3gFgg5az0h7UIjQGSbVl/X6xAJiEqbQ8LHXUSYKF3rp6TBL5yGaadIxANE0nPMnt2UE6+M=" + }, + { + "plainTextBase64" : "GUP/8ePmDWQi4wel8yjSlgCDZtyyIAEoxtcDHgnNSRmF5E5WyaKiVuM=", + "ivBase64" : "SL36q3exvYk8Lwvn4tqXeg==", + "cipherTextBase64" : "AUi9+qt3sb2JPC8L5+Lal3qa1WsH1NgP+z0Wzo1L/YQXSB9V5Dg0/4HfrTbLK9lbiYWnC5cKowx4DpJ8VILdswk6CgDLdXvFMQiaxjPoYQ0K2GaUEtxXDIpLC3M3HzXKhw==", + "hexKey" : "fc9f48fa700c132fa66f366558e1baf70df516d6d96f0daf3f9260e157c309b5", + "keyToEncrypt256" : "807c667065d6c2ac7906d7007b1a751b6dd7cccd10aa9750fedfd24d17a3c70b", + "keyToEncrypt128" : "01df890e072897a461048d7c14556200", + "encryptedKey256" : "AUi9+qt3sb2JPC8L5+Lal3pLH68VbN4boVpRyI0dLU5VnowkQI/k76PFsRN87rwODBU+Ew++J0f0vV7aNxflB4SDS07PgjR9pltP2KooRNz3", + "encryptedKey128" : "AUi9+qt3sb2JPC8L5+Lal3opQQGRo792MAAOKjTN+qoVPRYBuajIPmWfw6DgSBBwzvBSbbTGKJPZEsxaGAsvRvc=" + }, + { + "plainTextBase64" : "a2iQjBJl67EEuNTZh/cSG+1GI2bFcRt4l1Sziv7loPdhE+k8Fzh2mRJi", + "ivBase64" : "4Az6nuzm1HC2HEofwuyYSw==", + "cipherTextBase64" : "AeAM+p7s5tRwthxKH8LsmEufwapoNJY7blkXnaKBfPO8vKdAiwJabA962u+otppG9IJrY6fjmiPgULldHuM9nBC6Q/7ZgYJed8OjlG9B4eklBu2xP869kNF5KWVMI/Clag==", + "hexKey" : "db2ac64d818f99bb6efd5e9ae5c2911d80b9b97731c7171868278c5d284bc320", + "keyToEncrypt256" : "59d00c4dee1d993646af42f20a5330e7dd325096cc03156b55579dfc73e71ca2", + "keyToEncrypt128" : "6aafe75effe6001fee486861a79076f4", + "encryptedKey256" : "AeAM+p7s5tRwthxKH8LsmEv56L/+HaeUmLZzIgtMc4Oy69+xrQMj9lIUx0DTa9ikKX+D04ri2Xl6z52yH4ijoXLybJtAzpya4YreH6jyJsWH", + "encryptedKey128" : "AeAM+p7s5tRwthxKH8LsmEvVkwGS/dZ2eBFasbovQfohqUMpCwSpWPFJGSiDZzOT27Hg4R7vXn8oRui8UE0UJcc=" + }, + { + "plainTextBase64" : "wjfapz0zCP6NHB95n3goljyuIWaGOv2MrXmQw+VjpYOiig1131lp5lsAKQ==", + "ivBase64" : "MGciPZxEdZGGybwR9iHgIA==", + "cipherTextBase64" : "ATBnIj2cRHWRhsm8EfYh4CCaDC9izsFqxHG2JTXJR4AXAfnmEcUP3xDlog9rZ9rFkemeszzeyQcppz6IXFCb3uRe0KIHAFL0k11R2AS+dueNexUEi/u8p6h2WN4kjmsefQ==", + "hexKey" : "e721575d07b9f4af96775cd6e8e1c097cea66b151a84a22a755b13057efbe389", + "keyToEncrypt256" : "cf0db1ea0b89fa30c239a3bf4f9f627c63e0c382684e7092f31a521db27a73b8", + "keyToEncrypt128" : "9edb304d58567f168a528ece1e0358c7", + "encryptedKey256" : "ATBnIj2cRHWRhsm8EfYh4CB2Rfy46r3Qn/+7hXnJiyXgAkQnPgPa339lQjcepAqYucf8Yxpc1yTcIzv9RJipkphrJlL651yn8Bw/XJsBFEm8", + "encryptedKey128" : "ATBnIj2cRHWRhsm8EfYh4CCgNMmpuDPZBmt7HC+E/ki23VnyK1oz9cLNPA+fj4tzyV5GQvRogV6kN7x5IT0Z7S0=" + }, + { + "plainTextBase64" : "MWDMJAACnwupcB/ZdU+1YYTi8BoPLewzWx1sID015ckfJHG5xUqrtoITtWA=", + "ivBase64" : "zq0SPVv1A/F8L+2/AKnwPw==", + "cipherTextBase64" : "Ac6tEj1b9QPxfC/tvwCp8D+nZfvj/e5iVN+EuE3jhPPrmZZmukfj7J47nQvQXXMR4yirxroOjqMaRrp5SOXT8HLJfUNax7XCSM4NnDshO1+wEAX2m+tzG/R/UApTIyKTwA==", + "hexKey" : "0757ba27987720099f96abb70f8a79b23c02b6d934098b50a2ef2001fcaf40f7", + "keyToEncrypt256" : "e76c5c734ef46a487df55428000e2698bab7569828d9dcce769ee3fd20965271", + "keyToEncrypt128" : "1c6ef8a74ca76153f5b61ef9e6fabe0b", + "encryptedKey256" : "Ac6tEj1b9QPxfC/tvwCp8D+VbdAP53tiaQtq+gYAnzuyWk3oGaW/OPGb/9xeSCdMQXtL+j0bILlTgqNBmYOR41ft0A/V4L89WRiFBKY+Zil6", + "encryptedKey128" : "Ac6tEj1b9QPxfC/tvwCp8D+6oz6vPTdbWU7e/FVockyWpu0x+077hQ54BD1jzbEqKIeVB9DOJ9hTqKWE1WEAGiw=" + }, + { + "plainTextBase64" : "cK9qq2jGZTS6XurGcFX7ntF8wFoHlEvQbTM4erXY6ntHR2bEgpSBWjYw4Sie", + "ivBase64" : "j/GeiqADzaDh/RCNXaP8Pw==", + "cipherTextBase64" : "AY/xnoqgA82g4f0QjV2j/D8NaGyXEDDSejxyMFi2uDs//QFmSpXsc/t0zoFJy59n6+Cf+1CIkdPvkiNbvl9+yrlKy2fz94taHoUpw4wHOdb5kZqg5jqQzE19nsvYW//HwA==", + "hexKey" : "57a3af880fd9c35fe40258fd2a862691d2084b30eee5b3396b00eee57870406f", + "keyToEncrypt256" : "465d034a2febfbf129eac917f7743ab96407458332615bc5a5e7241caac81e11", + "keyToEncrypt128" : "6faac475a450f7649879fd6bea53f134", + "encryptedKey256" : "AY/xnoqgA82g4f0QjV2j/D+tl8CS+7UjsmiIDS9NRdjK19YaeejVJiWMANSq7+9kStqAlndF9I0nyV0qQf15vK72DFGfCDputqP0jIFPqHQ0", + "encryptedKey128" : "AY/xnoqgA82g4f0QjV2j/D9CdCD5GVxxK441UtI0UQPzMpFQFKRfgKHhkCb8MdZmn/7/g/637oRhJs10wkyeEcM=" + }, + { + "plainTextBase64" : "pbJ9Qp8XuMFbmGowlT+21YYKeVKaUmfwLywNp6GXaqa38I6Lo6uaQXOfO4ohCQ==", + "ivBase64" : "EPVlVkEueTTpY096cNORvA==", + "cipherTextBase64" : "ARD1ZVZBLnk06WNPenDTkbw3Cs0Dnq/h8588KTSVCThBo528BYhgPg4F6uNcG5k2PNQuSsRZfnQLCUZXbvHKDpa2lKEUVGHwXvS+r7rdH600d+T9C1eUi1HqMz0ceF1xVQ==", + "hexKey" : "6e82e8ee19cb880f3dbc5b2ba533277a5be31c96a0ec1ee7cacce05e90867f5a", + "keyToEncrypt256" : "d2a3d0784f443f8d4ac65a1cd558e98281dcb9af517215fad2f1d17c4278c83c", + "keyToEncrypt128" : "ae81e49648307fd5ec56c10ace4cabfd", + "encryptedKey256" : "ARD1ZVZBLnk06WNPenDTkbzArS4Twn43ke9jxg/8E9rVlO59M4AMRKhurvmaIIxA+dhayU7ZzJYF74D6Hiy9rGlcIjouP32IVgU1w1iuzFFA", + "encryptedKey128" : "ARD1ZVZBLnk06WNPenDTkbxRl6JOkFEfyvHhV7hldMdEL6vb5gfKDnJD1VCFzjiX9E+Or1bdftfj8uUnwARPMG0=" + }, + { + "plainTextBase64" : "rmEohUAf6H4pENVLrFjrFU9dwrImxP1fI+rKp4cUvii0ITjtt1Mb7THt1NRpsw0=", + "ivBase64" : "gsGERW/+KZwOOMbdUu+wrg==", + "cipherTextBase64" : "AYLBhEVv/imcDjjG3VLvsK7ggJY3pks6UHSREiS3sGDaMSqsJQlT5P0JyxcOcolo78DfXaZF70Sogi2MlXLv4SYQm2anwjy5JR81i0p4gXWf/rwTjIzRLQY5w42g1VJ0VA==", + "hexKey" : "36d135a47462543a7682ab679f741abd4813c5d08aab057d876f591622c1440b", + "keyToEncrypt256" : "e4235caff1c047f30ff8e4b65443e8ea51edf3a59ae368904744d0362a959b30", + "keyToEncrypt128" : "4f16b6180fce9fab5cc040199502feba", + "encryptedKey256" : "AYLBhEVv/imcDjjG3VLvsK77Zf4BWTBtgmdWTv5ZWL4g32VDZyBWg28MHOfEhMe8nitbnr44YClRMHcNsDpUcaWb/jKVVk021z2IXY44crgQ", + "encryptedKey128" : "AYLBhEVv/imcDjjG3VLvsK6xnrtI4uLE+tw4rtcMEOVcxe2zAMurvCXYK++MI3pyfDaenOKrfMdF4CarcjwVMKM=" + }, + { + "plainTextBase64" : "wpAn3LSpLZlmuBgOJ0GVMq2JxgU9cdn5myjqhByLdYi+YLl50FZwMqoT8c85YWD2", + "ivBase64" : "2/bHkpY4A7nISDOxU7bWjg==", + "cipherTextBase64" : "Adv2x5KWOAO5yEgzsVO21o4Oa3b+kfwV8V597fddty0PPcu1rSVd6Ekh/O/4Io7hTuFsZ/Tah/6qEOlpNnFE/hWX4ziKPZPc5zGjurU/lU8EVrlDkS1szFQBKP9hQOHLaCQCrOiL1IgWZgHcFuNNTHw=", + "hexKey" : "16f1ea9c4b87299804e15265696dbf3226bb506b99353990f1dd7bbf2f3285ed", + "keyToEncrypt256" : "32b2216581211ad11970f4746f204637a77711d52b5cded836cdb005bd499436", + "keyToEncrypt128" : "cf086eda0a00eb9034e0952e206ce724", + "encryptedKey256" : "Adv2x5KWOAO5yEgzsVO21o48R6EDPCkzp2hHH77ajaT2Okr+TyJT30HRl1SZh3r3V7lDiHL03saYL55dUqjR7JyKLhCpO9qjNevPQ/MDtNk3", + "encryptedKey128" : "Adv2x5KWOAO5yEgzsVO21o5nDWHRmKnTBlK6Wga32LO+TmS6oEMVaBAXiW6TraTOgYJfjt7PB983Xa57xPoCaUM=" + }, + { + "plainTextBase64" : "rAXJXledP5MNb7OBa+YoW3ozFzmhVSzceZp00kmH4WPt94h1yzBj9ROTayDRmtVLlA==", + "ivBase64" : "/AXYICd0fhLS2Vw2QGlqbw==", + "cipherTextBase64" : "AfwF2CAndH4S0tlcNkBpam8lESeHMejlfpkwyye2F+HA644uyhyIND/GrECkvm5GE0TU0zCiSvsODVbLpFniavdjqzOxl7ZQOCMircKcSvqoVvIwD01g19e8fjcL2uo0uEIm+4XD6FMhbbPMlkHjwaE=", + "hexKey" : "e60929b6fafa74dbfd260d7999da8756609d91d21ce908313dbf2af577d303a0", + "keyToEncrypt256" : "7c715cc3caf407222e19df58e8d092a4da763498b0e8a70d1c013677da793114", + "keyToEncrypt128" : "c0f2def124ac065cf7af7371220c0bcf", + "encryptedKey256" : "AfwF2CAndH4S0tlcNkBpam96tdVhS2lxSMKL4KY5NzMSMBK36x5zWx4gvMTiTxSuhj2zwuwAeAAv4dHC3Xd7ILK0t+SaDMPpFaMqaqQsUwV7", + "encryptedKey128" : "AfwF2CAndH4S0tlcNkBpam/YHOd0XWE58VlDDFQ2Ms0vZ79UBVZsUk9PP3g0qHGN0njFYYHrRzipR3eP75kt1t4=" + }, + { + "plainTextBase64" : "vdDuaAG32G7vxasN030I6EyjDdNOVBrdARooNA/+XPE9fuUtdySlmsa6k7ECoFAFcZw=", + "ivBase64" : "g24zNDsDj7qEDlPoZYIcIw==", + "cipherTextBase64" : "AYNuMzQ7A4+6hA5T6GWCHCNOq4t9T98x01L5d9pQkWxJvGettMCcaTwgcWmZD7gmgdl6CjloSeA4yosgdORbuh13DbrFnIBtNxgeoZimC/EgM3gduCaiZz1ITgT/brk7yysmih7GECk52t1rvZl3vVU=", + "hexKey" : "8f9db14112a49b6598c3ee3d0bc9ae741a47412c1d298f75ce66e549f5547108", + "keyToEncrypt256" : "55c27db061c1fb2a86351d2047c45d64d26ad07557379c10fcb8b2a0828c4d6d", + "keyToEncrypt128" : "f887667230a279dc3d7bdd1458fa5881", + "encryptedKey256" : "AYNuMzQ7A4+6hA5T6GWCHCP2zfQtd01sKvuvbDrI2Gr8fY2vFSQAlfsVasRnXP+kJkWUjK7d2jFZgjl8J8bn145w16sHPwl2hbacX7QJifTk", + "encryptedKey128" : "AYNuMzQ7A4+6hA5T6GWCHCPpcTVFmOLUPlnP98PH+5KqOWJAOumy7HlvhMWzF+1y92T5V0JXNcjv9gWFfEKLm5w=" + }, + { + "plainTextBase64" : "4Jr9fhg6+1zNpS/Qlxb6hG4gXo9N8vuvhE/LGF8Q/LhGvgwLjyzMTeTy5Z4GxQ4LpDr5", + "ivBase64" : "3fchUuQLZaE3sKQ5xJ9CBg==", + "cipherTextBase64" : "Ad33IVLkC2WhN7CkOcSfQgZc4i7CyETtaPyA/2Uh2tE++3R8OKqU0WWhUdkb3Keof+Ol77bhmFQP4Kkkesg8WeG5GrtOe2rGiL3wA+cCxQ50xPa3e47wbiC2S4Rrarov0UfEPIzsrL65Nac8JNTgEV4=", + "hexKey" : "5823b018db0f63ff0900ecc57ca0591ceb2c1386274d29d4c6f15dbfac4f251c", + "keyToEncrypt256" : "f759db875ede9da19fe9c17aee0aa64ab2ecc9031ffd2681c072f037118022fe", + "keyToEncrypt128" : "87c49f33fe59649c13193f92c9dc1fe4", + "encryptedKey256" : "Ad33IVLkC2WhN7CkOcSfQgapPBfd5lhVyEipTOilvcIWDVH0wDz9yock/fTnqz7jk3eKuy05Dr0SGE/wwxxy50ozjkbacP34pV5LtVSt2RL/", + "encryptedKey128" : "Ad33IVLkC2WhN7CkOcSfQgYkx8v0m6myO2jEdFOIwR0IqcfytkZbRmEqnflVIB6vYTmGgtlfC3NgmDOiXo4MXDA=" + }, + { + "plainTextBase64" : "nPX05o2PnnuoN/SKFR4RQo1hqzu5YHbYlffUZEN2JW5BspbsH3Xi0uMSuegQ+ZjI4Zm0QQ==", + "ivBase64" : "bfE6nFjjWltSNKbWYuJ4jA==", + "cipherTextBase64" : "AW3xOpxY41pbUjSm1mLieIyCdatqOBLdwOGJEh0yj9BvmBlaXQVto3ucwZWeMARdZaoMmiyyJxxrxNhWqFZ75DOvCRieeN/W/QFmvh4XOngT83CgbnVF9uZUREwS60Ou9oc6FIAxsNObY8rcD4KUNA4=", + "hexKey" : "2a2795afafa2d06c9d5eca681c04f29e19e388484d1db0eea4c128b3c1ae7adf", + "keyToEncrypt256" : "5777a6c790358d5c9ed556c500352dc63eda6ab4c6e17f90719a386900e4ecb9", + "keyToEncrypt128" : "f4e0c1552343a072b6257e355e03edfc", + "encryptedKey256" : "AW3xOpxY41pbUjSm1mLieIyIA7gnr5/eJ4ECqfk0uHTXLyRlYt5A3F6orGCt0UjStAcEL83Gusg5X+wQfvX0Rlp5Le1rwoMDEO1DC7xUhKzl", + "encryptedKey128" : "AW3xOpxY41pbUjSm1mLieIxkYMcemGiyXcLC7FZfyKxfmtznq7o1DP6uibACh//72vdDowd38ZGUSZjgRf/SZ3A=" + }, + { + "plainTextBase64" : "iwUwZrB6SALd7ldVzpVuVZt8Jh4+Brt0437W2Vihkf14ZA7j8yO0ic+6fIMv/Rxkco6mlmY=", + "ivBase64" : "ZDYrRN/IuBJ+eXe7GnIyxw==", + "cipherTextBase64" : "AWQ2K0TfyLgSfnl3uxpyMseTwMTnVcfVgcBxeHhZ6NUIO/tsLpJUCHPPI78LfphBrYGBVACCV2s8u6Ncp9f5faAd1qpGOBnVUlpwQeEDS+vNkR5cEYWPbegdmN/ouL4Zn5hZ01LVvp8iCBt82nCb7YE=", + "hexKey" : "a72147b3994d27823045431af180e28f102eb128c856cf2670d0bb7812fa1185", + "keyToEncrypt256" : "4055f6c21151d20c591c66d074282998c8f858e7e30332b86726644a410d6eb2", + "keyToEncrypt128" : "b453028fef43b42ee6db4db1668e4fbf", + "encryptedKey256" : "AWQ2K0TfyLgSfnl3uxpyMseuvvusTOqn9CZVnPNGgSvRmkMBhNva/4rfg7PRekh43YEZKQJOzRyqs+f2IYB6osUJ+5qPFBBgDFVZQf5nqkfW", + "encryptedKey128" : "AWQ2K0TfyLgSfnl3uxpyMsfB1FjvwUwxhk0R+fWgXY+FrPALYnKWhuetEknmRvFAIkxAZdF0v7CK92jeTOPjJgo=" + }, + { + "plainTextBase64" : "5iXDfBRFqBywYufzEogT3gvJ/Ez1Dxh1JvalYYuF+9xfq4akyx2T1nzsRlUia+gjDj3CBy5G", + "ivBase64" : "JzgGcI/2zsYX7NyqUVc9lQ==", + "cipherTextBase64" : "ASc4BnCP9s7GF+zcqlFXPZV3iMclCFGnweIhmpzQkuYp7BZGXd3l5hFoRmVcadm4e3Hpf3kaEkceqQi6QPnhysjsjeC5C+2PPs3k6i23UTXT2IfqIH+M7DWeG1b20QqsbTnXLv/kDrLzRFci3zbhObQ=", + "hexKey" : "51244a5cabf5104788a04fa393214ea6a635a9e3b91665b5b87b29691cb2a123", + "keyToEncrypt256" : "f1a5e81970eb1c512a4f4351d95d39b575397b98b72c033bc63b7c415dd02981", + "keyToEncrypt128" : "b499ac36a1813917886d6641edd60827", + "encryptedKey256" : "ASc4BnCP9s7GF+zcqlFXPZWrgEN5xtqVWXtlxYrKwMYA0n99fvQhdG04kOaQI0+F4qh8GpJmCER52Qz41PThSek8xcAKTeamMLEIFlr5tMfC", + "encryptedKey128" : "ASc4BnCP9s7GF+zcqlFXPZWD13rGJksZoj9joJAcigun8n8TWH6ZGYC80j9MhMHqXRhIIuvuRji/ifvOMFMXeG0=" + }, + { + "plainTextBase64" : "ypr67oS75L9vwlyFrVeDV4uVKZ3iTtrtfZ1L2uyvsStxjSLEI/lyXJP6o6rLZlbswvV43fqUrA==", + "ivBase64" : "vtAf0uFqujm0uKi5GyBIXA==", + "cipherTextBase64" : "Ab7QH9Lharo5tLiouRsgSFzi72q2w0GjYSLkPlNoLwEUaWk2GGKZrOesLP+46Gz65IE1f+6JA2zfvY+FrMRVg4BXe1YJy8sSwspsl5rsS1EXxTbQzKFJYm26AppDIWT2DEV7EKCEIvr9KRDItfHy7XE=", + "hexKey" : "37bc274e24dfdca30a01e1c6eee17e79061838ed32c4e29c6fbca112bd4436ed", + "keyToEncrypt256" : "a10e4270e27310637818129aecb95b852b6c3bcff81b08423d68f7dfb8debba7", + "keyToEncrypt128" : "cd92d5659a2d097c83358c09c3edb096", + "encryptedKey256" : "Ab7QH9Lharo5tLiouRsgSFz6FcfTpdM/5sk5zFIFvH4cdLQaFCoJtmkiyUC3gjYalc4A+OeaUlmIRMxsiPdSDV3xXErEVoRDu4fBjhLsrBAh", + "encryptedKey128" : "Ab7QH9Lharo5tLiouRsgSFyZLdVH9l8K4NcgFfUBfqsPH4jrNWMmxluax6pP3iOKWjJACylXG8+IoICkOjguYaY=" + }, + { + "plainTextBase64" : "A1KJ59+5rg8H1G5WaGyJkeHnd7ZHu1U+WJaCO5F40XLvyvgMmFgn5f6zIOqoZ9t0AV7W9X2Ddf8=", + "ivBase64" : "0ig0xL93maqArAciw81wUg==", + "cipherTextBase64" : "AdIoNMS/d5mqgKwHIsPNcFIPa2rZNjZl+F1KyIqsTY1Fci6q/+DqG7IiFfoJLZs/us4f4KFKwgtwNrU1TpAcU5l4UOTRvZ7vvX4tydI0GVJJ6oB4my+4yQZIvrj57OPPEeA89lZE0TjMkIJoLMFgtOs=", + "hexKey" : "9ef8eb881aec852f6cad380ca603d1ae71fad77ffb00844583a6c4e4083e9293", + "keyToEncrypt256" : "138e2b18bf3d677e5f77b1b389363d523a20f59e821677c18ea06e4555e3141b", + "keyToEncrypt128" : "8e4334920678940f5009c299ecd2e9d9", + "encryptedKey256" : "AdIoNMS/d5mqgKwHIsPNcFL0sOL8Ten98nEPoPDOuMMG1fkAgbVvvfwO5EZwZMjXH8RXdorxwKyquqjBbRvAwJ0E4mNunl58fIGjawCceztt", + "encryptedKey128" : "AdIoNMS/d5mqgKwHIsPNcFILl0CW1fRZGg6ihtzkxpssF7ZqTIDX9D9Gv5WC8+0UbApagWK752m3SyeD397oPNU=" + }, + { + "plainTextBase64" : "YcBi/+tlz+EV44YnOfE06PIYBqYdy7HCk0Qy/ll6R04RvDgFcp7pRgg6U2z35GQpqd4Py07VqmrC", + "ivBase64" : "ltWniJOLW8R5Jmz8LB72tw==", + "cipherTextBase64" : "AZbVp4iTi1vEeSZs/Cwe9rfz5pSrGcGtfPPoJQnNicIqzzvR6KPDOtAU2znlhDy7bRKTmAkwubmB7iSyPVYrJDBGgMY3KXHE4FJl7mUv9EIPOot8SMTd40HBJHC6K60hoDh6luRIb8Q+zWWKi+/SVMg=", + "hexKey" : "c7f041ca7d06483029967d2c2a63c719f038258bc24faa4d196689bcc9f07bb1", + "keyToEncrypt256" : "aa3a8e0a559bb8125bc5a57767d323f9b1511ee08d4a846fcae24eeef9dfed57", + "keyToEncrypt128" : "c61be8849103caac53c5ea41237d0058", + "encryptedKey256" : "AZbVp4iTi1vEeSZs/Cwe9redunC8JTDnY0f7UUxkqf6MajVglYocPUJKWQo81WYuqrF2Z2sVrwmDvLorrntGe9Y6/yk6hTprzAkSMt3ndqul", + "encryptedKey128" : "AZbVp4iTi1vEeSZs/Cwe9rf6+A7hRnPI1PwPsj5DVOTwnGVJ8aDnWyYvMzM4ioxbVPQKKd6+Ux7v+nw1tWTa4gw=" + }, + { + "plainTextBase64" : "UjxKD60aO/94T2lNx7h45j83lGNRe54tgvdwIl0UvnwQkRFzgObWz0D7m8p+AxngtjjeBNlu7mor0w==", + "ivBase64" : "pWgJMrRFnNtxUALtwhHfnQ==", + "cipherTextBase64" : "AaVoCTK0RZzbcVAC7cIR353vHLSoPG8Wllnr2t5zzlHmtg8+raSh92GGMcM0A8/C+rehzfSmysuh05CKTveZw9x3QXsbXER82tgDT+At0ONsq00o9s/MMaodMf7sXlrktMNN4nGAx41CKLiTItygeW8=", + "hexKey" : "54681c5e21de6ba8be38812169c0decaf66a4d794e4b0ff50c955e36c492af1f", + "keyToEncrypt256" : "86f6b79d48b88cddb34afa2a4a1278b98877f9b402fd3a051d6f184afce9f631", + "keyToEncrypt128" : "7793702243e5fbd7df2ded0c20126e62", + "encryptedKey256" : "AaVoCTK0RZzbcVAC7cIR353k7VaVOctTQ5hn/w9X/XPNBMgzmshZ80/M0yoTyxxVFSmGPgQP2+yrP38S6OOV9W0UlE7Ku+XxTTOQdvzifVWN", + "encryptedKey128" : "AaVoCTK0RZzbcVAC7cIR353UlhUqKNHqASs9T2ZZgp4uaD863WoUP1b3F77bf3wyWg8jkE3jB+AJlsq470xY4+Y=" + }, + { + "plainTextBase64" : "BoYp+cktbU5pt5NsHfTrQQYv1OgGE3JCTjOmpHUZ+NUyWH5r6qef6qVh6ZYcsUW+Cr38UxWXUhwvM6w=", + "ivBase64" : "7CAcFWcPXA3FjKT3yYx6vg==", + "cipherTextBase64" : "AewgHBVnD1wNxYyk98mMer42ZFNyD2asaOzD3Qpdx1yc17g0HmJgBQKIisYhpZIoMb+FnrSi3Bxo0v/lJcggbnYU9FuSlzcEqPe+mLt4plj+XSnILZv6tPsmKEjgMZnFykr+Y0IJcbK7SVPM5i0/dOk=", + "hexKey" : "d23771886b5cd961beb61bb7d3c43dca091f038bc47409f2b4823a7a65c374e8", + "keyToEncrypt256" : "5578849db83eed86662e2230f307347e37d39a89ce5bf3b9047520f23e13d627", + "keyToEncrypt128" : "848fd079f86d8dd25f54502793eee49a", + "encryptedKey256" : "AewgHBVnD1wNxYyk98mMer54cMMWocNHspSB5YiZsZTRdlzgGwzhFdWtJsJRzV/vkOcWF9uGIJZtUZmW2Z2PVhWsGYIRGwvx0KyiHTkXVbdo", + "encryptedKey128" : "AewgHBVnD1wNxYyk98mMer6uIisBrlZx8mI/QaLbUER4HZGyQbd0T6RKcUN440gUY+WWlxDazRskpjkOXXJmBVg=" + }, + { + "plainTextBase64" : "b43cjk/Xj/wWqVw8SveFShNeXb3OJP9EogjTe57TijHSGJ/i/2qrqgrVzJgXUUXoNo7oUPFjUkSbyw3X", + "ivBase64" : "/xj5jP4Cio1+PUWlcRN0YA==", + "cipherTextBase64" : "Af8Y+Yz+AoqNfj1FpXETdGCLCJiq52/Mw76OtW9QU5hp1vN/gXselnBoIP/MdMoyYefxYvoPAHitIvUJ8ZCbDmLy29ZAXDGnmwfl0V4clyKv1g7bdcirUlZqaZDe/VcMnPLGno/IHfW9U+ZMH5qcNRE=", + "hexKey" : "b9b2d62c194a4143627e7e6dad774202e678428c469eb619f7bb9e8d7debac98", + "keyToEncrypt256" : "c38751b1cc7a3203066759be9fab9a63d2c6fcacf95c61346b56794ce925ebee", + "keyToEncrypt128" : "91ec4752c0c4f86529c8f39b5525cfe8", + "encryptedKey256" : "Af8Y+Yz+AoqNfj1FpXETdGAKfZ2us0GAtPYtyKXKQ/G3jOlkljP+SMZfwR/BGoxktbM7wBrTU1Ezeu6cjYodJ+rcPEyhbxdZo2J0Ry2Y2eE7", + "encryptedKey128" : "Af8Y+Yz+AoqNfj1FpXETdGC1UXb3w5in22bvnYJ73au8kRdScTfqGmeQSSwdBVl6v+QH+oU8bMYH0q6Mh3zxuTg=" + }, + { + "plainTextBase64" : "KJCgjHhHQkWPgVtPztM6YlaAhUMSZZa3cBawVproPtBYB5Ut9qNzsWOhZgerQJp/O5XoTN7OCNJGv7pL+A==", + "ivBase64" : "aEBYYgxfQ20LlwrRnT3WbA==", + "cipherTextBase64" : "AWhAWGIMX0NtC5cK0Z091mzD6/VAel/kCXoOq2jRVPMa0CwHIoUnabcGSSPSe3JeRIjaGK2TkE8PU7JD2QXa7H21XACsPwP2QxR/fYRqa3Ij37I5moyeMlQ5+YSryEIE2NyUsKSW63RFiYH+h7eyZvQ=", + "hexKey" : "f3162043e05b04fe5248e673d30357bf597920a3efd9fdaa89d0369a7b74ccc6", + "keyToEncrypt256" : "57d6eca23aef10df8f5cb7188696686610381ab08bab563012e9dcb5c6cb27c4", + "keyToEncrypt128" : "a9cada9188425c218c2a96cbfb1ef4af", + "encryptedKey256" : "AWhAWGIMX0NtC5cK0Z091mzHfKr0uGiFKNk8FMxpX6adfZEGbC8BWQmAWA9qoIVdk/Vx80dpO2dbdaYHLDB3h+wwpdHUj0pnndcqyMq/u+0h", + "encryptedKey128" : "AWhAWGIMX0NtC5cK0Z091mxWXCgXOYV2HcxZsAbpKcgMP9gMGrdj/dcDrLGRlh6rhuiYHcV11xd/psAOwb2IKI0=" + }, + { + "plainTextBase64" : "QidMAJ1e4klT01iWUtoTOsLKJUN8CcyOUHpUREADW8IJnOpdQB1WlKlbakhsce80JP05iuP5BbG2SbF5TJo=", + "ivBase64" : "gN6gQNmihClfiLboJ8fcCQ==", + "cipherTextBase64" : "AYDeoEDZooQpX4i26CfH3An+xvnfpLK8K0jDTswLweYl8NYZKC8nERkAigX0hLm+SgKw4ozJ2DdLPmUyBgnh7sMr5Yw5AfAj/YLkMzIoc4YLfTBAYP4UKBYnmJOXyT3xO2uE5kBArXHAb3LgZKO0zw8=", + "hexKey" : "8f0d5d2c64d57f83d818445e6be65c7c108e50d2972c33d5e74440d5a11e93ce", + "keyToEncrypt256" : "6419531f4621adb75599fb3d9f4c7d0a4bd8665cf919815393ffb6334a347a76", + "keyToEncrypt128" : "92355cfca80588a8983188eead61716c", + "encryptedKey256" : "AYDeoEDZooQpX4i26CfH3Anyc5LJjPq3iE3Gtgm8aO3TyI2Qyohcus+KQblF3GqO/9qc0bmURcwTxfFIzcxuhJIQWtFSQQ2E+AVNq2a0X0X/", + "encryptedKey128" : "AYDeoEDZooQpX4i26CfH3Am9Tgy+08n7spV0TOq7YXAt1pnbY/sFqwqXj/h9P3+LPdRqo6TerIh2sbwZijV9/3U=" + }, + { + "plainTextBase64" : "XqH5HX6NZbzdHuX7KCKrQKuBrnPsXFfzm5T4sUfYGdM8Ds2ly0NKyXGOP34qGHyfd4O7ZpcSp1uxnWLSzxxQ", + "ivBase64" : "IBw0Y92nRBhNfWDizwibBQ==", + "cipherTextBase64" : "ASAcNGPdp0QYTX1g4s8ImwUiVOsSEsHVWkZozizKSCwegF/SxxJqusVp455iWspcp1c3nMq2gqZ6NG8fGJuJSGykyHiVXw6icz715HCJ6mAl/EVG2xQrS6AK4ZZmehie0C9VH3u4Qd/DlOleH2hcejs=", + "hexKey" : "37d2c45f8c26ee66430f6be132285d4f4ef517ad28cee47e65ef4c24aac24f48", + "keyToEncrypt256" : "0e2076bf39b719e5e400de978abf78c8cf2103783f421745be02e503dc44df7e", + "keyToEncrypt128" : "22628a6de492b78c70a0517bd017c99f", + "encryptedKey256" : "ASAcNGPdp0QYTX1g4s8ImwWIdCfSxufm7M3L3Yecy8PVtF3MkLdXHSdS+1voqcKuAKvkVuhPHRZ3UKzxpvqDvMRMp5F16saCJl+yhrvLIt3R", + "encryptedKey128" : "ASAcNGPdp0QYTX1g4s8ImwU8fENePzI9UxwK3KXO32lW6PzykUEr1QlLLj+kjY/wwIsBLSyRqbRBkAyjISyULiw=" + }, + { + "plainTextBase64" : "UqW59r2EwnSN+24xqfJ2DVF+ppVD0yV++Fbo/vME8DpYAj6ZzoQPcGjV6P6ksiOh8/YxiBTdhE1rISc6AZNXNQ==", + "ivBase64" : "afdaqL0pNGYlRgyOcVw0eQ==", + "cipherTextBase64" : "AWn3Wqi9KTRmJUYMjnFcNHnSYkf7TpoBAoVKfYIdle7tGhdNzh424AlRYhM3orRsv89A+eXNFn/kO/O5NS6S2wJcLWc8GFSsUqeR2jEby91os+OzHuZX/ikIKYXH/IQvujfm5ut7KIYI9gmH/3FtjEd0pYa5m9lu4DEfLq0erWOL", + "hexKey" : "09e4881363fefd22dcf8e62c6a5bfd041454cbeb06ebbe41912ffb57429d0abb", + "keyToEncrypt256" : "280674bbcc79113ca661e4f2ba289a181c3f06c06461335e9641aeadf27f3530", + "keyToEncrypt128" : "cf20ff55a1d44a11711fa5ecd3afa97a", + "encryptedKey256" : "AWn3Wqi9KTRmJUYMjnFcNHkfG28Nh8N3seK5JoMrz5x46zy7Wx+rOL1e2r8+1ItjI+1jAkONbZ1cNF1DsPeQkWvfmXd/JFbXDuP1xSDbAw+K", + "encryptedKey128" : "AWn3Wqi9KTRmJUYMjnFcNHkyYrwARgKK+FY8cCvVTIoVYyw6+TnlPzZHkqCAbqTOu1tUX/iqp03Fd6NR5PoHNC0=" + }, + { + "plainTextBase64" : "RqwPxbVNaNdtjr57k1wkG6J2TUA7Kith7RvD0VRFT19wXqXnkML9hjrykxSD7WrT6YxcXlxL+ktH4TT1sW24jiM=", + "ivBase64" : "afgBxM63XJ8xXdB88xrc3g==", + "cipherTextBase64" : "AWn4AcTOt1yfMV3QfPMa3N6N5Qb2QjmO0t1AtGsLKXU2/d2fHcsCx9yA2+mvr58xFUcEVArsmby+rSK2YSCS6Q84AbOw2TndG5t3SqG9uiD9J3wQrc/1xyKNY8ibgt27ANUz1Ky8ytqY8crTMQMFCOmffol9KgnnqBezVfRf7A1a", + "hexKey" : "47a866a43e01d106fdcfb7b77f4a176b589cf0939c523509acaf2d6d38c06184", + "keyToEncrypt256" : "c35c5802cb9e79c5a0a035dcd6237d88936f6172d6f57064e206328f0f0c97ab", + "keyToEncrypt128" : "2e4533f47fe653eb8b5d66c180c314a1", + "encryptedKey256" : "AWn4AcTOt1yfMV3QfPMa3N7okMvZmqDs2k9WLZEMiyJ745qu4CFt5YJXjzvrUt8AVsu26ikIiDKH6ngw8AHXdmEQZph5o3wgFH2hiFKnagcW", + "encryptedKey128" : "AWn4AcTOt1yfMV3QfPMa3N6bfrEMg/hm0DFB7Da0sBPkHt+n5Y2txZwtuCmho40LrVxp4akF41yKqy1gq+lldmk=" + }, + { + "plainTextBase64" : "7euI2CXiKBFJXxiB+NCj6I6CUJUByH0OCKS1jJV+duw18UOuUknuNt01QgV2aDrAr3Jr7qK/KRnBzaeHZvgiKVbU", + "ivBase64" : "DtBiUk6Hcc+jkAyezlqsXA==", + "cipherTextBase64" : "AQ7QYlJOh3HPo5AMns5arFyB17pb5IxGfFbOtsXS+z6DAfsJkV9h44DxgaHhbDL6k/lYGwPHKUbz3hHOtFGHFevLQTgYRQwfb7zSU+ImSyeAo8zZb5lt+N8vCzQxVLl5Cp//tgiy0iH1b63/BT4/CphwJLnq/y4IAualC6SYCo8M", + "hexKey" : "a674f6af3ea20bd651018dfeba3bf27cef6ee06ecf5e2eefb54fa95f2059898c", + "keyToEncrypt256" : "712dd825b5010e0bb7b2a3ad51ed8afe7ac15228724e92000019877d40415efd", + "keyToEncrypt128" : "49e0e573d79434cd0fe6c4fca0a8a21e", + "encryptedKey256" : "AQ7QYlJOh3HPo5AMns5arFw7Vpf1DWYsEzRbGySpSXecQyPp8pSNTNm1etIgCyZgH+hyZoYgXFlIWuB4WA1/3oER3jjc6TMbNvNvci5ViG2G", + "encryptedKey128" : "AQ7QYlJOh3HPo5AMns5arFxCycsK759o4vu2OX27kNueZuKo9MYnChgP/LGCLhvQLBC/VgmUISaGi7jzINzU5fw=" + }, + { + "plainTextBase64" : "/Gw895SGwDx7kc79qzxVgkENruxlQsAUzTrYlZ/QIvNZfqn5oVPP8euRJdk6va30OySxGYhaXerCMp/A8XbSV35uLw==", + "ivBase64" : "jGQlEOUiMEJZpfi3SFmEWw==", + "cipherTextBase64" : "AYxkJRDlIjBCWaX4t0hZhFsqbuaVTEHCdUgxgC3SYNqzm5whW6nDPeZjVxWk/wnUVQcCHLBbY40hE1PokH39q0aZHt1GdhdClzf5W5PqGnW0CpuNe5zggOYx4F42LUiskv7YguKIwG5P1gYf1uAazAWkaCdtL93JMjz7sBivgKbp", + "hexKey" : "50cb306f4d0ebb08580ce693df482ac72dcb5b928dd7a0af6ab8ea890cd4d6e7", + "keyToEncrypt256" : "cacff5d379629987c841df34c32dd6dab583937bcc36ecc73b372dc699a81f56", + "keyToEncrypt128" : "1da7c69adbfe81b668b989a669a835bc", + "encryptedKey256" : "AYxkJRDlIjBCWaX4t0hZhFubEuQS8KJIfSupM7Q3woO+Gk118ouoSwhPCz3uzADgMB1hEyuXKRNOmuK+IFCjmJOP7i3yR2K6pe815Xq+B6yE", + "encryptedKey128" : "AYxkJRDlIjBCWaX4t0hZhFuy48AXZFC+Av1xr81EdTvG8yhIiXxs22BXPzyJrXsqgt/vVz+FNSe/TXwQpAaD//M=" + }, + { + "plainTextBase64" : "m+V+96E6g+bQcmR8hXMoWOPLaPprIDLSBT2g/2j+Nm6gOtG4KxtTkoByeTc/xkHXDyofpTonut53P0jR0xrXkbWFmOk=", + "ivBase64" : "/L261aGcp2cGe2pQYiXQ4w==", + "cipherTextBase64" : "Afy9utWhnKdnBntqUGIl0OMli9uMU1cEX6KvVDUdqINMHh/nYtJ/22XJDPDG4/SkkDNeUwfGaEGkNyEvlJw3/Krhshzw5t41Gid6RstrXf1nrsatEFdAGyaickOvqtbpYlLEWd9ZIexvAdbr/7QFpPHBDMjrGWJnGHLGcnlJLeHM", + "hexKey" : "cb756a89d5870d414dbb32b38391c9bda5a9ff54b472e2fa18234d23a65ddd0c", + "keyToEncrypt256" : "e407771b6a8d9f895fbf5ee480784dc879774a5c98fcab060801089fbd7de153", + "keyToEncrypt128" : "60a80c5f16501e47e6bad1418816cac3", + "encryptedKey256" : "Afy9utWhnKdnBntqUGIl0OOnjNM+VNLYbyOIdNOJjP1ikTtq1VFM9+VCQSrOyFO47sdLd+BpiuHGHInqVlCHgEBbHxoOagXBhNjhQ1wiDocr", + "encryptedKey128" : "Afy9utWhnKdnBntqUGIl0OMnfMyKeOgmW0WYwMqOHjjFpEGRuVRjdPSeq0ixgPNrI8FHUB5HrQJ3Cjrbmj/mTXU=" + }, + { + "plainTextBase64" : "/xYBy919GleDNHx8IYSdAKClw65a9qhzwDQpAyr3f79XjYKg880i6llywJIy+2Bi6iPGFwSYSM07jOxy54ynDLsG4xnt", + "ivBase64" : "ZPJtPU+Qk3hNm+0MxJ4u1A==", + "cipherTextBase64" : "AWTybT1PkJN4TZvtDMSeLtRlUuE7wCzNo2BnqHROJ6W8zPcPR48g57DlMyFf7LLrsKynCHghJao0l5imfbdHDXCtK8szqxq2ePNaDFFlKNnJ7P2uBaqitRPW50LaBM5bR6+RIBP5aPJCJxZlUgMVgjX/mjGVT6rmW/xz3L42JuZk", + "hexKey" : "a51914eb7ff61e4860262d38ecaf54aed2871371d38bedc17a63022920575887", + "keyToEncrypt256" : "ddfae209ac394277366816c46423e4d6c4726939e27bbde1feea26a4f9eed231", + "keyToEncrypt128" : "b87676defbbaf41c0278d27bbbf5b11c", + "encryptedKey256" : "AWTybT1PkJN4TZvtDMSeLtR9Rr0+yEhWalIEPAWEWLJeiNfHRk8XXG6PUC5qNw5sKS1q+HnMS6WJQ50OI8rO7VUUvr/+O9a4iCRya9K+T8qZ", + "encryptedKey128" : "AWTybT1PkJN4TZvtDMSeLtQ1T5OtSMctUQrQ+iDHbvTq9diM8f0TdMdgniWxvATGg02PTYgTybNgYGd5TZ2KuNg=" + }, + { + "plainTextBase64" : "n1dr/8f7dwaThD4ISPyICcBDc+Y0GweiywXMvLKrBV+GzNSzIJn/ZBc8xWyD4vGb3dXZ5Et/51fF+d7yOnwCxfuX9MlsNQ==", + "ivBase64" : "E+8oajFaMnx1I0fHOiXXjw==", + "cipherTextBase64" : "ARPvKGoxWjJ8dSNHxzol149RRQKFi9vODlRx5D2UlKb26o+1/1G2nwTSpRx5+kjgGZPEW7eOUIMxyWkfHVT24B3g1Brs5qlpWrc+ka7B1gEh1ReN9WLTM5T8cfMsxtDXTldkijfJVvW/NKoQkp/GDkQbloTqeQXVOw1OXBCE4j6I", + "hexKey" : "f769b491110893ab802cbe045e4be337ba768d16b2804a7c39bfd52d89dca4fb", + "keyToEncrypt256" : "55538b9fea8b9bf6e9758b3c70950dbcbdea0ff9f40204c12c8e21e43e8df2f3", + "keyToEncrypt128" : "240f5baa71bb6b7761a790d98aae4b8c", + "encryptedKey256" : "ARPvKGoxWjJ8dSNHxzol14+Q8BuReNDjz2BSFbly1M6+r6z30DZX7wQqrw3Db67ztT5+9d2xlpQltfDumLy1AjYxtVWri06AljHMmCYeRaxG", + "encryptedKey128" : "ARPvKGoxWjJ8dSNHxzol14/pnuA/k8At5gBx26HpLLES5WHri3N22bZGGuYZKdcvvhLIoUAhyqd+bLnZapv3n4s=" + }, + { + "plainTextBase64" : "C6oyjckl8vnzNucjzAh2gef8WioSPL72z1EusQDzMYlpo9VH50KQyk6BSEYhSJM7kXi1oGg9KNzU7hUlatBnpeyg1kDka5Q=", + "ivBase64" : "+/Ir1hrGYHg4uyI7C8M29g==", + "cipherTextBase64" : "AfvyK9YaxmB4OLsiOwvDNvbMHDK/uIw2Y5zhI3ldxWxd633WXwc7Gkfl9UNpsvEsvrOsCgF/lW2iMGZYdFjy9zR9utzsKFmuraSH7U8uElzVMn/OS+FDwRpcroaDLLpduANhy5NylRi610IOo8lwNl3aJtE0Sc3xtQjz7kwhMTwY", + "hexKey" : "04978affe301103dbf32dd471078710ef2cfa1801d5f98fd0ce2a782e5a6b31b", + "keyToEncrypt256" : "67c8c49ebd08c861595390b48171e6c4bacc1475b95858b2287c040165019224", + "keyToEncrypt128" : "a633296edb3b13683bb97001afc45e53", + "encryptedKey256" : "AfvyK9YaxmB4OLsiOwvDNvbn+QYepSLZFEI3GCgt9ieealW3jhO1KZTQ/E2AllmDX+cqBkzlB9xiKCVwfhsnecRVoCY4sqK8dw0hZMq2eqxZ", + "encryptedKey128" : "AfvyK9YaxmB4OLsiOwvDNvYirD2q7PsYIR/SVq40+9LmAbZ5bC37xQxtpAY4OpdZdt6dnSij6dcfAp99uRvfgfc=" + }, + { + "plainTextBase64" : "J4V6FJatYbnLXdoOHpUerHHwg7t7+L2PXc3Mzc1WwyGv1dd1NXfRaegq0Ke7yoOSH4V+02AP4Ar6Q8M7gIgGKo5asFrWLv4L", + "ivBase64" : "uW6CavsUHk10+U/izdtT/w==", + "cipherTextBase64" : "Ablugmr7FB5NdPlP4s3bU/8yu7CLuOvK6a5hsiE3o1dY+0RBoWEhVTx44yI9rA4yXATxhExPXyT4kSatveIPPJWNBetLU9XYlAebgs3et2Zsz+DzVXqWESKvWNsiVpIO6UsM3qCUfzefNbCLF+WS6avVUiw8YU10cuT0AD6yKu6N", + "hexKey" : "1198c4c83d357c20bc7bd02e0f4f2397cac986d325fb45dd159848c5d0deee47", + "keyToEncrypt256" : "fe8693d5ee28ca6c635aeb8b47322ab76a2d81422d509e10135e4e5237bfdae9", + "keyToEncrypt128" : "00bd20f92a6e965f8be3acf3d1acb18a", + "encryptedKey256" : "Ablugmr7FB5NdPlP4s3bU/+lWNS7fLLGpy7ywiy+VsP75pBof4BBX88PqPM4L4B79cs1wxfegIDQxhL9c2lsByAbYy0quDhL5PFXREUQc+1j", + "encryptedKey128" : "Ablugmr7FB5NdPlP4s3bU/8WXpGp+G93cBHNHoM1GUoL2rSPr+gcWTz43rx1W6tGhiTcyxu2323LJK1k9fIxHLk=" + }, + { + "plainTextBase64" : "rv5YEsC01kRWxJqGkFN5tDNjaOEdnOWdgntha8rao6S4A8CuvcO4jbA54ocEcnC7WDn6adnxp8kZnLY3SdaF0WvB0WbnrssqUw==", + "ivBase64" : "vPcHj7BOoppnOdHD36dQ6A==", + "cipherTextBase64" : "Abz3B4+wTqKaZznRw9+nUOhZ/cyQmkPnI0fDWaeW4yqZfPb6APrKetFzWQKNlw8cvMIpxi0S70RCPXD/EiFY/wmGFWFSHnoxapc0W7ZiaHNgXnpl8OoelLuLLYq+CN3/w6Iw3E89koEnBP5WU5I8OIETAhh3Ch6/lPcVhGMszUj+", + "hexKey" : "10eebc38b8d93fc9ccf1a06ea475b8505baf3f41a2965dda9bc7872134eea886", + "keyToEncrypt256" : "9c8a7298c32b895d81df168da647aca018fbd4b66ca7929c2a17253a023220a7", + "keyToEncrypt128" : "e652684b1e1ca151934e4f5076b3d715", + "encryptedKey256" : "Abz3B4+wTqKaZznRw9+nUOjMprNpuT9kgNf1Ri37uVhbXipw/IKKou/b8sHGtU393pCf3Fun342TOa0EW53OBwHN77NyOQC6YaZyid/d7FJt", + "encryptedKey128" : "Abz3B4+wTqKaZznRw9+nUOhT7A8/vJwQj/6NNeOjIFwf8Fxg73IQTTSlMApK5vSrpsN7R8NDVOAPn6cQnOVqns8=" + }, + { + "plainTextBase64" : "mfhdVjwftsonb0LQxgUGOQZMpP79XfmMmE6zszaoi5LKoPlx92j9qH8EwMMgSKHdEzqhzSYEzhOEpt6sLCLg0jV/g3r1+kfGYBc=", + "ivBase64" : "mxPrSQtiCLgQAPSxP8iEeQ==", + "cipherTextBase64" : "AZsT60kLYgi4EAD0sT/IhHnYuoD64AIRIEVqiNGBVnD9ENsLN3Z5u3jLyJktRZpH8wuknu6lZHF7QNUQsGShnpYEOMXoXbE2XGQ0yJmZEd4L3gCW7F1vI4gM8W+KJtIVlNuV6XKHZ1twL/HA5Is22CipqeHljOhbJyrF7N7Jyh3B", + "hexKey" : "378d6104ebac3ed5d624db7fdc505d20e66a3e47d33ec28a92c9b200399710d7", + "keyToEncrypt256" : "aae64ebd2658e6cb13ee873b99967cb6c9411d145b735f81eb6ce2ad6b7ac1b2", + "keyToEncrypt128" : "c634c1ff078cdce265b271bc8f90d9ee", + "encryptedKey256" : "AZsT60kLYgi4EAD0sT/IhHnz1feQmwaQeRG2swxvBABxIms4bK/XV+J88Twy5yGY2mY0AyxR/yWt/C4o3HjIenx4gq2Gh9QVkMAzbI/ikTD6", + "encryptedKey128" : "AZsT60kLYgi4EAD0sT/IhHnW1PrYhOII4SczzOVQccsgdm+kHGf6JU2mcSCWcyK59apjFDhGwxCdBj+0Od7DqQg=" + }, + { + "plainTextBase64" : "fRDtrAAamvkU49Dn/jsP63uRtMFfqk4mbPdk6Xnb0zz67Wf2C2Ghgwv9H7Eu1pcKLq3Jg89FY1i9PGZzxvcnlH/ivVrXAD/EL/II", + "ivBase64" : "xCmXdGvU5qlAoBFdPplULw==", + "cipherTextBase64" : "AcQpl3Rr1OapQKARXT6ZVC8BIbF3nZLzG8qm+m7ySgG12XuHFdRjfONPtIc9qP9lPv3dlaWOtEzgIbUHdawHbKef1okf3K6es19kwDYSKblPYswC1TOZz6q10cIHgimdpD1pqOLfOfdiDusmlEDL8uQCAKsl+RgG/a5LwC5XIOJq", + "hexKey" : "671a6f9aeee9af14ef88e126a048c71d121ec86726f9e13d1420e4c77b0f4e96", + "keyToEncrypt256" : "7067e86eab30417a8f451f7c993ab4899a2d67df8047c1debe77d2d7e84f9fd1", + "keyToEncrypt128" : "5fa57e485cfdc5c4771fb1053a7d42d0", + "encryptedKey256" : "AcQpl3Rr1OapQKARXT6ZVC8O0H0K9uh071M0hEu1CHnBBQYzP5s3X/CkuX10zIKnFExdVMP49ZYRNcrZ9wam7ltLU2LPUgpgDDWRc89wPVk+", + "encryptedKey128" : "AcQpl3Rr1OapQKARXT6ZVC/qP9olBQv7Ym4aUI/nsiFAxzNhPNSd9GkV70MNDwPDfPTHQoAEC7Xw4bszt81xxak=" + }, + { + "plainTextBase64" : "OjPexD2qdQPYTAWljqkXYxYENIxjOoTwl4vn1DVwfsu2iUhFxvJbmuJTZXi+Wbag2EKl8uWfbv9QiqZpy/hMpSMNFM/j1fGo8wYf+w==", + "ivBase64" : "EUSnP5PNdlct0TzM+82fpw==", + "cipherTextBase64" : "ARFEpz+TzXZXLdE8zPvNn6f6rMPgbmxUyi8HJ7KOAdzcGZCw1584ktvwRuyZhHfIKQrTSDKL1zMAmpK7BRCBOtgN+bAbfP180ibWhyUDtx3fJlWajsNyPEfptzSxwv4jUG2Wd1eAu8zeMlqiAyu2fgtbZm/YASX/lyzB6GzxiMUq", + "hexKey" : "20f58a4b12aee6a844bef26d041834e3091972448c711f3d1d2a7c1994b7934a", + "keyToEncrypt256" : "2f2e38e695abee73619d07823f2902131d6c864c70d6a16094df7b03df31555e", + "keyToEncrypt128" : "3c19561a184cff82aec0d38ac3c35654", + "encryptedKey256" : "ARFEpz+TzXZXLdE8zPvNn6fFr7hdc5eA4MYn+dgxzxhQiSVoaf6pDAGLE6IGDyPJgSiTi0LBOS4uHuwApzQjOULOEt7rHQfh/FSuhDZx0EnS", + "encryptedKey128" : "ARFEpz+TzXZXLdE8zPvNn6ddQRdHhWm/mFfIEb63XoWrFPRkD9n8PY17n9z7PpfvMMY3mDlIdhgBh0KS8KbrDgA=" + }, + { + "plainTextBase64" : "ZQPTDtqmjiBoDXtEtNy0aBlZQsT48aRXBbU9tEm7hdnGNCFmJIHTF5ymQx5S0+2AtwEIfRH5S49DgVRtD74uUXdk8HWzqKmrL3fT0kA=", + "ivBase64" : "P581+ievEuf7zyCVlQfRHw==", + "cipherTextBase64" : "AT+fNfonrxLn+88glZUH0R/Fb0QYOlQ6L3uoS2qQRLzylEN9BYm81yAjPOFuuS6585z3lQRJQnaEoH3c/zzPhfujf17P63i0Yd7gGhhQsX4nx2yySNdXMEYPf56nZAwGRhoKt3fKLokLqkdI1DuMK/eo206trmtQas+VuMhplt1/", + "hexKey" : "3d1d1ce69444e14d9846f0c3cf9bd50bd8219679975a6a3599c7909bd909c195", + "keyToEncrypt256" : "51666c2f0e009f03b5c0a7fa3f4a51fd899c93df84c6e939b5cda7bf13f51cf9", + "keyToEncrypt128" : "3f46eff42e70be471ae025e95e2cb7c3", + "encryptedKey256" : "AT+fNfonrxLn+88glZUH0R/yKCf+jrObwHaTBIVFOwtcg0ooGH2SY4h885c/ZbQmnzbIx5UBC+q/SZvZkHTSUj/NR/Ql5LMFTbT+G8dzdFG/", + "encryptedKey128" : "AT+fNfonrxLn+88glZUH0R+YqoryYxgF9FGpzaYt1hcrGqe1kkjCX8T4NOZZXpDcy68BBujvoZPH1NXf/ZBhLrc=" + }, + { + "plainTextBase64" : "91fT6eXTvt/zHqIX+Tq3nFvRhiPEHrfIDItcotSmsXMtI2eEdnTE2GsKL00u8unsKGkJk1A/J3aVa3hc+eJ8YRzxyxbQmg0hqCKJPkHi", + "ivBase64" : "WTR8WkV/vJY0C+UzuuI1Cw==", + "cipherTextBase64" : "AVk0fFpFf7yWNAvlM7riNQvOm7P7DPOaGjhYuWe6D+horajUypqazynsA2JqrAUMGC4PHQdRMPhtEr/d0l7RL8/y3M1ERKSTUgBunkulBn+Lx62+Xpb8bv9cUtXr7gLeE3p4iITU3KrAQiUVKiauieCxDsuZ5rKG0wIQFo574bh+", + "hexKey" : "f000fa8b180896d9cc6ff520d88d74c1a9d151458d1a830d3c6e9ed73d8c02b3", + "keyToEncrypt256" : "edb2db93d671b94a792f66e4a81bf28c929a66182a26965820375c07203b2888", + "keyToEncrypt128" : "4fc65a6225dd3f2ac3522df76999e70c", + "encryptedKey256" : "AVk0fFpFf7yWNAvlM7riNQuuEl9Gcjr4nYi8GnXkjjUnIuC2tQ4NkNOQD/iCe2JYdtGwkBPhJ8eadX+QuKdL3L1VyECaXJec6Em5BWA+4x/o", + "encryptedKey128" : "AVk0fFpFf7yWNAvlM7riNQuB2Iqm9DXDfGh4KfS/msZYE2LYP1CyHICNzCJ/wowlS/LYdCYVR3EiMlPz0Hqd0ds=" + }, + { + "plainTextBase64" : "VWSMmaPzHwNVcjUkdQTs0gXd3FAISilkj37fNjBFYmcKzoZOaFfx57kcRS2LFpudGTfXgMuPgCYsg7KhjHQVtNmYt578gwQbStQci5W4PA==", + "ivBase64" : "5tbwzxMk8+qSPsahsGlslA==", + "cipherTextBase64" : "AebW8M8TJPPqkj7GobBpbJQJsw9nhBT47UNHuiR1k0JjeE5RGaTa6ANUWzBP2G9urgEgpxm9lCZnR/SRuNk4nMBMoetEY9YoKUO6KA1gYhERDheUmZ2LEh0rrhLWwdurt4KsZb1CN4eSVjufHZiQR9KzsG/guRAuVkvryBhRVFFy", + "hexKey" : "91d43d78d3bae2f4c04382524b8c4d6b6e7cd9e48061eba870817a63d6814b74", + "keyToEncrypt256" : "bbc7764486d0f85d150d8c8acb29ae18ad659e20a43b1219f10f834075353157", + "keyToEncrypt128" : "e008389b570333ce3efdacb7faa47f29", + "encryptedKey256" : "AebW8M8TJPPqkj7GobBpbJSUkveU7p9M21P+liEPt0cELnuza6fuvzlcDXGcQVW6nYpm51eGZD/eI1J4iiEKf812jFvXsAwljSGf3A3zhx+R", + "encryptedKey128" : "AebW8M8TJPPqkj7GobBpbJTQzWaId96iWlVKHGM5IScJk9f0ddI1we+p/9K/s+QKe4WenWHv8gI45v8J8C5dZ2E=" + }, + { + "plainTextBase64" : "Rp+Y93fWAZN2Y/7kXe6LreiaTqrtJPMerlCF5gIm1O/gAKQKIKOKB3VJqU9WyTAPaa9gXVCQHOL1d3G9iu9noAzKUm7jWk3gXLgUJPstYrE=", + "ivBase64" : "cE//BbGwLhhFVmPhWGOLRA==", + "cipherTextBase64" : "AXBP/wWxsC4YRVZj4Vhji0ShBNUkbTQEYs6Iu1+FSbxbtvCHzmEJTpZ+ru+5T8rLrjW321tQuYkmKictT570taDuvo4lU83rdBTBPhjXxYBKhaT3GFpqD72Kb0h32YdgA1IrRJ55yCrKc7xvkC62Ufk9d2z20WchTZgGpdiXFSLOh774S3PkhYD2BdwNDX9o/Q==", + "hexKey" : "eae1b8a9348b514ac31b7959cbae05c1b0d2167d202722e17527c6b392f7437d", + "keyToEncrypt256" : "ecc624272e332de169266f2b264441a0964e793ae77888fb3fce8b0c701be4ae", + "keyToEncrypt128" : "ffa8f96111a91aeb14177c61246044d7", + "encryptedKey256" : "AXBP/wWxsC4YRVZj4Vhji0RhVQ3MLCvnSsusYI44BdV/V1GgkSStQozVkA8Rli4OJ+Ax0tUx+qkDz/29R6TB0arNx4tC2IWJ6RxRANfzSA5T", + "encryptedKey128" : "AXBP/wWxsC4YRVZj4Vhji0TgIuNAHLXPecJcmmnKLKoCkHXlxzB0TKvITZlFZl5WoaGmidQOMBlY/sROa3LorpM=" + }, + { + "plainTextBase64" : "gsoaBy3o9l88JkMC/lIhIbKRE/Zd90osP8nXWhKIM9047uQgHxfD4acSXPQQRTKQ/hsoFW25RvchgwBtxZ26Lmi4wa8W3BP9ZxRiiX1oZ/WU", + "ivBase64" : "N8rs7zfSR2EsrPLGCUsOng==", + "cipherTextBase64" : "ATfK7O830kdhLKzyxglLDp5PraOtB4IgN8HBKB88hXv9XLBdCwBYX4ddHbERy/vNY8hUAx6m34cSaVcrnroM2125VsoV6F3mPQ03GltV/E0Btsro7LwG3L6HmrNiwa/7mx3q7LhPFfW2sItS4TAelJXa9uloUNts8WfFpsvwXN0WLnNWzhAm8qdmVaQjRxNVBw==", + "hexKey" : "653ae1ae7c526f81820d0d3243f47032f58722dac12e6f7ed7a6df78bee913cb", + "keyToEncrypt256" : "11fc07fd8968bf459a6e40812bdaafe0608a01823a6760d223159956a35dab1e", + "keyToEncrypt128" : "a35c4ddd42e85022d4d6aba5dd467e28", + "encryptedKey256" : "ATfK7O830kdhLKzyxglLDp4BO78V8m0TeGT4HIukleP5qwOU+XLvwy2XgjZp9Vo9XGdlwBwG3NEGm+lI3p2846Zqm+b2IDJIDnRUwLhYQksr", + "encryptedKey128" : "ATfK7O830kdhLKzyxglLDp7Hf/l0qmY7t1jrYoPc9K2X4hnDz0R1yujPi7uFmD7tvXjt89LWxgkLFrHbKXkAUWM=" + }, + { + "plainTextBase64" : "vEVCcM7tdzfTwFP+w01RId4Nyr6OCugZOgqGe2h8JBH9bKfGPT2Cdb5Wt+9i9gY6+HtjGy/oAnocLtZvlrXawoUQApEVKzZZ1kZs6qwnYDKAUw==", + "ivBase64" : "gFZoKp5v2Vu3Y6cw39GRHw==", + "cipherTextBase64" : "AYBWaCqeb9lbt2OnMN/RkR/0PG5U/IyHso3LLi/tysGoCkodazMZ9w3E/Q+a1QsQUPfL06y17ZVMgUnGAJVyVhSAzeQwdw2uYhr0ykGXSY1XS65FRYSrE8GJm8GsKQTTULy3nhsUoEdKETrcoSJ8I7wQ5rDh5jZjzXPbrcOUW8tuTikCGn8bwzAwxwp/l5qlfA==", + "hexKey" : "d337287a0a02296f764247d08074f658a1244a731202adfd8c1985805cd64879", + "keyToEncrypt256" : "bdee450e8c895edc277152a635aa397768585fc4a04c8bacb6af8befeebc28f4", + "keyToEncrypt128" : "29a6d39e0bb95616c4f22edec88bf23f", + "encryptedKey256" : "AYBWaCqeb9lbt2OnMN/RkR+clCfelBkAeg49B88Rq6uWl/lw6l1hv5Zow8aoS1jDsNjXl4uIp0Kph3cpP0KQJ/A3Eo+hRrS4FzsMcdOoEvKa", + "encryptedKey128" : "AYBWaCqeb9lbt2OnMN/RkR84oPcf5rYwbyiqAARcQhFSCkJZ9LS8ksGTBpm6KFbNwVbcjhWxf0sIp7k3ElpbRwI=" + }, + { + "plainTextBase64" : "Um640ahLcxMn3cezH5w1b9K82Yf08u++LXSetUVJG/CYW6DMRn/r/budbInnfpMyvzkqJYUwEUmNkTcJMNUYf+pDrRKioDf7h0fzFfOha0lAhLY=", + "ivBase64" : "kiq0n9yWC5SV6Vnkt43AEg==", + "cipherTextBase64" : "AZIqtJ/clguUlelZ5LeNwBLg0DVJJCTc2qmZvSlktjdfPZeb8KVAAKSKKP5uUJY17KgQ6Dv08dXZ61wNISl0uAK2uFN4Ts2aHVbamHx2K4d+5dBLyk571myU6N41WGMzG/qFaEl7Enr+u40H6ab8qXdcFEsMhUJnOxNLPevOxrPeJpFFSVmJQyb15+NkEqCgUQ==", + "hexKey" : "eae1fbcda31b1d19a526518fd685fe84b8fe97cfbd97979c3fe661396ab67e2d", + "keyToEncrypt256" : "d28ed81e5d80ead8edfb243d731e9b0dd550f28ed48cd70e3f286c4f37bf33eb", + "keyToEncrypt128" : "87bfb817c3ea46264eefb0611e8873d4", + "encryptedKey256" : "AZIqtJ/clguUlelZ5LeNwBJFeHzYF8ojP7Mz3nUV+RA/A4DtcH/Fkzg5cqRsJh8j6nQzbzuQVCznyvRDF5WJXX32jCFH28v87yWu75clBMaD", + "encryptedKey128" : "AZIqtJ/clguUlelZ5LeNwBIVit4vXKYLkHiY7iCt5ivE4qJU+z7ZyNoxThv+mY4+sCtWyYLRJDk7KalAE4dEZaI=" + }, + { + "plainTextBase64" : "Q5NmsL81XvmZLuQ5/3zwAI90gWb2hu9fle1atQ6DaWQsVR0dbVreoaEgEbN6A29gqS4ief5VDyh7zhK1npkCvCOAGDqKeBAnEjyfdYkENsNHFdwz", + "ivBase64" : "M6M3jClrMzY3TF9hAIZflw==", + "cipherTextBase64" : "ATOjN4wpazM2N0xfYQCGX5cTXxkE+GHhiNkw6PqTpZ1HzEQQ1jhPbI3ZUfeaeQCeZB24bVMkj0sSkivLXO5grqEXt++iIg/7rBv9enJmoICPqxk0wGIJiugxgw2cEIPSjNvrgyI3KxejC8FvebbXbaDz/SqxydjBr3BKn+MSPabUec8hMJoT2t9X5UBUqWajKg==", + "hexKey" : "31adba7bb14fdcb7172424a1106f65915e52755e7ce1b564baf8eb8dc6010628", + "keyToEncrypt256" : "8b877e3e7f4fe5849f29818cf0396292994e0217f20adfa4246a829eedb29444", + "keyToEncrypt128" : "4c18e7a42beebe3cd598a8c57cf3b9b1", + "encryptedKey256" : "ATOjN4wpazM2N0xfYQCGX5cnlJnQp6OYQN9BaolaZV+seF/IFxJXDNSbwCDr/b0zEMBbqO5QqdhE4t0V8YyvSwzVbbSMBxdm5QmFBhk5HsJg", + "encryptedKey128" : "ATOjN4wpazM2N0xfYQCGX5fbUwIE256saeCZuo6a10laF0/P/72+Rv4f53tPuNH4Pt1J3Y4DUfTw5pFRYHW59eM=" + }, + { + "plainTextBase64" : "2gm7VIl4fWZ82/mZhneict9DPffPzNWuD1aGIheHzTDUSRfWIZwbGmyTDhI0vRXpvOmMcSAvl4s37w6AFpV/OsqkBCfd2exdkOPYpzeipvIhg9iiag==", + "ivBase64" : "c9l9zZMPMIxhEo72CKyjzA==", + "cipherTextBase64" : "AXPZfc2TDzCMYRKO9giso8x307IJZvYDff9kwm5m5aVRYcZ6fl2rD6PrL9tYfzX1x2POH820cb4EajT7vfPvdtykdxjKa0DGKblhNy7LopcCRS7qKLnwbbgSsFX/4lznJp/ay42hF7cPa+xwE2uR/0IsmVXUesZBQHl9WaOMeeezllSXIozIVWf6NzkD8IN1XQ==", + "hexKey" : "cddb467c459cb66fa490ec63c5f299502c3800ae4e5bdfc2c24f91b23e9d154b", + "keyToEncrypt256" : "c171df49be9ba74545cb86e18eca0e6033cbe5acd26c06cf3f9f78500991a17b", + "keyToEncrypt128" : "e2efa1195095c2b6b294ab18695213c7", + "encryptedKey256" : "AXPZfc2TDzCMYRKO9giso8y4jkCAKaZZRzb8sVZ7jDLRMkJrw0ugBystjSqreXwVXT4LkPTakKHuF7foT80pjWJtDCit65Svgc+USHZ62ue2", + "encryptedKey128" : "AXPZfc2TDzCMYRKO9giso8wUeFvjzYbFi5GopRfQMCIUeErHatuq5+mWLYiVJzW8Wq2fyHCyFFecicjsvRxcPqs=" + }, + { + "plainTextBase64" : "GEFCterMNFLN1dx6LBgnahdtHsvyw66lOHLFLM+8PyMSwFNB0S179E42NxFMyjSVL9IOW01Z/cx9wXDOLOnoCjntClgidkOGFPIS++HpiavGgEi8lr8=", + "ivBase64" : "WW63eeIu7tKpqLxbxI1xog==", + "cipherTextBase64" : "AVlut3niLu7Sqai8W8SNcaLFPFeZPrCmGS/wXUNlQUpbuGzJu8oX3LgHQd5wBeN3jhVhTyrJvbZelxLcldyeachlUXiA65xQjzGCMkNMstvZteif1Uvmb5qaBfk/6ShO8eObo1wv8SKN3nJ3V/Oqm8lZhs//gGjQbUpS/zst+E64C1i6lMIuXKOAj1YJcUtWRQ==", + "hexKey" : "03d07c6ddd9ae257841d6778f65cfbce91f23986a0dcb1323e661dc36447f645", + "keyToEncrypt256" : "cf5ed55e3181efc4a51e8004fd3cef1f2ef42c5cb2f66c7af915787e8ca136b2", + "keyToEncrypt128" : "a0629dbf4d64ae323fa4b353f5f0eb15", + "encryptedKey256" : "AVlut3niLu7Sqai8W8SNcaICdPY/usRnJ4e49VtdG4igqTsqA9QMltmLALMP2AuUAhGKmi4Rv48W9KpwIuYluqW6YEfhEnnnhdMekLk5UHTF", + "encryptedKey128" : "AVlut3niLu7Sqai8W8SNcaIYNbc5uUCLk/GY9uMCwuQyQi9OodAsgaAMBtY75U75iiPZ6Qykg1diiJ+y9Vkslpc=" + }, + { + "plainTextBase64" : "2pLQmAywzLicnEMoSTkZXjN3jfI37JJM3ApvyDW+aHoiH6F/NWcy+3vMujGIIrz4++FloAA2asY29gzfre6Bb7zGX4y44uURwfh9QhrQG87glZsSK1Ct", + "ivBase64" : "sQpI6kTLzE12JsCFqIgtUQ==", + "cipherTextBase64" : "AbEKSOpEy8xNdibAhaiILVFAN0CYsBUuUjc5UEL9vpiT10LJcNBUqIYb0WdmyFLpdmbwhPwKIIx9eDWGuovQDAjRTunzWSWUnbl5Uradr4e7Ec+Qpad/rUzTToMtiGktwETJgXNPgI9svCsG9X65QNV0JHnP/6tuYMd9gStbf7Z64zfkMWHaxMwusmTD0kwHQA==", + "hexKey" : "32616dd22fcb4c2c2aa301721c048f51cf7f56cf70ad596003e306fdb0b68d73", + "keyToEncrypt256" : "96516691ee4cd800f382a6f05124fe574d742929c7b7478d29a3a533ee057f3b", + "keyToEncrypt128" : "f091125768571e27b93b163ced5b6148", + "encryptedKey256" : "AbEKSOpEy8xNdibAhaiILVFpXqUijtD1QzpY+3I8pfV/BT5q+GdU4B6uebgQvtoXUX47Dw1YOrXRlGZJU5zfLQHeRahalIY29MxConqEAQmD", + "encryptedKey128" : "AbEKSOpEy8xNdibAhaiILVHvQRMRGKiRWJwMoygsUy37+BPhcc+/6DUfqxXjTgi3d+hhZJWQqoq6bWQIyNQ8tl4=" + }, + { + "plainTextBase64" : "VBK0bBxeKSoqPiOqro4WbDX/H4RssT3hSYdazXH1qfOXuNstb3KF31jeicI2CO+HFpxY3S0lnxZRA3bIqGe0f33d8NwcbWY3k56nOaFOe6OjjonrT3WkKg==", + "ivBase64" : "Ya/xiC/QQXk8O8w+dEdF/Q==", + "cipherTextBase64" : "AWGv8Ygv0EF5PDvMPnRHRf3rhs07OYmtgE5ZNBAKfioOaj3A/kDUPfZecBMIL1OR0LTpEgMVuwn245RujDoj9UKl+jSPad5zHcl3YUVajRVrE9FfBptBhUCU2SPSb529x2ftQLnBCSVn1bCFJ/1k55JRv8o5TQCXqHM8dUGrSzv1AHXsAOfXCUKTKvqX4Vz6iw==", + "hexKey" : "887886aa5f5b9532bf1173c9a9ec4527f58b19a5db8a4aefd3227d13b5460a50", + "keyToEncrypt256" : "4fe23f176f4a070dacbcb6455f1cd702fc8409083621efbf5e386eb10861c782", + "keyToEncrypt128" : "240639aebfcc686ec03b4b1351d4c483", + "encryptedKey256" : "AWGv8Ygv0EF5PDvMPnRHRf3W+OenPeTVr/gB7K3+zvLSdRY2apkwHzJZL63BfNOrsrIbrNRunFyglo87M/0hPcUxuqcRCU4bvdJmDnAt/tst", + "encryptedKey128" : "AWGv8Ygv0EF5PDvMPnRHRf0CkuyMZ4fnVSURUBK4s7wA1c6QbprPKtfZigdSpPVhOscGEzKNifYgK7foJ0MSIZ4=" + }, + { + "plainTextBase64" : "Lh53XU3vNtk8eDdVt1rkDFy1aOCnCFuWIFhb6vwL8Tyt6jRtxy/Xonzmy2RcJWTnY0Ih+3xabpV5RXGvIEPipoCIGDu+Gu2x0ED1oylKdqEFLfaxZRfGb9Q=", + "ivBase64" : "EDwg6MlcnMNdqB8aG/Q8Eg==", + "cipherTextBase64" : "ARA8IOjJXJzDXagfGhv0PBKHRRHGTOQQZRZj0CbRmZXqlr1+wvm53b1KcfyR60v0ak+RG7EpWqYehwSyRWeZc7Wx8gTAmT+kbJZLsWrSefbrS6/CwF6YAQBSt6xZfa9BJhGy2wjzzQhoYLMILac/Iuz+3nFLtWpyDOZrA+NfCxu2eB/UkifQlPRgzTdUZTFjzA==", + "hexKey" : "e4f1253cf1c2b5346c6d16194aabd248afa0815c39cd3ec65fe5eedea6bf0f90", + "keyToEncrypt256" : "a8daba0ca6a0f1ac94e1cf9a4c3e1a29bf383cf2a7138466404ba5b486c0e0fe", + "keyToEncrypt128" : "f1719c59c6be7a190c51a4331e6fe6d6", + "encryptedKey256" : "ARA8IOjJXJzDXagfGhv0PBLG23lGeULHS0qYi5iJgE4XRK9j5B84eo2D8TDlN6ltbppu4DFotUSZzotC/BWXGdK3N8WAY2mXyO0+hEQCfn6h", + "encryptedKey128" : "ARA8IOjJXJzDXagfGhv0PBIp/8rfZp9SypJxjJ6wDuXtVeBECPAt75Fk2M7T0Y9C4QdsYE6YcM2Cuq0xFdPcl84=" + }, + { + "plainTextBase64" : "5eCi/i+HvuA6pvrCPoxpZvvEnvux+FIQYXm3eTDNAGLK4wgJluLlc6k/ojdg0lL3xN0vZ9Zxdsksm0mxcbvxcoLUfAVCZc1pdij6fEx77/ybmiLyK65VJvPL", + "ivBase64" : "gbszvfbQoweFhXkA7mXcMw==", + "cipherTextBase64" : "AYG7M7320KMHhYV5AO5l3DNKIg+hpa1KNSa4iDNnYUvCXiXPxRzbfT+N5U0GakfdqzcLaCmItZsDqOwH/l314QIu1X2wqxXjiSsjwZtnBtgcHPBW5Em4OhDWkbhKQYwGejfAPjKnO44Zed1x3irJcMbwWbxvaob61ii3aRcnqXF7Hq/fxGyUDbXuL8W99ahWqA==", + "hexKey" : "d8502793f98ec3a4bc8ab3d939cf6bed3e4ee72e8de5fc113481db1a0bd61c97", + "keyToEncrypt256" : "88c613c529a3bcea6af467af838381f298fcbadc2c6b10eeeed89d3b9e4dc2ad", + "keyToEncrypt128" : "f0cbebfe8f4be318791a7f457c621ec1", + "encryptedKey256" : "AYG7M7320KMHhYV5AO5l3DNfLjd+RZcC6lcKyt/8F4Uqdo8wOf6AEnTvg2DjaSCXwDrxqVyMOpmi98E/I5Mm+/DoAq+RNJg87uB9y01Gy2uU", + "encryptedKey128" : "AYG7M7320KMHhYV5AO5l3DOh6LOO8XcuZ4YcDOHP6H2ohRZ3b8Lu5pOwqhTr0NtiTtfLj1ymUdGZ00oDWyr8Z8Q=" + }, + { + "plainTextBase64" : "UTBuP6nD1V6wWXqxAOIE1O5b7KnbHy5YEo7BpK5XHFzezrlyiBhA+HKwzJSpjoZkHa2a8xvuehOMVSaKnIc4MdHhWgBhBbWX5s8TSZ2SSXKmSbW3vcyiOG5+jQ==", + "ivBase64" : "1GxsWePCOYwIjFcnTm9WOA==", + "cipherTextBase64" : "AdRsbFnjwjmMCIxXJ05vVjhdse4RHE1pSi5OOr4wUqJnzDyUq389uNKqs0UDlaYBsAmPoQxi52wDnfJxhzVGqD92Lateyaiv4hd0qxDrOIHj1k1qwwls/RSvv4Qwlf9O+nV88euXptlY5Akj62BXZAv/EGJRrwh5Uwsksr2lefsrM8KijkAOjmZiOeyEw61UnA==", + "hexKey" : "1f084a76fe9739d59f92c62a01b8990061d676ed59268a829811a1a46f2badb5", + "keyToEncrypt256" : "68a0c5d8381c46e7e87d69dae8d898343cf6a981697d866f6cd31f2ee9f747c9", + "keyToEncrypt128" : "d3bc709a443fc4711565e6a4648f4549", + "encryptedKey256" : "AdRsbFnjwjmMCIxXJ05vVjjqWiQAOjRDcX9rqTZfGlI0yXvfnEvnkp1nFhuLhLO5oE6sEdNz7cZE0KBHMPvdD/AcwWUoHSbE/PWpsWQR8gzW", + "encryptedKey128" : "AdRsbFnjwjmMCIxXJ05vVjgHaIuPYYScq7sIJhMTtIw7ZcAVgzFoHyDsUUwsrhkU+bi54JIz7c/Oy+wxjkgVpek=" + }, + { + "plainTextBase64" : "Or/cdJ3QSn2cMQqQpwuys/Gkp0EWPip1pqknDcCInzLQprs/jnK7a6cU3dxBeOQoV/1/2Cx+3QKSwOLFgXkg/oZ2Sj7wske+J4T/xqFgGsHtLWT12nAqw3wxExA=", + "ivBase64" : "u1jIEfUNg51OvpVSxLMykw==", + "cipherTextBase64" : "AbtYyBH1DYOdTr6VUsSzMpONplY566jp2l8Vtx3HwP0WyTJS3dw5U7oJ6nhxFQwcZ1V0B6/i7AXGtve3U5qCL1w7wFtKzHYnVVabPlG3z2dc/u4jhLA5V62nWLS79yvXqVyBpmJ/6AiVe2vtjSeJjkX08JfxN988GBaLy+O3tVWIzQEgw+XhaeZVU5Bmrhv6DA==", + "hexKey" : "147e6a6b708354b4700d1362bf9de8026f2445a4f9631e9208dedfaa45aad8e2", + "keyToEncrypt256" : "f628aac55a9e3a233fb11fbd7cb3c3ea7b926f6201ba3a99fa5ed48ed26d441a", + "keyToEncrypt128" : "9ba50b0598a243a9d1e6952a6551e128", + "encryptedKey256" : "AbtYyBH1DYOdTr6VUsSzMpPj1U2bsd5rQKnpajhE0mQ3U7VgP2n8rbq0djm98j2mlb5k/hTDpHJ/qzVQEdbWQdP/z4KMnpDqy7LOfZbaxBmz", + "encryptedKey128" : "AbtYyBH1DYOdTr6VUsSzMpNwQYCuE2KTEohWHfoATs+078aacjEs51d90fIC1uPHwEfY9eIH3Xh+TPLCGzsIago=" + }, + { + "plainTextBase64" : "ydT6a9PTM3FToSXS7cuRZNvND6sH/x9NVmT/+OQQ6Usxfq+myQakotZSwXwKvmKl0yacL13WFu3u/paIVTDoDLVNhfi1Z5QVSA0C/3i2RZlx6hE8xyuvBkyG5hs1", + "ivBase64" : "fhPWU4bVDnhEcObSdyWjuQ==", + "cipherTextBase64" : "AX4T1lOG1Q54RHDm0nclo7mWmXixMPm9BWiLIZVozuKQSWiEaPxhAJY1AHMY9nQhuCkOcN3aFZCSQ6eK/HCY6P3el1MnpR5oRNd+eiJdDy9mjKkb9c1UFGiPjM3j3fnXmLhXXx1nWpPhq0ZabebuRQ5qJHvvNIEd1QW9xFmjVyxOS5lZ5Dd6unXuW4FxRtIzjQ==", + "hexKey" : "cb7ad5c62c0141e15effbf13d7611a8f28b9e1bf81f9b3b88f0f4197052da208", + "keyToEncrypt256" : "3cc6450c00519d36a27fa3369096fd34d7edfed60be1492a1024ab7836998c48", + "keyToEncrypt128" : "2838765c179409dc6cdbcaf3b3383f70", + "encryptedKey256" : "AX4T1lOG1Q54RHDm0nclo7mPM5NsDg09uuS9AqR7x+3CAIqs/LsI8IBWvNiGotfA6oqNibvDdpd/F0aPqU/eZPiCAd40T78PfilQDmh8/LK/", + "encryptedKey128" : "AX4T1lOG1Q54RHDm0nclo7mZ+VRspMY0Z2nWXMxUfMPLOc6hjXSMJ2zUPppEGiSy68/rFXw6FSkrtdcmgdw8pXk=" + }, + { + "plainTextBase64" : "PVV5COwAZvoIQmyPvtg8DMWg5Bu11So8XvX6/nlIbdER7eUu95yaM5b721KoACugM0F/Z305uRG3d6k8WmTesE7Trk9dygCOiBqR21EWjYgybbYUEpled7Zs/OzBWg==", + "ivBase64" : "baBftIqPcBW/eL5qnRJRUA==", + "cipherTextBase64" : "AW2gX7SKj3AVv3i+ap0SUVDFQng0pHN2ezLSYXCyGD4XTcMRmMot05mYHFT8GX5bURK+jNAQvDundVhMQ04wlizGl6/bvkM9pVGzWcTdTAdzPQ6ynkFYYxpjDNGp02eGD35VvsiRGpDot1PaQ6cUQeL71NoSHVFFukP/OgV9WQPrVsleB6xvJiToSM+e0aqWTQ==", + "hexKey" : "b3eaecec26fcee6e6e47f5bac6998c7c4603502e787b93154851ab78c7e19cbc", + "keyToEncrypt256" : "ed65dc415e4923eef92964e10ef32cab6c81449d27f084d1c0fa207c91ae3def", + "keyToEncrypt128" : "aa611360ad743ce1b81c8d70b08d36ae", + "encryptedKey256" : "AW2gX7SKj3AVv3i+ap0SUVA/+PIRDCxZz78av9M+SeijZaDQSRPivdo7tUXHeI97zLJfa/W1dUzEbWQejys8rxIcBfYyZgd/x+eT7izzuRit", + "encryptedKey128" : "AW2gX7SKj3AVv3i+ap0SUVCOyeFpmBNFU75zpj8pGfXCOaRPT1rX6lP5OwV9S5WCb+kpNJzM2zzv1GqidoZp+1g=" + }, + { + "plainTextBase64" : "TBo0w1nOASQybIZKZD+22eA52DZeQeKwvzaTFLHrqSsj776J7qKZ7pY/Dwq9xbe5lTtZC1bf9DZ9sQ1caJQGaLSs9KyT5dDNSKpgbMiLzZ+BWXqKQ2ssvDUgb7/xgZA=", + "ivBase64" : "H8XfkGGxCLyVH1/opHNrRw==", + "cipherTextBase64" : "AR/F35BhsQi8lR9f6KRza0dAo3qHBFlnpb3EuY+pH/UaqVwAEkcnWR0xpCxhk1Ec5qrWQ1tRC9425S+edK3616YPbZxTgsu5mVKyniNINkRTrtTTRgmd0SS3cKDqIhzP8wCUapLMm9HT9m4uG2r4bjdT7EAr7Hz//ea/LgfpkM4kjokxaQB7j0hypsbSDJ0nFg==", + "hexKey" : "beb93e7d3afd66a1956a9ef14b750d8892c0f81621e29ff8e90b03e81567c999", + "keyToEncrypt256" : "fd0fa80388d33572fc7b443cc2da3aadaf53db8e48cf16ce2b9e9ec89670fc0a", + "keyToEncrypt128" : "590839037103a6a450c991e7cbb14115", + "encryptedKey256" : "AR/F35BhsQi8lR9f6KRza0e8JLZ6OJf5UEko8vqduiGEJaZT1hlGqt63FrxCGnNGybYQVWrT9kPfVqzeOK8mUlnjgemq93vNa9pZUernSMps", + "encryptedKey128" : "AR/F35BhsQi8lR9f6KRza0fCwY8zB8DbvughMJ8DSqEe9kvC8A/H+D0RpL/vugbyYl5oCaRDoYQ3gWY/Pxe0F7A=" + }, + { + "plainTextBase64" : "FsjCimZotaPAONmiHdls9vmWClGViuTMwcUP1mjTmNfdcxyz1Kg/B16TKU+fICjmA9EjNZ+PADAP0x/AlR5NkHAt9Dpn/h/BTWb81tWPyXhSdcb9RC6j0leL/807dSkn", + "ivBase64" : "T7iP5+Z2WtOeIvXxO3exTQ==", + "cipherTextBase64" : "AU+4j+fmdlrTniL18Tt3sU1K9rRhCIgtqDmX8KfLcL3hZqSv+D5nN43W3FhjGQNkyPKqir8J73MxNhcCZrIA5dhJ5EQ3q0Dj2e18ojinIb12HDhIur8cPWEtb43bxesHLUb7nLq51REv/Su4yNaajkIEnt1PUrvrCFCdR9Xqg7eag/Qq5wjpbYUC/rSjwaIMtoot7pLu1haAz2l4BmfCnwg=", + "hexKey" : "4ac6df55b701a2ecc3b338845361d5313863dfd9f0cf7520bbbe13932e0bd60b", + "keyToEncrypt256" : "84aecf2eb9d254a2a8e49e1cde5b23ba114ba24b1ea6b08069cf5d391206ba71", + "keyToEncrypt128" : "dfca6aca9ba293aa9867e923da7ce8d0", + "encryptedKey256" : "AU+4j+fmdlrTniL18Tt3sU1rY0NCkbCK8k+krsDBjN1VL7Q4u5dLV/9MPOzdIhsovco6u8QR05l9c2LvnJi159JMS5SY7r1HkRWhpXp4LuRZ", + "encryptedKey128" : "AU+4j+fmdlrTniL18Tt3sU0mps1ucZb1XulDEd19Fwb03GTD5WhDpHiqgG87J987Ar8psXGoLDvWNDrpZyoJeVA=" + }, + { + "plainTextBase64" : "OR/e3pgn743+gt+MvAxIXp57jXMZe5SHCKyvzeJaj5E/vhjl28whfqWg5M502HcQy0f7Eby6dgVswvwF0LjIVlibFPjPnhWZdsVEaX4+I/82nCf1KaH6nP+0QLdltkLqiQ==", + "ivBase64" : "Fm7as9deTwnpVZeyMObvQQ==", + "cipherTextBase64" : "ARZu2rPXXk8J6VWXsjDm70Hz+SPUwExu6fMwrHILfZGIzOtJbxBJ0B5rSIvoOuul4l7t3YDuvZKO7WiDx++EV4WkPJBhcO9y4fW2iLrZDB2GMy2LQhi89pt0NAJ3/OTUAtrX9V+pwq8V3pfpEJyGQ0jW/E2czaY+34YuPrhCgoXH+t/GpNlcW4JbdN2hnd7wsioLXbWlWChJruxVYp8Eyo8=", + "hexKey" : "0b026d45eb691d6af410c60425fdfc90573a457d37976fc155b07a6c6850d9f0", + "keyToEncrypt256" : "ad85f19996140a7490eb7d078c1c5ac22f3632108a45918559f0df1a36dcb165", + "keyToEncrypt128" : "9c2cdcadc696400517ee67ddd266e497", + "encryptedKey256" : "ARZu2rPXXk8J6VWXsjDm70FLDQRBAfGFQjLyKGpvadJgGkUmaYtfcao9HEH/OdGp1yM/vsj7PxF1UwzSR2WU9TBmoFMaj2WyGyK++xQ1Royb", + "encryptedKey128" : "ARZu2rPXXk8J6VWXsjDm70FkAcLUYHSXSykmQpQmJ0uwgtcTGbTXF/vDMlCZ4wRwkebsGgxztivw3e/GprRCduM=" + }, + { + "plainTextBase64" : "eUs6sbJtux/oOEdAgH4EPNOwHE3OWjwPgV7rvboYN7uhTKEQIae1gdIbU8n/wA0JSebb04YNsI1JAHqYvt1vnXYEjL3c8LCpSsmi0K4WFJsdOJM/s7slMo0YUnXXnRvTSVE=", + "ivBase64" : "VULvd2vbPbFQBk1wAk9Fdw==", + "cipherTextBase64" : "AVVC73dr2z2xUAZNcAJPRXehspj00u8oIN3ZkaOiDNPtNOv1imS5hM+c3k56pkXeLzYsNERAIrlVyiY5nKk+LcuGkiNiczvpdLEj2p0nPnne9UNAgCaNA8Hw4siG+b4O+ajWT3OUCCQXinBSwSzOKN/NAqHe9Rmz2iX2YVgO2z8z4pH1DkWwXUj3bWMV2Dfk/52NsbuwqTWi8K25GiLA5B4=", + "hexKey" : "de429adc6ddf66b5ed8617ddb355a9670e16a689b2bad62174751ebed66ae060", + "keyToEncrypt256" : "012ee7b3ea34950977a63c8ae0493100cd6043b315ad9764a7d3f4d7899f0f2f", + "keyToEncrypt128" : "4acb6af27d31c427859baf3469ef9e70", + "encryptedKey256" : "AVVC73dr2z2xUAZNcAJPRXeOKqH718cU/FCyH9aOr9aGFuFpOGjJQWGdCBT8UDqJiob2CJC0zIhnP/sYeMnkWTJGDN3ZZpv+OgVlvpRnCJCy", + "encryptedKey128" : "AVVC73dr2z2xUAZNcAJPRXcbpzSElC2xeOKQkFO0/oBKG/Xi3wu1W9cgxs6a6vjX+KALiBID3k+ez6ayyXf1ZTM=" + }, + { + "plainTextBase64" : "nv/TOsoNbzre97e9SBUY5603Hnfk0bqd/vsBJW5ccNHVAkiW9wZnYulQbnSCQO7y0RvrNFX144l1ljGK1UGU7uCOcMckiDtPyxp5F/Zdpz9g1ld7QLvQFxpcmO3DfUwrvvVP", + "ivBase64" : "f6zK5YQt2KL+9Cdrcpolvg==", + "cipherTextBase64" : "AX+syuWELdii/vQna3KaJb69FraUfsFJ6kqR7c8qdyeVV79lPw7URbCHcrW+F0OL6BwpJLppZTbCjFTwoP3iHICv+6Leh67MqyMYIgkTzWlUMCPdQa36DtZz2ph3GAupM8mf5XU1DMHPjuB0hWDbML71wE4V3bgVh0BoBvpZEcsw++nqlrq0gsev2MHSkrYNSMMUcea4xsCxrLu8NikvxEU=", + "hexKey" : "9322f28f606a9ada88bafbe20e8cb2ffbe45feb19f511d1bbc8185e83376c0b9", + "keyToEncrypt256" : "8acce5acdcb4e75100b83540dcfe8d57746591e7425628b32c865049542fe349", + "keyToEncrypt128" : "6980ca3a5d0961481dd0380712237a5f", + "encryptedKey256" : "AX+syuWELdii/vQna3KaJb6fHaZ8fjdmY44zStAapdt1DC4503bEMdK3tm+rWKF1t4WEmyAL+Pv5r9J0E0wmzJK6xC55nuKkQEM0saNaYudC", + "encryptedKey128" : "AX+syuWELdii/vQna3KaJb5vtK3heTGndT/zH31iKDuo4sjybNE45fqNHoGULWC6EkQt2Y2Qf5cnfFmvVnW8+lI=" } ], - "aes128Tests": [ - { - "plainTextBase64": "", - "ivBase64": "oLhibvWslO+jwrn5gXBFGA==", - "cipherTextBase64": "oLhibvWslO+jwrn5gXBFGBAyBMM6jQOyjoEdDqMQnS0=", - "hexKey": "87295bd5562e38b76472f11484d58618", - "keyToEncrypt256": "249fd19791afd4bebff9ad7571ea1eb893e6f510128123aa8ce7053c7825b6ea", - "keyToEncrypt128": "7981c6430f0f15fa96aab6f0d14dd4b4", - "encryptedKey256": "jmXMPLE8V864J3YAku6og9gNczyQbBvbMS2ZkyvNMX4=", - "encryptedKey128": "hpoHVn+FZmfxfR8l1ashfA==" - }, - { - "plainTextBase64": "GA==", - "ivBase64": "oDNdi5R3QZXB6CgZRbJbyg==", - "cipherTextBase64": "oDNdi5R3QZXB6CgZRbJbyhsEeqQQg39WxEsmk1/x/+Q=", - "hexKey": "8d09bb450fbadbb7076162b1315f7803", - "keyToEncrypt256": "ab22ce46ec367779343e07474f568df746a012c8b4ea688ce7617ef8673fb5c5", - "keyToEncrypt128": "9f464b47938db5464dd45c9aa9e896d1", - "encryptedKey256": "uamy6ugW/9b3f90IwT0zxTSMWV3NApllVO0eRT5SkpI=", - "encryptedKey128": "lNb8c/lO2a3ZURkFlHG45w==" - }, - { - "plainTextBase64": "kx8=", - "ivBase64": "Zfokg+nfzt1tGgDa8r+GBw==", - "cipherTextBase64": "Zfokg+nfzt1tGgDa8r+GByyul92nGlXCd1kCUYzb6nQ=", - "hexKey": "89a41d94506928769861d7b1758d1275", - "keyToEncrypt256": "8f86d4e0e8a68c95fa338688fc3e0da0c3c03c2b1f3e2dea8dce76a442b407f7", - "keyToEncrypt128": "dd6c3739f5529c438e67645d27001a19", - "encryptedKey256": "pYvBjbGvq5BwTKBvmBBMMDdIxiYaYr04wmq33HQqEYU=", - "encryptedKey128": "e8Kp7dNHU6lbDTADSnsAHw==" - }, - { - "plainTextBase64": "/YjX", - "ivBase64": "Y4WncXzc5CgoH6SCSrwikg==", - "cipherTextBase64": "Y4WncXzc5CgoH6SCSrwikjyw/nXdH5T/F8QUhqHZhw0=", - "hexKey": "ffe158124400d747eb61af584e354b48", - "keyToEncrypt256": "d921fe2c93d6d4d0d2c3d65c4f7734fab0412dff6bf3e4466d4cd74059784552", - "keyToEncrypt128": "35e3c664ad9eff36075b86240a44dd04", - "encryptedKey256": "Kg3Au9EW880q57beHTzl1QmZGhuPBv0ujm+9+0O/KW0=", - "encryptedKey128": "z4UGaXYnAK3FAD0CW37XHg==" - }, - { - "plainTextBase64": "yjuOHQ==", - "ivBase64": "fBxURaqOHM8qWZr6lYkH6Q==", - "cipherTextBase64": "fBxURaqOHM8qWZr6lYkH6csvwqEpGrs1ddVYA+eOo9o=", - "hexKey": "b2b42a692af4f3e1f91bb1d266496250", - "keyToEncrypt256": "0da70213317986bb2b85e06d1d5f70a3c3f1130e7b5ef46c2b487907078fe68d", - "keyToEncrypt128": "1f5e590f6146b11f2ed3c3b4bac56a15", - "encryptedKey256": "AqOWB5x3bg+BV7AEmEVTigLeDwVM3lfGKDcvYhQEx8E=", - "encryptedKey128": "Ant1JrBoWd/FwsAxx58OGw==" - }, - { - "plainTextBase64": "LFwUKfE=", - "ivBase64": "btRhmTucbtNjOgEJyJ1daA==", - "cipherTextBase64": "btRhmTucbtNjOgEJyJ1daDxDcvuXs0rrG8g5TvbL25A=", - "hexKey": "5083561dda3347a2f16ac8747b8332da", - "keyToEncrypt256": "19268e98f28904a28700338207f1e8ec088f80cb5f0306a9534aff5aefc805aa", - "keyToEncrypt128": "e98f145f99ddef5250f559a7eb364201", - "encryptedKey256": "PWU2yZ+L61ag+5orJq+/rbE09/dYZgOFZS5lSRYdAA0=", - "encryptedKey128": "7vyTi50q308fYTs5c/n5sg==" - }, - { - "plainTextBase64": "smFL6zpA", - "ivBase64": "0t2tCLtCVKotvEDf07BBsw==", - "cipherTextBase64": "0t2tCLtCVKotvEDf07BBs/5WzxRPj6CMs3KxZqEgR2Q=", - "hexKey": "978986b7c00583e9569f73da17dd5c0c", - "keyToEncrypt256": "c486e1cafd15f7cccb36fe405bed7aa870d1d0e9e8d6a06cdc1c638940a0ebbb", - "keyToEncrypt128": "0716540c2d2824e416e97d6e80651cf3", - "encryptedKey256": "QXWycEeSy+TCnJ5aTjmMNS3pEsB6jZAawKL0WW5df54=", - "encryptedKey128": "EYXF9HOMAZUgRda8oe8P6w==" - }, - { - "plainTextBase64": "By05hMYn7w==", - "ivBase64": "GmYlVdaytQTRK5mxK0WAyQ==", - "cipherTextBase64": "GmYlVdaytQTRK5mxK0WAyZ6uDBA2ON//c2/5KCIDAAw=", - "hexKey": "6267a200bdf2549f0270e4f9beabd76d", - "keyToEncrypt256": "c9521e7456994499688a63780f440824491b0d4d2ed12cd4c0000ff57a9cb393", - "keyToEncrypt128": "c8fd5bcd12696235a8685cdc904ae338", - "encryptedKey256": "RlnozJIiKXnKexy0KuvmYDWJJXitGYiYw9GgmHyjnEs=", - "encryptedKey128": "FOsma5w9AbEYZpRAKLFCXw==" - }, - { - "plainTextBase64": "to5J0nV/JjE=", - "ivBase64": "xM4kgLyElEdwafpss0Y1FA==", - "cipherTextBase64": "xM4kgLyElEdwafpss0Y1FO1eletVIYU8SZjeETSF/Tw=", - "hexKey": "32db947afaf04c4def7a864f4e7d7176", - "keyToEncrypt256": "59863f1b95756fc50f6f75ad676b8b046cdbe8e9280f6e962d219665a3ef94f1", - "keyToEncrypt128": "e7001beee4362adb5b2e6a716c9ea89a", - "encryptedKey256": "Jcr3cCKceoczW8v5IXx5HzXV0Ddq8aHW4Iw6ZYEk2WY=", - "encryptedKey128": "P+OPy2Vs2Kha+eIaFxXiXA==" - }, - { - "plainTextBase64": "qxJHhPDsNSW7", - "ivBase64": "XoeWDBJ1LDZyHAoY/4qZcw==", - "cipherTextBase64": "XoeWDBJ1LDZyHAoY/4qZczdKZFy1K5I7KQJJx+Zl5K0=", - "hexKey": "5d1d77b73ea99c84b77f7279779ea712", - "keyToEncrypt256": "2efb88e012dffdf9646da99513e19673ec636c823b840b982125f7b3c4febeb1", - "keyToEncrypt128": "8b54d2c566a512402ddd892ac1ab8b58", - "encryptedKey256": "bEAbzzdnAftoDCZsZo9aTGn2N7CGOfcxh2q76kJ/EOU=", - "encryptedKey128": "wN0OIe34V8nyVIXC8SIcuQ==" - }, - { - "plainTextBase64": "YuGfu7xUVX2aGg==", - "ivBase64": "m2LQy7yIChogYTtDVsQhjA==", - "cipherTextBase64": "m2LQy7yIChogYTtDVsQhjG/KA9+JLNv7S0DCXsnD01o=", - "hexKey": "8d88ada5488d595f29ce7b4857c069b2", - "keyToEncrypt256": "5cb0f19ddb2414f6361e2ad7017e30fc65cc604d7b89d572a378cab4100c7956", - "keyToEncrypt128": "6219279217cb4e240f934e49e50b9be4", - "encryptedKey256": "gui8Nw0oksIsVRn3jc7CQ11TlLcM1cqOHns2NPdJMpQ=", - "encryptedKey128": "roPMIaEW2iCtAat9vUsNPw==" - }, - { - "plainTextBase64": "reDX26Q1rcwuv/k=", - "ivBase64": "EWieZBWA25kYK6Tzq9vkbg==", - "cipherTextBase64": "EWieZBWA25kYK6Tzq9vkbt0isweJ4MuCn6f9VTWvbOE=", - "hexKey": "86864814078fb82760d23e01350b9c41", - "keyToEncrypt256": "df2703d394584df74175a11070c0b3ad4542ee2a6419edf927485d8ebfc76a08", - "keyToEncrypt128": "763fb14adccdb8c58ef39b00cc4fdae3", - "encryptedKey256": "HXTIGDGHK/81orFWtof7yPX7s7/E6zl59H0PnRjZ5jI=", - "encryptedKey128": "dYmz39maNIbqwPyUCA9/MQ==" - }, - { - "plainTextBase64": "RGxL4XB+50JWUXbk", - "ivBase64": "Lagsp6uPcr6GzrYno0vhuQ==", - "cipherTextBase64": "Lagsp6uPcr6GzrYno0vhubyROYVkvNgLsRqvAX2WKos=", - "hexKey": "21a43bb26026092bdd63f0a3b0102bb8", - "keyToEncrypt256": "ae30205b6cf4536205bad10f7c98f5411e5edd78cd12c2970330692abd99d147", - "keyToEncrypt128": "74646096ca9c512490733d6bbbaf8ce9", - "encryptedKey256": "Uy7W+niC6Di0+LmTeT4sWM5pNtS8s83Uw2R/arYAiTM=", - "encryptedKey128": "VNrCED43sOcJR1dWCghC+w==" - }, - { - "plainTextBase64": "n4yceGORwzYBNnDlag==", - "ivBase64": "ocjsmmf9ly/tTwU+2P/d4Q==", - "cipherTextBase64": "ocjsmmf9ly/tTwU+2P/d4ckGq3U1s1JUL6i+w8SP/74=", - "hexKey": "a8cb2b719e22dfb677e4f8c53a065e0a", - "keyToEncrypt256": "6e49c7802485a2df933322ef145a6d9b55192a3887178fd5ac8ebdba53df67bb", - "keyToEncrypt128": "a4b2f8468da0292637a5997584c60f84", - "encryptedKey256": "DcxeFWomWny2bm//NBrv7C/93BccInzeBZOxwFgPEQQ=", - "encryptedKey128": "Kvi68GLUQKrHX4DcThL1PA==" - }, - { - "plainTextBase64": "v9ELoXpjCyc4C+nd1Fo=", - "ivBase64": "pg1ogCr07gtZamp08jHHwg==", - "cipherTextBase64": "pg1ogCr07gtZamp08jHHwuA+udQoNvIL2r5pBXrNsE0=", - "hexKey": "905fb8d3aa1e75ffe775c0ccc4219cd4", - "keyToEncrypt256": "8ca52cf59083cfea2cb6bb5170c174579cee2ba389182856c23bfca77d27ebbe", - "keyToEncrypt128": "d288aa529d22499e33532bd55672651b", - "encryptedKey256": "4Q434TDVFggrxOqi6WjxBTFInYK9PP2Gj4tjVkupFQI=", - "encryptedKey128": "k5kjRDqMA+HfDO+HCLqHlQ==" - }, - { - "plainTextBase64": "l4fZrJ53cAFGA5++TnQF", - "ivBase64": "5wuJ8qdFzNQRV9E/rtls1g==", - "cipherTextBase64": "5wuJ8qdFzNQRV9E/rtls1uDUD7SAIMIKs8paNGRNqUY=", - "hexKey": "0a44908dbb4bd124cbd3dc332f4ddb30", - "keyToEncrypt256": "bb8ab4f20a10dcf5bbd14d161d3a0d68c65c9fcc835a84a7877458456ad2cb50", - "keyToEncrypt128": "9ea95de5df1be20a4004394fc86f256c", - "encryptedKey256": "VWlDxZpLlCdFc54fRnjAQRXdlgLS+X8G9TGKySrbu8I=", - "encryptedKey128": "W1duLfEbM6eN8FH/s6/NpA==" - }, - { - "plainTextBase64": "TKy7S4jFwIwuF3k/BT/hIw==", - "ivBase64": "GQ6lq/LNeQXOVS48sD3/8w==", - "cipherTextBase64": "GQ6lq/LNeQXOVS48sD3/83pfF92cnR6yL0XMeTgATy5j8wE2d9rOi8oUPyYH0Dpc", - "hexKey": "be14a6883e63e54602dd0b22b0048a12", - "keyToEncrypt256": "07fd61b258a4912c944219d4245aab6ebba612f002cf05e1bfd58016d66bde67", - "keyToEncrypt128": "eea186c49841042644280cec4b147b6d", - "encryptedKey256": "eyE5c9Ke/9AL0wRFOS0f6uwi2BBur9jxWC0lRG9s+oI=", - "encryptedKey128": "j9MWmky3LPMXyITLx/8MFQ==" - }, - { - "plainTextBase64": "Uu3tFVZRHMjQS7G1V7HZzTc=", - "ivBase64": "Y1hluLud2NNuEzXe7zmXvg==", - "cipherTextBase64": "Y1hluLud2NNuEzXe7zmXvnaWnEi7jQHDOC0c3mR8nI8EzHlMYnCwrJdZo3hTmz/7", - "hexKey": "9a1d362a42cb87bafce78c646a9ecc65", - "keyToEncrypt256": "4dedaefef4e4438c4dc99aa343b2572090b514fbf64eaf907b1316c71e00e372", - "keyToEncrypt128": "022dd345635f1df1128c9e77c74522c8", - "encryptedKey256": "AUKZ4SOyhlC9ToKHStx0DqcPkjYV+Z07pYUH1gzupsw=", - "encryptedKey128": "Lp4WtVjrL9We8jLr/qDOXg==" - }, - { - "plainTextBase64": "wv3nu/4rF2p2I6Vdy86iHwAd", - "ivBase64": "qNGd+GTG87XjaoowDKbIlA==", - "cipherTextBase64": "qNGd+GTG87XjaoowDKbIlAGu1uWH0tG9AbaPvgINQxNPoAOBRAQuQitks5WKrbBK", - "hexKey": "32a0246a53fbeb3ad7254fcb9eac88ec", - "keyToEncrypt256": "be80970a2a1606d904f2002c7fe60d01696307b60def6c83aec1f0ef6972d0a7", - "keyToEncrypt128": "5599dbfef92e587789997c6dfc9f02e4", - "encryptedKey256": "uGLdDtj/bCiA2EJxIGdG6Evr8uSpZ+HtwpT9a4+5HK8=", - "encryptedKey128": "A1Afgv/w0mD1mlJoRT/cQA==" - }, - { - "plainTextBase64": "ra6G+NMHzdkTawzMiOfmDtX79Q==", - "ivBase64": "5orLVeCmQVL3Wty9HsXEWg==", - "cipherTextBase64": "5orLVeCmQVL3Wty9HsXEWnJNuiAmcO67KsB5My4teNwFCMGtzaCwmkEEeYIXPdFE", - "hexKey": "8a6b02a6a33087df4769a87b87348039", - "keyToEncrypt256": "5ca6bc1f987e2e15d0524d44051add0e63fe8a03c9b00f018a9fcddf50532bec", - "keyToEncrypt128": "d3d67e199ecd1c5b95aff7e0b6db693c", - "encryptedKey256": "AoHBJdD4npLtm3MNiNL7J7+eCUVdT45qL2DSUqLYuzk=", - "encryptedKey128": "eNvR5k4Kh6C9uaxJXjapEg==" - }, - { - "plainTextBase64": "WgUqXLy2KfN1FL+5p9IgycALOTQ=", - "ivBase64": "uxRqCcIEEYkeiZIc4o4rhg==", - "cipherTextBase64": "uxRqCcIEEYkeiZIc4o4rho+Qwr98oTTub7eGpMG5PZgwfGoX/sUFvgu+XVa8TFDF", - "hexKey": "0c781361b93e47ee82ac108063fc6e08", - "keyToEncrypt256": "c5b5ddbc19487ef03a9c21d780fa649f74567d7c33656a66d69742773b4fb8ff", - "keyToEncrypt128": "d8567cf398fd4718739d9d38964a002e", - "encryptedKey256": "wIPKlfCzZ1TJhnGTet5B4EPKOR3qH3GrZ6r7ghoD76A=", - "encryptedKey128": "gQ5GlINQowOsjIW7JllTCw==" - }, - { - "plainTextBase64": "csbNt8OJjJMoURZe8hLr9E/DiIHo", - "ivBase64": "FAnPcpdbe64xrAcWwcHIGQ==", - "cipherTextBase64": "FAnPcpdbe64xrAcWwcHIGVtAkpO8A3DgKYxZH1yoc6JbweTP+bBWztndsNGCX4dK", - "hexKey": "3140c8dc0b4fe97820c862df6f11924c", - "keyToEncrypt256": "a46f4552d2fdb6587f7efe0c2b8b581bb030c70c8617d22193af89fdc917af35", - "keyToEncrypt128": "04f821a5b56a0ed4a400ba231957f528", - "encryptedKey256": "3aeHpcZ7P3SInpAgLyfN+Zq1c//rM2e4uTYT7CQHlQY=", - "encryptedKey128": "kauA0t1l+lkK3EhDUQeW9A==" - }, - { - "plainTextBase64": "74bY5bByHUTpPkfWr4O578aX0MQkaQ==", - "ivBase64": "/2Sp1JFe6PWwODf8CWjofA==", - "cipherTextBase64": "/2Sp1JFe6PWwODf8CWjofNttyez3k5uLuOw7+ur3CFIvHszl80dcHhNsdgN4lD0H", - "hexKey": "008b73a76c451288950aeb4254fbc77d", - "keyToEncrypt256": "c1920b57ee0dc60596714a4fddde64434b1c8aac6df053a041d2f38a94830168", - "keyToEncrypt128": "459390d02fe0a33f424346db0de4d975", - "encryptedKey256": "8sO411f1MJJ4uRxQ8W1JZA9XGs6xndiBBnSyBJheOrw=", - "encryptedKey128": "k/53aqDwMcGeuvhtrS1sfg==" - }, - { - "plainTextBase64": "+7auYsJMTAfPgMwA7AEhOLmH1y+v28U=", - "ivBase64": "vypQxSuzir9TYwt5r5pvtg==", - "cipherTextBase64": "vypQxSuzir9TYwt5r5pvthzQFA2voevwFU4XDxgPwHd4DPwIquoLh23luXkuFJsn", - "hexKey": "721f6de58b73a6d1a63c27c33316a9f9", - "keyToEncrypt256": "6cf1c34ac1c50288aa38032ea5cb6fa200dc3e242b5e40ce6987f0192ecc31f2", - "keyToEncrypt128": "8dc3a2c2f95078cbd8fbcea8f48c65c1", - "encryptedKey256": "8V76fruT1LSzRmxPPL9P5jB1vqT2ZQ3dItuOjOT/J4A=", - "encryptedKey128": "XqafpJ3UoMrlQbkCqV8Plg==" - }, - { - "plainTextBase64": "RBdfY7s8z3drdLkRlkTHXzgrGg4dfkCk", - "ivBase64": "FPsi3qFGfzYUTROj1nmXYg==", - "cipherTextBase64": "FPsi3qFGfzYUTROj1nmXYgL59gDHgwud68Quz5J2HLGBWT2rqHB4Fcpd8fEjEOGv", - "hexKey": "af3961f4fcac244a840de1f5c490807c", - "keyToEncrypt256": "d261498bd39cdb71bcacd216a97404c682166c46d35c4ba46eb5635db11d82ab", - "keyToEncrypt128": "5a0b74a11cd4d1284ce36e775f81bb9a", - "encryptedKey256": "AaIi4ZwmhHuPynFTyNXfWCDe0etUu/ZvCbnZaZrEwEE=", - "encryptedKey128": "rGHz+t5DBY1dcqf6cd10+w==" - }, - { - "plainTextBase64": "gfsIdpe4MZc3VGGCO2UK6ntuz6A20fFAlg==", - "ivBase64": "2XLqRVtc0QTOgeQv8+D37w==", - "cipherTextBase64": "2XLqRVtc0QTOgeQv8+D371NR6Ea61oFEMP2GFaiUP4tZc4qPDFJRZjFo59+z84IY", - "hexKey": "69d1d0b0a614979dc6633cd7e47b6326", - "keyToEncrypt256": "3c32ee569fab9273d6670c14ed461a6da83a017af1fb2ac89532b8aee117cc58", - "keyToEncrypt128": "cf6beda2d0aa77cb4ea138c49842405a", - "encryptedKey256": "HhQs2gOzM1wzlBfRW5s+G0tnP/exfSS2jz2zkqwbLrI=", - "encryptedKey128": "LqvyQokVmIpgYpS0E5NQXw==" - }, - { - "plainTextBase64": "gZ3WkYGNj8OnXhTuTvoW8kAmS2lSvObz50M=", - "ivBase64": "nAljdw4M7MPLH7G3ZDwn3A==", - "cipherTextBase64": "nAljdw4M7MPLH7G3ZDwn3Evu01nZDgcvvV2l8s6xOBxrfofxJYVF7luJy8e2ZGR+", - "hexKey": "08f2d545b879865dff6980283d36b1dd", - "keyToEncrypt256": "b0585a7767f56cedaa9c0dd511c19bf3f303faa9c18b1daf74adcb6b6e37aa8b", - "keyToEncrypt128": "e9aea2187bd9726d37cdfa19b758e843", - "encryptedKey256": "2PrfhGI9BvdZBm6fdq2xoPGfdZxbG0BWVcFKO4q0fTc=", - "encryptedKey128": "VJMvwXk2dCUtTKKM2ogXFQ==" - }, - { - "plainTextBase64": "gi6800yhRbwpgQZEhApXBGhMPqOUt/qiO3NZ", - "ivBase64": "geN+oozggPPOorm8ZSjezA==", - "cipherTextBase64": "geN+oozggPPOorm8ZSjezG8OjtVN6NFq87y7q6DaswFjYLyZVOr5eBkPPaS8uaNT", - "hexKey": "c21cfe4fe3b5c85a85e568eb1353dc53", - "keyToEncrypt256": "e539675221f93e161bf354d7054a980dc78c6101ae87f6f74acf10cfc737f88d", - "keyToEncrypt128": "ed29a9a1b8fc3ec7194ab1ad2a8290a6", - "encryptedKey256": "L44U11LnyvoAq1dbfVR1IuXYqFOEorgsGm2OJosxbeE=", - "encryptedKey128": "vd8hhShCnui5A9BaBR19uA==" - }, - { - "plainTextBase64": "lzVwyMaAgK9IHTuX915iKTkmajxslF+6AwzxQQ==", - "ivBase64": "YuhxPvVFwJ8e6G7MaeaXQg==", - "cipherTextBase64": "YuhxPvVFwJ8e6G7MaeaXQjZEne7goOIMCW9qeIDMg9vcSatdqhlXgqM+jTR4u+eI", - "hexKey": "137041bbff5bdc1febf776e69b965b92", - "keyToEncrypt256": "b323ab4f5ad459f5cf24d057fa359ed26e5ffc6e9a213d8ae183ec2694b2ac65", - "keyToEncrypt128": "37cbc63a1691d5bedd699bfe7504d283", - "encryptedKey256": "zAqzYktDkNgm+Qq0EAjybqrOgvr6iT5gNQ4bD6EIN7k=", - "encryptedKey128": "bvWL18XC5bKINaC0m8NFeQ==" - }, - { - "plainTextBase64": "sa5jKeXOZMKgIlZRNe5KstzKJkQFC6cPU1ykFK0=", - "ivBase64": "jTBhfnNRkAUmdKYTnu7XxQ==", - "cipherTextBase64": "jTBhfnNRkAUmdKYTnu7XxS7wUSMU2PmmDjZu27ll6kLv9L0G9aaOxaXIVV2N/Uqg", - "hexKey": "b0064cd7c541babdbca28eba5fc2fca9", - "keyToEncrypt256": "2b9f9a005c7ff2901ae5a3fae83e8e061346592bd99bba96e42039173fe2d79a", - "keyToEncrypt128": "24a3a0318c357ce3240db5d549498d9f", - "encryptedKey256": "mOV9j4WJU+xWy2Mw+WlfuwIwiJJgGDDCurb2Cg4t00A=", - "encryptedKey128": "gu4lfr+nRB1no32cSzcMNw==" - }, - { - "plainTextBase64": "o/Xxdq9pIfP042gnBlwgBkCRi42vnluS8yhOU6Pc", - "ivBase64": "KZhW2O22razsCBm30NpA2w==", - "cipherTextBase64": "KZhW2O22razsCBm30NpA29a6XKENA1FzJj/K3CnJNhn5rNZjoRoRPWiOzswM+QdB", - "hexKey": "48ee3f9471f28f765d88fbe2426337b5", - "keyToEncrypt256": "b302312e529a93db9a1dc65dfa579062441d3e218d166e9f0083ace7ed30a21f", - "keyToEncrypt128": "4cf511ff1d38061f1d2026829fd817aa", - "encryptedKey256": "FQDmH02Db3VTcxInch8usLkmQ7aBwUblJT0RKaT8lkw=", - "encryptedKey128": "kiW4NXy6zLNbdDXlL6JGVw==" - }, - { - "plainTextBase64": "w5Rv/9cBAGDZuIOyf26EVZpov9TDf2Qg0uE7JLG0KQ==", - "ivBase64": "x7McrXNlopSueilEVFB6pA==", - "cipherTextBase64": "x7McrXNlopSueilEVFB6pErROiJ2175PY9BErqzHuwVVkBjL6zStYb/YWWgUgnJj", - "hexKey": "0cee63ad5bd01323b784829a51a26fdf", - "keyToEncrypt256": "07561d433182b70166d82a9a740d0c6e70a62998736316ac1918fb667b87351a", - "keyToEncrypt128": "dd6f19adcb0feb73b2dbdaa793e394c9", - "encryptedKey256": "NLboBkH2EO/nnATaM1eE/aWpJ34QddmTez2TLoDaeVw=", - "encryptedKey128": "jDyLvxir40SqEy99IA/xfg==" - }, - { - "plainTextBase64": "wp7eenCvLWmV+cCElaE2g/CTQmQyx3/EcFcWkQ7kf4Y=", - "ivBase64": "TofJBwI2jodc+oa+KmVbVQ==", - "cipherTextBase64": "TofJBwI2jodc+oa+KmVbVd3N9UQap0LuUs8hzPrJAAI35e3fnxDuFuLU2zSdPQzLk41Pigb2C1cfj0wnGlCVLw==", - "hexKey": "54b7f9829d2545c5c408488d54258873", - "keyToEncrypt256": "1ac79eb80ccce3f3e27e0c8d6c03b0b58d75342f16ae41ef16890c90525ffa14", - "keyToEncrypt128": "a9ba457622a8de17dd5232bb93a65742", - "encryptedKey256": "IHrgkoYSq0pt8wfSrfhhgP4dMkMHE1VONjYuupsfjT0=", - "encryptedKey128": "Ka2sv5Vo6d9fxLu5i+2dnA==" - }, - { - "plainTextBase64": "/mICBU1zx0LNRlsH3Asmm+Hd8dvEP/DZ5hjC6UmA0mdk", - "ivBase64": "1gdgq157jYZVR388AJVGPw==", - "cipherTextBase64": "1gdgq157jYZVR388AJVGP9FFCg271ey7hrdlRp58A8Z+m1MFRqte4iftPghe2fCLEP62Len1f4QvRCNd6XyIZg==", - "hexKey": "4a4a7c25608abed8143317b3a817dde5", - "keyToEncrypt256": "9306c95101efcdaf4e8e7c26a217ace4f0d42ae44ada449c75ed69a69469a484", - "keyToEncrypt128": "9555f7b36a876c2023e79b23c5648807", - "encryptedKey256": "X8zG6lc+9BmB5+X8bbovvyg7gnxDApyH6Qzju6xfeGs=", - "encryptedKey128": "a8oNfXuXnRWG6dewhSm3lQ==" - }, - { - "plainTextBase64": "bh8Q/eDsRIrwATE0vjRuMye+Jn2wUsnSMHCwDkFtCmDFmg==", - "ivBase64": "bw030ttACb02wHT9LLz+OQ==", - "cipherTextBase64": "bw030ttACb02wHT9LLz+OSyrH+55L45J6zKMi/jXF6pams01GsV2tWZkiJ9MghGvn4s7FEbXaarpQyC33wE6ug==", - "hexKey": "a0a2878046a5a6bb386ef8c463964e62", - "keyToEncrypt256": "6f135ef1eb7b0198b1fc50797a3de1618fb61bc346da511edbd25c520ba2069b", - "keyToEncrypt128": "a37bbfb9ee954c144c75b79328755dd4", - "encryptedKey256": "G9fymy5Jh5BIAKNXdrXFfB+gmmx+hgelD1Z3B6g2fBE=", - "encryptedKey128": "m6p+ed3FyRDLlIQZ9sc6Pw==" - }, - { - "plainTextBase64": "GkRAro2UJ/6VsdBiQ+UXoINHawIDIlZrQaGAi/izTvcoiXI=", - "ivBase64": "ec6PFCeFDDFUFkAQz/9LLQ==", - "cipherTextBase64": "ec6PFCeFDDFUFkAQz/9LLZHjFo0NgT36Wc2/Eqia8aLwvWDYfunQ6NA+BgCkDYiqKYuabkYotK7Dig/jA2lVaA==", - "hexKey": "225268dd3762ca643cf16d5c8c30cbed", - "keyToEncrypt256": "b3ceb12754e784a1231db554f98a1872521dd9aacc633885cf0e36e0c7cae2b8", - "keyToEncrypt128": "4a08c45036bf6a56f47a9a1e47ce3de5", - "encryptedKey256": "AawLikFn0IsFjbX9yh3BhGAnIm1anjP4OArlhpwOBIo=", - "encryptedKey128": "+XrxIlgnSj1/sJQ/ex/jmQ==" - }, - { - "plainTextBase64": "9fa86V/EIgqo57i1Lo9grTqqTdLKm73q7wdoVfIHTTGhl+QS", - "ivBase64": "qeqQ1Iuewf+GYwvyIQdmZA==", - "cipherTextBase64": "qeqQ1Iuewf+GYwvyIQdmZLpr7AOj55tvQav5Ub3gHdLOwY7xe0lW9csHvIoPDsKNu5bTJvva2Rz32NKbwXiy/Q==", - "hexKey": "f8f4c684c1482d86411fc590f037cf65", - "keyToEncrypt256": "858d53360b92d6115acb1f2f9c4690caab6e3c6ce7a817fac986301c0e3aacfb", - "keyToEncrypt128": "967b9e60fa05798c47e4faf11389030a", - "encryptedKey256": "ZKVX3JjsClP4V9evKekcAuj3n/0kCmDPsg1aDXpArt8=", - "encryptedKey128": "v0yGoBF78ED8EgWvKg6tMg==" - }, - { - "plainTextBase64": "GiWbvijESwHeqv0QWj9yqL1SQ3k5jgdI2NTrm+6YRax4CELcpA==", - "ivBase64": "d/Qoj8Dp6WbxRRMvmL6Nbw==", - "cipherTextBase64": "d/Qoj8Dp6WbxRRMvmL6Nb7O4xPhKyfD0fECUE4Sbu8OxfWsaULdL8txpIwc9pKtkp+hSbhs2bxhM0PiyuvXMNQ==", - "hexKey": "7a95eec19bf398aa1b35c328369b59d5", - "keyToEncrypt256": "f0a31dd3616ba7e6feae69693c2041102454124f00d3e9ef835ad37976cd6460", - "keyToEncrypt128": "645af3f2e6612dce30800d6558315c55", - "encryptedKey256": "u3jqSTYZHfkEaFocrpDRgX36soS1jy13UqF0+nA+lZ4=", - "encryptedKey128": "EPeWo31ER5HQn8k2K+icHw==" - }, - { - "plainTextBase64": "Qm/YfpsgLWOTxg0RxCWud+oRvSa7mP8UO/eAwPdiUCxfwRfveMA=", - "ivBase64": "ycTbrJ7egFQAB+56dHd1Yg==", - "cipherTextBase64": "ycTbrJ7egFQAB+56dHd1Ymx55dplTNLILrkawZYUo6IiFrPuvZZx6TnL47iqEqJrsyCigNa4NEBwhKzKkq6fzg==", - "hexKey": "00121adb1ae15576a9377c3493027abf", - "keyToEncrypt256": "4152f5e2515c43d83a46dc8145d7eb78b236818318083c9c906b40df53ba761a", - "keyToEncrypt128": "34779ffbef7de7117fd0f044cfbdfe57", - "encryptedKey256": "SawRx4UgDusQAJ3jbTK9j4prmAoJvY2b9UsOz8hGkZg=", - "encryptedKey128": "uvDq2q0YffpnodhP24GYCw==" - }, - { - "plainTextBase64": "h7vuNBIAkZkG+DWvrWEAod8qK7PmIVG3lxKOePUewx+zM39HmjlI", - "ivBase64": "tuLisRwEwlEknVjetsyMgQ==", - "cipherTextBase64": "tuLisRwEwlEknVjetsyMgYCqWhKdMh5KhLDwFoHyz4/UoyyHwaISw3stQGtVv0nDPSNAct8saPIsjl1uZ92yoQ==", - "hexKey": "d94d5057ebbaff527aa82dd0e2b55cd6", - "keyToEncrypt256": "afa8c63284881a5ca6cac48fb37a38ac396765baa2de197982ad601c13e47f2d", - "keyToEncrypt128": "16a40e7aa0bd0406e5867072733632c6", - "encryptedKey256": "xfqBZK2DcYdqJuvc34CZCU8znVPqFYktIelSvwyaHi4=", - "encryptedKey128": "rV2PT52lDe82SupscMhj7Q==" - }, - { - "plainTextBase64": "g7JfQbH3LELnPEkE3tbdGPyYHdOEpkDXbsBHBE2GK2QnlfLYvB2q/A==", - "ivBase64": "p5FYWxNkYlHzaS28rFiwrg==", - "cipherTextBase64": "p5FYWxNkYlHzaS28rFiwrtfjJeWmMfY/3Dlya/eqWLHX6y7bkUqQT3/qFoNw4GsocaNSdULfORXLe/6OUEgpFw==", - "hexKey": "20b365a500baa950197289692a50718b", - "keyToEncrypt256": "f9f832f67f3a777c6c6847102a47a5bf426bc5a6e267cc5cd2c4e0e5fdea1544", - "keyToEncrypt128": "744e78736b4b0235d742fca5d857af2d", - "encryptedKey256": "RKhpZF4vhdEqwqwj6Hmey6Ba3dFvXm1udJazOEdNPRU=", - "encryptedKey128": "ASssns6N8D7MbpWvfGCcUg==" - }, - { - "plainTextBase64": "oBzvJMw3sAi3vPke3z9JhKbcnLvBJo55FHQxOcRLEk5TVJ60Rm+B7Es=", - "ivBase64": "dWzzjzZlXp5pEcnnAvqcZg==", - "cipherTextBase64": "dWzzjzZlXp5pEcnnAvqcZjoTQIURXKTfpDUpiH6SmloQ0ESgOR/1nyjJgWjNu/HMbBaNKFuxqj7o4rkSgm2mVw==", - "hexKey": "57196353c6e2a8b06f58013df47fd880", - "keyToEncrypt256": "9044ed506bdfab1ccfa0483665e024ffcf396ad0426b828e7358c692311a1b7a", - "keyToEncrypt128": "4516ca3c0545a0a56d3faa8d93f23dc0", - "encryptedKey256": "+aQXu2xIC6tXXezdLhkjJGLev8RtLpppAmlp/OvcinY=", - "encryptedKey128": "jaybhnjhYnsH0OvCfSfjJA==" - }, - { - "plainTextBase64": "RevoJtCp+K1Ey4zv6y6rVnSjz8OQjP8ZjsLzVDVFL0joxQ9ux0jjrGVb", - "ivBase64": "P5VX+1WyVDAnUNUCaVi6YQ==", - "cipherTextBase64": "P5VX+1WyVDAnUNUCaVi6YdzX00KYcSF9t0EAQBD5DGHKLIGzSiMc6oydXSpL+tRkVYt/Meg22joffoM/WwwKMw==", - "hexKey": "efed4061356a3881832ea7ce92019b9b", - "keyToEncrypt256": "2b3fecbbf5d31ae07e1bb5524e4696c13c02355cfc03c87b727abe8026cd6a8b", - "keyToEncrypt128": "28af1bdd5898e82eaf7b0a45a6c3b585", - "encryptedKey256": "yw6i5m5RNGT6uyGdRGDxeCNJjHETts4OBLUE1bMSvfY=", - "encryptedKey128": "X+17viB//dJYhXEVttKM+Q==" - }, - { - "plainTextBase64": "dNpX9WXe0+0yrmFLwBeV0Mc/oC228KgS81iSu9u2SAkyZSk1RznaImGsXA==", - "ivBase64": "ExQFRIemgkG8lYLn9XnAgw==", - "cipherTextBase64": "ExQFRIemgkG8lYLn9XnAg9rdIl5qIc2H45WnTWQh1oguR782GFwLV6TbrchdMkul7ywp1duDy70pJm9FDMaCzQ==", - "hexKey": "b3014addf0e77f76851fea3f91cb1382", - "keyToEncrypt256": "6caced803e521788b9557583b904c61eaec45be95c5dfe2c0e5e767aaf992f33", - "keyToEncrypt128": "ea7ca3aa393d3982186c9fe35777d160", - "encryptedKey256": "6TZzoIN8S066bqjVSqjW9leGxhSNqFBFPs7813F2m7c=", - "encryptedKey128": "8iFlUpnRbVeln+zTkrkqFg==" - }, - { - "plainTextBase64": "57JB2qqG23gQ7RDmkNJufMP+njdGNrPVNGB2HFQ+ikP3LFU9QwMJxRQhCME=", - "ivBase64": "CuD1YVZiJLpUwP2gcWNocA==", - "cipherTextBase64": "CuD1YVZiJLpUwP2gcWNocKP5VxIuGQxoUvJvT20eA9rmXkNEotqEb0rOr23+Y1qSsMXIdDSXBc+yJfNW4DVWig==", - "hexKey": "059061f9882c918820fd575a4ab8984c", - "keyToEncrypt256": "949e7ec683c17098d162bc14fb5acfb402962b9101faf9d1c9848bf73de30b36", - "keyToEncrypt128": "cf042d1422c0c8b08b51014c0759c16d", - "encryptedKey256": "2WzF2R7JgrDW1GF10LMc1TF5s10qxhXRIs4GbBCECvw=", - "encryptedKey128": "B/cGQxOYEnmBvtfprqVhuA==" - }, - { - "plainTextBase64": "3GKw0APYHar7ydct9J9Y6mpMdUDsuhkVfdqBoZoRG61psnM4AIopa458r1U/", - "ivBase64": "ajcR9CoNG4hhhbrdIVsAyw==", - "cipherTextBase64": "ajcR9CoNG4hhhbrdIVsAyz0aHkKx4yiSN8UZ6ohTLf68kKMopNxadw7pX+rtOANGqQ57WBzXbxV9hWYEyG67bA==", - "hexKey": "3952017a797984c54916c42fd299636f", - "keyToEncrypt256": "a1bba73e0bcebac5a3402feeb9504178adefcf7b185629ebaaf4f1b535836fa8", - "keyToEncrypt128": "ae7b4611b60403f27924a0db1b36e77c", - "encryptedKey256": "h3M34UI8y2qPLDtapR2ErnkN4ec1uqIZAI4m986eL/0=", - "encryptedKey128": "mvBhbK7EpmjswZ0dlKOVmA==" - }, - { - "plainTextBase64": "icUOLqvtZSll3npP/NdFZsT9Rq9BcVxUJ5gBHtUU8/Atc8CjU/1qYjo3yyR7vw==", - "ivBase64": "K1gYwX0YPxNqDZDzPMvIgQ==", - "cipherTextBase64": "K1gYwX0YPxNqDZDzPMvIgRdadRKqDrOPKU1l42gUGS7KGAP8JB2Ec0gnk5UGAnQ8P8TfkwNnBugM+2A4VC2Zfg==", - "hexKey": "883b9a41e00d1fa243ba847d9fc4e8e1", - "keyToEncrypt256": "86eb1c44ad7508d0a544149d02e3c32b78d96afddd761282795ee08af3eefaf7", - "keyToEncrypt128": "adc3efd19b832e5e22e060f3cb944bdd", - "encryptedKey256": "BCZ0UKRsACMqjHlCSyxaGhAlpE9Fax491HrYEfbXseg=", - "encryptedKey128": "rN8Lu7nSJ762Gdy6EkIUlQ==" - }, - { - "plainTextBase64": "Xg2doG+dXiPGMGL9VQ02PJx9Vtfik5CxsDEF/niAmZeamq9Hp1DCVf0QaMaguxE=", - "ivBase64": "WCuJj80vdHwDFI5vN4xJCA==", - "cipherTextBase64": "WCuJj80vdHwDFI5vN4xJCFka2TTdB+ANESs2n/d8uakTpYdXkt83KpygZxrm+rPES0U0uyXLQ2iLvUspLmEK6A==", - "hexKey": "cea3d0ac8aaad027028e07008f530d17", - "keyToEncrypt256": "957486ef8ccf360c6b2dede2fce29d2628a468ebe5deb0dea32155bc388713bd", - "keyToEncrypt128": "511769e2620a7c3f11fc867ec99fdb5c", - "encryptedKey256": "J86xgONFaTNY6MyzrWlSSdiALbx1Tx3/Z/WTd29l4lE=", - "encryptedKey128": "Rye6mFi4hfAbnfCvHWSpKA==" - }, - { - "plainTextBase64": "XYvCAlJ2ZsDKgPJhjQnjES15fk/Nof9w/em5DJqLjE6ZigwWn1UwTrqJ4fJAZ+ej", - "ivBase64": "XOZqN1vAZkY+IR30agAkCQ==", - "cipherTextBase64": "XOZqN1vAZkY+IR30agAkCaHhEyFh5fxdIS2bulgYhxKkpFzjBkYnQhWknnRfQSlRTgbY3ZXP6VFjnxKlfb3lCq5PjyMBoXDM8TfxLoUw//Y=", - "hexKey": "8e409617ff5032b4a5e2ecf2269a9974", - "keyToEncrypt256": "9be8907f990a2ee3542219266525a5b7b8a5f315da4009da7d2361cfa185ec97", - "keyToEncrypt128": "51ce220e281385551a2838511d6529f6", - "encryptedKey256": "E+xhnOgzvN+HS2R8giU7RYDS/Kya1mbWF0Afmgj3pNs=", - "encryptedKey128": "07iu2a/4TkSCxqW+PWetyg==" - }, - { - "plainTextBase64": "wF6z7jocMcpTdW8p+qAr+yQmZFKEKwnv0qVt8DBjpuRN3DAnjf0u9SNpdkMY7Qk0pA==", - "ivBase64": "4mRroFBim2J+6jaGuTZaEg==", - "cipherTextBase64": "4mRroFBim2J+6jaGuTZaEgG/r5D4zbUHKWNaYH7UFQQZxPivkekdH1R+wU4TEbjK8NWKc7shuFWqmkItOTbCCxqIcQtxSuixuf9an9E48oM=", - "hexKey": "ea860a49f5c63cda49c8fd341ad63427", - "keyToEncrypt256": "457975f1d59bf1fe73a202f891eda4f4d9265535e3b957dd25c2d11f2e1a5c2b", - "keyToEncrypt128": "118c7afc7946904f101d3b360063a959", - "encryptedKey256": "u8bkyScK+JYXaIHu560Q6cNDFp2Jrru5ESj/WBwkXHc=", - "encryptedKey128": "XuRAtRU/bOcrOm09VIW/fQ==" - }, - { - "plainTextBase64": "IROBva6WHcHV2ec2gVtGEUuJF8uns3Boj8dxAOokVd4cdvcsEuXUQ4UTwCT9RGhSl+E=", - "ivBase64": "GT7RFUywQtb+9dFjMLEMOQ==", - "cipherTextBase64": "GT7RFUywQtb+9dFjMLEMOagFZi3m7GdUNdWWUG5xJYW08lDxnsYxdAKJ41w3GkdIj2GCxsj17uwByfjAjzeoCHpGrG/ZXlkN5BpUR5P5Lfs=", - "hexKey": "2edb895d883b2c495df9984a227921d7", - "keyToEncrypt256": "f36ef1035ca2f0726a399a41288170937e94d031f5784e016116443f7f8df953", - "keyToEncrypt128": "0c851bd31bc8f39048b447c73d4ee573", - "encryptedKey256": "sgZL9KhDDIAM0Zo6tzSQ6CyKYU2+xhndLdhql4obimM=", - "encryptedKey128": "BfSfuMG0X7o/Wp/wZXABRw==" - }, - { - "plainTextBase64": "8FCR4PUfEwl77KsCYZmO/zlJx3qQHAnN/0UWxJ5iTBDMVyFwj18h0kXnO/y0xvCI/ctv", - "ivBase64": "r94v/MUQIPx30NW1HQcpEw==", - "cipherTextBase64": "r94v/MUQIPx30NW1HQcpE+LOe+GJFp29Od7ITwLnqp8h1iQB6CC71c8dyYWXnQWpOsdq3ZUhr0Ws2O6+s9zAWgc3sobmqIZXBkmdy/OoUxE=", - "hexKey": "35092ed9e0e24d8fe1ec8021edff22ef", - "keyToEncrypt256": "65ae75eaa0a3d692f251e0cbc54b063e56bac93b220fd8a03e3ede1c3789e857", - "keyToEncrypt128": "7c125eca7c9d3521fdce7698925eab6b", - "encryptedKey256": "2Ipvc3B09boLBax/WfpXvUi1bSnc3gVbbky/5Kib+Bc=", - "encryptedKey128": "M8cqwBf2tAiII6IP7jpBRA==" - }, - { - "plainTextBase64": "oIVLXdxMHpTHw+jsD8bSwij8rskabq5RuufjMNNUnBUBIYIqzDhokmI9Zn2jR20+h0aZGA==", - "ivBase64": "ndCuu9F4Yo3+mDMmkCeHmg==", - "cipherTextBase64": "ndCuu9F4Yo3+mDMmkCeHmrLkEcovAuAcovge85JE7MMTTZKP/NFxB2/1zIOPTUkB5inYidoopveAmfxi78bzQGVSxKBbBXBCGxmPRIboVT0=", - "hexKey": "64e005228770982b6a0132ffbf9382ac", - "keyToEncrypt256": "e96a36c3271c893aaa0de52ec7abe5a8ead781ef38f81020587e00c7b4c08dfe", - "keyToEncrypt128": "4d362803894804a351d202942c197e72", - "encryptedKey256": "a+cnUHl0lxQarHKWQgAsPiddbcSUMUWUHU+DpDkaYpM=", - "encryptedKey128": "XP6F+42VSilZvEaVbXZjeg==" - }, - { - "plainTextBase64": "+jbJLvcEpF9gKAOoccHd/8A7UYO3VPxWQ6HmVr2gh4OloerMg/DbomznFLEIttfZif/6ghc=", - "ivBase64": "8G58PZhHGRd/VIDT24ZYZA==", - "cipherTextBase64": "8G58PZhHGRd/VIDT24ZYZKyXTKL1nPwhnQh4vsDWAteIuWyrSmeMX9zK40iMyCZKGRMtjj5W4rQp4xQ+BUHDjGHqhF1To0JvwCs9NQV8FpE=", - "hexKey": "2e11271f1ce710e587fe0ab3839ab8ea", - "keyToEncrypt256": "fae42f1d8f9d2eef1b5c99f23443d0fa73e89154cc24a49fe3d250671d63f54e", - "keyToEncrypt128": "2784281f8a437dceb7b02cfeea544fe7", - "encryptedKey256": "0wtQM2CUuCXtBlOuuHNwDzLIIqYFxicItY7WjFuWEy4=", - "encryptedKey128": "dSim7dsceTGIRCFcDfBPWQ==" - }, - { - "plainTextBase64": "s3M3SOCUmtyE036g3pBEhxOaYkN+YUtteYDdAOI1z2I9gZBT3Tx+RwwhXkDr33QGS5q+yYrh", - "ivBase64": "ILXQma+lOuz7qs/Mcr9hqQ==", - "cipherTextBase64": "ILXQma+lOuz7qs/Mcr9hqZymZSkuPLTVYgLI3URKaENto7EnUF0kn7lJ+pCrnQDAi8gtNt89/h6vmCm45AMzBVHcKfI2HqPyH4hWL+Xfc6s=", - "hexKey": "8e7f82982fa66f63b7b27040eaeb26eb", - "keyToEncrypt256": "d26a294af43f8d763419dcecbe6e6a4c2e75a6727e343d94d62dbf270bbb9966", - "keyToEncrypt128": "97ab58792480a9de991200895ecd2654", - "encryptedKey256": "xN6GlfN6nMOC2FDzOB/+IgD0u/irdJovaPdsvzz3cBw=", - "encryptedKey128": "K/F2o2OMt4zckvg6rO1y7w==" - }, - { - "plainTextBase64": "XWws9Fyjt4GhrBVOGPuVF7pokPKAYXXC7J0U5jk/zSYSylUQEG3RTSse6j6bs70p2aCDf59iAQ==", - "ivBase64": "XH7SyxOG2epj3S/jM8lgHg==", - "cipherTextBase64": "XH7SyxOG2epj3S/jM8lgHgJ0NgLwLdHdPzNDplTViG+ZOm5L96El/7f0PyAZ9im2BKNw3djeQhiPPfSwx3qmZQcT0TcyoTHzYIhVWMeuPPA=", - "hexKey": "f1dc2b16dd25a369a402d4cb1ffd8a3c", - "keyToEncrypt256": "0adce219cd5830a6ad05e59e8f1a84b8f7e4538c7bce9545a73d837f4725dd22", - "keyToEncrypt128": "44633c9d0cfdc6d6a21f8d08d34a3deb", - "encryptedKey256": "QtA2T4nejcH9YPtb2vl7JcJ7fvM9CuN9zlpRuZVLtCI=", - "encryptedKey128": "zXRwuHw+Rm19QAseb9WD4Q==" - }, - { - "plainTextBase64": "ShKK9rmsVeLHj1LbbKLvQXHgGofxC/aUyBp7jsh7YE5HjOktrXNvMg7vLECKYq9c8QKbmpHNs/o=", - "ivBase64": "TfJijkaQ7WDaT7w5vGw7pQ==", - "cipherTextBase64": "TfJijkaQ7WDaT7w5vGw7pSKpn2z0MuFzwVCXNwQPs8Gummq0fnJ/PYjYZ4oFaKeQSO8x+dmq97i0pwmrTJPQLIKAq8srkCzm1w/f6u5YAEg=", - "hexKey": "5a461995c9795512ae1a8e4a7291eafc", - "keyToEncrypt256": "049f36ad4e840232cf6bae492fb017228cb47fc8b4ddc7b9f007a813b3fb8d24", - "keyToEncrypt128": "c2d043f77881ea496829534e54f4e92d", - "encryptedKey256": "K4/2W31rQdMyGp/3b/Zs24f991EoShK8c5jlMMzjLak=", - "encryptedKey128": "FXYEoLNEEiDwonVuqYWI8w==" - }, - { - "plainTextBase64": "b4Eh7fO6rfsv6DyeG+QvKOt4bCFWULyB92fWxFJO9sLKNAkL3AKPZzKFKPvE9kSlGhXo7tNTjh0U", - "ivBase64": "mVusCV9Ky8z+ibedCQsUBA==", - "cipherTextBase64": "mVusCV9Ky8z+ibedCQsUBJ2yGJ/BJjnpxCugp3XLCMHS1+m5BJpNh4jhVWCu0Kt4hZ3vp7Pj4Qy7hbL5Vzh1xYDzgjWPRfJisKbmVthkeao=", - "hexKey": "378be216d5a85c0b57d19c27b8a5b5c0", - "keyToEncrypt256": "a6a846b11801612bc4d42f03a13730e25dea6e7e8636926a02c3e44a23dbf39c", - "keyToEncrypt128": "16a54f3a62f52baccd630f264113fb7d", - "encryptedKey256": "z6BTt090p06nn8GEN0vuVu3UDmlmkitQrZWchcHiTZI=", - "encryptedKey128": "khW3RCmsFDuii3f16Bl+tA==" - }, - { - "plainTextBase64": "gSHkOtDRRwYQ6l/tYDbboLt6MrY5cLOZDEbpFsQc7L+mEaQrfIdAXITuhDTk9+uFQWgadgPSfVP6UQ==", - "ivBase64": "nzdFc3wBnEpidanefzSd/g==", - "cipherTextBase64": "nzdFc3wBnEpidanefzSd/qy6pFisL3gAc/bqZFxpnMYVkFDAuYwXoUMpNb86G7CISMWew2slSXDlCMxs+GJ2LBgLvlXFWVPrjL9cT9LuTGE=", - "hexKey": "a5b4afade60d5135e826fe7dc7f65df3", - "keyToEncrypt256": "8e461538aeae7b5342925f1fdce1798582fa6c82381acca62d455887f43cd332", - "keyToEncrypt128": "287bea9293c2cc44afb1a8036c2f261f", - "encryptedKey256": "RRYFl0NyPZqTvjliRVJHyStcpXDum3Nx8O+NSdEdQK0=", - "encryptedKey128": "gc69p2YAy8fUl1gz897oEQ==" - }, - { - "plainTextBase64": "Y30jOoEQmt9DIbH41+KoJZ27gskZh9oWYF7hc34NCIs0IiEwCsBXCKXDlUj5mpY36hs0/L0BN1OwTUY=", - "ivBase64": "qb/Trigl+1JtX2LMTM88oA==", - "cipherTextBase64": "qb/Trigl+1JtX2LMTM88oN3wOgx2L5JECGWU8HrddNQqSKE9I4y+7IcGmRSMfcPS7jsbNXpD0q/h4vt5YR4elG1U8BbIDgxhvC8sYB81ERA=", - "hexKey": "4d874ab7a16611dcda417d0422b2c9cf", - "keyToEncrypt256": "a5610e6e32380dcb4d5f267febfe168ab1a6eddfd9b2a128d60421d7e5835187", - "keyToEncrypt128": "2e6aed41f1e702c453269dfc3e2e7956", - "encryptedKey256": "ifJVjceZe/cVeLWSk5PW2nFq1Kqnq33chrtAD+EoiqM=", - "encryptedKey128": "ouQ3RZnJxzLC2VmgFhtSew==" - }, - { - "plainTextBase64": "EPuYZv18ldiVUGcSMJsf5M7svv9UqlZZNidpJaAlhnwgsTr/TJ7OVGsC/ohGdLcENyROCGsw6lSrA+by", - "ivBase64": "v790SJegL1JAUwPc3uO+3g==", - "cipherTextBase64": "v790SJegL1JAUwPc3uO+3ml3RQ7OsL+BUNAq2reCVeixdrG6xhHnds/wZo4SAe2CJl+auCcdx/BzkPbG3fOZLS3Rn8DN/SS1Vt8zRQ/zBv8=", - "hexKey": "abfefea9e03624cc03e3ca0f8a38bdcf", - "keyToEncrypt256": "397d1327ebf18aa516546f3b2b457f14c2bc934af0d52fac12c3517c5abe9204", - "keyToEncrypt128": "3b729173f2aafc085bac5e96277e069d", - "encryptedKey256": "eNUThmlwBbWSqLUOzKGKYyGM7n8hedZrInbrri6jzGs=", - "encryptedKey128": "u8hNAcNlykomKoH4w4CZ/A==" - }, - { - "plainTextBase64": "c/La1iXPYXYLemdKdzOUg+TExU/5V+Ffl0kpcZj8NBeyUgwcMSeQXEvrEB/dIVek8XTBqvbQsJfVz8/9/Q==", - "ivBase64": "tKj0QHwQqfkvMCfmsWABJA==", - "cipherTextBase64": "tKj0QHwQqfkvMCfmsWABJA834esnrY/4PfbbuhHB9TcwzWEhTV0T4BxTLabfamDWgPyN+BUSAxjDibusQOxvej8Oylx5FGduiVIleS9hY3Y=", - "hexKey": "466bb75bea63d8429c1eec64a361b59f", - "keyToEncrypt256": "6185d208f3600cbf4623ab0e477ab1a86d5f4e0ac6ac724c600912a5090ab9cd", - "keyToEncrypt128": "cdd706c13904fa9dc780e229b6040717", - "encryptedKey256": "SSLixlOyOYMN6Lw5q7NSQWEN6Rm6FilBXp0d1224DT8=", - "encryptedKey128": "ZLhC+ZvOJ/sfQz+0LfxTQA==" - }, - { - "plainTextBase64": "pb8efq58QbGjjKhwhEYm+TrLaYUNJk9qBee48ovYr5mZA80wEgROevrKb0KKSh95YEp4DUV94xRqMiPFT5c=", - "ivBase64": "5T4PuJgvlK4k1bOHv2pO4Q==", - "cipherTextBase64": "5T4PuJgvlK4k1bOHv2pO4YUaITgHpQkM/dPIHthXpLDM3zuNHdzf867tiwY9d1hX9m1WAz8Mbd5U5IhwhEdfvN5wjz9J+1imzOek5KhdqTs=", - "hexKey": "b5a1e268517a944189ce93cc8601b53c", - "keyToEncrypt256": "ad8fb4a9884facbfe7d65e992b31bf75780861870372a55518ccb602222714e1", - "keyToEncrypt128": "1cdfbc187282c76eda4bfbd8371d493d", - "encryptedKey256": "3dgzzd03mALq1wYdlfVfXRbsNrebDgAgtfbJkr3zZ9o=", - "encryptedKey128": "Ih3awcSKorCrlpbcEw4eBg==" - }, - { - "plainTextBase64": "QyLgKoue0imWEaIg3j0zVfm6a8UmpsqdwaCGi6CXUgtbwJXoC5l4eSI1B7BxKSAS017wvT/ITzeQVEZIvN/P", - "ivBase64": "GYhVlR8mr5bbUEG8U8broA==", - "cipherTextBase64": "GYhVlR8mr5bbUEG8U8broHF5Ir5INF2PodB3ivsOvNYO4qaGMQ5DOjujbpjGeEJtp8bga6m/hUw4opeyXPd9QveoCOTQKGs0VqqV9LaQY7M=", - "hexKey": "937f9c6c566ccdf54532077e715dfc0b", - "keyToEncrypt256": "1e0808185d0787b85b8b85a90e1fce29986afa66a5dd7e3fc90176a4f3e30194", - "keyToEncrypt128": "a14a85dfae3540352a31e7f7c23a0c06", - "encryptedKey256": "ccSwBoLJEbgDzUjkFcW+I2LFXqdHOXJECRnEvos2f78=", - "encryptedKey128": "USw4A2zFAJLxzO/7R9AQUg==" - }, - { - "plainTextBase64": "daDIxp42tfM3Zqr9GWzlGk85K0OIDiLYlgz2lGteLt0wIrWfs0xH/zwvRHjikYAP+achvcemwEetHvknL6Nijg==", - "ivBase64": "Z87A6xxA+eqZv3RWFtS29Q==", - "cipherTextBase64": "Z87A6xxA+eqZv3RWFtS29bKB0ophvFL0tSti/9JdY6N9jbcwaLxcPl4E+zTetEFszVTb8LCV0R94tXxhjgZYQQDPaT+bqo4/yzKc5B9syeoUAJ1Ohb3gVnR2vUWOCu2h", - "hexKey": "3b9dcc9d224c430c631404fa76794cb7", - "keyToEncrypt256": "db35f9fbbc48a1a74a40090647b37427c84956f1586371e80a2b2b097c886d13", - "keyToEncrypt128": "15e9f5169cd814abe0ec830bb2513882", - "encryptedKey256": "G+axlOqbCrvK71d8PALxCKVlLbpSFoqnS2yuzdXLm3M=", - "encryptedKey128": "eEga4AEgDEVHJ5rKJzEG3w==" - }, - { - "plainTextBase64": "x/pjyDVUqdch1C95LBuGTE9I1kAta2smVifmnNTzG0xKJ4kNucC8GqWkfUye9Jf9V/kR+3fXTLjckAfGtFlscuQ=", - "ivBase64": "CdFa6rtEBkgs2Q8feTvUtQ==", - "cipherTextBase64": "CdFa6rtEBkgs2Q8feTvUtbAHZShzpI83PUlp/sTmdRbnbYVeqW2gm2iVpSIZTC44CrSXVMNh7B46WkUSYLOqCe6P7GDGJTEdnLNLuXe/sb+lfezNXT1lpwo2LMNRr8OR", - "hexKey": "7f897e27bb30f23964dfbd06799fba6b", - "keyToEncrypt256": "8fb4cb1fff2279751fc48b24a68a14478701803f62f5ed58ca4800f288ba889a", - "keyToEncrypt128": "3efaa51eeaa35570edf09faf29257c13", - "encryptedKey256": "79vQq+okBM0RVQRYe3iWU6UJiv/E9OFE4Y02cMLZUH4=", - "encryptedKey128": "VMYVfv3E9L3UaMri86e2rQ==" - }, - { - "plainTextBase64": "sHRAdVeq/FKY6/KTMjTml4SibKyIzz7Bn1NGiB/KK7QFAF+fXOi0YkXx34vH1WALJIGqm4DEi8SDk1v/okSO4JzT", - "ivBase64": "PLYypxj8evPFJ2hWAlPy1A==", - "cipherTextBase64": "PLYypxj8evPFJ2hWAlPy1EBV01/peVbrFLaLcYh1mRfrc+115jcxyqASCZVTw8H3icgKCOCDn0KQaCCgBDKEAsvTDaV67t/2qamtaCNcsuI/PesV2090JXKFYUcbfQnm", - "hexKey": "f917b98188ac37d52ebe37771cb2b78d", - "keyToEncrypt256": "cc128e7c192fca02a84c30f0cf6a120eab35d9c3aa148622344ab214a04dc0a2", - "keyToEncrypt128": "b79cb1d5fb5e062c69f56496ffd2cf79", - "encryptedKey256": "HksebthmMDpoIm1VTb8jE7iXrc8y4v+HP6Vw3VHtxaA=", - "encryptedKey128": "5iFeCKZoOcDSo3E1ywOG8Q==" - }, - { - "plainTextBase64": "9xL3eiHqCAjl1II7lllGIeGdt8HLJ6bT+4Vt8vrs1tjJId1zvzt7NXB9PwIBS4URIIzbx5E0OwUkWJCmsFMd966+OQ==", - "ivBase64": "CVzTbX2vNDkAMU+sKPDaJg==", - "cipherTextBase64": "CVzTbX2vNDkAMU+sKPDaJlkbgn/TRg0NsSpPkNUM9/y0OslEE7fhDAKqG1d07Dda9WYgeBtx+hfQRqxcTbiUKUaBqVD4dAO+7iZp9rUV/vtzf3DXn3OhNQXUCLypUXKN", - "hexKey": "1eeb9cc1c2540759b4ed73ad98ce1699", - "keyToEncrypt256": "c399a740d9cf332144f6c586318f3f40c1d29b59c0c945cbc39760048c677b0f", - "keyToEncrypt128": "fa246b675f9037e65b6f30b607be09bc", - "encryptedKey256": "4QYrhWNVsyjPjLMidDE+blOlHhs/gR/DbFC4Bq1kftk=", - "encryptedKey128": "0MbCxuDZJqqMGt2C1Zi9kA==" - }, - { - "plainTextBase64": "uMyLIdb2hWdvI4Dw0lQIWyAjBhLycNA44bRZQRG81dMCudpaqKxDpIqFZ4b0kfG0hQeOpWHu8YkE4yUfO6fseSHUG48=", - "ivBase64": "UlpQow8PKgMkicRbIm3XwA==", - "cipherTextBase64": "UlpQow8PKgMkicRbIm3XwCQS7VzyphjYjczqXogGhvPcYExpAxYky3zORvorrvBtmajkTpJv8b7bj2CCcwzo2BaUmaF2xvEdGJO+zXUABynsaW7xUcomHySOO7QgwZhI", - "hexKey": "6da1b675ed3b3b3eb26184a21574b4fb", - "keyToEncrypt256": "507dde7351eaa34bea91a545a636066ccffa59d8be16c1060d44afacfa97b787", - "keyToEncrypt128": "ec9c1ed1c2b1d25482c386e7d2ae382e", - "encryptedKey256": "fGUxD7GTTa9i/UImKEILdQo/lRrq0ijM+y6edPi02U8=", - "encryptedKey128": "jyEtHg6yMHjUW9GZs6IdjQ==" - }, - { - "plainTextBase64": "FXwb2Gv0dPZvmCfvfs7Wa4EuOrTDVRR8NWn9p4A0lae7NWhazfqVojuXiXUHIJBlkp2uUdT3UicpKJlx4uePszsGrGjh", - "ivBase64": "yxgdWpb3/hf0XI4yNGWUxg==", - "cipherTextBase64": "yxgdWpb3/hf0XI4yNGWUxscNd1kMMjytZb247+1t9BMRhefnFhCPny6UHBHViqOgBMGYFM+dKN5zkgIAxYM6xxKjCIuRRtrXgKSXjKQw7rrRRb8hrmNIPTLFm6NcGygk", - "hexKey": "f16857f88e8adef223f0437c995609de", - "keyToEncrypt256": "b27102ad45ef6d5194cfe482339c926bce7442f87c96fbb3cd817ab8f3e8b0ed", - "keyToEncrypt128": "db68a0939def04fe00beaeba86e5b031", - "encryptedKey256": "1AX7kxTXd5NDYa2PwnjcpxwbKP/e8cVysHXYqEaF0zE=", - "encryptedKey128": "AOAUvX/wHGdyxN+UreLIGQ==" - }, - { - "plainTextBase64": "nOneMC8yDW0M0PLVFin252ewWKBRRKZoXDPiPSn/5l9XtXEZufYrdo8e27C06xDTELZSwQkVQNUTtK2/4rtS21yeUxXJJA==", - "ivBase64": "7LsC257a7f+whRM+mhsxbg==", - "cipherTextBase64": "7LsC257a7f+whRM+mhsxbv1B/W5QXf550RFwFTx4XJaYzCOMR8pwXNzWozows3IzR31Ji+iO/5eH6vsQvbUHNY8OJSmx8ihnVPKbrGEBTEKufNfjrcCGRFpHAtDV8ybS", - "hexKey": "96e9465146d11c068e3993aca1a77858", - "keyToEncrypt256": "0db4c786035dfeb84db68848965baaa771a692876a0bc0fa8fb48bc6a896642f", - "keyToEncrypt128": "855e17a3071cf6fbfa6eb30b0cf89337", - "encryptedKey256": "Btqt/evPuWaZtggcnZxhnTlWY242yU8UDDrregmz1Qs=", - "encryptedKey128": "0eu50lS6oI3a3Y21g7LJEQ==" - }, - { - "plainTextBase64": "dsFktagZ7GP7DIYARcfGkAUMhLZNnapr+1ULGq4t84CPZQ0LLEXcRFtSJNBowTvKc9NQ9WRdqvx/C7AsIzDQhR3aIpdWjuE=", - "ivBase64": "uSd6fUhyifMPl9noPX/5Kg==", - "cipherTextBase64": "uSd6fUhyifMPl9noPX/5KojbIasRJRWQN1VaXRTGD2FbTShzNmaz+aCvPF8tMSiXIg79zjJ5SVHQBb1kCde7SgE0fRGqM/Pmp2Zl3y62ilnQGH++W6XrbraBCAcDGp8v", - "hexKey": "398cd5a33958cd8a405d12dd08f8c98f", - "keyToEncrypt256": "dc7cd7db45e2e9439f5f5c61662f8167b2a19187773fc263eac0a4052e6f772e", - "keyToEncrypt128": "05ba4e2a4beab5d55549ee66bf1d0992", - "encryptedKey256": "nwjclYBTBK1ekYGIvdFT9KXKf63AbFPDpq3Jtyxb0pk=", - "encryptedKey128": "YF/Aq2LOQgD27GW6eHg1lQ==" - }, - { - "plainTextBase64": "z7Km6ORfg3fC6tmrJvU3aCZ8jIBWQcxB4A8V3tpGnWxiPHuNjtnsTAMO9QYjjWHEH48L1M5O6vIwLO/noJfWFUUDJukLclb0", - "ivBase64": "7fz6o5IFRMcCZsXffpNacw==", - "cipherTextBase64": "7fz6o5IFRMcCZsXffpNac72qDnyKXNYSHxG5Mwrxb3kqStQ28kRqASRVV+JSnzCcOHGSNroKauqBQOY4YZHL61/oHqUZo69Ir31EbK9hrJyF9Jf7PAo9qo1qY9Ugt6vG", - "hexKey": "ee80261d71b395ac324f3e5a419d7252", - "keyToEncrypt256": "59f610ae7a3dd2082f65dc7f909f56f2122ba117890b761796029b3cd8c1a12a", - "keyToEncrypt128": "38393e8c20da6fcf9b31f5233509fa8d", - "encryptedKey256": "KoWhl4+kJEH+XT2gPiMa91CSYDudtvtVGNqRUSoLvz8=", - "encryptedKey128": "wFGAxkyW7FmdYnOgUk0TEw==" - }, - { - "plainTextBase64": "gneoAVG4mSaIiO+n+kJFIQbTwmCN8ATyvDqXiBXPVfO4kt+SQbLu9JnjqU8jCkqjHgxRL93bPidR1UOMvwOzPAbO+3WbUcxGkg==", - "ivBase64": "VPe6lFaqUJyBzVlUhsSGOw==", - "cipherTextBase64": "VPe6lFaqUJyBzVlUhsSGO7Fl7qbZgvpZLMlis6t1ZIxW/MT2W5QbRxDytXn1d8JaOVYcWTilAkuODCovrekwK0m8PrpF9xd1J7RR4ebO/M2TbUyGvOEAWo2AWJ2yGIKZ", - "hexKey": "1615ba63cb799525690ab7c9dfb2f416", - "keyToEncrypt256": "bc71d1f6d1adce17dbc9ba713cbc29513e83023150bb0461c0642b2e80a4f419", - "keyToEncrypt128": "e7f5c4669ce95605d054f3a3f8508362", - "encryptedKey256": "CsmQNt/fIf8cTXgBnXfCfXv1rByuyfSTIxJm3pDHkYM=", - "encryptedKey128": "V1pRqlKEeR8h2H/+sIKerQ==" - }, - { - "plainTextBase64": "gcJ9aAcsI+TI5o1tyxe9ZGFcxIYupJZQBQnVRD1G2migMHj7zkKrK2+31AJ1ArX7GkEMq1tIQNweTjvBW51LtBTnlpIpoGgzp4Y=", - "ivBase64": "2DGxwGr01/VdvDvKxBdjxw==", - "cipherTextBase64": "2DGxwGr01/VdvDvKxBdjx+vB/4zMEvFgDyYCSES7L4OsxE4f6v3BWgWIc7+q0qlZ2pHCN/k5busMxNxVjhbaW9BNFly4jMPEWgpZsCWE/Rgs1382I1Is46GdMUUPRiau", - "hexKey": "ee91781ce0129232393c3bb34375013e", - "keyToEncrypt256": "21c8776f052c8a854913f5b358e36bf963efa2ca64789186029d99ca4569a901", - "keyToEncrypt128": "fc5335fe536f42ec12582c795acf422a", - "encryptedKey256": "p06YI1fTJ5HWb8vgISgwfBNZxiBXVzH+p8t46kZo4nw=", - "encryptedKey128": "8LQqkcP9MIa8R7722GG5FA==" - }, - { - "plainTextBase64": "hs1cBV7MSTDmyKJf1G/9A7fjfxCB37yt/R5X8qzgWIWfNKGZ6JHVOlqmiEZsrqRaT6Vc4mmVQCqfxoyVMz77dhrVFds5kSByEVGi", - "ivBase64": "7xq/nmLa2r552xwF98CY2A==", - "cipherTextBase64": "7xq/nmLa2r552xwF98CY2D0Pb9ZibsZ5hY0K5Ca5nu30PU8XMRcGKcStqCR4CqApt3TiWpBlasaoKd5mKSMT5e3/qE5wgZHZZhhZ/Wq93IXXD0Qck2u6QfRFA+EfTAgA", - "hexKey": "7b04b3d2de1a5a88e4557f25e9dd3e73", - "keyToEncrypt256": "894d36a42b7a3a81764972f80464fe7f2d001a2e24d5d27df9f2390d1e43ed7b", - "keyToEncrypt128": "15eb4fb66b73a513e36b897fccda090d", - "encryptedKey256": "qCp+9S54qbd2pqBrVPikcR71KuojYwKBP/Lc4ZDHD/I=", - "encryptedKey128": "+D+ryaoeWhQstdm/VTZ4tA==" - }, - { - "plainTextBase64": "Mgm6pMGtW7Wm5WwDOnIWsfOoOh8Sx9CK+P9wH2SvdW6nMg66YAYSzccF2mCD73lnG2mmLqNOSl7NBj+xw3LsfDbcoMPhSTgWVnheHw==", - "ivBase64": "q40Kqxio8laR339HkXEP+A==", - "cipherTextBase64": "q40Kqxio8laR339HkXEP+AhxIGURkGJVld+8MF5xIUZ8oxr3ZHHmwhglhJG9ivot+hDDUhZ49bG6tILG9XSlvI/XCwj3JOW2UcEn8nNAVxWkfUmZ0jkeWKeXcQaON+cL", - "hexKey": "33f771df50c300bf22ba092a402a1ad3", - "keyToEncrypt256": "195e6c468ded948372150c69f75cc40d9e9f5e5d747de1e5f5d38aec9772e791", - "keyToEncrypt128": "5a17ca2a1d8effcc354a4d115957ae9f", - "encryptedKey256": "RP6XLiopjqWp92jrDvUZX7Oy5jqBTNGGw/RVc55mEck=", - "encryptedKey128": "ZSVpojXraKjnojtfmP6SeA==" - }, - { - "plainTextBase64": "Q8/wQZ6Lc33xgTZS38/INl4Mmsd2jTzabo6FIRBD8TFlBwhNph8vjFvlV5d6XR1rTsKAWzzBI8j1uxzSrbGzo9ABDctUtcaUPYGMHyA=", - "ivBase64": "tHmyjUC71bGEdYma5qA2sA==", - "cipherTextBase64": "tHmyjUC71bGEdYma5qA2sLYI/jSprHOVqxNX2rQeaukmKWrm6zXtMBJilg3qw/CHBstlxb9DrHbhICtUTntwxPWdQBX5EPiw19Hz/KW2bw/Due4UjjBdxfQj9lgTgTqV", - "hexKey": "ca5c9eaa9c621385f0d42e9d6c157384", - "keyToEncrypt256": "6ca251fd015c6df1e859263daaa94775a852321f59a3f99ccb4934281b0db85c", - "keyToEncrypt128": "cd3304f1cfccd7ae3e123a8f23360118", - "encryptedKey256": "/njxc/YLorEtZc8a6yGx+FvtgYmBcKk0nY6unfzFCVo=", - "encryptedKey128": "+iOJouIuUI2LXVYM/7Os5w==" - }, - { - "plainTextBase64": "Umh+cMYXMBmN7KipeffNZorX2/8ehTRWIIFNkuhSKjU99GoP095PEoSf0MdaiSXBitgPzmzjeMV8QPbZhowc5S6BjdsMODCZ3RT7lUil", - "ivBase64": "DBFLu8o91f2n0RFR+j5fzQ==", - "cipherTextBase64": "DBFLu8o91f2n0RFR+j5fzaxOzGRRW91LNkByb2BIjM9eifqk/u8ZjeihBM1PWowLe1Hu6Koz4Xx39MXrOj/cH2xWS/CUZxzAFDlG64vDPv4FV0tbCx0eyZ/4V1iwNpBt", - "hexKey": "f2149dcbf3d7c9e11d0520b30e4d7f46", - "keyToEncrypt256": "3b5152ae077dc5c13821ce99117d454e9694b2f55689686889bce2441528af11", - "keyToEncrypt128": "efbdbd9c28ec1efd745fd19afa719adb", - "encryptedKey256": "QoiprgqF6iVmC3daBYrBDg7azEZfrylgFmSJN8CcU/M=", - "encryptedKey128": "zgv8X41EfYDC2vMxXAru3w==" - }, - { - "plainTextBase64": "UZwQ4PuMqH9+PnL6njEuiIlRkdKAGxaAV8zTkq6mL6ZXdhR621J2yuQ7un2rwONGh/g6dzEddFw86E2t41vs1D/5XH+lkuDIAK7iaqVV5g==", - "ivBase64": "QFiuATm2sON8oA0OyqoO/Q==", - "cipherTextBase64": "QFiuATm2sON8oA0OyqoO/d90eZdSaMi8v4z1TngDNcvinLDynRtXaXkyuI/qMQQZ4y5gh/OyRq6cAQCYU4v9L6bmVEUomv65Cu2aH1v0WxYZosHjex14rVDkBq5bOA6r", - "hexKey": "0a3c2fce68d161ce15c115deefa4bac0", - "keyToEncrypt256": "7cddb244eae63d1307869908f18efd4151cee31aac26818ef3011f66347e2b2d", - "keyToEncrypt128": "c6cc444d9a0bd2b9b7082bd13c3d9a65", - "encryptedKey256": "GO8ml0RQqbgaPNiHRHaHRiI/d6sjmEffMNk8R+/39tg=", - "encryptedKey128": "lUDlbkXfG/luWnEoTZVgdA==" - }, - { - "plainTextBase64": "/z1jvtw66iNZZQzAZfGpeQvFxvJFfekOwSHeUnc8SAPrtA0GnXk4ervHKlaBsxVXnkR+1Q5yMko8C3uM55CeG0bpjyUN65xBmWlKUDLw/Ds=", - "ivBase64": "duWZvv94xkYAUr+ls9vU3A==", - "cipherTextBase64": "duWZvv94xkYAUr+ls9vU3LB7cnzHbuaZz7SUVJrPEkKWEksXIH8uVVezPactjSbn1Ov/7owjZ81TcTiIXPrzIkhVCTjpmtaY6NdQpI8V/zsKhllm2ldr3Pre3adD91is1J9w/8TZXWZNVPxS2ajRtA==", - "hexKey": "f69d26c515104828b7127bc664de509d", - "keyToEncrypt256": "9e4c99beb464d2f43f329e8d69f4f6d2bdcffc0df5b90521225b0c5e6c62befe", - "keyToEncrypt128": "3ac8947786d3f7795a4af270e8a969cb", - "encryptedKey256": "0VHiSmUgRGneXGUB/d4dAtf9ZSQOETr2arQUE9QajmU=", - "encryptedKey128": "VQuQTxl1tL1pTnh3xGo1CQ==" - }, - { - "plainTextBase64": "hOwM7rRz2DQ1vv64Trpr85caCmgIv/0RLkL9qe4GEfu3LjBFmIhpRI5yQ2CMlXQ+NljOrwG0Q+51Whz9j84ku95wSHbRSWmBzNZeew3FEuwU", - "ivBase64": "XZycLuY6SAeLW1Gf5pcBCA==", - "cipherTextBase64": "XZycLuY6SAeLW1Gf5pcBCG3fMRKxg/mp7kN+4N6UKgcBj3HegXLwiO4DQhS1vSSKbBBWkX4UWtrbiZ+KaG/op1gAlLREjakhO2r+0gDVufUxzKJjYr0BVqWSfV63QohiThW9/ZHn431462GaIUjJXQ==", - "hexKey": "958bbcb8beedbfb5d18479b236a01956", - "keyToEncrypt256": "590bebbc91a5491e8b4c0f8526a90ecb66f47d2b5ecedb864d5f757392505907", - "keyToEncrypt128": "24c68db67c868bb7b5dd5d5ecaeab571", - "encryptedKey256": "Gvzcr3Q/gt5fyT736p/P5rMshJz+i4BoofMkwWLt9OU=", - "encryptedKey128": "k5pDsMEeYmFWU1WySS9YMw==" - }, - { - "plainTextBase64": "Vkv+T6tQJvkqwK2xyh5XNfhdY5ybX4UKlLusRQFRsb59NVS+iCxo8Dt+QlKGSROtIWorBqMxsC4Pdctxl1fXpjbxu1lAdyeQCt8SrkfOgVnL6Q==", - "ivBase64": "WHbbgEOzP/f/kxQCwvNqvg==", - "cipherTextBase64": "WHbbgEOzP/f/kxQCwvNqvku4JiVPyUIHHWIbQdfjYXWxjoz8JYWZlTOeIW97lc38lgRjC6KQRUs/KNTPXgOcjHUOxjZlH70OsGf9Pf6fA3r1pMKQuKETZZp8Ag6GGQU22LMbr1UBVMX7ko6GblvkGw==", - "hexKey": "d461d62b28d6b5e08fcdf305edb14f4c", - "keyToEncrypt256": "c380076953e9e01761145bce00499456f5301bb54f3dc9e72660da78dcd341a5", - "keyToEncrypt128": "d6e1fb64cf61efd140a9a731872bf229", - "encryptedKey256": "aNcnL+pUE3S8EE7MH162lGqRSu7xGbEt/Gg7AmQj7UQ=", - "encryptedKey128": "VFrr44Q8hZOtySPEiyL5ww==" - }, - { - "plainTextBase64": "W9z/qqtiZPOklTsESKmCPqF8OiIypCUbIl7vfbQRCZll3EJZI8epvgG4CNPZ08IiaiHhWZFjihVPtijGp1kQkFQfp5jDcXCe6mLP/9hnzhFEbIA=", - "ivBase64": "YR/0ldljpzOYHxDbNiIiBA==", - "cipherTextBase64": "YR/0ldljpzOYHxDbNiIiBBP0h44T6DwZv+RnmkmFziawy5IopR1ImbDYaJRN5l1UhBJt6E5gSv5eXjiXO62Hm4C+DKBMjwUT0rS0ex/B5+1JEEf16wQq1zbZeLlP4JsDByweI8Pg3U169Qa6Jcx/XA==", - "hexKey": "028a4d94e59b12ac79ec4ddbec0f66a2", - "keyToEncrypt256": "5e5d5001da66d3c740adf0224dc512c020903ebfccbf4e6c7806fa7b0b67d801", - "keyToEncrypt128": "84e973e827a81a5c40fe3cd9686acfac", - "encryptedKey256": "nduHfhkRYtmuBUP3BKaL8zcvm7q9strkfY2nMVVlHPU=", - "encryptedKey128": "LtrCg6GJ4bQH9DpziudNSQ==" - }, - { - "plainTextBase64": "vaGHTZOvZscF7oVtfL7KD+VxloP3KV+Y49gnQFg7flnOcaNxuTNSfv6fIm40/PwzdMsJ6V0TuHOdu9YKypB//aVetw/Dkri6oXye2n+Z+iL+5e8j", - "ivBase64": "4DOGosUC8G7OI3g2+flCtA==", - "cipherTextBase64": "4DOGosUC8G7OI3g2+flCtH3Jj8ZxSgVMfaMAB/Z8RfUlmo+K2+cAW8+kll71OJ7HvC41uR720aguB40ua3sv0KxW87vsNEpjPjLRhbQJ7aE6w0mCbvf2+FdqSZkZSymtvGOXk0JoXowMB8tV7STzAg==", - "hexKey": "b886d513a11a20b74c9792d736942ab0", - "keyToEncrypt256": "8e6fa8ae9cf40101b5f7731f51792927117923467179b80437b4f3fd48870366", - "keyToEncrypt128": "8498737243f682031bb6f5abb60e6a43", - "encryptedKey256": "G9mnGwLgZONF7BZwDtp+fs3LWA6Ja/OsKpWq9v5IZt0=", - "encryptedKey128": "/oQeBGQfUtG+jWhs9V0A5w==" - }, - { - "plainTextBase64": "c4f0ePAEAkGmSO7l4fEJsQJlh9ENZyjZHwyg9dVCtawENpUTZ1sHLsMGMErb9Tz0EZQEadMG2yoeqBDKNhBHvlsi14+4YVmj/RtdPBvdo2tT8qMfcw==", - "ivBase64": "PqbMk3Uyxs9nL8dhoLdOaw==", - "cipherTextBase64": "PqbMk3Uyxs9nL8dhoLdOa0hGHei9aMHhG+Q5iEQJrJm02dVJ5tinurZJuZnc+QlKSTJnZ99EYmxcJiU9Q4TfCzTMA4XuwZ1Y+Xq0cVh7qDmc4bJqhi15bmwkv13/jbDPfc0iUWE5EGs6Jk1CyOYGOg==", - "hexKey": "368baebb49415ce30c0b411f2bc1bed5", - "keyToEncrypt256": "4a0554a5e013a036baaf8f63e98b46811f9021e0a3c77cd0f9323a15b49a86a6", - "keyToEncrypt128": "3140fc6fe045122a3fd9b4ade8dd1c74", - "encryptedKey256": "ywhMDwqcHCguiYhjxEUKSgpLdr4C+yumGymL+bGKtsI=", - "encryptedKey128": "aHdwXtr+Nsh+H8/uJxL5kQ==" - }, - { - "plainTextBase64": "tSWUUdOa+92phkria63XYrYIhdvfTPwEVti7ricmciauapEsd/OV1En8QfdLA4aVSoafez3pk8wslvyB0v/q23nqQcO7nhSJENcNC1w3KVHorrW8krk=", - "ivBase64": "xAufDbEqRWr/j8tnzhwk8A==", - "cipherTextBase64": "xAufDbEqRWr/j8tnzhwk8N5UYQVP1ztJRt1OqtJUpBZV/9iw08s72zX0MRn8iqRs0An+UtutX3qTqu6xjsI8jFF4EVZvkp2pkSHKx/tMEQ42SWuudJkCWsD4ey4tQPZKhjAYRDqULXPUt2MuZHAY9A==", - "hexKey": "de3559513baf189ef1df9a5082ca3c8f", - "keyToEncrypt256": "5bffd613067fe22a9f7c3a530488da727742e55e5c7d66a3d101165bbc0158fa", - "keyToEncrypt128": "a4ef03b1cb89db3e54ef3fc44838e9e1", - "encryptedKey256": "cw28mJ1sJEDm4fmzSNDQTOcqa4kyqTV9yG0hw2OY9Oo=", - "encryptedKey128": "1TQXJ63LgfS9oH6XHLOHcw==" - }, - { - "plainTextBase64": "rathyV7i7Op9e5XtnBvymFccOhpY+SLazcf/Cc+rt7CrUIrpARhwzTxqaCHhsdNP3PScFwWgxq/A/7RXzChePQOPbpEfVDrXO0tmR0RF7cU0kmQld8Aj", - "ivBase64": "4Mldj70kW0Qd1fWA3Jdqjg==", - "cipherTextBase64": "4Mldj70kW0Qd1fWA3JdqjtDAKGGeI08LseXdGdUMPYMT3mEkhkksMVOW0snlMC89r/zxGG7hXBCr1+ppH+wZIMCb2dFn+Ve6ZxsKwIQOMP/DgWANhwSQh1csfglvlY8P1ZYVjFdg/kpAV8oT7uU7Yg==", - "hexKey": "7750bbf467d380cd1b864446891f55d7", - "keyToEncrypt256": "1e4baf9cac26efc07cdb28e98216d637c93a17d9186f3d9ba542d0815a17a4d1", - "keyToEncrypt128": "6a0d5203bee975d665986a5a6046812a", - "encryptedKey256": "3jqJabcWcSlJjCXlJ01rNRf2LalFCOYZhT8Ip1xxFy8=", - "encryptedKey128": "7yzCbPy+nUzCXKQIFrq7mQ==" - }, - { - "plainTextBase64": "6KO4KVIz1J6W1FndUGKqMty0AIIW4eNYCcCgEJIMFASlp4kMuEE8zkm86NLDjFCq9nXx2WLrMa7cpUes4eGorLAgSGONPD6XCfY2zOtVEgVih4edgR/0Ow==", - "ivBase64": "y90c9qEPryqDsIntv80y3A==", - "cipherTextBase64": "y90c9qEPryqDsIntv80y3FahJNjHyfVL8nEJlvFF/+10BeVOxynFr2obfd+6vXLowvVUIcbiAixJb7ZFMpkP56BAqkcEPZ5dsjqDzcVKg8IIAfZ6I9PS8eu9B0CnVtSxSlgYEisZwF2N+ee2zUow3g==", - "hexKey": "95ab87fe45e9df117edcd228c1a20099", - "keyToEncrypt256": "16ab347d998ccac2d05dcf175811a7a5c90f7832384ea962bc977ae8be2471de", - "keyToEncrypt128": "4b134de67752663660d47d45931bc9b1", - "encryptedKey256": "qHqHBHtJmKzEDH7IxZXp3lWUif78bSZbwE103lrwfS4=", - "encryptedKey128": "TYC7KgjFDKRzKW8C/H7ciA==" - }, - { - "plainTextBase64": "pgnAUTfPeJd+RaaXowG6Rr6urmzFiRCanBT0QvVu33ShhSLeGrBHgm09FcNj1Xhkz5wdThpsut3CkDTqTfWZqUjjffVh2L+tQWTpO891U4i22eYonVgFuy8=", - "ivBase64": "ynWWWc+ry5gCTKI0EFmO9Q==", - "cipherTextBase64": "ynWWWc+ry5gCTKI0EFmO9cZmoUSz8L+Yx3+C6mF1OAp7fnfXUYdKjBMGLfJ5JiC+rgwrgNZRwZ9m8QOC2AKURZcwY+vKj3TyKcf9mF/uZAbP9fElow9VHzxEb9bw2E0SX76dACR74CDwa3r9Y2eiHg==", - "hexKey": "383600cb6171e036939c99145c838be3", - "keyToEncrypt256": "a2630a8b5a23f05b0f80f74d8836353835a0d14d94add133b52c543c51c86784", - "keyToEncrypt128": "f4934d4a06cd4591f15d032dc3bf8b6c", - "encryptedKey256": "RbmDoCCTjQvlWN0Ct6DJx759TYhp1ss1hhgjsn2o/Nw=", - "encryptedKey128": "3LX+O2Okm9+K/q47V7oQEw==" - }, - { - "plainTextBase64": "Ik0STyYM/AUTIzds3sFf49e+X8pno2rK+nEnOpvpRldP1X1ePuuTH2RAxJ2UCatdOhKinovqPE9n4oq0nhyT7dyxYx7yfg7r/azwCkwEdR7AMdnE5ro4wvMJ", - "ivBase64": "KA0EXdrlySWMV0TdkaI1Pg==", - "cipherTextBase64": "KA0EXdrlySWMV0TdkaI1PiBn0CoQetO3DZnI6fXG4RWdwidIQQgMJrBgotUvyVKzelHf1fSsGOEkGlLrFvHsaMke/LeuXie5j0HRhCv/9PHI0R7Q/aRGNqz+9SkhbdnGKqq2NuKqpHHcANjPzupySA==", - "hexKey": "f8f50a3030c948eecf79fe38e91cf6f8", - "keyToEncrypt256": "7e40457b8057fc085bf9e20c5acbe48afa81971bd26c7b615198ebeaf0adde3e", - "keyToEncrypt128": "dbad09050c0c56c45c7a13db026ee1ef", - "encryptedKey256": "KtVpIapRWJs2Ic7mmFFyiw057osnDnWFvWxWBZg6MOM=", - "encryptedKey128": "2g2eR/X2UcYZEg6artjHxg==" - }, - { - "plainTextBase64": "fXU+CeQ5+xfZXGCtOjWW+kV3WeuzcnNQx+i84nlstpE1pXALCLuy1IE1QUgD82vOvojMHPZCvvHmMNXYDiwkelKEIuoCB4HLc3pVlq8wfWxDPHS1KxY0iHjCFw==", - "ivBase64": "GP54yFTzKZ7J/kPtGTdB/g==", - "cipherTextBase64": "GP54yFTzKZ7J/kPtGTdB/quYZUsvqg55njyrbg25a+CqT7pUp4zdUSUSlsbaW6MAj4Ji7ugn3VWQgde24cR1i6jj3Ax8yHlMW33Zsq1lGN75IcjrT29/F4WNxH+E/2+ADrgOfJNx5pQqophMH/rR3w==", - "hexKey": "347289744ed3d4884e644575c335535a", - "keyToEncrypt256": "2da488611d01257796fe5d14d2b9fbd3b5d2dc524a74f524d5c29ab19a67dd81", - "keyToEncrypt128": "40505720e556db174828d5e68edd391d", - "encryptedKey256": "ASLlGfUNiTcDbiYT56Kx9q3JlQ3yx3Z/0HGlUA5O1DI=", - "encryptedKey128": "IQnILuIf/Gh6FvjeN4mdhQ==" - }, - { - "plainTextBase64": "YU2FZMN0/ViT6eRRt21YFxdKPQGMZaAkcKBNmFvSi0+AaPHqYRp8jhITrZMyPD6ul2IfIG1Yxyu6SaEnpOZFRptEalFwvwdbzXPor+9qARh09jnqJTX+HBJD4h4=", - "ivBase64": "es2/WaKUI+L/MF62hUnjXg==", - "cipherTextBase64": "es2/WaKUI+L/MF62hUnjXlVk7vJB6UV4yaLmDmziLmxeMw915tfI+SdmlgWfBsUXrRMKwu3nBJfkmlFyX0kEaEY6cCcGcoz6iQFVYVuxYchjDWjrW0IBnDv8QhQ9soH316BqkH6ihPvNkcr7gPqfjA==", - "hexKey": "dad589270fc969a204f65e23a6e9e24f", - "keyToEncrypt256": "b96067c168ff61828f852e2a8d1666cde8c38a22ac0f41842f2cb88583b3ddca", - "keyToEncrypt128": "c32a05a50b169cfe6fcfcb21027ce667", - "encryptedKey256": "HnLH5xdWjOF+vKxfmmHgAf5F+f/v11hxlosVAFUiCM0=", - "encryptedKey128": "ARCo3Xqw2Fl/4fq7TJH++A==" - }, - { - "plainTextBase64": "8w+9D+iHOm2lNpJM/0EuqkMqR6AmqkCSNHFEyZyY9IPTIleYGPELrAJHlgZv3EAO54QojBA/ZuFZnAKDAkYPLqm223o/8TKkxYfnq3DwbBL1wBkMgkbJ96Ba/qGN", - "ivBase64": "D8F9kL+Btp9hIbJeTS08rw==", - "cipherTextBase64": "D8F9kL+Btp9hIbJeTS08r7m9F2L02SS/lg7SD+mjHaYdADnyV3Xa4ZpUtA1OYLrOQqBldvGd6/MxWvfe8upFH0iBxQpoVjALRw9A2dwszlVGd/EAoYTBniIdeeJKpXffG8ReXlfmR1j4ZnXLn6Y1Zg==", - "hexKey": "1cf6da4c4da0d4354c9c1571bcf0dd49", - "keyToEncrypt256": "47b1b1166e5b5c7d25d8f214332c01a90c8823797bf82a6c1d7f0bbb17eff4c4", - "keyToEncrypt128": "e8602531ba8bdcd95c7aab192ec102c2", - "encryptedKey256": "iyWkQx8gOIkTM87XfFoEmgmhJLg4jpckUkIVTx46VwQ=", - "encryptedKey128": "nPkpMNxIB0ih96M4MXNXcg==" - }, - { - "plainTextBase64": "gD4R17B0Cf92Qvede8pzFtgoBTEVDWwLESA4uKSROHs0Gb8fE/il8wXVYBzvTJGyR/DyhJPhhP7srY+AQSAens/IN0gIcklZC5wSaJPXUYwlZYzHUP1mPo5n3uGE0w==", - "ivBase64": "ObgZ/MWKWvpOLSkJN9dmtA==", - "cipherTextBase64": "ObgZ/MWKWvpOLSkJN9dmtMAr0JmqD0MhAyvXKGAEXrR8VLy0kZYrL2zjBGJgxheiL7fkMFQ8uSzjyRxP6PUEDs/fFUutugmLw7NlRs5/YsT/hx8hxvWIxnaV7cdlGDO+Ws4IGL5VWOpbwUhww0s7pA==", - "hexKey": "3dfc81a55acf002c7c5a4fa55b36765f", - "keyToEncrypt256": "3368c0e114b0cc1d20a0281efa31d1bac8f5749443b068ce3d82073ae9c5c288", - "keyToEncrypt128": "c48468b364fee3b46505c8d9df9e8fe1", - "encryptedKey256": "Y08nm8AtXPeC9ErzPTkX3T+/Lt+LIiBcRRQ8lueAMRI=", - "encryptedKey128": "gFO0FEQ1eaOY/sjv0zWDSA==" - }, - { - "plainTextBase64": "LzVBPuj4LeRd/HexUSzaC3nfuq1Su9U/U0fPab3ZRoXEBEG7/+AgTsReiB5D0BPR6xEPD/1WyR7mfZukbNEjAn2y0oToF034LyTishHjybKCL5HSIzveEIivJsgPMPk=", - "ivBase64": "pAfK9QpzyCFuJo0NzZ9YCw==", - "cipherTextBase64": "pAfK9QpzyCFuJo0NzZ9YC3URveNbkRUFGAHnowx4MEoQtJjdK1d75gRKwLnE+L365Q5GBPYnVgtHOnJbONdFgQtSylIrvB8hlOKrX0xc0rGybsm+Xit3fPh28tT17TE28mzN8LOGUMc8b6oZAWQCXw==", - "hexKey": "f987ffb43b7100c909dcb6d592e2af24", - "keyToEncrypt256": "65d593f6e78662387f6ae09787888818952ceeeb6faf808dfc7426eca046950f", - "keyToEncrypt128": "476344eb8f3af83dc7f8f0a918b7b296", - "encryptedKey256": "E8chDKV8W4uRNzerGf3FWTitGbGB6+pAQghnBYBblPs=", - "encryptedKey128": "+6FnV3uYeREP7+ckPxq+jw==" - }, - { - "plainTextBase64": "eTpeBucewfbyqrzoDDrWWnA0pPlZI4b7Mx/nZHYmKaExX4EGeS3vhN9wTUrqLebY2HM5bYdKxa8w/XC2rEXT7IRTAU+P/78T+/nc2rcfVCLby0nnWD1B0mYTJuV1C3Tf", - "ivBase64": "zSToNFvNDFTQUNfq3okbJg==", - "cipherTextBase64": "zSToNFvNDFTQUNfq3okbJvdQ3jxJsSfL/Bfwzfa6h5aGA1sVemaj1NTajpaPkQj3JYkNEtuxw8V1I84lGuV3pEDZGQfybUY50XhKXrChuZ08ij+VxqIa0Nn9zQ4hOQbBzwWlWzKcAeRP16fa7qM4k2fAZIsRUcbVzBI0Ii43TF0=", - "hexKey": "59421ec1721f6c6f3310b490ee770539", - "keyToEncrypt256": "c52ce8bad90aa08a8e263e76dd24b52441d63f5d9c8f1b3bc8bf8e5ea68b87aa", - "keyToEncrypt128": "7a696029671c5bb246d921239c4969ef", - "encryptedKey256": "LEX+30DT/KGSGy/YJ2QS2Q76tnfYCyV12PVgr6WZjo4=", - "encryptedKey128": "w4EjKoTaQdhGyYZhtknBvg==" - }, - { - "plainTextBase64": "EECOPgJexTldSLukWSfWReXFQda/o35+SV37VddbHTIyFj3PK8WlGYSBLT9AlUYQbwRTBcoK/DIRmcB2/tVyB7jFYaQhYfyqFrRZYrOGmvrbqXq9+A87QJcuN3qxj8Pt3A==", - "ivBase64": "6bblRstg58if8WThVACpMA==", - "cipherTextBase64": "6bblRstg58if8WThVACpMENqS3Ukw4mGDU8DQVWzQT+K17ibI1hLDCWI20ioH7PTT9G7VEv1Esz8zTda7F2yT5hmvhIwf5e5hWVD4rEeVRtLYBzheKOP5M63o5KbpgXbZEXkpKyu9I4nJ+39PNH4E6czepeFrEQb5pz3fTaw6Vs=", - "hexKey": "32b396bc893cd567fcb14ad28ef92b65", - "keyToEncrypt256": "c20991e5f9b049615afced2dafa6db1262cd995e9d80dcd94bdfdb7f14dbad20", - "keyToEncrypt128": "835796515e7089f91ec50b490fa68278", - "encryptedKey256": "giU3e9Q2oBRAlUjA90RDjP12L9rCHhnzVe3pr0bFOY8=", - "encryptedKey128": "qWdfgqRKiX3gLa3LtlEwhg==" - }, - { - "plainTextBase64": "xKZJNlt/R+zxa7lgwxE2hfGrLeDL/n6DZ1ZM+AlcFXPOa7W5ZFx5VpQF+CjVqBUeFFMJB3fJK6/Z074SahfUbOJcFPF24AKh2+YwMmDLnj5pFXIFVKkizBrxBZ73MV2Ahk0=", - "ivBase64": "IJOWKpu93webtsCJR9DnNw==", - "cipherTextBase64": "IJOWKpu93webtsCJR9DnNxu6eBrW/oIFpgB+oPZKvsJdj03vAqTMeFC4hcGLeFNcCoZqt/xP1vFHkJDnrUAdugWG9E9UBWplMchzmiqxNDG3NwQXgvr2R37q2wM4kdF1KNbvn/5eIxdR/cXZbvVr2pAD5DuS1gFVH0rNlpPWeu8=", - "hexKey": "7cfe73602682c7b65df968752a7da775", - "keyToEncrypt256": "13fe8b38407348b17c53f851cb7d752b3ece35f7083637c39ee2e1ad6875ff94", - "keyToEncrypt128": "200a084ad5a1b2b2989a36388e2c38c8", - "encryptedKey256": "sWDbnJrBDhbl05iGEWKHV9eO/Cm7NuGpcJnYkKLdwMA=", - "encryptedKey128": "DOQGcw3/H+Jp2c63Ozh+MA==" - }, - { - "plainTextBase64": "xl3lVy/cr9VkMbVIbT3Dvhng1jFBSq+GaAvJVrwrQlSmL58uXuG9zFz7tIPPRxKApakKwRqAPUkzRsj6FeFmIY4RulbMnL1guFHd5B22Q3NUXEEE2w33W/Kp4ugehAedGxs6", - "ivBase64": "8PP2f2DKvpWHuuKpB90qNg==", - "cipherTextBase64": "8PP2f2DKvpWHuuKpB90qNhSUpl55jhBXytRNSwuZ/pbWKBZnU5E+sYk9BICRbRpYcx0ksx1RQJfn1BmG1TA9o1YwAucwFILQZDNVIixTjTeHkQbS7ak8lTZnnfud3EbUUM4xTKWoYWC0RzVZyi/C5s8Q/PsV34eoYDBrhEEGefA=", - "hexKey": "e3ed97639dfb757d069df7b192df3291", - "keyToEncrypt256": "a870817ebc70332d86a7e971f4b97f41a0e381004708c38caa9d7336abbfc4a1", - "keyToEncrypt128": "deca09cf1dada556e1751eefab0ca2e7", - "encryptedKey256": "+ChHnrXcz1xW6hNIfjT3kQ6wU58HZkfLx6Il9cYSIPM=", - "encryptedKey128": "zj5f5ZaISaBR87DHo+uICg==" + "aes128Tests" : [ + { + "plainTextBase64" : "", + "ivBase64" : "oLhibvWslO+jwrn5gXBFGA==", + "cipherTextBase64" : "oLhibvWslO+jwrn5gXBFGBAyBMM6jQOyjoEdDqMQnS0=", + "hexKey" : "87295bd5562e38b76472f11484d58618", + "keyToEncrypt256" : "249fd19791afd4bebff9ad7571ea1eb893e6f510128123aa8ce7053c7825b6ea", + "keyToEncrypt128" : "7981c6430f0f15fa96aab6f0d14dd4b4", + "encryptedKey256" : "jmXMPLE8V864J3YAku6og9gNczyQbBvbMS2ZkyvNMX4=", + "encryptedKey128" : "hpoHVn+FZmfxfR8l1ashfA==" + }, + { + "plainTextBase64" : "GA==", + "ivBase64" : "oDNdi5R3QZXB6CgZRbJbyg==", + "cipherTextBase64" : "oDNdi5R3QZXB6CgZRbJbyhsEeqQQg39WxEsmk1/x/+Q=", + "hexKey" : "8d09bb450fbadbb7076162b1315f7803", + "keyToEncrypt256" : "ab22ce46ec367779343e07474f568df746a012c8b4ea688ce7617ef8673fb5c5", + "keyToEncrypt128" : "9f464b47938db5464dd45c9aa9e896d1", + "encryptedKey256" : "uamy6ugW/9b3f90IwT0zxTSMWV3NApllVO0eRT5SkpI=", + "encryptedKey128" : "lNb8c/lO2a3ZURkFlHG45w==" + }, + { + "plainTextBase64" : "kx8=", + "ivBase64" : "Zfokg+nfzt1tGgDa8r+GBw==", + "cipherTextBase64" : "Zfokg+nfzt1tGgDa8r+GByyul92nGlXCd1kCUYzb6nQ=", + "hexKey" : "89a41d94506928769861d7b1758d1275", + "keyToEncrypt256" : "8f86d4e0e8a68c95fa338688fc3e0da0c3c03c2b1f3e2dea8dce76a442b407f7", + "keyToEncrypt128" : "dd6c3739f5529c438e67645d27001a19", + "encryptedKey256" : "pYvBjbGvq5BwTKBvmBBMMDdIxiYaYr04wmq33HQqEYU=", + "encryptedKey128" : "e8Kp7dNHU6lbDTADSnsAHw==" + }, + { + "plainTextBase64" : "/YjX", + "ivBase64" : "Y4WncXzc5CgoH6SCSrwikg==", + "cipherTextBase64" : "Y4WncXzc5CgoH6SCSrwikjyw/nXdH5T/F8QUhqHZhw0=", + "hexKey" : "ffe158124400d747eb61af584e354b48", + "keyToEncrypt256" : "d921fe2c93d6d4d0d2c3d65c4f7734fab0412dff6bf3e4466d4cd74059784552", + "keyToEncrypt128" : "35e3c664ad9eff36075b86240a44dd04", + "encryptedKey256" : "Kg3Au9EW880q57beHTzl1QmZGhuPBv0ujm+9+0O/KW0=", + "encryptedKey128" : "z4UGaXYnAK3FAD0CW37XHg==" + }, + { + "plainTextBase64" : "yjuOHQ==", + "ivBase64" : "fBxURaqOHM8qWZr6lYkH6Q==", + "cipherTextBase64" : "fBxURaqOHM8qWZr6lYkH6csvwqEpGrs1ddVYA+eOo9o=", + "hexKey" : "b2b42a692af4f3e1f91bb1d266496250", + "keyToEncrypt256" : "0da70213317986bb2b85e06d1d5f70a3c3f1130e7b5ef46c2b487907078fe68d", + "keyToEncrypt128" : "1f5e590f6146b11f2ed3c3b4bac56a15", + "encryptedKey256" : "AqOWB5x3bg+BV7AEmEVTigLeDwVM3lfGKDcvYhQEx8E=", + "encryptedKey128" : "Ant1JrBoWd/FwsAxx58OGw==" + }, + { + "plainTextBase64" : "LFwUKfE=", + "ivBase64" : "btRhmTucbtNjOgEJyJ1daA==", + "cipherTextBase64" : "btRhmTucbtNjOgEJyJ1daDxDcvuXs0rrG8g5TvbL25A=", + "hexKey" : "5083561dda3347a2f16ac8747b8332da", + "keyToEncrypt256" : "19268e98f28904a28700338207f1e8ec088f80cb5f0306a9534aff5aefc805aa", + "keyToEncrypt128" : "e98f145f99ddef5250f559a7eb364201", + "encryptedKey256" : "PWU2yZ+L61ag+5orJq+/rbE09/dYZgOFZS5lSRYdAA0=", + "encryptedKey128" : "7vyTi50q308fYTs5c/n5sg==" + }, + { + "plainTextBase64" : "smFL6zpA", + "ivBase64" : "0t2tCLtCVKotvEDf07BBsw==", + "cipherTextBase64" : "0t2tCLtCVKotvEDf07BBs/5WzxRPj6CMs3KxZqEgR2Q=", + "hexKey" : "978986b7c00583e9569f73da17dd5c0c", + "keyToEncrypt256" : "c486e1cafd15f7cccb36fe405bed7aa870d1d0e9e8d6a06cdc1c638940a0ebbb", + "keyToEncrypt128" : "0716540c2d2824e416e97d6e80651cf3", + "encryptedKey256" : "QXWycEeSy+TCnJ5aTjmMNS3pEsB6jZAawKL0WW5df54=", + "encryptedKey128" : "EYXF9HOMAZUgRda8oe8P6w==" + }, + { + "plainTextBase64" : "By05hMYn7w==", + "ivBase64" : "GmYlVdaytQTRK5mxK0WAyQ==", + "cipherTextBase64" : "GmYlVdaytQTRK5mxK0WAyZ6uDBA2ON//c2/5KCIDAAw=", + "hexKey" : "6267a200bdf2549f0270e4f9beabd76d", + "keyToEncrypt256" : "c9521e7456994499688a63780f440824491b0d4d2ed12cd4c0000ff57a9cb393", + "keyToEncrypt128" : "c8fd5bcd12696235a8685cdc904ae338", + "encryptedKey256" : "RlnozJIiKXnKexy0KuvmYDWJJXitGYiYw9GgmHyjnEs=", + "encryptedKey128" : "FOsma5w9AbEYZpRAKLFCXw==" + }, + { + "plainTextBase64" : "to5J0nV/JjE=", + "ivBase64" : "xM4kgLyElEdwafpss0Y1FA==", + "cipherTextBase64" : "xM4kgLyElEdwafpss0Y1FO1eletVIYU8SZjeETSF/Tw=", + "hexKey" : "32db947afaf04c4def7a864f4e7d7176", + "keyToEncrypt256" : "59863f1b95756fc50f6f75ad676b8b046cdbe8e9280f6e962d219665a3ef94f1", + "keyToEncrypt128" : "e7001beee4362adb5b2e6a716c9ea89a", + "encryptedKey256" : "Jcr3cCKceoczW8v5IXx5HzXV0Ddq8aHW4Iw6ZYEk2WY=", + "encryptedKey128" : "P+OPy2Vs2Kha+eIaFxXiXA==" + }, + { + "plainTextBase64" : "qxJHhPDsNSW7", + "ivBase64" : "XoeWDBJ1LDZyHAoY/4qZcw==", + "cipherTextBase64" : "XoeWDBJ1LDZyHAoY/4qZczdKZFy1K5I7KQJJx+Zl5K0=", + "hexKey" : "5d1d77b73ea99c84b77f7279779ea712", + "keyToEncrypt256" : "2efb88e012dffdf9646da99513e19673ec636c823b840b982125f7b3c4febeb1", + "keyToEncrypt128" : "8b54d2c566a512402ddd892ac1ab8b58", + "encryptedKey256" : "bEAbzzdnAftoDCZsZo9aTGn2N7CGOfcxh2q76kJ/EOU=", + "encryptedKey128" : "wN0OIe34V8nyVIXC8SIcuQ==" + }, + { + "plainTextBase64" : "YuGfu7xUVX2aGg==", + "ivBase64" : "m2LQy7yIChogYTtDVsQhjA==", + "cipherTextBase64" : "m2LQy7yIChogYTtDVsQhjG/KA9+JLNv7S0DCXsnD01o=", + "hexKey" : "8d88ada5488d595f29ce7b4857c069b2", + "keyToEncrypt256" : "5cb0f19ddb2414f6361e2ad7017e30fc65cc604d7b89d572a378cab4100c7956", + "keyToEncrypt128" : "6219279217cb4e240f934e49e50b9be4", + "encryptedKey256" : "gui8Nw0oksIsVRn3jc7CQ11TlLcM1cqOHns2NPdJMpQ=", + "encryptedKey128" : "roPMIaEW2iCtAat9vUsNPw==" + }, + { + "plainTextBase64" : "reDX26Q1rcwuv/k=", + "ivBase64" : "EWieZBWA25kYK6Tzq9vkbg==", + "cipherTextBase64" : "EWieZBWA25kYK6Tzq9vkbt0isweJ4MuCn6f9VTWvbOE=", + "hexKey" : "86864814078fb82760d23e01350b9c41", + "keyToEncrypt256" : "df2703d394584df74175a11070c0b3ad4542ee2a6419edf927485d8ebfc76a08", + "keyToEncrypt128" : "763fb14adccdb8c58ef39b00cc4fdae3", + "encryptedKey256" : "HXTIGDGHK/81orFWtof7yPX7s7/E6zl59H0PnRjZ5jI=", + "encryptedKey128" : "dYmz39maNIbqwPyUCA9/MQ==" + }, + { + "plainTextBase64" : "RGxL4XB+50JWUXbk", + "ivBase64" : "Lagsp6uPcr6GzrYno0vhuQ==", + "cipherTextBase64" : "Lagsp6uPcr6GzrYno0vhubyROYVkvNgLsRqvAX2WKos=", + "hexKey" : "21a43bb26026092bdd63f0a3b0102bb8", + "keyToEncrypt256" : "ae30205b6cf4536205bad10f7c98f5411e5edd78cd12c2970330692abd99d147", + "keyToEncrypt128" : "74646096ca9c512490733d6bbbaf8ce9", + "encryptedKey256" : "Uy7W+niC6Di0+LmTeT4sWM5pNtS8s83Uw2R/arYAiTM=", + "encryptedKey128" : "VNrCED43sOcJR1dWCghC+w==" + }, + { + "plainTextBase64" : "n4yceGORwzYBNnDlag==", + "ivBase64" : "ocjsmmf9ly/tTwU+2P/d4Q==", + "cipherTextBase64" : "ocjsmmf9ly/tTwU+2P/d4ckGq3U1s1JUL6i+w8SP/74=", + "hexKey" : "a8cb2b719e22dfb677e4f8c53a065e0a", + "keyToEncrypt256" : "6e49c7802485a2df933322ef145a6d9b55192a3887178fd5ac8ebdba53df67bb", + "keyToEncrypt128" : "a4b2f8468da0292637a5997584c60f84", + "encryptedKey256" : "DcxeFWomWny2bm//NBrv7C/93BccInzeBZOxwFgPEQQ=", + "encryptedKey128" : "Kvi68GLUQKrHX4DcThL1PA==" + }, + { + "plainTextBase64" : "v9ELoXpjCyc4C+nd1Fo=", + "ivBase64" : "pg1ogCr07gtZamp08jHHwg==", + "cipherTextBase64" : "pg1ogCr07gtZamp08jHHwuA+udQoNvIL2r5pBXrNsE0=", + "hexKey" : "905fb8d3aa1e75ffe775c0ccc4219cd4", + "keyToEncrypt256" : "8ca52cf59083cfea2cb6bb5170c174579cee2ba389182856c23bfca77d27ebbe", + "keyToEncrypt128" : "d288aa529d22499e33532bd55672651b", + "encryptedKey256" : "4Q434TDVFggrxOqi6WjxBTFInYK9PP2Gj4tjVkupFQI=", + "encryptedKey128" : "k5kjRDqMA+HfDO+HCLqHlQ==" + }, + { + "plainTextBase64" : "l4fZrJ53cAFGA5++TnQF", + "ivBase64" : "5wuJ8qdFzNQRV9E/rtls1g==", + "cipherTextBase64" : "5wuJ8qdFzNQRV9E/rtls1uDUD7SAIMIKs8paNGRNqUY=", + "hexKey" : "0a44908dbb4bd124cbd3dc332f4ddb30", + "keyToEncrypt256" : "bb8ab4f20a10dcf5bbd14d161d3a0d68c65c9fcc835a84a7877458456ad2cb50", + "keyToEncrypt128" : "9ea95de5df1be20a4004394fc86f256c", + "encryptedKey256" : "VWlDxZpLlCdFc54fRnjAQRXdlgLS+X8G9TGKySrbu8I=", + "encryptedKey128" : "W1duLfEbM6eN8FH/s6/NpA==" + }, + { + "plainTextBase64" : "TKy7S4jFwIwuF3k/BT/hIw==", + "ivBase64" : "GQ6lq/LNeQXOVS48sD3/8w==", + "cipherTextBase64" : "GQ6lq/LNeQXOVS48sD3/83pfF92cnR6yL0XMeTgATy5j8wE2d9rOi8oUPyYH0Dpc", + "hexKey" : "be14a6883e63e54602dd0b22b0048a12", + "keyToEncrypt256" : "07fd61b258a4912c944219d4245aab6ebba612f002cf05e1bfd58016d66bde67", + "keyToEncrypt128" : "eea186c49841042644280cec4b147b6d", + "encryptedKey256" : "eyE5c9Ke/9AL0wRFOS0f6uwi2BBur9jxWC0lRG9s+oI=", + "encryptedKey128" : "j9MWmky3LPMXyITLx/8MFQ==" + }, + { + "plainTextBase64" : "Uu3tFVZRHMjQS7G1V7HZzTc=", + "ivBase64" : "Y1hluLud2NNuEzXe7zmXvg==", + "cipherTextBase64" : "Y1hluLud2NNuEzXe7zmXvnaWnEi7jQHDOC0c3mR8nI8EzHlMYnCwrJdZo3hTmz/7", + "hexKey" : "9a1d362a42cb87bafce78c646a9ecc65", + "keyToEncrypt256" : "4dedaefef4e4438c4dc99aa343b2572090b514fbf64eaf907b1316c71e00e372", + "keyToEncrypt128" : "022dd345635f1df1128c9e77c74522c8", + "encryptedKey256" : "AUKZ4SOyhlC9ToKHStx0DqcPkjYV+Z07pYUH1gzupsw=", + "encryptedKey128" : "Lp4WtVjrL9We8jLr/qDOXg==" + }, + { + "plainTextBase64" : "wv3nu/4rF2p2I6Vdy86iHwAd", + "ivBase64" : "qNGd+GTG87XjaoowDKbIlA==", + "cipherTextBase64" : "qNGd+GTG87XjaoowDKbIlAGu1uWH0tG9AbaPvgINQxNPoAOBRAQuQitks5WKrbBK", + "hexKey" : "32a0246a53fbeb3ad7254fcb9eac88ec", + "keyToEncrypt256" : "be80970a2a1606d904f2002c7fe60d01696307b60def6c83aec1f0ef6972d0a7", + "keyToEncrypt128" : "5599dbfef92e587789997c6dfc9f02e4", + "encryptedKey256" : "uGLdDtj/bCiA2EJxIGdG6Evr8uSpZ+HtwpT9a4+5HK8=", + "encryptedKey128" : "A1Afgv/w0mD1mlJoRT/cQA==" + }, + { + "plainTextBase64" : "ra6G+NMHzdkTawzMiOfmDtX79Q==", + "ivBase64" : "5orLVeCmQVL3Wty9HsXEWg==", + "cipherTextBase64" : "5orLVeCmQVL3Wty9HsXEWnJNuiAmcO67KsB5My4teNwFCMGtzaCwmkEEeYIXPdFE", + "hexKey" : "8a6b02a6a33087df4769a87b87348039", + "keyToEncrypt256" : "5ca6bc1f987e2e15d0524d44051add0e63fe8a03c9b00f018a9fcddf50532bec", + "keyToEncrypt128" : "d3d67e199ecd1c5b95aff7e0b6db693c", + "encryptedKey256" : "AoHBJdD4npLtm3MNiNL7J7+eCUVdT45qL2DSUqLYuzk=", + "encryptedKey128" : "eNvR5k4Kh6C9uaxJXjapEg==" + }, + { + "plainTextBase64" : "WgUqXLy2KfN1FL+5p9IgycALOTQ=", + "ivBase64" : "uxRqCcIEEYkeiZIc4o4rhg==", + "cipherTextBase64" : "uxRqCcIEEYkeiZIc4o4rho+Qwr98oTTub7eGpMG5PZgwfGoX/sUFvgu+XVa8TFDF", + "hexKey" : "0c781361b93e47ee82ac108063fc6e08", + "keyToEncrypt256" : "c5b5ddbc19487ef03a9c21d780fa649f74567d7c33656a66d69742773b4fb8ff", + "keyToEncrypt128" : "d8567cf398fd4718739d9d38964a002e", + "encryptedKey256" : "wIPKlfCzZ1TJhnGTet5B4EPKOR3qH3GrZ6r7ghoD76A=", + "encryptedKey128" : "gQ5GlINQowOsjIW7JllTCw==" + }, + { + "plainTextBase64" : "csbNt8OJjJMoURZe8hLr9E/DiIHo", + "ivBase64" : "FAnPcpdbe64xrAcWwcHIGQ==", + "cipherTextBase64" : "FAnPcpdbe64xrAcWwcHIGVtAkpO8A3DgKYxZH1yoc6JbweTP+bBWztndsNGCX4dK", + "hexKey" : "3140c8dc0b4fe97820c862df6f11924c", + "keyToEncrypt256" : "a46f4552d2fdb6587f7efe0c2b8b581bb030c70c8617d22193af89fdc917af35", + "keyToEncrypt128" : "04f821a5b56a0ed4a400ba231957f528", + "encryptedKey256" : "3aeHpcZ7P3SInpAgLyfN+Zq1c//rM2e4uTYT7CQHlQY=", + "encryptedKey128" : "kauA0t1l+lkK3EhDUQeW9A==" + }, + { + "plainTextBase64" : "74bY5bByHUTpPkfWr4O578aX0MQkaQ==", + "ivBase64" : "/2Sp1JFe6PWwODf8CWjofA==", + "cipherTextBase64" : "/2Sp1JFe6PWwODf8CWjofNttyez3k5uLuOw7+ur3CFIvHszl80dcHhNsdgN4lD0H", + "hexKey" : "008b73a76c451288950aeb4254fbc77d", + "keyToEncrypt256" : "c1920b57ee0dc60596714a4fddde64434b1c8aac6df053a041d2f38a94830168", + "keyToEncrypt128" : "459390d02fe0a33f424346db0de4d975", + "encryptedKey256" : "8sO411f1MJJ4uRxQ8W1JZA9XGs6xndiBBnSyBJheOrw=", + "encryptedKey128" : "k/53aqDwMcGeuvhtrS1sfg==" + }, + { + "plainTextBase64" : "+7auYsJMTAfPgMwA7AEhOLmH1y+v28U=", + "ivBase64" : "vypQxSuzir9TYwt5r5pvtg==", + "cipherTextBase64" : "vypQxSuzir9TYwt5r5pvthzQFA2voevwFU4XDxgPwHd4DPwIquoLh23luXkuFJsn", + "hexKey" : "721f6de58b73a6d1a63c27c33316a9f9", + "keyToEncrypt256" : "6cf1c34ac1c50288aa38032ea5cb6fa200dc3e242b5e40ce6987f0192ecc31f2", + "keyToEncrypt128" : "8dc3a2c2f95078cbd8fbcea8f48c65c1", + "encryptedKey256" : "8V76fruT1LSzRmxPPL9P5jB1vqT2ZQ3dItuOjOT/J4A=", + "encryptedKey128" : "XqafpJ3UoMrlQbkCqV8Plg==" + }, + { + "plainTextBase64" : "RBdfY7s8z3drdLkRlkTHXzgrGg4dfkCk", + "ivBase64" : "FPsi3qFGfzYUTROj1nmXYg==", + "cipherTextBase64" : "FPsi3qFGfzYUTROj1nmXYgL59gDHgwud68Quz5J2HLGBWT2rqHB4Fcpd8fEjEOGv", + "hexKey" : "af3961f4fcac244a840de1f5c490807c", + "keyToEncrypt256" : "d261498bd39cdb71bcacd216a97404c682166c46d35c4ba46eb5635db11d82ab", + "keyToEncrypt128" : "5a0b74a11cd4d1284ce36e775f81bb9a", + "encryptedKey256" : "AaIi4ZwmhHuPynFTyNXfWCDe0etUu/ZvCbnZaZrEwEE=", + "encryptedKey128" : "rGHz+t5DBY1dcqf6cd10+w==" + }, + { + "plainTextBase64" : "gfsIdpe4MZc3VGGCO2UK6ntuz6A20fFAlg==", + "ivBase64" : "2XLqRVtc0QTOgeQv8+D37w==", + "cipherTextBase64" : "2XLqRVtc0QTOgeQv8+D371NR6Ea61oFEMP2GFaiUP4tZc4qPDFJRZjFo59+z84IY", + "hexKey" : "69d1d0b0a614979dc6633cd7e47b6326", + "keyToEncrypt256" : "3c32ee569fab9273d6670c14ed461a6da83a017af1fb2ac89532b8aee117cc58", + "keyToEncrypt128" : "cf6beda2d0aa77cb4ea138c49842405a", + "encryptedKey256" : "HhQs2gOzM1wzlBfRW5s+G0tnP/exfSS2jz2zkqwbLrI=", + "encryptedKey128" : "LqvyQokVmIpgYpS0E5NQXw==" + }, + { + "plainTextBase64" : "gZ3WkYGNj8OnXhTuTvoW8kAmS2lSvObz50M=", + "ivBase64" : "nAljdw4M7MPLH7G3ZDwn3A==", + "cipherTextBase64" : "nAljdw4M7MPLH7G3ZDwn3Evu01nZDgcvvV2l8s6xOBxrfofxJYVF7luJy8e2ZGR+", + "hexKey" : "08f2d545b879865dff6980283d36b1dd", + "keyToEncrypt256" : "b0585a7767f56cedaa9c0dd511c19bf3f303faa9c18b1daf74adcb6b6e37aa8b", + "keyToEncrypt128" : "e9aea2187bd9726d37cdfa19b758e843", + "encryptedKey256" : "2PrfhGI9BvdZBm6fdq2xoPGfdZxbG0BWVcFKO4q0fTc=", + "encryptedKey128" : "VJMvwXk2dCUtTKKM2ogXFQ==" + }, + { + "plainTextBase64" : "gi6800yhRbwpgQZEhApXBGhMPqOUt/qiO3NZ", + "ivBase64" : "geN+oozggPPOorm8ZSjezA==", + "cipherTextBase64" : "geN+oozggPPOorm8ZSjezG8OjtVN6NFq87y7q6DaswFjYLyZVOr5eBkPPaS8uaNT", + "hexKey" : "c21cfe4fe3b5c85a85e568eb1353dc53", + "keyToEncrypt256" : "e539675221f93e161bf354d7054a980dc78c6101ae87f6f74acf10cfc737f88d", + "keyToEncrypt128" : "ed29a9a1b8fc3ec7194ab1ad2a8290a6", + "encryptedKey256" : "L44U11LnyvoAq1dbfVR1IuXYqFOEorgsGm2OJosxbeE=", + "encryptedKey128" : "vd8hhShCnui5A9BaBR19uA==" + }, + { + "plainTextBase64" : "lzVwyMaAgK9IHTuX915iKTkmajxslF+6AwzxQQ==", + "ivBase64" : "YuhxPvVFwJ8e6G7MaeaXQg==", + "cipherTextBase64" : "YuhxPvVFwJ8e6G7MaeaXQjZEne7goOIMCW9qeIDMg9vcSatdqhlXgqM+jTR4u+eI", + "hexKey" : "137041bbff5bdc1febf776e69b965b92", + "keyToEncrypt256" : "b323ab4f5ad459f5cf24d057fa359ed26e5ffc6e9a213d8ae183ec2694b2ac65", + "keyToEncrypt128" : "37cbc63a1691d5bedd699bfe7504d283", + "encryptedKey256" : "zAqzYktDkNgm+Qq0EAjybqrOgvr6iT5gNQ4bD6EIN7k=", + "encryptedKey128" : "bvWL18XC5bKINaC0m8NFeQ==" + }, + { + "plainTextBase64" : "sa5jKeXOZMKgIlZRNe5KstzKJkQFC6cPU1ykFK0=", + "ivBase64" : "jTBhfnNRkAUmdKYTnu7XxQ==", + "cipherTextBase64" : "jTBhfnNRkAUmdKYTnu7XxS7wUSMU2PmmDjZu27ll6kLv9L0G9aaOxaXIVV2N/Uqg", + "hexKey" : "b0064cd7c541babdbca28eba5fc2fca9", + "keyToEncrypt256" : "2b9f9a005c7ff2901ae5a3fae83e8e061346592bd99bba96e42039173fe2d79a", + "keyToEncrypt128" : "24a3a0318c357ce3240db5d549498d9f", + "encryptedKey256" : "mOV9j4WJU+xWy2Mw+WlfuwIwiJJgGDDCurb2Cg4t00A=", + "encryptedKey128" : "gu4lfr+nRB1no32cSzcMNw==" + }, + { + "plainTextBase64" : "o/Xxdq9pIfP042gnBlwgBkCRi42vnluS8yhOU6Pc", + "ivBase64" : "KZhW2O22razsCBm30NpA2w==", + "cipherTextBase64" : "KZhW2O22razsCBm30NpA29a6XKENA1FzJj/K3CnJNhn5rNZjoRoRPWiOzswM+QdB", + "hexKey" : "48ee3f9471f28f765d88fbe2426337b5", + "keyToEncrypt256" : "b302312e529a93db9a1dc65dfa579062441d3e218d166e9f0083ace7ed30a21f", + "keyToEncrypt128" : "4cf511ff1d38061f1d2026829fd817aa", + "encryptedKey256" : "FQDmH02Db3VTcxInch8usLkmQ7aBwUblJT0RKaT8lkw=", + "encryptedKey128" : "kiW4NXy6zLNbdDXlL6JGVw==" + }, + { + "plainTextBase64" : "w5Rv/9cBAGDZuIOyf26EVZpov9TDf2Qg0uE7JLG0KQ==", + "ivBase64" : "x7McrXNlopSueilEVFB6pA==", + "cipherTextBase64" : "x7McrXNlopSueilEVFB6pErROiJ2175PY9BErqzHuwVVkBjL6zStYb/YWWgUgnJj", + "hexKey" : "0cee63ad5bd01323b784829a51a26fdf", + "keyToEncrypt256" : "07561d433182b70166d82a9a740d0c6e70a62998736316ac1918fb667b87351a", + "keyToEncrypt128" : "dd6f19adcb0feb73b2dbdaa793e394c9", + "encryptedKey256" : "NLboBkH2EO/nnATaM1eE/aWpJ34QddmTez2TLoDaeVw=", + "encryptedKey128" : "jDyLvxir40SqEy99IA/xfg==" + }, + { + "plainTextBase64" : "wp7eenCvLWmV+cCElaE2g/CTQmQyx3/EcFcWkQ7kf4Y=", + "ivBase64" : "TofJBwI2jodc+oa+KmVbVQ==", + "cipherTextBase64" : "TofJBwI2jodc+oa+KmVbVd3N9UQap0LuUs8hzPrJAAI35e3fnxDuFuLU2zSdPQzLk41Pigb2C1cfj0wnGlCVLw==", + "hexKey" : "54b7f9829d2545c5c408488d54258873", + "keyToEncrypt256" : "1ac79eb80ccce3f3e27e0c8d6c03b0b58d75342f16ae41ef16890c90525ffa14", + "keyToEncrypt128" : "a9ba457622a8de17dd5232bb93a65742", + "encryptedKey256" : "IHrgkoYSq0pt8wfSrfhhgP4dMkMHE1VONjYuupsfjT0=", + "encryptedKey128" : "Ka2sv5Vo6d9fxLu5i+2dnA==" + }, + { + "plainTextBase64" : "/mICBU1zx0LNRlsH3Asmm+Hd8dvEP/DZ5hjC6UmA0mdk", + "ivBase64" : "1gdgq157jYZVR388AJVGPw==", + "cipherTextBase64" : "1gdgq157jYZVR388AJVGP9FFCg271ey7hrdlRp58A8Z+m1MFRqte4iftPghe2fCLEP62Len1f4QvRCNd6XyIZg==", + "hexKey" : "4a4a7c25608abed8143317b3a817dde5", + "keyToEncrypt256" : "9306c95101efcdaf4e8e7c26a217ace4f0d42ae44ada449c75ed69a69469a484", + "keyToEncrypt128" : "9555f7b36a876c2023e79b23c5648807", + "encryptedKey256" : "X8zG6lc+9BmB5+X8bbovvyg7gnxDApyH6Qzju6xfeGs=", + "encryptedKey128" : "a8oNfXuXnRWG6dewhSm3lQ==" + }, + { + "plainTextBase64" : "bh8Q/eDsRIrwATE0vjRuMye+Jn2wUsnSMHCwDkFtCmDFmg==", + "ivBase64" : "bw030ttACb02wHT9LLz+OQ==", + "cipherTextBase64" : "bw030ttACb02wHT9LLz+OSyrH+55L45J6zKMi/jXF6pams01GsV2tWZkiJ9MghGvn4s7FEbXaarpQyC33wE6ug==", + "hexKey" : "a0a2878046a5a6bb386ef8c463964e62", + "keyToEncrypt256" : "6f135ef1eb7b0198b1fc50797a3de1618fb61bc346da511edbd25c520ba2069b", + "keyToEncrypt128" : "a37bbfb9ee954c144c75b79328755dd4", + "encryptedKey256" : "G9fymy5Jh5BIAKNXdrXFfB+gmmx+hgelD1Z3B6g2fBE=", + "encryptedKey128" : "m6p+ed3FyRDLlIQZ9sc6Pw==" + }, + { + "plainTextBase64" : "GkRAro2UJ/6VsdBiQ+UXoINHawIDIlZrQaGAi/izTvcoiXI=", + "ivBase64" : "ec6PFCeFDDFUFkAQz/9LLQ==", + "cipherTextBase64" : "ec6PFCeFDDFUFkAQz/9LLZHjFo0NgT36Wc2/Eqia8aLwvWDYfunQ6NA+BgCkDYiqKYuabkYotK7Dig/jA2lVaA==", + "hexKey" : "225268dd3762ca643cf16d5c8c30cbed", + "keyToEncrypt256" : "b3ceb12754e784a1231db554f98a1872521dd9aacc633885cf0e36e0c7cae2b8", + "keyToEncrypt128" : "4a08c45036bf6a56f47a9a1e47ce3de5", + "encryptedKey256" : "AawLikFn0IsFjbX9yh3BhGAnIm1anjP4OArlhpwOBIo=", + "encryptedKey128" : "+XrxIlgnSj1/sJQ/ex/jmQ==" + }, + { + "plainTextBase64" : "9fa86V/EIgqo57i1Lo9grTqqTdLKm73q7wdoVfIHTTGhl+QS", + "ivBase64" : "qeqQ1Iuewf+GYwvyIQdmZA==", + "cipherTextBase64" : "qeqQ1Iuewf+GYwvyIQdmZLpr7AOj55tvQav5Ub3gHdLOwY7xe0lW9csHvIoPDsKNu5bTJvva2Rz32NKbwXiy/Q==", + "hexKey" : "f8f4c684c1482d86411fc590f037cf65", + "keyToEncrypt256" : "858d53360b92d6115acb1f2f9c4690caab6e3c6ce7a817fac986301c0e3aacfb", + "keyToEncrypt128" : "967b9e60fa05798c47e4faf11389030a", + "encryptedKey256" : "ZKVX3JjsClP4V9evKekcAuj3n/0kCmDPsg1aDXpArt8=", + "encryptedKey128" : "v0yGoBF78ED8EgWvKg6tMg==" + }, + { + "plainTextBase64" : "GiWbvijESwHeqv0QWj9yqL1SQ3k5jgdI2NTrm+6YRax4CELcpA==", + "ivBase64" : "d/Qoj8Dp6WbxRRMvmL6Nbw==", + "cipherTextBase64" : "d/Qoj8Dp6WbxRRMvmL6Nb7O4xPhKyfD0fECUE4Sbu8OxfWsaULdL8txpIwc9pKtkp+hSbhs2bxhM0PiyuvXMNQ==", + "hexKey" : "7a95eec19bf398aa1b35c328369b59d5", + "keyToEncrypt256" : "f0a31dd3616ba7e6feae69693c2041102454124f00d3e9ef835ad37976cd6460", + "keyToEncrypt128" : "645af3f2e6612dce30800d6558315c55", + "encryptedKey256" : "u3jqSTYZHfkEaFocrpDRgX36soS1jy13UqF0+nA+lZ4=", + "encryptedKey128" : "EPeWo31ER5HQn8k2K+icHw==" + }, + { + "plainTextBase64" : "Qm/YfpsgLWOTxg0RxCWud+oRvSa7mP8UO/eAwPdiUCxfwRfveMA=", + "ivBase64" : "ycTbrJ7egFQAB+56dHd1Yg==", + "cipherTextBase64" : "ycTbrJ7egFQAB+56dHd1Ymx55dplTNLILrkawZYUo6IiFrPuvZZx6TnL47iqEqJrsyCigNa4NEBwhKzKkq6fzg==", + "hexKey" : "00121adb1ae15576a9377c3493027abf", + "keyToEncrypt256" : "4152f5e2515c43d83a46dc8145d7eb78b236818318083c9c906b40df53ba761a", + "keyToEncrypt128" : "34779ffbef7de7117fd0f044cfbdfe57", + "encryptedKey256" : "SawRx4UgDusQAJ3jbTK9j4prmAoJvY2b9UsOz8hGkZg=", + "encryptedKey128" : "uvDq2q0YffpnodhP24GYCw==" + }, + { + "plainTextBase64" : "h7vuNBIAkZkG+DWvrWEAod8qK7PmIVG3lxKOePUewx+zM39HmjlI", + "ivBase64" : "tuLisRwEwlEknVjetsyMgQ==", + "cipherTextBase64" : "tuLisRwEwlEknVjetsyMgYCqWhKdMh5KhLDwFoHyz4/UoyyHwaISw3stQGtVv0nDPSNAct8saPIsjl1uZ92yoQ==", + "hexKey" : "d94d5057ebbaff527aa82dd0e2b55cd6", + "keyToEncrypt256" : "afa8c63284881a5ca6cac48fb37a38ac396765baa2de197982ad601c13e47f2d", + "keyToEncrypt128" : "16a40e7aa0bd0406e5867072733632c6", + "encryptedKey256" : "xfqBZK2DcYdqJuvc34CZCU8znVPqFYktIelSvwyaHi4=", + "encryptedKey128" : "rV2PT52lDe82SupscMhj7Q==" + }, + { + "plainTextBase64" : "g7JfQbH3LELnPEkE3tbdGPyYHdOEpkDXbsBHBE2GK2QnlfLYvB2q/A==", + "ivBase64" : "p5FYWxNkYlHzaS28rFiwrg==", + "cipherTextBase64" : "p5FYWxNkYlHzaS28rFiwrtfjJeWmMfY/3Dlya/eqWLHX6y7bkUqQT3/qFoNw4GsocaNSdULfORXLe/6OUEgpFw==", + "hexKey" : "20b365a500baa950197289692a50718b", + "keyToEncrypt256" : "f9f832f67f3a777c6c6847102a47a5bf426bc5a6e267cc5cd2c4e0e5fdea1544", + "keyToEncrypt128" : "744e78736b4b0235d742fca5d857af2d", + "encryptedKey256" : "RKhpZF4vhdEqwqwj6Hmey6Ba3dFvXm1udJazOEdNPRU=", + "encryptedKey128" : "ASssns6N8D7MbpWvfGCcUg==" + }, + { + "plainTextBase64" : "oBzvJMw3sAi3vPke3z9JhKbcnLvBJo55FHQxOcRLEk5TVJ60Rm+B7Es=", + "ivBase64" : "dWzzjzZlXp5pEcnnAvqcZg==", + "cipherTextBase64" : "dWzzjzZlXp5pEcnnAvqcZjoTQIURXKTfpDUpiH6SmloQ0ESgOR/1nyjJgWjNu/HMbBaNKFuxqj7o4rkSgm2mVw==", + "hexKey" : "57196353c6e2a8b06f58013df47fd880", + "keyToEncrypt256" : "9044ed506bdfab1ccfa0483665e024ffcf396ad0426b828e7358c692311a1b7a", + "keyToEncrypt128" : "4516ca3c0545a0a56d3faa8d93f23dc0", + "encryptedKey256" : "+aQXu2xIC6tXXezdLhkjJGLev8RtLpppAmlp/OvcinY=", + "encryptedKey128" : "jaybhnjhYnsH0OvCfSfjJA==" + }, + { + "plainTextBase64" : "RevoJtCp+K1Ey4zv6y6rVnSjz8OQjP8ZjsLzVDVFL0joxQ9ux0jjrGVb", + "ivBase64" : "P5VX+1WyVDAnUNUCaVi6YQ==", + "cipherTextBase64" : "P5VX+1WyVDAnUNUCaVi6YdzX00KYcSF9t0EAQBD5DGHKLIGzSiMc6oydXSpL+tRkVYt/Meg22joffoM/WwwKMw==", + "hexKey" : "efed4061356a3881832ea7ce92019b9b", + "keyToEncrypt256" : "2b3fecbbf5d31ae07e1bb5524e4696c13c02355cfc03c87b727abe8026cd6a8b", + "keyToEncrypt128" : "28af1bdd5898e82eaf7b0a45a6c3b585", + "encryptedKey256" : "yw6i5m5RNGT6uyGdRGDxeCNJjHETts4OBLUE1bMSvfY=", + "encryptedKey128" : "X+17viB//dJYhXEVttKM+Q==" + }, + { + "plainTextBase64" : "dNpX9WXe0+0yrmFLwBeV0Mc/oC228KgS81iSu9u2SAkyZSk1RznaImGsXA==", + "ivBase64" : "ExQFRIemgkG8lYLn9XnAgw==", + "cipherTextBase64" : "ExQFRIemgkG8lYLn9XnAg9rdIl5qIc2H45WnTWQh1oguR782GFwLV6TbrchdMkul7ywp1duDy70pJm9FDMaCzQ==", + "hexKey" : "b3014addf0e77f76851fea3f91cb1382", + "keyToEncrypt256" : "6caced803e521788b9557583b904c61eaec45be95c5dfe2c0e5e767aaf992f33", + "keyToEncrypt128" : "ea7ca3aa393d3982186c9fe35777d160", + "encryptedKey256" : "6TZzoIN8S066bqjVSqjW9leGxhSNqFBFPs7813F2m7c=", + "encryptedKey128" : "8iFlUpnRbVeln+zTkrkqFg==" + }, + { + "plainTextBase64" : "57JB2qqG23gQ7RDmkNJufMP+njdGNrPVNGB2HFQ+ikP3LFU9QwMJxRQhCME=", + "ivBase64" : "CuD1YVZiJLpUwP2gcWNocA==", + "cipherTextBase64" : "CuD1YVZiJLpUwP2gcWNocKP5VxIuGQxoUvJvT20eA9rmXkNEotqEb0rOr23+Y1qSsMXIdDSXBc+yJfNW4DVWig==", + "hexKey" : "059061f9882c918820fd575a4ab8984c", + "keyToEncrypt256" : "949e7ec683c17098d162bc14fb5acfb402962b9101faf9d1c9848bf73de30b36", + "keyToEncrypt128" : "cf042d1422c0c8b08b51014c0759c16d", + "encryptedKey256" : "2WzF2R7JgrDW1GF10LMc1TF5s10qxhXRIs4GbBCECvw=", + "encryptedKey128" : "B/cGQxOYEnmBvtfprqVhuA==" + }, + { + "plainTextBase64" : "3GKw0APYHar7ydct9J9Y6mpMdUDsuhkVfdqBoZoRG61psnM4AIopa458r1U/", + "ivBase64" : "ajcR9CoNG4hhhbrdIVsAyw==", + "cipherTextBase64" : "ajcR9CoNG4hhhbrdIVsAyz0aHkKx4yiSN8UZ6ohTLf68kKMopNxadw7pX+rtOANGqQ57WBzXbxV9hWYEyG67bA==", + "hexKey" : "3952017a797984c54916c42fd299636f", + "keyToEncrypt256" : "a1bba73e0bcebac5a3402feeb9504178adefcf7b185629ebaaf4f1b535836fa8", + "keyToEncrypt128" : "ae7b4611b60403f27924a0db1b36e77c", + "encryptedKey256" : "h3M34UI8y2qPLDtapR2ErnkN4ec1uqIZAI4m986eL/0=", + "encryptedKey128" : "mvBhbK7EpmjswZ0dlKOVmA==" + }, + { + "plainTextBase64" : "icUOLqvtZSll3npP/NdFZsT9Rq9BcVxUJ5gBHtUU8/Atc8CjU/1qYjo3yyR7vw==", + "ivBase64" : "K1gYwX0YPxNqDZDzPMvIgQ==", + "cipherTextBase64" : "K1gYwX0YPxNqDZDzPMvIgRdadRKqDrOPKU1l42gUGS7KGAP8JB2Ec0gnk5UGAnQ8P8TfkwNnBugM+2A4VC2Zfg==", + "hexKey" : "883b9a41e00d1fa243ba847d9fc4e8e1", + "keyToEncrypt256" : "86eb1c44ad7508d0a544149d02e3c32b78d96afddd761282795ee08af3eefaf7", + "keyToEncrypt128" : "adc3efd19b832e5e22e060f3cb944bdd", + "encryptedKey256" : "BCZ0UKRsACMqjHlCSyxaGhAlpE9Fax491HrYEfbXseg=", + "encryptedKey128" : "rN8Lu7nSJ762Gdy6EkIUlQ==" + }, + { + "plainTextBase64" : "Xg2doG+dXiPGMGL9VQ02PJx9Vtfik5CxsDEF/niAmZeamq9Hp1DCVf0QaMaguxE=", + "ivBase64" : "WCuJj80vdHwDFI5vN4xJCA==", + "cipherTextBase64" : "WCuJj80vdHwDFI5vN4xJCFka2TTdB+ANESs2n/d8uakTpYdXkt83KpygZxrm+rPES0U0uyXLQ2iLvUspLmEK6A==", + "hexKey" : "cea3d0ac8aaad027028e07008f530d17", + "keyToEncrypt256" : "957486ef8ccf360c6b2dede2fce29d2628a468ebe5deb0dea32155bc388713bd", + "keyToEncrypt128" : "511769e2620a7c3f11fc867ec99fdb5c", + "encryptedKey256" : "J86xgONFaTNY6MyzrWlSSdiALbx1Tx3/Z/WTd29l4lE=", + "encryptedKey128" : "Rye6mFi4hfAbnfCvHWSpKA==" + }, + { + "plainTextBase64" : "XYvCAlJ2ZsDKgPJhjQnjES15fk/Nof9w/em5DJqLjE6ZigwWn1UwTrqJ4fJAZ+ej", + "ivBase64" : "XOZqN1vAZkY+IR30agAkCQ==", + "cipherTextBase64" : "XOZqN1vAZkY+IR30agAkCaHhEyFh5fxdIS2bulgYhxKkpFzjBkYnQhWknnRfQSlRTgbY3ZXP6VFjnxKlfb3lCq5PjyMBoXDM8TfxLoUw//Y=", + "hexKey" : "8e409617ff5032b4a5e2ecf2269a9974", + "keyToEncrypt256" : "9be8907f990a2ee3542219266525a5b7b8a5f315da4009da7d2361cfa185ec97", + "keyToEncrypt128" : "51ce220e281385551a2838511d6529f6", + "encryptedKey256" : "E+xhnOgzvN+HS2R8giU7RYDS/Kya1mbWF0Afmgj3pNs=", + "encryptedKey128" : "07iu2a/4TkSCxqW+PWetyg==" + }, + { + "plainTextBase64" : "wF6z7jocMcpTdW8p+qAr+yQmZFKEKwnv0qVt8DBjpuRN3DAnjf0u9SNpdkMY7Qk0pA==", + "ivBase64" : "4mRroFBim2J+6jaGuTZaEg==", + "cipherTextBase64" : "4mRroFBim2J+6jaGuTZaEgG/r5D4zbUHKWNaYH7UFQQZxPivkekdH1R+wU4TEbjK8NWKc7shuFWqmkItOTbCCxqIcQtxSuixuf9an9E48oM=", + "hexKey" : "ea860a49f5c63cda49c8fd341ad63427", + "keyToEncrypt256" : "457975f1d59bf1fe73a202f891eda4f4d9265535e3b957dd25c2d11f2e1a5c2b", + "keyToEncrypt128" : "118c7afc7946904f101d3b360063a959", + "encryptedKey256" : "u8bkyScK+JYXaIHu560Q6cNDFp2Jrru5ESj/WBwkXHc=", + "encryptedKey128" : "XuRAtRU/bOcrOm09VIW/fQ==" + }, + { + "plainTextBase64" : "IROBva6WHcHV2ec2gVtGEUuJF8uns3Boj8dxAOokVd4cdvcsEuXUQ4UTwCT9RGhSl+E=", + "ivBase64" : "GT7RFUywQtb+9dFjMLEMOQ==", + "cipherTextBase64" : "GT7RFUywQtb+9dFjMLEMOagFZi3m7GdUNdWWUG5xJYW08lDxnsYxdAKJ41w3GkdIj2GCxsj17uwByfjAjzeoCHpGrG/ZXlkN5BpUR5P5Lfs=", + "hexKey" : "2edb895d883b2c495df9984a227921d7", + "keyToEncrypt256" : "f36ef1035ca2f0726a399a41288170937e94d031f5784e016116443f7f8df953", + "keyToEncrypt128" : "0c851bd31bc8f39048b447c73d4ee573", + "encryptedKey256" : "sgZL9KhDDIAM0Zo6tzSQ6CyKYU2+xhndLdhql4obimM=", + "encryptedKey128" : "BfSfuMG0X7o/Wp/wZXABRw==" + }, + { + "plainTextBase64" : "8FCR4PUfEwl77KsCYZmO/zlJx3qQHAnN/0UWxJ5iTBDMVyFwj18h0kXnO/y0xvCI/ctv", + "ivBase64" : "r94v/MUQIPx30NW1HQcpEw==", + "cipherTextBase64" : "r94v/MUQIPx30NW1HQcpE+LOe+GJFp29Od7ITwLnqp8h1iQB6CC71c8dyYWXnQWpOsdq3ZUhr0Ws2O6+s9zAWgc3sobmqIZXBkmdy/OoUxE=", + "hexKey" : "35092ed9e0e24d8fe1ec8021edff22ef", + "keyToEncrypt256" : "65ae75eaa0a3d692f251e0cbc54b063e56bac93b220fd8a03e3ede1c3789e857", + "keyToEncrypt128" : "7c125eca7c9d3521fdce7698925eab6b", + "encryptedKey256" : "2Ipvc3B09boLBax/WfpXvUi1bSnc3gVbbky/5Kib+Bc=", + "encryptedKey128" : "M8cqwBf2tAiII6IP7jpBRA==" + }, + { + "plainTextBase64" : "oIVLXdxMHpTHw+jsD8bSwij8rskabq5RuufjMNNUnBUBIYIqzDhokmI9Zn2jR20+h0aZGA==", + "ivBase64" : "ndCuu9F4Yo3+mDMmkCeHmg==", + "cipherTextBase64" : "ndCuu9F4Yo3+mDMmkCeHmrLkEcovAuAcovge85JE7MMTTZKP/NFxB2/1zIOPTUkB5inYidoopveAmfxi78bzQGVSxKBbBXBCGxmPRIboVT0=", + "hexKey" : "64e005228770982b6a0132ffbf9382ac", + "keyToEncrypt256" : "e96a36c3271c893aaa0de52ec7abe5a8ead781ef38f81020587e00c7b4c08dfe", + "keyToEncrypt128" : "4d362803894804a351d202942c197e72", + "encryptedKey256" : "a+cnUHl0lxQarHKWQgAsPiddbcSUMUWUHU+DpDkaYpM=", + "encryptedKey128" : "XP6F+42VSilZvEaVbXZjeg==" + }, + { + "plainTextBase64" : "+jbJLvcEpF9gKAOoccHd/8A7UYO3VPxWQ6HmVr2gh4OloerMg/DbomznFLEIttfZif/6ghc=", + "ivBase64" : "8G58PZhHGRd/VIDT24ZYZA==", + "cipherTextBase64" : "8G58PZhHGRd/VIDT24ZYZKyXTKL1nPwhnQh4vsDWAteIuWyrSmeMX9zK40iMyCZKGRMtjj5W4rQp4xQ+BUHDjGHqhF1To0JvwCs9NQV8FpE=", + "hexKey" : "2e11271f1ce710e587fe0ab3839ab8ea", + "keyToEncrypt256" : "fae42f1d8f9d2eef1b5c99f23443d0fa73e89154cc24a49fe3d250671d63f54e", + "keyToEncrypt128" : "2784281f8a437dceb7b02cfeea544fe7", + "encryptedKey256" : "0wtQM2CUuCXtBlOuuHNwDzLIIqYFxicItY7WjFuWEy4=", + "encryptedKey128" : "dSim7dsceTGIRCFcDfBPWQ==" + }, + { + "plainTextBase64" : "s3M3SOCUmtyE036g3pBEhxOaYkN+YUtteYDdAOI1z2I9gZBT3Tx+RwwhXkDr33QGS5q+yYrh", + "ivBase64" : "ILXQma+lOuz7qs/Mcr9hqQ==", + "cipherTextBase64" : "ILXQma+lOuz7qs/Mcr9hqZymZSkuPLTVYgLI3URKaENto7EnUF0kn7lJ+pCrnQDAi8gtNt89/h6vmCm45AMzBVHcKfI2HqPyH4hWL+Xfc6s=", + "hexKey" : "8e7f82982fa66f63b7b27040eaeb26eb", + "keyToEncrypt256" : "d26a294af43f8d763419dcecbe6e6a4c2e75a6727e343d94d62dbf270bbb9966", + "keyToEncrypt128" : "97ab58792480a9de991200895ecd2654", + "encryptedKey256" : "xN6GlfN6nMOC2FDzOB/+IgD0u/irdJovaPdsvzz3cBw=", + "encryptedKey128" : "K/F2o2OMt4zckvg6rO1y7w==" + }, + { + "plainTextBase64" : "XWws9Fyjt4GhrBVOGPuVF7pokPKAYXXC7J0U5jk/zSYSylUQEG3RTSse6j6bs70p2aCDf59iAQ==", + "ivBase64" : "XH7SyxOG2epj3S/jM8lgHg==", + "cipherTextBase64" : "XH7SyxOG2epj3S/jM8lgHgJ0NgLwLdHdPzNDplTViG+ZOm5L96El/7f0PyAZ9im2BKNw3djeQhiPPfSwx3qmZQcT0TcyoTHzYIhVWMeuPPA=", + "hexKey" : "f1dc2b16dd25a369a402d4cb1ffd8a3c", + "keyToEncrypt256" : "0adce219cd5830a6ad05e59e8f1a84b8f7e4538c7bce9545a73d837f4725dd22", + "keyToEncrypt128" : "44633c9d0cfdc6d6a21f8d08d34a3deb", + "encryptedKey256" : "QtA2T4nejcH9YPtb2vl7JcJ7fvM9CuN9zlpRuZVLtCI=", + "encryptedKey128" : "zXRwuHw+Rm19QAseb9WD4Q==" + }, + { + "plainTextBase64" : "ShKK9rmsVeLHj1LbbKLvQXHgGofxC/aUyBp7jsh7YE5HjOktrXNvMg7vLECKYq9c8QKbmpHNs/o=", + "ivBase64" : "TfJijkaQ7WDaT7w5vGw7pQ==", + "cipherTextBase64" : "TfJijkaQ7WDaT7w5vGw7pSKpn2z0MuFzwVCXNwQPs8Gummq0fnJ/PYjYZ4oFaKeQSO8x+dmq97i0pwmrTJPQLIKAq8srkCzm1w/f6u5YAEg=", + "hexKey" : "5a461995c9795512ae1a8e4a7291eafc", + "keyToEncrypt256" : "049f36ad4e840232cf6bae492fb017228cb47fc8b4ddc7b9f007a813b3fb8d24", + "keyToEncrypt128" : "c2d043f77881ea496829534e54f4e92d", + "encryptedKey256" : "K4/2W31rQdMyGp/3b/Zs24f991EoShK8c5jlMMzjLak=", + "encryptedKey128" : "FXYEoLNEEiDwonVuqYWI8w==" + }, + { + "plainTextBase64" : "b4Eh7fO6rfsv6DyeG+QvKOt4bCFWULyB92fWxFJO9sLKNAkL3AKPZzKFKPvE9kSlGhXo7tNTjh0U", + "ivBase64" : "mVusCV9Ky8z+ibedCQsUBA==", + "cipherTextBase64" : "mVusCV9Ky8z+ibedCQsUBJ2yGJ/BJjnpxCugp3XLCMHS1+m5BJpNh4jhVWCu0Kt4hZ3vp7Pj4Qy7hbL5Vzh1xYDzgjWPRfJisKbmVthkeao=", + "hexKey" : "378be216d5a85c0b57d19c27b8a5b5c0", + "keyToEncrypt256" : "a6a846b11801612bc4d42f03a13730e25dea6e7e8636926a02c3e44a23dbf39c", + "keyToEncrypt128" : "16a54f3a62f52baccd630f264113fb7d", + "encryptedKey256" : "z6BTt090p06nn8GEN0vuVu3UDmlmkitQrZWchcHiTZI=", + "encryptedKey128" : "khW3RCmsFDuii3f16Bl+tA==" + }, + { + "plainTextBase64" : "gSHkOtDRRwYQ6l/tYDbboLt6MrY5cLOZDEbpFsQc7L+mEaQrfIdAXITuhDTk9+uFQWgadgPSfVP6UQ==", + "ivBase64" : "nzdFc3wBnEpidanefzSd/g==", + "cipherTextBase64" : "nzdFc3wBnEpidanefzSd/qy6pFisL3gAc/bqZFxpnMYVkFDAuYwXoUMpNb86G7CISMWew2slSXDlCMxs+GJ2LBgLvlXFWVPrjL9cT9LuTGE=", + "hexKey" : "a5b4afade60d5135e826fe7dc7f65df3", + "keyToEncrypt256" : "8e461538aeae7b5342925f1fdce1798582fa6c82381acca62d455887f43cd332", + "keyToEncrypt128" : "287bea9293c2cc44afb1a8036c2f261f", + "encryptedKey256" : "RRYFl0NyPZqTvjliRVJHyStcpXDum3Nx8O+NSdEdQK0=", + "encryptedKey128" : "gc69p2YAy8fUl1gz897oEQ==" + }, + { + "plainTextBase64" : "Y30jOoEQmt9DIbH41+KoJZ27gskZh9oWYF7hc34NCIs0IiEwCsBXCKXDlUj5mpY36hs0/L0BN1OwTUY=", + "ivBase64" : "qb/Trigl+1JtX2LMTM88oA==", + "cipherTextBase64" : "qb/Trigl+1JtX2LMTM88oN3wOgx2L5JECGWU8HrddNQqSKE9I4y+7IcGmRSMfcPS7jsbNXpD0q/h4vt5YR4elG1U8BbIDgxhvC8sYB81ERA=", + "hexKey" : "4d874ab7a16611dcda417d0422b2c9cf", + "keyToEncrypt256" : "a5610e6e32380dcb4d5f267febfe168ab1a6eddfd9b2a128d60421d7e5835187", + "keyToEncrypt128" : "2e6aed41f1e702c453269dfc3e2e7956", + "encryptedKey256" : "ifJVjceZe/cVeLWSk5PW2nFq1Kqnq33chrtAD+EoiqM=", + "encryptedKey128" : "ouQ3RZnJxzLC2VmgFhtSew==" + }, + { + "plainTextBase64" : "EPuYZv18ldiVUGcSMJsf5M7svv9UqlZZNidpJaAlhnwgsTr/TJ7OVGsC/ohGdLcENyROCGsw6lSrA+by", + "ivBase64" : "v790SJegL1JAUwPc3uO+3g==", + "cipherTextBase64" : "v790SJegL1JAUwPc3uO+3ml3RQ7OsL+BUNAq2reCVeixdrG6xhHnds/wZo4SAe2CJl+auCcdx/BzkPbG3fOZLS3Rn8DN/SS1Vt8zRQ/zBv8=", + "hexKey" : "abfefea9e03624cc03e3ca0f8a38bdcf", + "keyToEncrypt256" : "397d1327ebf18aa516546f3b2b457f14c2bc934af0d52fac12c3517c5abe9204", + "keyToEncrypt128" : "3b729173f2aafc085bac5e96277e069d", + "encryptedKey256" : "eNUThmlwBbWSqLUOzKGKYyGM7n8hedZrInbrri6jzGs=", + "encryptedKey128" : "u8hNAcNlykomKoH4w4CZ/A==" + }, + { + "plainTextBase64" : "c/La1iXPYXYLemdKdzOUg+TExU/5V+Ffl0kpcZj8NBeyUgwcMSeQXEvrEB/dIVek8XTBqvbQsJfVz8/9/Q==", + "ivBase64" : "tKj0QHwQqfkvMCfmsWABJA==", + "cipherTextBase64" : "tKj0QHwQqfkvMCfmsWABJA834esnrY/4PfbbuhHB9TcwzWEhTV0T4BxTLabfamDWgPyN+BUSAxjDibusQOxvej8Oylx5FGduiVIleS9hY3Y=", + "hexKey" : "466bb75bea63d8429c1eec64a361b59f", + "keyToEncrypt256" : "6185d208f3600cbf4623ab0e477ab1a86d5f4e0ac6ac724c600912a5090ab9cd", + "keyToEncrypt128" : "cdd706c13904fa9dc780e229b6040717", + "encryptedKey256" : "SSLixlOyOYMN6Lw5q7NSQWEN6Rm6FilBXp0d1224DT8=", + "encryptedKey128" : "ZLhC+ZvOJ/sfQz+0LfxTQA==" + }, + { + "plainTextBase64" : "pb8efq58QbGjjKhwhEYm+TrLaYUNJk9qBee48ovYr5mZA80wEgROevrKb0KKSh95YEp4DUV94xRqMiPFT5c=", + "ivBase64" : "5T4PuJgvlK4k1bOHv2pO4Q==", + "cipherTextBase64" : "5T4PuJgvlK4k1bOHv2pO4YUaITgHpQkM/dPIHthXpLDM3zuNHdzf867tiwY9d1hX9m1WAz8Mbd5U5IhwhEdfvN5wjz9J+1imzOek5KhdqTs=", + "hexKey" : "b5a1e268517a944189ce93cc8601b53c", + "keyToEncrypt256" : "ad8fb4a9884facbfe7d65e992b31bf75780861870372a55518ccb602222714e1", + "keyToEncrypt128" : "1cdfbc187282c76eda4bfbd8371d493d", + "encryptedKey256" : "3dgzzd03mALq1wYdlfVfXRbsNrebDgAgtfbJkr3zZ9o=", + "encryptedKey128" : "Ih3awcSKorCrlpbcEw4eBg==" + }, + { + "plainTextBase64" : "QyLgKoue0imWEaIg3j0zVfm6a8UmpsqdwaCGi6CXUgtbwJXoC5l4eSI1B7BxKSAS017wvT/ITzeQVEZIvN/P", + "ivBase64" : "GYhVlR8mr5bbUEG8U8broA==", + "cipherTextBase64" : "GYhVlR8mr5bbUEG8U8broHF5Ir5INF2PodB3ivsOvNYO4qaGMQ5DOjujbpjGeEJtp8bga6m/hUw4opeyXPd9QveoCOTQKGs0VqqV9LaQY7M=", + "hexKey" : "937f9c6c566ccdf54532077e715dfc0b", + "keyToEncrypt256" : "1e0808185d0787b85b8b85a90e1fce29986afa66a5dd7e3fc90176a4f3e30194", + "keyToEncrypt128" : "a14a85dfae3540352a31e7f7c23a0c06", + "encryptedKey256" : "ccSwBoLJEbgDzUjkFcW+I2LFXqdHOXJECRnEvos2f78=", + "encryptedKey128" : "USw4A2zFAJLxzO/7R9AQUg==" + }, + { + "plainTextBase64" : "daDIxp42tfM3Zqr9GWzlGk85K0OIDiLYlgz2lGteLt0wIrWfs0xH/zwvRHjikYAP+achvcemwEetHvknL6Nijg==", + "ivBase64" : "Z87A6xxA+eqZv3RWFtS29Q==", + "cipherTextBase64" : "Z87A6xxA+eqZv3RWFtS29bKB0ophvFL0tSti/9JdY6N9jbcwaLxcPl4E+zTetEFszVTb8LCV0R94tXxhjgZYQQDPaT+bqo4/yzKc5B9syeoUAJ1Ohb3gVnR2vUWOCu2h", + "hexKey" : "3b9dcc9d224c430c631404fa76794cb7", + "keyToEncrypt256" : "db35f9fbbc48a1a74a40090647b37427c84956f1586371e80a2b2b097c886d13", + "keyToEncrypt128" : "15e9f5169cd814abe0ec830bb2513882", + "encryptedKey256" : "G+axlOqbCrvK71d8PALxCKVlLbpSFoqnS2yuzdXLm3M=", + "encryptedKey128" : "eEga4AEgDEVHJ5rKJzEG3w==" + }, + { + "plainTextBase64" : "x/pjyDVUqdch1C95LBuGTE9I1kAta2smVifmnNTzG0xKJ4kNucC8GqWkfUye9Jf9V/kR+3fXTLjckAfGtFlscuQ=", + "ivBase64" : "CdFa6rtEBkgs2Q8feTvUtQ==", + "cipherTextBase64" : "CdFa6rtEBkgs2Q8feTvUtbAHZShzpI83PUlp/sTmdRbnbYVeqW2gm2iVpSIZTC44CrSXVMNh7B46WkUSYLOqCe6P7GDGJTEdnLNLuXe/sb+lfezNXT1lpwo2LMNRr8OR", + "hexKey" : "7f897e27bb30f23964dfbd06799fba6b", + "keyToEncrypt256" : "8fb4cb1fff2279751fc48b24a68a14478701803f62f5ed58ca4800f288ba889a", + "keyToEncrypt128" : "3efaa51eeaa35570edf09faf29257c13", + "encryptedKey256" : "79vQq+okBM0RVQRYe3iWU6UJiv/E9OFE4Y02cMLZUH4=", + "encryptedKey128" : "VMYVfv3E9L3UaMri86e2rQ==" + }, + { + "plainTextBase64" : "sHRAdVeq/FKY6/KTMjTml4SibKyIzz7Bn1NGiB/KK7QFAF+fXOi0YkXx34vH1WALJIGqm4DEi8SDk1v/okSO4JzT", + "ivBase64" : "PLYypxj8evPFJ2hWAlPy1A==", + "cipherTextBase64" : "PLYypxj8evPFJ2hWAlPy1EBV01/peVbrFLaLcYh1mRfrc+115jcxyqASCZVTw8H3icgKCOCDn0KQaCCgBDKEAsvTDaV67t/2qamtaCNcsuI/PesV2090JXKFYUcbfQnm", + "hexKey" : "f917b98188ac37d52ebe37771cb2b78d", + "keyToEncrypt256" : "cc128e7c192fca02a84c30f0cf6a120eab35d9c3aa148622344ab214a04dc0a2", + "keyToEncrypt128" : "b79cb1d5fb5e062c69f56496ffd2cf79", + "encryptedKey256" : "HksebthmMDpoIm1VTb8jE7iXrc8y4v+HP6Vw3VHtxaA=", + "encryptedKey128" : "5iFeCKZoOcDSo3E1ywOG8Q==" + }, + { + "plainTextBase64" : "9xL3eiHqCAjl1II7lllGIeGdt8HLJ6bT+4Vt8vrs1tjJId1zvzt7NXB9PwIBS4URIIzbx5E0OwUkWJCmsFMd966+OQ==", + "ivBase64" : "CVzTbX2vNDkAMU+sKPDaJg==", + "cipherTextBase64" : "CVzTbX2vNDkAMU+sKPDaJlkbgn/TRg0NsSpPkNUM9/y0OslEE7fhDAKqG1d07Dda9WYgeBtx+hfQRqxcTbiUKUaBqVD4dAO+7iZp9rUV/vtzf3DXn3OhNQXUCLypUXKN", + "hexKey" : "1eeb9cc1c2540759b4ed73ad98ce1699", + "keyToEncrypt256" : "c399a740d9cf332144f6c586318f3f40c1d29b59c0c945cbc39760048c677b0f", + "keyToEncrypt128" : "fa246b675f9037e65b6f30b607be09bc", + "encryptedKey256" : "4QYrhWNVsyjPjLMidDE+blOlHhs/gR/DbFC4Bq1kftk=", + "encryptedKey128" : "0MbCxuDZJqqMGt2C1Zi9kA==" + }, + { + "plainTextBase64" : "uMyLIdb2hWdvI4Dw0lQIWyAjBhLycNA44bRZQRG81dMCudpaqKxDpIqFZ4b0kfG0hQeOpWHu8YkE4yUfO6fseSHUG48=", + "ivBase64" : "UlpQow8PKgMkicRbIm3XwA==", + "cipherTextBase64" : "UlpQow8PKgMkicRbIm3XwCQS7VzyphjYjczqXogGhvPcYExpAxYky3zORvorrvBtmajkTpJv8b7bj2CCcwzo2BaUmaF2xvEdGJO+zXUABynsaW7xUcomHySOO7QgwZhI", + "hexKey" : "6da1b675ed3b3b3eb26184a21574b4fb", + "keyToEncrypt256" : "507dde7351eaa34bea91a545a636066ccffa59d8be16c1060d44afacfa97b787", + "keyToEncrypt128" : "ec9c1ed1c2b1d25482c386e7d2ae382e", + "encryptedKey256" : "fGUxD7GTTa9i/UImKEILdQo/lRrq0ijM+y6edPi02U8=", + "encryptedKey128" : "jyEtHg6yMHjUW9GZs6IdjQ==" + }, + { + "plainTextBase64" : "FXwb2Gv0dPZvmCfvfs7Wa4EuOrTDVRR8NWn9p4A0lae7NWhazfqVojuXiXUHIJBlkp2uUdT3UicpKJlx4uePszsGrGjh", + "ivBase64" : "yxgdWpb3/hf0XI4yNGWUxg==", + "cipherTextBase64" : "yxgdWpb3/hf0XI4yNGWUxscNd1kMMjytZb247+1t9BMRhefnFhCPny6UHBHViqOgBMGYFM+dKN5zkgIAxYM6xxKjCIuRRtrXgKSXjKQw7rrRRb8hrmNIPTLFm6NcGygk", + "hexKey" : "f16857f88e8adef223f0437c995609de", + "keyToEncrypt256" : "b27102ad45ef6d5194cfe482339c926bce7442f87c96fbb3cd817ab8f3e8b0ed", + "keyToEncrypt128" : "db68a0939def04fe00beaeba86e5b031", + "encryptedKey256" : "1AX7kxTXd5NDYa2PwnjcpxwbKP/e8cVysHXYqEaF0zE=", + "encryptedKey128" : "AOAUvX/wHGdyxN+UreLIGQ==" + }, + { + "plainTextBase64" : "nOneMC8yDW0M0PLVFin252ewWKBRRKZoXDPiPSn/5l9XtXEZufYrdo8e27C06xDTELZSwQkVQNUTtK2/4rtS21yeUxXJJA==", + "ivBase64" : "7LsC257a7f+whRM+mhsxbg==", + "cipherTextBase64" : "7LsC257a7f+whRM+mhsxbv1B/W5QXf550RFwFTx4XJaYzCOMR8pwXNzWozows3IzR31Ji+iO/5eH6vsQvbUHNY8OJSmx8ihnVPKbrGEBTEKufNfjrcCGRFpHAtDV8ybS", + "hexKey" : "96e9465146d11c068e3993aca1a77858", + "keyToEncrypt256" : "0db4c786035dfeb84db68848965baaa771a692876a0bc0fa8fb48bc6a896642f", + "keyToEncrypt128" : "855e17a3071cf6fbfa6eb30b0cf89337", + "encryptedKey256" : "Btqt/evPuWaZtggcnZxhnTlWY242yU8UDDrregmz1Qs=", + "encryptedKey128" : "0eu50lS6oI3a3Y21g7LJEQ==" + }, + { + "plainTextBase64" : "dsFktagZ7GP7DIYARcfGkAUMhLZNnapr+1ULGq4t84CPZQ0LLEXcRFtSJNBowTvKc9NQ9WRdqvx/C7AsIzDQhR3aIpdWjuE=", + "ivBase64" : "uSd6fUhyifMPl9noPX/5Kg==", + "cipherTextBase64" : "uSd6fUhyifMPl9noPX/5KojbIasRJRWQN1VaXRTGD2FbTShzNmaz+aCvPF8tMSiXIg79zjJ5SVHQBb1kCde7SgE0fRGqM/Pmp2Zl3y62ilnQGH++W6XrbraBCAcDGp8v", + "hexKey" : "398cd5a33958cd8a405d12dd08f8c98f", + "keyToEncrypt256" : "dc7cd7db45e2e9439f5f5c61662f8167b2a19187773fc263eac0a4052e6f772e", + "keyToEncrypt128" : "05ba4e2a4beab5d55549ee66bf1d0992", + "encryptedKey256" : "nwjclYBTBK1ekYGIvdFT9KXKf63AbFPDpq3Jtyxb0pk=", + "encryptedKey128" : "YF/Aq2LOQgD27GW6eHg1lQ==" + }, + { + "plainTextBase64" : "z7Km6ORfg3fC6tmrJvU3aCZ8jIBWQcxB4A8V3tpGnWxiPHuNjtnsTAMO9QYjjWHEH48L1M5O6vIwLO/noJfWFUUDJukLclb0", + "ivBase64" : "7fz6o5IFRMcCZsXffpNacw==", + "cipherTextBase64" : "7fz6o5IFRMcCZsXffpNac72qDnyKXNYSHxG5Mwrxb3kqStQ28kRqASRVV+JSnzCcOHGSNroKauqBQOY4YZHL61/oHqUZo69Ir31EbK9hrJyF9Jf7PAo9qo1qY9Ugt6vG", + "hexKey" : "ee80261d71b395ac324f3e5a419d7252", + "keyToEncrypt256" : "59f610ae7a3dd2082f65dc7f909f56f2122ba117890b761796029b3cd8c1a12a", + "keyToEncrypt128" : "38393e8c20da6fcf9b31f5233509fa8d", + "encryptedKey256" : "KoWhl4+kJEH+XT2gPiMa91CSYDudtvtVGNqRUSoLvz8=", + "encryptedKey128" : "wFGAxkyW7FmdYnOgUk0TEw==" + }, + { + "plainTextBase64" : "gneoAVG4mSaIiO+n+kJFIQbTwmCN8ATyvDqXiBXPVfO4kt+SQbLu9JnjqU8jCkqjHgxRL93bPidR1UOMvwOzPAbO+3WbUcxGkg==", + "ivBase64" : "VPe6lFaqUJyBzVlUhsSGOw==", + "cipherTextBase64" : "VPe6lFaqUJyBzVlUhsSGO7Fl7qbZgvpZLMlis6t1ZIxW/MT2W5QbRxDytXn1d8JaOVYcWTilAkuODCovrekwK0m8PrpF9xd1J7RR4ebO/M2TbUyGvOEAWo2AWJ2yGIKZ", + "hexKey" : "1615ba63cb799525690ab7c9dfb2f416", + "keyToEncrypt256" : "bc71d1f6d1adce17dbc9ba713cbc29513e83023150bb0461c0642b2e80a4f419", + "keyToEncrypt128" : "e7f5c4669ce95605d054f3a3f8508362", + "encryptedKey256" : "CsmQNt/fIf8cTXgBnXfCfXv1rByuyfSTIxJm3pDHkYM=", + "encryptedKey128" : "V1pRqlKEeR8h2H/+sIKerQ==" + }, + { + "plainTextBase64" : "gcJ9aAcsI+TI5o1tyxe9ZGFcxIYupJZQBQnVRD1G2migMHj7zkKrK2+31AJ1ArX7GkEMq1tIQNweTjvBW51LtBTnlpIpoGgzp4Y=", + "ivBase64" : "2DGxwGr01/VdvDvKxBdjxw==", + "cipherTextBase64" : "2DGxwGr01/VdvDvKxBdjx+vB/4zMEvFgDyYCSES7L4OsxE4f6v3BWgWIc7+q0qlZ2pHCN/k5busMxNxVjhbaW9BNFly4jMPEWgpZsCWE/Rgs1382I1Is46GdMUUPRiau", + "hexKey" : "ee91781ce0129232393c3bb34375013e", + "keyToEncrypt256" : "21c8776f052c8a854913f5b358e36bf963efa2ca64789186029d99ca4569a901", + "keyToEncrypt128" : "fc5335fe536f42ec12582c795acf422a", + "encryptedKey256" : "p06YI1fTJ5HWb8vgISgwfBNZxiBXVzH+p8t46kZo4nw=", + "encryptedKey128" : "8LQqkcP9MIa8R7722GG5FA==" + }, + { + "plainTextBase64" : "hs1cBV7MSTDmyKJf1G/9A7fjfxCB37yt/R5X8qzgWIWfNKGZ6JHVOlqmiEZsrqRaT6Vc4mmVQCqfxoyVMz77dhrVFds5kSByEVGi", + "ivBase64" : "7xq/nmLa2r552xwF98CY2A==", + "cipherTextBase64" : "7xq/nmLa2r552xwF98CY2D0Pb9ZibsZ5hY0K5Ca5nu30PU8XMRcGKcStqCR4CqApt3TiWpBlasaoKd5mKSMT5e3/qE5wgZHZZhhZ/Wq93IXXD0Qck2u6QfRFA+EfTAgA", + "hexKey" : "7b04b3d2de1a5a88e4557f25e9dd3e73", + "keyToEncrypt256" : "894d36a42b7a3a81764972f80464fe7f2d001a2e24d5d27df9f2390d1e43ed7b", + "keyToEncrypt128" : "15eb4fb66b73a513e36b897fccda090d", + "encryptedKey256" : "qCp+9S54qbd2pqBrVPikcR71KuojYwKBP/Lc4ZDHD/I=", + "encryptedKey128" : "+D+ryaoeWhQstdm/VTZ4tA==" + }, + { + "plainTextBase64" : "Mgm6pMGtW7Wm5WwDOnIWsfOoOh8Sx9CK+P9wH2SvdW6nMg66YAYSzccF2mCD73lnG2mmLqNOSl7NBj+xw3LsfDbcoMPhSTgWVnheHw==", + "ivBase64" : "q40Kqxio8laR339HkXEP+A==", + "cipherTextBase64" : "q40Kqxio8laR339HkXEP+AhxIGURkGJVld+8MF5xIUZ8oxr3ZHHmwhglhJG9ivot+hDDUhZ49bG6tILG9XSlvI/XCwj3JOW2UcEn8nNAVxWkfUmZ0jkeWKeXcQaON+cL", + "hexKey" : "33f771df50c300bf22ba092a402a1ad3", + "keyToEncrypt256" : "195e6c468ded948372150c69f75cc40d9e9f5e5d747de1e5f5d38aec9772e791", + "keyToEncrypt128" : "5a17ca2a1d8effcc354a4d115957ae9f", + "encryptedKey256" : "RP6XLiopjqWp92jrDvUZX7Oy5jqBTNGGw/RVc55mEck=", + "encryptedKey128" : "ZSVpojXraKjnojtfmP6SeA==" + }, + { + "plainTextBase64" : "Q8/wQZ6Lc33xgTZS38/INl4Mmsd2jTzabo6FIRBD8TFlBwhNph8vjFvlV5d6XR1rTsKAWzzBI8j1uxzSrbGzo9ABDctUtcaUPYGMHyA=", + "ivBase64" : "tHmyjUC71bGEdYma5qA2sA==", + "cipherTextBase64" : "tHmyjUC71bGEdYma5qA2sLYI/jSprHOVqxNX2rQeaukmKWrm6zXtMBJilg3qw/CHBstlxb9DrHbhICtUTntwxPWdQBX5EPiw19Hz/KW2bw/Due4UjjBdxfQj9lgTgTqV", + "hexKey" : "ca5c9eaa9c621385f0d42e9d6c157384", + "keyToEncrypt256" : "6ca251fd015c6df1e859263daaa94775a852321f59a3f99ccb4934281b0db85c", + "keyToEncrypt128" : "cd3304f1cfccd7ae3e123a8f23360118", + "encryptedKey256" : "/njxc/YLorEtZc8a6yGx+FvtgYmBcKk0nY6unfzFCVo=", + "encryptedKey128" : "+iOJouIuUI2LXVYM/7Os5w==" + }, + { + "plainTextBase64" : "Umh+cMYXMBmN7KipeffNZorX2/8ehTRWIIFNkuhSKjU99GoP095PEoSf0MdaiSXBitgPzmzjeMV8QPbZhowc5S6BjdsMODCZ3RT7lUil", + "ivBase64" : "DBFLu8o91f2n0RFR+j5fzQ==", + "cipherTextBase64" : "DBFLu8o91f2n0RFR+j5fzaxOzGRRW91LNkByb2BIjM9eifqk/u8ZjeihBM1PWowLe1Hu6Koz4Xx39MXrOj/cH2xWS/CUZxzAFDlG64vDPv4FV0tbCx0eyZ/4V1iwNpBt", + "hexKey" : "f2149dcbf3d7c9e11d0520b30e4d7f46", + "keyToEncrypt256" : "3b5152ae077dc5c13821ce99117d454e9694b2f55689686889bce2441528af11", + "keyToEncrypt128" : "efbdbd9c28ec1efd745fd19afa719adb", + "encryptedKey256" : "QoiprgqF6iVmC3daBYrBDg7azEZfrylgFmSJN8CcU/M=", + "encryptedKey128" : "zgv8X41EfYDC2vMxXAru3w==" + }, + { + "plainTextBase64" : "UZwQ4PuMqH9+PnL6njEuiIlRkdKAGxaAV8zTkq6mL6ZXdhR621J2yuQ7un2rwONGh/g6dzEddFw86E2t41vs1D/5XH+lkuDIAK7iaqVV5g==", + "ivBase64" : "QFiuATm2sON8oA0OyqoO/Q==", + "cipherTextBase64" : "QFiuATm2sON8oA0OyqoO/d90eZdSaMi8v4z1TngDNcvinLDynRtXaXkyuI/qMQQZ4y5gh/OyRq6cAQCYU4v9L6bmVEUomv65Cu2aH1v0WxYZosHjex14rVDkBq5bOA6r", + "hexKey" : "0a3c2fce68d161ce15c115deefa4bac0", + "keyToEncrypt256" : "7cddb244eae63d1307869908f18efd4151cee31aac26818ef3011f66347e2b2d", + "keyToEncrypt128" : "c6cc444d9a0bd2b9b7082bd13c3d9a65", + "encryptedKey256" : "GO8ml0RQqbgaPNiHRHaHRiI/d6sjmEffMNk8R+/39tg=", + "encryptedKey128" : "lUDlbkXfG/luWnEoTZVgdA==" + }, + { + "plainTextBase64" : "/z1jvtw66iNZZQzAZfGpeQvFxvJFfekOwSHeUnc8SAPrtA0GnXk4ervHKlaBsxVXnkR+1Q5yMko8C3uM55CeG0bpjyUN65xBmWlKUDLw/Ds=", + "ivBase64" : "duWZvv94xkYAUr+ls9vU3A==", + "cipherTextBase64" : "duWZvv94xkYAUr+ls9vU3LB7cnzHbuaZz7SUVJrPEkKWEksXIH8uVVezPactjSbn1Ov/7owjZ81TcTiIXPrzIkhVCTjpmtaY6NdQpI8V/zsKhllm2ldr3Pre3adD91is1J9w/8TZXWZNVPxS2ajRtA==", + "hexKey" : "f69d26c515104828b7127bc664de509d", + "keyToEncrypt256" : "9e4c99beb464d2f43f329e8d69f4f6d2bdcffc0df5b90521225b0c5e6c62befe", + "keyToEncrypt128" : "3ac8947786d3f7795a4af270e8a969cb", + "encryptedKey256" : "0VHiSmUgRGneXGUB/d4dAtf9ZSQOETr2arQUE9QajmU=", + "encryptedKey128" : "VQuQTxl1tL1pTnh3xGo1CQ==" + }, + { + "plainTextBase64" : "hOwM7rRz2DQ1vv64Trpr85caCmgIv/0RLkL9qe4GEfu3LjBFmIhpRI5yQ2CMlXQ+NljOrwG0Q+51Whz9j84ku95wSHbRSWmBzNZeew3FEuwU", + "ivBase64" : "XZycLuY6SAeLW1Gf5pcBCA==", + "cipherTextBase64" : "XZycLuY6SAeLW1Gf5pcBCG3fMRKxg/mp7kN+4N6UKgcBj3HegXLwiO4DQhS1vSSKbBBWkX4UWtrbiZ+KaG/op1gAlLREjakhO2r+0gDVufUxzKJjYr0BVqWSfV63QohiThW9/ZHn431462GaIUjJXQ==", + "hexKey" : "958bbcb8beedbfb5d18479b236a01956", + "keyToEncrypt256" : "590bebbc91a5491e8b4c0f8526a90ecb66f47d2b5ecedb864d5f757392505907", + "keyToEncrypt128" : "24c68db67c868bb7b5dd5d5ecaeab571", + "encryptedKey256" : "Gvzcr3Q/gt5fyT736p/P5rMshJz+i4BoofMkwWLt9OU=", + "encryptedKey128" : "k5pDsMEeYmFWU1WySS9YMw==" + }, + { + "plainTextBase64" : "Vkv+T6tQJvkqwK2xyh5XNfhdY5ybX4UKlLusRQFRsb59NVS+iCxo8Dt+QlKGSROtIWorBqMxsC4Pdctxl1fXpjbxu1lAdyeQCt8SrkfOgVnL6Q==", + "ivBase64" : "WHbbgEOzP/f/kxQCwvNqvg==", + "cipherTextBase64" : "WHbbgEOzP/f/kxQCwvNqvku4JiVPyUIHHWIbQdfjYXWxjoz8JYWZlTOeIW97lc38lgRjC6KQRUs/KNTPXgOcjHUOxjZlH70OsGf9Pf6fA3r1pMKQuKETZZp8Ag6GGQU22LMbr1UBVMX7ko6GblvkGw==", + "hexKey" : "d461d62b28d6b5e08fcdf305edb14f4c", + "keyToEncrypt256" : "c380076953e9e01761145bce00499456f5301bb54f3dc9e72660da78dcd341a5", + "keyToEncrypt128" : "d6e1fb64cf61efd140a9a731872bf229", + "encryptedKey256" : "aNcnL+pUE3S8EE7MH162lGqRSu7xGbEt/Gg7AmQj7UQ=", + "encryptedKey128" : "VFrr44Q8hZOtySPEiyL5ww==" + }, + { + "plainTextBase64" : "W9z/qqtiZPOklTsESKmCPqF8OiIypCUbIl7vfbQRCZll3EJZI8epvgG4CNPZ08IiaiHhWZFjihVPtijGp1kQkFQfp5jDcXCe6mLP/9hnzhFEbIA=", + "ivBase64" : "YR/0ldljpzOYHxDbNiIiBA==", + "cipherTextBase64" : "YR/0ldljpzOYHxDbNiIiBBP0h44T6DwZv+RnmkmFziawy5IopR1ImbDYaJRN5l1UhBJt6E5gSv5eXjiXO62Hm4C+DKBMjwUT0rS0ex/B5+1JEEf16wQq1zbZeLlP4JsDByweI8Pg3U169Qa6Jcx/XA==", + "hexKey" : "028a4d94e59b12ac79ec4ddbec0f66a2", + "keyToEncrypt256" : "5e5d5001da66d3c740adf0224dc512c020903ebfccbf4e6c7806fa7b0b67d801", + "keyToEncrypt128" : "84e973e827a81a5c40fe3cd9686acfac", + "encryptedKey256" : "nduHfhkRYtmuBUP3BKaL8zcvm7q9strkfY2nMVVlHPU=", + "encryptedKey128" : "LtrCg6GJ4bQH9DpziudNSQ==" + }, + { + "plainTextBase64" : "vaGHTZOvZscF7oVtfL7KD+VxloP3KV+Y49gnQFg7flnOcaNxuTNSfv6fIm40/PwzdMsJ6V0TuHOdu9YKypB//aVetw/Dkri6oXye2n+Z+iL+5e8j", + "ivBase64" : "4DOGosUC8G7OI3g2+flCtA==", + "cipherTextBase64" : "4DOGosUC8G7OI3g2+flCtH3Jj8ZxSgVMfaMAB/Z8RfUlmo+K2+cAW8+kll71OJ7HvC41uR720aguB40ua3sv0KxW87vsNEpjPjLRhbQJ7aE6w0mCbvf2+FdqSZkZSymtvGOXk0JoXowMB8tV7STzAg==", + "hexKey" : "b886d513a11a20b74c9792d736942ab0", + "keyToEncrypt256" : "8e6fa8ae9cf40101b5f7731f51792927117923467179b80437b4f3fd48870366", + "keyToEncrypt128" : "8498737243f682031bb6f5abb60e6a43", + "encryptedKey256" : "G9mnGwLgZONF7BZwDtp+fs3LWA6Ja/OsKpWq9v5IZt0=", + "encryptedKey128" : "/oQeBGQfUtG+jWhs9V0A5w==" + }, + { + "plainTextBase64" : "c4f0ePAEAkGmSO7l4fEJsQJlh9ENZyjZHwyg9dVCtawENpUTZ1sHLsMGMErb9Tz0EZQEadMG2yoeqBDKNhBHvlsi14+4YVmj/RtdPBvdo2tT8qMfcw==", + "ivBase64" : "PqbMk3Uyxs9nL8dhoLdOaw==", + "cipherTextBase64" : "PqbMk3Uyxs9nL8dhoLdOa0hGHei9aMHhG+Q5iEQJrJm02dVJ5tinurZJuZnc+QlKSTJnZ99EYmxcJiU9Q4TfCzTMA4XuwZ1Y+Xq0cVh7qDmc4bJqhi15bmwkv13/jbDPfc0iUWE5EGs6Jk1CyOYGOg==", + "hexKey" : "368baebb49415ce30c0b411f2bc1bed5", + "keyToEncrypt256" : "4a0554a5e013a036baaf8f63e98b46811f9021e0a3c77cd0f9323a15b49a86a6", + "keyToEncrypt128" : "3140fc6fe045122a3fd9b4ade8dd1c74", + "encryptedKey256" : "ywhMDwqcHCguiYhjxEUKSgpLdr4C+yumGymL+bGKtsI=", + "encryptedKey128" : "aHdwXtr+Nsh+H8/uJxL5kQ==" + }, + { + "plainTextBase64" : "tSWUUdOa+92phkria63XYrYIhdvfTPwEVti7ricmciauapEsd/OV1En8QfdLA4aVSoafez3pk8wslvyB0v/q23nqQcO7nhSJENcNC1w3KVHorrW8krk=", + "ivBase64" : "xAufDbEqRWr/j8tnzhwk8A==", + "cipherTextBase64" : "xAufDbEqRWr/j8tnzhwk8N5UYQVP1ztJRt1OqtJUpBZV/9iw08s72zX0MRn8iqRs0An+UtutX3qTqu6xjsI8jFF4EVZvkp2pkSHKx/tMEQ42SWuudJkCWsD4ey4tQPZKhjAYRDqULXPUt2MuZHAY9A==", + "hexKey" : "de3559513baf189ef1df9a5082ca3c8f", + "keyToEncrypt256" : "5bffd613067fe22a9f7c3a530488da727742e55e5c7d66a3d101165bbc0158fa", + "keyToEncrypt128" : "a4ef03b1cb89db3e54ef3fc44838e9e1", + "encryptedKey256" : "cw28mJ1sJEDm4fmzSNDQTOcqa4kyqTV9yG0hw2OY9Oo=", + "encryptedKey128" : "1TQXJ63LgfS9oH6XHLOHcw==" + }, + { + "plainTextBase64" : "rathyV7i7Op9e5XtnBvymFccOhpY+SLazcf/Cc+rt7CrUIrpARhwzTxqaCHhsdNP3PScFwWgxq/A/7RXzChePQOPbpEfVDrXO0tmR0RF7cU0kmQld8Aj", + "ivBase64" : "4Mldj70kW0Qd1fWA3Jdqjg==", + "cipherTextBase64" : "4Mldj70kW0Qd1fWA3JdqjtDAKGGeI08LseXdGdUMPYMT3mEkhkksMVOW0snlMC89r/zxGG7hXBCr1+ppH+wZIMCb2dFn+Ve6ZxsKwIQOMP/DgWANhwSQh1csfglvlY8P1ZYVjFdg/kpAV8oT7uU7Yg==", + "hexKey" : "7750bbf467d380cd1b864446891f55d7", + "keyToEncrypt256" : "1e4baf9cac26efc07cdb28e98216d637c93a17d9186f3d9ba542d0815a17a4d1", + "keyToEncrypt128" : "6a0d5203bee975d665986a5a6046812a", + "encryptedKey256" : "3jqJabcWcSlJjCXlJ01rNRf2LalFCOYZhT8Ip1xxFy8=", + "encryptedKey128" : "7yzCbPy+nUzCXKQIFrq7mQ==" + }, + { + "plainTextBase64" : "6KO4KVIz1J6W1FndUGKqMty0AIIW4eNYCcCgEJIMFASlp4kMuEE8zkm86NLDjFCq9nXx2WLrMa7cpUes4eGorLAgSGONPD6XCfY2zOtVEgVih4edgR/0Ow==", + "ivBase64" : "y90c9qEPryqDsIntv80y3A==", + "cipherTextBase64" : "y90c9qEPryqDsIntv80y3FahJNjHyfVL8nEJlvFF/+10BeVOxynFr2obfd+6vXLowvVUIcbiAixJb7ZFMpkP56BAqkcEPZ5dsjqDzcVKg8IIAfZ6I9PS8eu9B0CnVtSxSlgYEisZwF2N+ee2zUow3g==", + "hexKey" : "95ab87fe45e9df117edcd228c1a20099", + "keyToEncrypt256" : "16ab347d998ccac2d05dcf175811a7a5c90f7832384ea962bc977ae8be2471de", + "keyToEncrypt128" : "4b134de67752663660d47d45931bc9b1", + "encryptedKey256" : "qHqHBHtJmKzEDH7IxZXp3lWUif78bSZbwE103lrwfS4=", + "encryptedKey128" : "TYC7KgjFDKRzKW8C/H7ciA==" + }, + { + "plainTextBase64" : "pgnAUTfPeJd+RaaXowG6Rr6urmzFiRCanBT0QvVu33ShhSLeGrBHgm09FcNj1Xhkz5wdThpsut3CkDTqTfWZqUjjffVh2L+tQWTpO891U4i22eYonVgFuy8=", + "ivBase64" : "ynWWWc+ry5gCTKI0EFmO9Q==", + "cipherTextBase64" : "ynWWWc+ry5gCTKI0EFmO9cZmoUSz8L+Yx3+C6mF1OAp7fnfXUYdKjBMGLfJ5JiC+rgwrgNZRwZ9m8QOC2AKURZcwY+vKj3TyKcf9mF/uZAbP9fElow9VHzxEb9bw2E0SX76dACR74CDwa3r9Y2eiHg==", + "hexKey" : "383600cb6171e036939c99145c838be3", + "keyToEncrypt256" : "a2630a8b5a23f05b0f80f74d8836353835a0d14d94add133b52c543c51c86784", + "keyToEncrypt128" : "f4934d4a06cd4591f15d032dc3bf8b6c", + "encryptedKey256" : "RbmDoCCTjQvlWN0Ct6DJx759TYhp1ss1hhgjsn2o/Nw=", + "encryptedKey128" : "3LX+O2Okm9+K/q47V7oQEw==" + }, + { + "plainTextBase64" : "Ik0STyYM/AUTIzds3sFf49e+X8pno2rK+nEnOpvpRldP1X1ePuuTH2RAxJ2UCatdOhKinovqPE9n4oq0nhyT7dyxYx7yfg7r/azwCkwEdR7AMdnE5ro4wvMJ", + "ivBase64" : "KA0EXdrlySWMV0TdkaI1Pg==", + "cipherTextBase64" : "KA0EXdrlySWMV0TdkaI1PiBn0CoQetO3DZnI6fXG4RWdwidIQQgMJrBgotUvyVKzelHf1fSsGOEkGlLrFvHsaMke/LeuXie5j0HRhCv/9PHI0R7Q/aRGNqz+9SkhbdnGKqq2NuKqpHHcANjPzupySA==", + "hexKey" : "f8f50a3030c948eecf79fe38e91cf6f8", + "keyToEncrypt256" : "7e40457b8057fc085bf9e20c5acbe48afa81971bd26c7b615198ebeaf0adde3e", + "keyToEncrypt128" : "dbad09050c0c56c45c7a13db026ee1ef", + "encryptedKey256" : "KtVpIapRWJs2Ic7mmFFyiw057osnDnWFvWxWBZg6MOM=", + "encryptedKey128" : "2g2eR/X2UcYZEg6artjHxg==" + }, + { + "plainTextBase64" : "fXU+CeQ5+xfZXGCtOjWW+kV3WeuzcnNQx+i84nlstpE1pXALCLuy1IE1QUgD82vOvojMHPZCvvHmMNXYDiwkelKEIuoCB4HLc3pVlq8wfWxDPHS1KxY0iHjCFw==", + "ivBase64" : "GP54yFTzKZ7J/kPtGTdB/g==", + "cipherTextBase64" : "GP54yFTzKZ7J/kPtGTdB/quYZUsvqg55njyrbg25a+CqT7pUp4zdUSUSlsbaW6MAj4Ji7ugn3VWQgde24cR1i6jj3Ax8yHlMW33Zsq1lGN75IcjrT29/F4WNxH+E/2+ADrgOfJNx5pQqophMH/rR3w==", + "hexKey" : "347289744ed3d4884e644575c335535a", + "keyToEncrypt256" : "2da488611d01257796fe5d14d2b9fbd3b5d2dc524a74f524d5c29ab19a67dd81", + "keyToEncrypt128" : "40505720e556db174828d5e68edd391d", + "encryptedKey256" : "ASLlGfUNiTcDbiYT56Kx9q3JlQ3yx3Z/0HGlUA5O1DI=", + "encryptedKey128" : "IQnILuIf/Gh6FvjeN4mdhQ==" + }, + { + "plainTextBase64" : "YU2FZMN0/ViT6eRRt21YFxdKPQGMZaAkcKBNmFvSi0+AaPHqYRp8jhITrZMyPD6ul2IfIG1Yxyu6SaEnpOZFRptEalFwvwdbzXPor+9qARh09jnqJTX+HBJD4h4=", + "ivBase64" : "es2/WaKUI+L/MF62hUnjXg==", + "cipherTextBase64" : "es2/WaKUI+L/MF62hUnjXlVk7vJB6UV4yaLmDmziLmxeMw915tfI+SdmlgWfBsUXrRMKwu3nBJfkmlFyX0kEaEY6cCcGcoz6iQFVYVuxYchjDWjrW0IBnDv8QhQ9soH316BqkH6ihPvNkcr7gPqfjA==", + "hexKey" : "dad589270fc969a204f65e23a6e9e24f", + "keyToEncrypt256" : "b96067c168ff61828f852e2a8d1666cde8c38a22ac0f41842f2cb88583b3ddca", + "keyToEncrypt128" : "c32a05a50b169cfe6fcfcb21027ce667", + "encryptedKey256" : "HnLH5xdWjOF+vKxfmmHgAf5F+f/v11hxlosVAFUiCM0=", + "encryptedKey128" : "ARCo3Xqw2Fl/4fq7TJH++A==" + }, + { + "plainTextBase64" : "8w+9D+iHOm2lNpJM/0EuqkMqR6AmqkCSNHFEyZyY9IPTIleYGPELrAJHlgZv3EAO54QojBA/ZuFZnAKDAkYPLqm223o/8TKkxYfnq3DwbBL1wBkMgkbJ96Ba/qGN", + "ivBase64" : "D8F9kL+Btp9hIbJeTS08rw==", + "cipherTextBase64" : "D8F9kL+Btp9hIbJeTS08r7m9F2L02SS/lg7SD+mjHaYdADnyV3Xa4ZpUtA1OYLrOQqBldvGd6/MxWvfe8upFH0iBxQpoVjALRw9A2dwszlVGd/EAoYTBniIdeeJKpXffG8ReXlfmR1j4ZnXLn6Y1Zg==", + "hexKey" : "1cf6da4c4da0d4354c9c1571bcf0dd49", + "keyToEncrypt256" : "47b1b1166e5b5c7d25d8f214332c01a90c8823797bf82a6c1d7f0bbb17eff4c4", + "keyToEncrypt128" : "e8602531ba8bdcd95c7aab192ec102c2", + "encryptedKey256" : "iyWkQx8gOIkTM87XfFoEmgmhJLg4jpckUkIVTx46VwQ=", + "encryptedKey128" : "nPkpMNxIB0ih96M4MXNXcg==" + }, + { + "plainTextBase64" : "gD4R17B0Cf92Qvede8pzFtgoBTEVDWwLESA4uKSROHs0Gb8fE/il8wXVYBzvTJGyR/DyhJPhhP7srY+AQSAens/IN0gIcklZC5wSaJPXUYwlZYzHUP1mPo5n3uGE0w==", + "ivBase64" : "ObgZ/MWKWvpOLSkJN9dmtA==", + "cipherTextBase64" : "ObgZ/MWKWvpOLSkJN9dmtMAr0JmqD0MhAyvXKGAEXrR8VLy0kZYrL2zjBGJgxheiL7fkMFQ8uSzjyRxP6PUEDs/fFUutugmLw7NlRs5/YsT/hx8hxvWIxnaV7cdlGDO+Ws4IGL5VWOpbwUhww0s7pA==", + "hexKey" : "3dfc81a55acf002c7c5a4fa55b36765f", + "keyToEncrypt256" : "3368c0e114b0cc1d20a0281efa31d1bac8f5749443b068ce3d82073ae9c5c288", + "keyToEncrypt128" : "c48468b364fee3b46505c8d9df9e8fe1", + "encryptedKey256" : "Y08nm8AtXPeC9ErzPTkX3T+/Lt+LIiBcRRQ8lueAMRI=", + "encryptedKey128" : "gFO0FEQ1eaOY/sjv0zWDSA==" + }, + { + "plainTextBase64" : "LzVBPuj4LeRd/HexUSzaC3nfuq1Su9U/U0fPab3ZRoXEBEG7/+AgTsReiB5D0BPR6xEPD/1WyR7mfZukbNEjAn2y0oToF034LyTishHjybKCL5HSIzveEIivJsgPMPk=", + "ivBase64" : "pAfK9QpzyCFuJo0NzZ9YCw==", + "cipherTextBase64" : "pAfK9QpzyCFuJo0NzZ9YC3URveNbkRUFGAHnowx4MEoQtJjdK1d75gRKwLnE+L365Q5GBPYnVgtHOnJbONdFgQtSylIrvB8hlOKrX0xc0rGybsm+Xit3fPh28tT17TE28mzN8LOGUMc8b6oZAWQCXw==", + "hexKey" : "f987ffb43b7100c909dcb6d592e2af24", + "keyToEncrypt256" : "65d593f6e78662387f6ae09787888818952ceeeb6faf808dfc7426eca046950f", + "keyToEncrypt128" : "476344eb8f3af83dc7f8f0a918b7b296", + "encryptedKey256" : "E8chDKV8W4uRNzerGf3FWTitGbGB6+pAQghnBYBblPs=", + "encryptedKey128" : "+6FnV3uYeREP7+ckPxq+jw==" + }, + { + "plainTextBase64" : "eTpeBucewfbyqrzoDDrWWnA0pPlZI4b7Mx/nZHYmKaExX4EGeS3vhN9wTUrqLebY2HM5bYdKxa8w/XC2rEXT7IRTAU+P/78T+/nc2rcfVCLby0nnWD1B0mYTJuV1C3Tf", + "ivBase64" : "zSToNFvNDFTQUNfq3okbJg==", + "cipherTextBase64" : "zSToNFvNDFTQUNfq3okbJvdQ3jxJsSfL/Bfwzfa6h5aGA1sVemaj1NTajpaPkQj3JYkNEtuxw8V1I84lGuV3pEDZGQfybUY50XhKXrChuZ08ij+VxqIa0Nn9zQ4hOQbBzwWlWzKcAeRP16fa7qM4k2fAZIsRUcbVzBI0Ii43TF0=", + "hexKey" : "59421ec1721f6c6f3310b490ee770539", + "keyToEncrypt256" : "c52ce8bad90aa08a8e263e76dd24b52441d63f5d9c8f1b3bc8bf8e5ea68b87aa", + "keyToEncrypt128" : "7a696029671c5bb246d921239c4969ef", + "encryptedKey256" : "LEX+30DT/KGSGy/YJ2QS2Q76tnfYCyV12PVgr6WZjo4=", + "encryptedKey128" : "w4EjKoTaQdhGyYZhtknBvg==" + }, + { + "plainTextBase64" : "EECOPgJexTldSLukWSfWReXFQda/o35+SV37VddbHTIyFj3PK8WlGYSBLT9AlUYQbwRTBcoK/DIRmcB2/tVyB7jFYaQhYfyqFrRZYrOGmvrbqXq9+A87QJcuN3qxj8Pt3A==", + "ivBase64" : "6bblRstg58if8WThVACpMA==", + "cipherTextBase64" : "6bblRstg58if8WThVACpMENqS3Ukw4mGDU8DQVWzQT+K17ibI1hLDCWI20ioH7PTT9G7VEv1Esz8zTda7F2yT5hmvhIwf5e5hWVD4rEeVRtLYBzheKOP5M63o5KbpgXbZEXkpKyu9I4nJ+39PNH4E6czepeFrEQb5pz3fTaw6Vs=", + "hexKey" : "32b396bc893cd567fcb14ad28ef92b65", + "keyToEncrypt256" : "c20991e5f9b049615afced2dafa6db1262cd995e9d80dcd94bdfdb7f14dbad20", + "keyToEncrypt128" : "835796515e7089f91ec50b490fa68278", + "encryptedKey256" : "giU3e9Q2oBRAlUjA90RDjP12L9rCHhnzVe3pr0bFOY8=", + "encryptedKey128" : "qWdfgqRKiX3gLa3LtlEwhg==" + }, + { + "plainTextBase64" : "xKZJNlt/R+zxa7lgwxE2hfGrLeDL/n6DZ1ZM+AlcFXPOa7W5ZFx5VpQF+CjVqBUeFFMJB3fJK6/Z074SahfUbOJcFPF24AKh2+YwMmDLnj5pFXIFVKkizBrxBZ73MV2Ahk0=", + "ivBase64" : "IJOWKpu93webtsCJR9DnNw==", + "cipherTextBase64" : "IJOWKpu93webtsCJR9DnNxu6eBrW/oIFpgB+oPZKvsJdj03vAqTMeFC4hcGLeFNcCoZqt/xP1vFHkJDnrUAdugWG9E9UBWplMchzmiqxNDG3NwQXgvr2R37q2wM4kdF1KNbvn/5eIxdR/cXZbvVr2pAD5DuS1gFVH0rNlpPWeu8=", + "hexKey" : "7cfe73602682c7b65df968752a7da775", + "keyToEncrypt256" : "13fe8b38407348b17c53f851cb7d752b3ece35f7083637c39ee2e1ad6875ff94", + "keyToEncrypt128" : "200a084ad5a1b2b2989a36388e2c38c8", + "encryptedKey256" : "sWDbnJrBDhbl05iGEWKHV9eO/Cm7NuGpcJnYkKLdwMA=", + "encryptedKey128" : "DOQGcw3/H+Jp2c63Ozh+MA==" + }, + { + "plainTextBase64" : "xl3lVy/cr9VkMbVIbT3Dvhng1jFBSq+GaAvJVrwrQlSmL58uXuG9zFz7tIPPRxKApakKwRqAPUkzRsj6FeFmIY4RulbMnL1guFHd5B22Q3NUXEEE2w33W/Kp4ugehAedGxs6", + "ivBase64" : "8PP2f2DKvpWHuuKpB90qNg==", + "cipherTextBase64" : "8PP2f2DKvpWHuuKpB90qNhSUpl55jhBXytRNSwuZ/pbWKBZnU5E+sYk9BICRbRpYcx0ksx1RQJfn1BmG1TA9o1YwAucwFILQZDNVIixTjTeHkQbS7ak8lTZnnfud3EbUUM4xTKWoYWC0RzVZyi/C5s8Q/PsV34eoYDBrhEEGefA=", + "hexKey" : "e3ed97639dfb757d069df7b192df3291", + "keyToEncrypt256" : "a870817ebc70332d86a7e971f4b97f41a0e381004708c38caa9d7336abbfc4a1", + "keyToEncrypt128" : "deca09cf1dada556e1751eefab0ca2e7", + "encryptedKey256" : "+ChHnrXcz1xW6hNIfjT3kQ6wU58HZkfLx6Il9cYSIPM=", + "encryptedKey128" : "zj5f5ZaISaBR87DHo+uICg==" } ], - "aes128MacTests": [ - { - "plainTextBase64": "", - "ivBase64": "AhLigt1tL0R5Dr1HuR3v0A==", - "cipherTextBase64": "AQIS4oLdbS9EeQ69R7kd79DpPasnuLvw003DmnJ1y+U+Hb8fpgU5eBpSUInKItEiwXFZNUK3LoieMbJt6389YVQ=", - "hexKey": "2fb8c6e0bc1d16721ea0b78b471dba1c", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "5w==", - "ivBase64": "FyYLOIebXNfGFwelu7hbdQ==", - "cipherTextBase64": "ARcmCziHm1zXxhcHpbu4W3Xt48oCXxJjE8g+FY2nHl0ZdHBLk7auvRn7Go8XeoMO/3PG5tKPqn4fEq5XIq95ZE8=", - "hexKey": "5f55a55141b585ddcde171d84efefa65", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "pI0=", - "ivBase64": "6bA5QToX3+mZpAWf+aJwug==", - "cipherTextBase64": "AemwOUE6F9/pmaQFn/micLpJDWqSXmF+Ed+5D7mJoWXJYwLueII+e3uuXFFnAzdxBD1ayv+NV3kKbZMR4oNu1hI=", - "hexKey": "288d22355c110d1b69e1ea1dc2fdf477", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "CnBI", - "ivBase64": "R4tnzuJenpDyV+bMewebCg==", - "cipherTextBase64": "AUeLZ87iXp6Q8lfmzHsHmwqXJ8Mp89QeRyKQbi3ozmXf6k1/ZhCUwzdaGTitvX9jfU+87i9Y7GIzsu3dwL3Oesg=", - "hexKey": "8123888142af28c491f5099a5f03fffd", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "8amNWg==", - "ivBase64": "R7ijY0S9aHcases75VbRJw==", - "cipherTextBase64": "AUe4o2NEvWh3GrHrO+VW0ScIAj8KkudlOWBt7SzWRkCTmKM4zfJYicAxTuIT7kpDNVyPn0LFT20zZ7bxLcU/tJ4=", - "hexKey": "ca7c143b6b113278ddf42a23cece6e57", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "pGRG4gE=", - "ivBase64": "6jYWtCEk9O6MywukEiQmlw==", - "cipherTextBase64": "Aeo2FrQhJPTujMsLpBIkJpc4P7B+rbhX0NO4LT+zIf1LJbmy3UVBVYmvwJ3pXuIQCDfYLOGuP7TA3/xBLzJ12vo=", - "hexKey": "ff450bcec3c97f2f8f87b92489cae073", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "9LV7hFEP", - "ivBase64": "lumvyyqHQ0ClwYwVY6O11Q==", - "cipherTextBase64": "AZbpr8sqh0NApcGMFWOjtdVKy+9COtFH75O54uiJbZz+dNSlnRo3mm8XCYo9uB3hsGvh1wf97v0B0+TdAfv8/ic=", - "hexKey": "980b856b20a6bba0e89ec76582516db0", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "3SmDFdwdPw==", - "ivBase64": "/7OTNOE3IdasS/6f26Ggcg==", - "cipherTextBase64": "Af+zkzThNyHWrEv+n9uhoHL3zNU0THBj9rfWDOpHzWja3/xHGFq2SDTVeU4SxUPfx/3Shpkf6l76e0dMR20hiro=", - "hexKey": "89c652da9eacccf38806fcc76c658357", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "wK8XGv9GkG0=", - "ivBase64": "9Tb8KbMgbgJVeWSpCN3rMg==", - "cipherTextBase64": "AfU2/CmzIG4CVXlkqQjd6zJ7cl4QM/tM9Yw+qcCEXS6GX8b+5x1WR+bOtTrzVtB/SU+xte3cUJVBp2AnBpXzgRY=", - "hexKey": "1fbaf091964545d20fd888179a94d7ee", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "CJ7hJUkMw/1A", - "ivBase64": "eseal6hXOwb00zYr906B+g==", - "cipherTextBase64": "AXrHmpeoVzsG9NM2K/dOgfpVMlVhzX5YjV9ZQX7vIwbOJt0CS8EevjuhEyZ7LjYHqTGlxgJXTtvqHXGDoW5EMIc=", - "hexKey": "6e0725f65f4c54aad2c57073b47f3580", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "qwXwoCtO7/iTww==", - "ivBase64": "Z2tSGpeDW/epDyZUWx5NbQ==", - "cipherTextBase64": "AWdrUhqXg1v3qQ8mVFseTW0Rs2PDNmhn5Cfjmu3Uwe4VEY/vfgUMyneW+3wBGRUpYL876Frtjp6SO/+FVbjwv/0=", - "hexKey": "db85e5210ea4583260600a544daf0129", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "T7GgzrCtuv+R6Ns=", - "ivBase64": "Vm6Jso2TXBGZ/1fWFAC2dg==", - "cipherTextBase64": "AVZuibKNk1wRmf9X1hQAtnY/wsbmglu7V/qZ21PlsYgeE+V6uP08qWLzx7MyyDIfWubR6qXWd6mDIAD2hLcm7r0=", - "hexKey": "b85f2c87436e989a2e3bc8f3a6fe14da", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "5TGS4gLIwl51uHcR", - "ivBase64": "yxlkzUz5D2Ttba0jtorogQ==", - "cipherTextBase64": "AcsZZM1M+Q9k7W2tI7aK6IHKCPdDBhbDTIMiSx1/E7Y5l3MizsrRUyQavkXwqoVQDvhR5YALI6bFChCqI9ztNUI=", - "hexKey": "7f7052b476cb4be965603f6eff130854", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "2rzm+tPWMAwsF3tCDA==", - "ivBase64": "mqfvFD1jOy6ft3kiUnJiNA==", - "cipherTextBase64": "AZqn7xQ9Yzsun7d5IlJyYjTLuaqqzQPtpEmEumlLXmdDUB87PuJlTZBdWlSxt1BxNA/aQVmUoEib4H1G6bzWDyI=", - "hexKey": "c609e064ea2306a96d9f2a63a838c12d", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "QQs6tqF5GHZxPObZjvE=", - "ivBase64": "TechBRY3TYKbOTOhkJsZww==", - "cipherTextBase64": "AU3nIQUWN02CmzkzoZCbGcNRDbS2TZecmsgUXnTH2nTcCTv9D9ZlACJQjVWqm4ID/ZsoQ3bBRnKeWLsv71ZlFd0=", - "hexKey": "0dc9370aeb0ef9977c8d4e3814cd392b", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "dB86TCDXQ3zI3trlyr4V", - "ivBase64": "L1zF0Ue0GwzFIWaenP34LA==", - "cipherTextBase64": "AS9cxdFHtBsMxSFmnpz9+Cym3NJDQlAMRxWoPPOGZpeRx+sHOY9fyLkNIIsgOm3E/qUJdJfT1Q//Ybc4IkcotR8=", - "hexKey": "e95c2d9d999b604c17a04492374bdba7", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "UZ4TIaODDti3UVqnpnyfSw==", - "ivBase64": "8sOcIHe1ziBr4YnTdJJd1w==", - "cipherTextBase64": "AfLDnCB3tc4ga+GJ03SSXdf0ZY8mxWCsnQYCEEM4ciZYPKPTLVu1oM3Rjk8b5REs4H69PZvUoVBT7x/QazyGvTdaMZEVgmDv3rlJatO0RbUY", - "hexKey": "8c0e8640bb7416c1a29bdab1254ff391", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "zxHCSiJzVrvwckdSIlGmYgc=", - "ivBase64": "90aDyaX1/c2/QpZawwYR+g==", - "cipherTextBase64": "AfdGg8ml9f3Nv0KWWsMGEfot05Xoe4TUkigreBhpjoIe0jtK+VzzAeyIKzxdshIwr2PBsAR8/0BXN3wP8KJ2ugkvssIgZkmgAQ0XHpj48QE2", - "hexKey": "db89b4d27f9e557ffe84aa437d79f30a", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "UJ4END0AXrrEoIHJCJNLTGnP", - "ivBase64": "44lXy7Sv1mq8oRbVMHhFsQ==", - "cipherTextBase64": "AeOJV8u0r9ZqvKEW1TB4RbF4iaoxnPr3v03+9nyJ+ku6F9+jLAp2SAfDaB0M6Of61UMfyfS9Shf2brgwTU5Z7wfeBfCJOMRX10t8FXoUpWXI", - "hexKey": "f50c775d1e68643342bf507712a73987", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "LF5VEM5rONIE191VrXKw2qeUsQ==", - "ivBase64": "FaN2Y8QbRNi9ZSEF/eoT+w==", - "cipherTextBase64": "ARWjdmPEG0TYvWUhBf3qE/uvn83lQYvb0B2I68IJjCEfIQst0GQcxksXxfjzwl7+liHYTuweYzeFT5IGqq/ZF7XsHFxbOWBccKY92E9Gu3Lt", - "hexKey": "df564c22f0ebb49275c69bd0bdd8528e", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "LTjMI1DsIFeCIHtIQESbKL0A8nA=", - "ivBase64": "4Z1TUZX5pyGD7Sws4TRIqQ==", - "cipherTextBase64": "AeGdU1GV+achg+0sLOE0SKm8r6py7RfAngRoev6rY5KgHHXgcwry1TbNhq126WH7EHQTWSWIlcS4m+/jSheeyfGncxsj4RSsjYP0g5+1+bZq", - "hexKey": "979bcebf5b0895e28d77715fbdcb7321", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "X1kpUCs2wRCijQRFm9bOYrZnGLGZ", - "ivBase64": "uECCNmbUdygq469CxEnxrg==", - "cipherTextBase64": "AbhAgjZm1HcoKuOvQsRJ8a6T4wtl9kPxb9j7v2qxckPlZVpe/gO6ukir9ss9nuWoVHrkZTMBsL3V8DeG1qdvBS4/rmayBc3CdZj0ketJrhE1", - "hexKey": "d60dd356484289d5f70a569b569c92af", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "xglj6vcqDPJc6XFJy/VrZgcMNe4Dzw==", - "ivBase64": "cONcORlFlNrWKsLZHwC6hg==", - "cipherTextBase64": "AXDjXDkZRZTa1irC2R8AuoYNVfLiuJZsmFfPg8u1p97fGEkiC9kKB2OZ2xf8WO4qMHN1mlEn0quKI1f4mftSceMo/XlH2XmyErR21PDTIvIv", - "hexKey": "42e90f1aedd85b34d6d77338fb247c58", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "RrbW1sLmk7UsdPHt/xjHxrs/WNS6DJY=", - "ivBase64": "tvVjHlvHqzyvLh44BUC33Q==", - "cipherTextBase64": "Abb1Yx5bx6s8ry4eOAVAt902fAqpWPQ18+vJlr/k3wdN04ai8pZILgCUQgAsS/5FoOeeEylGJaxpQMZ1EEE6beUhM6jnvMp9utSK0N+NNUV+", - "hexKey": "2b6cf6a6e8e15efccd6a38aa42044cd9", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "oEJRaCUVj1wk6YoOGSGDBH5FaqxbxV+5", - "ivBase64": "qrFEF5RjzDxbrCf7gol7sg==", - "cipherTextBase64": "AaqxRBeUY8w8W6wn+4KJe7J86nNP7gunJ5TkVkI/d86ZZd5SEYJzDwXH5Pap6mnv4plnnLy9aiLv9hk3RrXJ5F4pCPFMp5i+rvVpxwCrXt+b", - "hexKey": "f184b9b359121886b2e6c310795151ae", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "k7WP/l1nM6gf77Kar9ckdCuRRdkGf8NOqQ==", - "ivBase64": "lgsbBxmM5GIR39JJdxNCCg==", - "cipherTextBase64": "AZYLGwcZjORiEd/SSXcTQgqt78F4Vrz7pzmb2j651hj4z1WreHxYuV7gH7cw9ZQbZRS1O6l/ln7zAPm3CsKdPsBNXKhDGQ+6uEvnjCyuYe8i", - "hexKey": "c9ed81ddccfee7f16d6821aa84c71007", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "sRsu9uO071mhwVWR1HTSQoR50WkGTW5lU/Q=", - "ivBase64": "YO7F72fjE/sZXWqPX7/BQg==", - "cipherTextBase64": "AWDuxe9n4xP7GV1qj1+/wULjTeSntKUA8eg1anz9GIBpFpvxiKnlwFoTubhU8r6dUIkhD1YHmxKI+6Aq9DwowUS3gPyUiwwmMR1Lz8ceKbSZ", - "hexKey": "6c6e30d5dd1a6b5405d8fd8fc71a94ae", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "lanTulqCb0HyQmXCkPrzjgtokh43PEWsZ8oW", - "ivBase64": "S337mZbB5sD9L0feKmAHPg==", - "cipherTextBase64": "AUt9+5mWwebA/S9H3ipgBz5uSzXR15RXRFvv6VE6LjXWN/sfc2/r+KW8W5gUQlgWyx5Py5mLQTUSHw9BfKQUQWxoSxzIx7NzobTNHMPokxYj", - "hexKey": "1a19a9332f991d3f21f6326ef59f00c7", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "JrhGuIB2UxDa8hYiuxJY1YHfLcygWYCMu/5wGQ==", - "ivBase64": "/QgA1lEn05pGNQjyOJ49/Q==", - "cipherTextBase64": "Af0IANZRJ9OaRjUI8jiePf0i7LQQbJV4b4Wa39CvafuKakY0GzAoAxKv/EQ3MsssiG80LQihDo1RpAz84cEV5uw2rsACXhPzLRYo+Kq4MEDS", - "hexKey": "4013b641151cbb91c8b3d2a0cc40dda2", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "mVrIHvpICsXthnR1v5Qgot/d1hUNpH0j9C4od/g=", - "ivBase64": "7UK+ZWQIM9glqHEVlejR5Q==", - "cipherTextBase64": "Ae1CvmVkCDPYJahxFZXo0eXKTNmVDxAvCE3bcWNYsaePgaYoAa6nVOKYHAvo68Pp8bUSXo8ONDDlR+eao9LDex9EzbsSSXqSdfkFmfBA98jc", - "hexKey": "f47f1b909e54fa7512d3548df6892aa4", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "P3s8PgD00Dsc1T3Z9cYZMYExzQOwEXi7xn4pepiZ", - "ivBase64": "RG7aPq0PeP5Oszf1q2ujew==", - "cipherTextBase64": "AURu2j6tD3j+TrM39atro3uspnUEHxsEygE5pgP9WiaWss8+rAzhNuz4Qx9kBYi7oYIQhuS/cc9r8SXOxQmxvXgMBrANq8/VHWPdQmx4DTya", - "hexKey": "1a34d05cf5e3a51416ef6d9f33233b3a", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "fs02fDYAAse9tf4LJDuYp7ZuDRqjUg2JJ28vSenuaw==", - "ivBase64": "Qq/qWKE2j4badbB/B922Ng==", - "cipherTextBase64": "AUKv6lihNo+G2nWwfwfdtjbF0/JgvBqKjF+bFHEBYBfdKaer5yz54AvFSX9C+Q4WU95KuolgF0YAeDldD4FfRELhj10ceh0jA4UOxj9+jdZn", - "hexKey": "cc2605a044df97b6052a38a8ecabd396", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "gS3dtp8RkZM1yAp/6YhfusK1rDGWk9T1nbU06jYx+yg=", - "ivBase64": "i0jp/4YMprXv/L9dAqOIxg==", - "cipherTextBase64": "AYtI6f+GDKa17/y/XQKjiMYU5h7JGnIhIAY9/HRdQi877Na26TYhKT83ue1fhjQnxLtCCo+wX9CJaIaBoJ15Fhj+ZrHWJfSuqCP7YJohUjO8oFi65nsxuuUUrIgKbl3C5g==", - "hexKey": "1f6667b8f0835574050f99585bcfc708", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "v6Aj0evJIumA6mQ8YX8kH+t95Fg2FL6Adv4Qg9mylihn", - "ivBase64": "ASbK/NlGIJY0ATI9jfaYRQ==", - "cipherTextBase64": "AQEmyvzZRiCWNAEyPY32mEVBJmxW3JGLA2op5xdEscALOhxbAtev7wpvHFMmd1d1gkaVBm49U+EILXtXlfm+VLxEPYrJpkMGXCPXWV5SnQiwIIpf+3BZaUGslLCiOhuQ0Q==", - "hexKey": "f54f102ca2e1ec58970a63ab1d32e268", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "6tfPRwPT8kosals2b31OR/3VdIt2BbRDQxusN2mfAwfIkQ==", - "ivBase64": "dmG2AB6JxzY5TnNoOhU7Vg==", - "cipherTextBase64": "AXZhtgAeicc2OU5zaDoVO1Y8KkXT20988eHhYOGtZo0kLIlwYIsbAz9BfKVp71UMd9iwNzWtjmxEzW2SNOyFyA18CqHmGs+UVqZOo/Aa75TVzS7Ujlo9Hy6LJxAaaMbPuA==", - "hexKey": "f56f025e525dc78e700058999b3ab90e", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "X8UAXlPn4HxOT5MuGKx3SEmP+SSfpIrXFkRAvDYkhrABMtI=", - "ivBase64": "xBikYpE3ImDypRRQAX35vg==", - "cipherTextBase64": "AcQYpGKRNyJg8qUUUAF9+b5jgNWchufikg3SiuPlnGpvydhEA9dzrJenMaExjjRQY/thLl0mxSIFi1Kbtw5qoshhlyAl2qT0pYzLMJuARAsWdRmuO1cmqblNjX1gY4dtEg==", - "hexKey": "45f653cea7441efc0299e2faf3647a26", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "BpnwIiPPXL7KY0KPnwFPHjGtXTLElp7xfBABMwS72NHFtRWQ", - "ivBase64": "pIpc9oNsuB26rnb3ec/v5A==", - "cipherTextBase64": "AaSKXPaDbLgduq5293nP7+TAv+wnCkLq6bMsvA+lfWZqobEjuJjXckB8WarJkAizaEStfE0W3jJ9sLgItEke8tfyWuZ0AjdXVW9jWzwnrFD3dDETQ1Ookopo7lBHjQ5Etg==", - "hexKey": "79e1c2b3b863212f4123f72714f30e4f", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "zCWmXPAwZpeR/Nc/KUNO2TmEgy6v1p8GsAmNTb61Lku6ozC+yg==", - "ivBase64": "3+/h6czF+hldFqzSKnBjqA==", - "cipherTextBase64": "Ad/v4enMxfoZXRas0ipwY6g/a9lMVAqarVcJ9FEfjmDUlWLS+ae6A11Jpymq5XYC+DpYIaJT7sQesrfZH9I0xlNKGqx/kn+MUMG429AC5OxgJoslMZSMPU3JsE5hp3GnXw==", - "hexKey": "cc811504354ad9fc6563f10d1ceebc0a", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "4swaNtxbYXyVnXF0XBAFCy7/D1QM/4Tmu40uQWQOlNDL5aZN3KI=", - "ivBase64": "RPyGrU67l/hVkbbjbKZT2A==", - "cipherTextBase64": "AUT8hq1Ou5f4VZG242ymU9j4imuU73VgSGgAIceh16iSfDN+r46tLVfQGjSZiNuBTqAG8K7JNwYqWMSVwy4vFMXoxu7C+OhLiACcyR37HXALofqstPWU+24RSzpDrFAgEg==", - "hexKey": "8d7e08c5669a3255175bb0f98aa5dd85", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "R+G/L535nbl/BMWnIm76ONbzMpZOOFMCvb3vet/BW6/LXB5WVCLp", - "ivBase64": "mG2VLQsqMxy9CwmZAlueqQ==", - "cipherTextBase64": "AZhtlS0LKjMcvQsJmQJbnqnaypaX4OSmtWdtunBa1pvdOQ4/f/NAQIcBJtk4FWHtJGziMn7fO7l8PaUBNs32FSXt6lLXMZNosNrbWkMQwinZW3hyygXXhLDAmf+W8Ps83g==", - "hexKey": "7fe91d04d5cf04872c08092c23e05a87", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "AYvwOV8CBs9uOY9OiLWxZVJA1A+VxG6wrG2U5say92l6Hl9AOtCRQA==", - "ivBase64": "2KdeS2LebxnIDVBHSeBl9A==", - "cipherTextBase64": "AdinXkti3m8ZyA1QR0ngZfS1VlkWk7J9u5qiPqv2sO+nYOCu8imsGiELQRnQhKtDXQyBwCrwU8rW8lgyNG+lKISoiH8tL0vWYbiNn+8E7D+bUAjuZ0la20zdG/JWdp/mLw==", - "hexKey": "5065b761f81666ffa3c3377e4edd4585", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "DO3BvJZg8BnnmF7xn0ArNBUqXf3FIEVm+Zi/EtGzF+P4cJ2fN3WgP6M=", - "ivBase64": "Mw6eFhjevespJ6J1uctFzQ==", - "cipherTextBase64": "ATMOnhYY3r3rKSeidbnLRc3PETNcELTgUd2aD1UEGILjvFlblCsTaJXxqvjh3Oxvaz1xJ18iksXTnWEoZ9kNTmLcU/Z55LGwa91mT2MAhYrOPOvJTWPYsK3SOVPcqtAodg==", - "hexKey": "71fee1569c0466c3ed8296d86a07fa36", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "NmbnxvQMmyKOiBOgp/MxFWs3D8vIm6kmtTTJuclK8P9CtpuZRex+cA7w", - "ivBase64": "I7Wid1m580xbSobDmuoK+g==", - "cipherTextBase64": "ASO1ondZufNMW0qGw5rqCvrGDD6qDzdGz6V9JGC4JRs5paD+awMhP9UYlx6MqJWKZLA1kuu4v8FLm7n6T+duO5hJ+ooRc9haWslD/WQqosQPrSZbgUmfYH8xcu3rFQgH/g==", - "hexKey": "23dc1422571d325882312627192fa426", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "91qSmT/f+sipnU7BiFeTwC8RkwvT4qUaEPKlMS3slMg0oEZWitvCp4uNEQ==", - "ivBase64": "w9xCP3ti5ePa9be3bfRRbw==", - "cipherTextBase64": "AcPcQj97YuXj2vW3t230UW+F/Geu4N7ikV3kop/nepYd3icWAq+drlB2I3AAzR4fgZf5bD9N9jqqzandCjbpUcTayBsEW6+NUB8q1dHlRgzLqt0p1obcm4Mj8GaVKxYhHw==", - "hexKey": "45b394be4f12a3d55dc4ba3edde6995d", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "sm8ufxGl8nCLnb9K2/QUI9O+/los5fxk6DE+vN4E8RRFcXJ7QNQZmTDR6qA=", - "ivBase64": "6/KEa3eDWNqWB/6iB1HEzA==", - "cipherTextBase64": "AevyhGt3g1jalgf+ogdRxMwid5jQU2BxwpKrxnRd0do4EHiDap8eSXWEdbGQFMRrY184Ifp9gG/mpKFkmlHwxSXgva2vLAXNyv+a5qR1RTzR7u2DSINoxinhsIEW00dz7g==", - "hexKey": "acfe44bbd7dd1023e8c931905104f89b", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "ex8MNqBi8frtz0Yd/VhmAiupuINmPJ9QmnTkYZm8N2S7YFbHyO6hxJ26VtjR", - "ivBase64": "3bLn+NH7vGhSkdl2EDA46w==", - "cipherTextBase64": "Ad2y5/jR+7xoUpHZdhAwOOsO4gQDLelOINyu1XmGpv32CyMT8Fzu5UrWUwquPw+gOnP/tShUlgDV+ARiwmi6Ut6xL/mbdiu56Y0kvssB8oAuQ4CxualHBxOVe0VdSNhTeA==", - "hexKey": "106fb24dd0607b114b3ca0d40da4f401", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "SpSyHEUk2rbFqvzMxCP1Ur/Tos+GvoCdsWFV5An4Bf7Y5BVw/NNVeTcQa1lAKQ==", - "ivBase64": "o9wwjxJ6ASDBDGxsD9pqow==", - "cipherTextBase64": "AaPcMI8SegEgwQxsbA/aaqNatr6f6AuqRunhm9WWwZI5AkELGiY9EqgIgo6CLIxb1lt88CBoNuE0mg+2cmLMJYhs3xJTpTx0FlRgtjM/nQ0CSV2taGBh1mpHBI4QUazz4Q==", - "hexKey": "c56eac5bb0da1d58af301f2eb6e37917", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "VMnDXPblpoVZnIMpZAaRGz+T+Y8Bsbb/l7kpHWg9myCMhQM/F9+jvGCzEv7euLM=", - "ivBase64": "ByDmLOglDSW6ymi3ZMc8lg==", - "cipherTextBase64": "AQcg5izoJQ0luspot2THPJY8/zhMJiFpZednXDmCsLp2QxPbQL6VyavE30RgmzHDS6ViiJNw6ZUQAD5+3F/Rk+yNpym91s5JGhU8bQ4coyCITgjgVfhuMy67UV/gWGMnxg==", - "hexKey": "2ff4a07f6fa034cb8a41bd581c355fc2", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "R6huqlt8GMX9n6oIedXn+po4oAlOllL578rJd501KrJPgtAQXqOmzwbqVMvxHF9m", - "ivBase64": "xRsXQJIgjgJd0ZK0xtJWxQ==", - "cipherTextBase64": "AcUbF0CSII4CXdGStMbSVsUW03e8fWN5NQQG2ZO++yjbiMefi7JaTk4+xNGO3EvAqJGuNrICswIxZ0P7mbdL5HcL5XVIlZTNLJLWGyydLCXCvvq0j8UL8lqLuIeFlltPKaP9ETIN2rrb8Mvg1xioCHw=", - "hexKey": "ed0ace88ec74febc18bdad2297847db4", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "ZTh27J/mw8IDPH8CY/hZTj4PMdf0zoT1Muh54X/jtomatqLUopwo/1VZP1B9pJiYkA==", - "ivBase64": "p7njVP2bRYp0FEyv6v1pPQ==", - "cipherTextBase64": "Aae541T9m0WKdBRMr+r9aT0EiykgjccmqJ0zAKvobLskZRFJQZYrMU2IP3+wB+dzrTaiuO1gMapDzhiLRSEqXA0JkcjS7ALilNyzAcTedPBA/UX574B4MPgctVv30sRjnpyWZobxEcvjPgQYfREjAao=", - "hexKey": "ec9fa7c7d7ab5b46a8145d0c5ab0c1e7", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "qVnS+PSlPMCitmSaA7il8lcwt373pCUljHiTS7pkEaEjt9pCS5w2larwh7m61c5YvxY=", - "ivBase64": "BQe512uLOGimwo+VGMkv9Q==", - "cipherTextBase64": "AQUHuddrizhopsKPlRjJL/UHlmouO3oHiEDmaDeW3Ou4sNN5wf7f6OuaE48kzUqCcgYaoLc7WQcEpzYWBFCtbzlZf7Eta24++wQ6Gq5RQko2ZjHcnKZQL1518ENRoIIyibZBAD2jFytjdgCPmqWhg/g=", - "hexKey": "83de64dd7160a920ea85a8ad4318378b", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "W6miiNwuGCwpERNu/GBh9fJeNcTp/kb4RiQiVFy6TeeXxbyLEZFis2rbdOz5PjnPpYlc", - "ivBase64": "IucVeDkOTWwVFs6Arv18NA==", - "cipherTextBase64": "ASLnFXg5Dk1sFRbOgK79fDS1yxDZ+7+8lT4RyyhPkHsaIm1VeB8j2we8KMabZk9R6n2RkBEGKxqdzdQGlctQMoMDwdFggKqqsiNwmxWWJcZhIYqB96YdPdeeWkZJXmqRIhysFyQTyY3RGkTyaKWgtQQ=", - "hexKey": "f8ecc7b7f7ce065a1ddc723a7e49c1fe", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "lfa2225Z+eG8rB0RzdK3FFE28nzCua1jJtxmiimk6RpKBiSd7WF6IYgR7RG9wgW4I9Hb8w==", - "ivBase64": "MKlNqPR9LF5AUeP/L/eTVg==", - "cipherTextBase64": "ATCpTaj0fSxeQFHj/y/3k1Z96q5dX+4KhuEE3YlX7vx329GgjdFdcoU74frGxPDaIxyTx5Z6Vl2Chzi7dsb9xU+ZweeGPPmh4W0T1P7V/oqU6kz13h75dXlxH3xI14hUOa/Zf5+EcN2R+LZgBOy8g+I=", - "hexKey": "3a54df733301a975f19d68d5a6ea26c6", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "sNLpOULHLJpmrQkeumvedmxalMEREpG+7m5ssO1AYdz/Xft7V4K+tv6ikUx5EW8250qtzL4=", - "ivBase64": "uWgpZ/9mtzd+DCFABT1KYQ==", - "cipherTextBase64": "AbloKWf/Zrc3fgwhQAU9SmGrDGqOkSOkxaGaoq3gqbPSbJTkNcfQwciXV4YDzDwP3twSqpbHAonnNaEtlekm7wNdy7cn3pBYGRUDlKgirFgdoQ1XjYdcthGdoQnigm8u/Bz0oEYJRco30/rcxXLNlyI=", - "hexKey": "4e5af20f4c7ba233746bb1b66b88d581", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "3D20jnHACILBAx4fu0NnuhEbClXxQuk2n1QARDSqLnIBA7W7c/4SFL/OAHcbQNGHjj28zjEx", - "ivBase64": "2Pzr5wjtvezOlBpa1Paq3Q==", - "cipherTextBase64": "Adj86+cI7b3szpQaWtT2qt2WROThlqV8vKaA41sNR7eQXMnC0xER8qRuAmZEhz03zAhAgaNsxDcBGcNGB6Z+m/ZSPVACQNfqJqPXxjwCMx+Lj/Nn9k04gQLBKNCM/tygdOnNGEBfSPPV9Ers2VFOIMo=", - "hexKey": "0ac8d4fea6542835161551f4f4f5016a", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "9VbhQfJ9Rj6kOmsn5rXwr+z1Vb3zqMX5LnZClk4lAT/Z2HOjFf5Ib/M7lrFLWDV9P5cXYaMZsA==", - "ivBase64": "Ujc8xgtp/oE5thXrLPH/+g==", - "cipherTextBase64": "AVI3PMYLaf6BObYV6yzx//paR1zlCIK2Voe2HdkOhjYwnUqDGJeuTB9EMHUE1goICfdqulpqNdxLjc1NBup4Z+Vf8G36EwGuoNpWVT9p7RtXYfCgJPTDw70fvSeYKR9IhoUuOM5igfVVL2qRsqSxcAc=", - "hexKey": "14561ec4e6069b810334d2edd797ae0d", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "qPLn+7g1BSzVRm6mZIdVT2Vf4wo+gtOgDUrFHrs+tkukGi+oT7naBt5Y3qzp6hKscVhSERLCmSQ=", - "ivBase64": "it78fuEgBvXk2I99lt1uGQ==", - "cipherTextBase64": "AYre/H7hIAb15NiPfZbdbhlZgkNEenOhu7Ygwq+6Q4zeuZE9gnp2brkidLWXFk8sEdIpt4HQkvaGC4X8A2q6BaMpXwrt2uZjXcBFFDNeCBQIQZmiLu+MTF8yrR8O8NF/+E19hd6cYqXv0cXoDs+pWds=", - "hexKey": "1096042d90922b9bc10407547b2cfee1", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "HSQnTWUC+5SLCSYsTw3vDf//ovtWDu4eWHYMrm4TnATbPv3a8go6Zq2Y+Xtmr7vKFKC/+RXcMz7g", - "ivBase64": "cbRNirpVPvooOwfIy2eTUg==", - "cipherTextBase64": "AXG0TYq6VT76KDsHyMtnk1IajMo/KDx9BbpcgBAFqXFZSV8NL3aHODj6bb4VgOFrodz5ws/34pNNxRza8jfNJQ7Jd6xjbifj9XeujTlKqv+0m5Oo6NBczZ+mInKCD07N4vstyC9/D3XNWmvmXDCBhE0=", - "hexKey": "1e98a67da0f6769b1e6e498e4700c3ef", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "qOnaHNDB1oApHRSOXB8Gtmkz77IEffHs+uzkkIZjM5aqPflIXpjEK5s1ceQxd/iXgA/irzIVwjxJ7A==", - "ivBase64": "Uhee6p2UoAJ2+5FhJ4NQaA==", - "cipherTextBase64": "AVIXnuqdlKACdvuRYSeDUGhx1TYNcxxFuBgQH1ZtHmsna2O5yfk3VyGLJIRlH1WEGW8f7Nj7yucOYQfU1tv7ATNpNdvTqpIbe9hkkiOf0HEUsGODf8+p6BTIQBbksFLU+aV0hZreFjRudUF278VLoeg=", - "hexKey": "aa9e2c1b4fe2b20aaaa296d111bead3e", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "+TrwGaHaukuQjCtSCfqxRdI9gzoOsxIFhmw8EKXhrSvezF832yqN9URI6PO3ZnZcCefayrVGnZj9/GM=", - "ivBase64": "y0Ma1zqCBqsR91BQ1W8k3A==", - "cipherTextBase64": "ActDGtc6ggarEfdQUNVvJNzUoptj88PqwS9Gk+gfc5Kz0n9Mj20LMTTE876OBI+EpbWihFa2w5kCy5IVlHsb8vXAmYU1krl9y18iLBWv3inWosWFq3vRlRZXcLP+sQT3YO24HCQP80SshwBYE6WzV2I=", - "hexKey": "60bd84748df11ce0d99edf6ff4df7199", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "CRFXzZ9HzWNEUK19pAsvCtCx26Wfp9BagIoSPGWxKbw7qXO65eNQAxs8+Qh6qB6APu+WrnsCbwpvJ0c2", - "ivBase64": "rcIUZnBu2vmFkXOCyS6CWA==", - "cipherTextBase64": "Aa3CFGZwbtr5hZFzgskuglgG/Su3DMc6y1MYIaC37lSCvC8yEd8yRwLGKCjaNg6AiFNH5v+Q92TeDf/ZU/n7jbJtNorjPzpapPilnxvd7L+n4h2lTIugmi7gN4gXxvkxQeQMApeaBWU5hNdRK0V6qHk=", - "hexKey": "afc64fb4434337e95f1f9b4abc81fce5", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "ce5mEVSYXBSggPUrypskesNkKrWM/Ln7LXviZmo1r9y2tv/7kTvJbxR0Mli5VgbnnAT1xzm5rHN+CVQmSw==", - "ivBase64": "5T73joHNLxX8DRztKqiJCw==", - "cipherTextBase64": "AeU+946BzS8V/A0c7SqoiQvLHARpItbFouj7tR2VCTE0ax9hXfQR0s9WiFTKOKLx/FPfd9OW5qd3Kw5vCty9Uu0I93/QcGl4M18u0E9/axrGfe32EniUPh40bZ1CtD4m6AZw8tlU/nA7eqUs7XmalD8=", - "hexKey": "be9c3a1dd20ddf913675196a17e098de", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "uhiT9N6RPhH2ePcLSM6EF7fMX+kCPwdqW7RAvP+ZUHut/C+7ZbRna1/rU+yeplB3FLpefga7tJ6szND/Fxk=", - "ivBase64": "w3zTsb0iEGhj99/EEST8zg==", - "cipherTextBase64": "AcN807G9IhBoY/ffxBEk/M5D8xe76f8mLtBEsgkiu2Bk8UnF94ArSluGHued1KFzEJWlGzV/+X/Xu5uIoIUnJa81LdHsogKHI9Ggo35BebLBVc4tMGZTwxdpw3VzcXF1s2JwBcGBxPdYqiZAQnEX/g4=", - "hexKey": "1a49f24d1fdae6b35aea8db965c9aec5", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "frTBb4bACvemhpVdzB5YsXW+xT2Gj54c+KmLwR6kuelwDX1GQWImCu2u5wWtowRAa0RNL5BfNGsj5q2NMQyA", - "ivBase64": "aBJDEDuQqAP8DK20VpkU1Q==", - "cipherTextBase64": "AWgSQxA7kKgD/AyttFaZFNVBvqm3CuOfShTuyRR4BArOBe2fJske3haH9WBVA15fZmtCtT6NYBjIa6qpFmJ9lWysNISDWSj2juls5yvsimK7eGtnqhJ0p2z+60tlTxZs9UqRaxXFWDl/p2kDr3RZVL0=", - "hexKey": "f4c97f47f48b69ff654c6e905a517049", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "N9Q6goT0gsUzSeuwh+z6gYBaPNRjfyxLmSevnfDkmgnhVRckAXOJ/AGBl3mzCzrpP0Ncz3MaYPFSVhL7S+rx9Q==", - "ivBase64": "DBWZlAiVtzTpsPtfwBDGKQ==", - "cipherTextBase64": "AQwVmZQIlbc06bD7X8AQximzhulwX/FIbTvKYMdJbp5pNuwbUHFCLd+nVBqHqpiJrcMPIZVIw44BwmJHpNcoJT2NvzTGXLuE9QETFwmvMAW0Ux72X0Rtx//1lsYhQOhTy2AcBgTsA2W0BxQ+83+8liEfpL/jVf6X+9iuhgeqeqQV", - "hexKey": "d4549f2b94137d9feebfeb279db690ec", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "Y+RrOFhfvIRA8jNagT5wuOtsv/PFl/1/C17K/rcQcTXwSfMfDQXHkCaof5lGzEI01g8SZtaZTolZg3IyZsT6kdc=", - "ivBase64": "wmiQYauOf+ITzYQI4vp8nQ==", - "cipherTextBase64": "AcJokGGrjn/iE82ECOL6fJ3uMv2gbm/Xb+BDd6HkBrLU59nHXVp/UCTJ6+jzPC3dXNacoPURjfTNZkysgyw9ZcOSfczx1tfmXBNz82q/J2qqb7fhIie+rxFCycV4jwho16aV2jxDbOL7Q1xXe4+1iJpOCNOr7oPTYn1QOkrPOdaj", - "hexKey": "4a64dfd13960fb3f1ca734bb85d790f2", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "7KEg/GmM5cu/0YozuccYt0XyLspe0RuCHv17N9XlbyvhKu4AoDQ21vynsA2kqnpwMZnjLjVqNE5XbVSRfkPdmjXF", - "ivBase64": "gcK+EeN2oaAo9Dml3et5Uw==", - "cipherTextBase64": "AYHCvhHjdqGgKPQ5pd3reVN1WmVKOz01++0etp3MP5GhJo3WsFHQILmiZ135nHwiY73ALQ3UbKbO7uMSghvARdLC268OoPbyJY2pIrrIQkUbXuvDrKvnxQeNpFwHKLIZiQMe0vuNRRys8VH6aDr7DH+6pY81vjBulVovUtG8fV3U", - "hexKey": "fe99729ad078509d9f160e18334b76f9", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "gN1geLd0qYIeJvKE8wpuwJ8JMs11GSPIUIOkYNuaezcdbNg0+Ie2+hacKoAI/LvJKiAjLyMogE3XFlx83caYGK4Fww==", - "ivBase64": "WJjlF03cZVX62QFf7HNxTw==", - "cipherTextBase64": "AViY5RdN3GVV+tkBX+xzcU9PNeA+ii6+vGhmwTIwyQCWlmdlEZzWhvjazt2hgUF50ZYJjQqgdkdyQ+oabA7hUsa1AjDnrjMJ9wKa6TFcz210wHYFUbbngBcdOaaCdDkfU1DxRrS7dPGFS38OhactoOvl3z5Tfy6Qnmt9YnJ86uXG", - "hexKey": "d6bcd72e9a9f6f8e84e8d1de3455c546", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "MQAaDRXozaAz0a7kInCHxDRbOPDtKu2xyZp+zlVOKbs4nxI33BUXWb7lNfXrL2czHIdTNgCkHqiuEtEL/Rhqzl0LITE=", - "ivBase64": "pqlfiNrwoibqgLj6vA1oQQ==", - "cipherTextBase64": "AaapX4ja8KIm6oC4+rwNaEGvOWam2o3e+con8qQaTvLbbPpkTgaEQIdY9f5CmOBzmYYCcUDNk1Iz+Wc/xT6oVeTFa6/hejWt6FWlSu7QD2+S3Ustzu6MGoTLOztvZfHWR8gRy5Skhi9L+nv4hWga26EObDl4uf8PhZZJ0ewOQkLf", - "hexKey": "076c22975c39990b7dcbf53accd798a0", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "M7DOKSx9XJ/h6AijMx7gVDs0SoJC0pdwQj2aU4+294/u+HgeEOHk6X0LHlR8lffE5iX7QgqF2STATTH+Yme50ShCRyJg", - "ivBase64": "vr6yAIsEU4EBGYiHoI0LJw==", - "cipherTextBase64": "Ab6+sgCLBFOBARmIh6CNCyc26k+7m8PednGRkxciU8w8gR1g7TZELyXJ/rXEWglS9EBsq5CbuutLaJ2NLjzsRDmp+JKCx7atmhdUyAFKHdrX/s9v/tkXA/Dk+ojLDHcRibAqkavjYVO+i3/ZasAVq/MCD5Ia3AJHEnszGcK/17lL", - "hexKey": "cb773c18e251b883acc5e9296332cf64", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "DQYaYm5Rw6Sc8fVUGjtw+bRuWwfN+jIklasG1w7U3puaMuj9+AghK5M9CpdNbx+t0eWlXQP6mij4KqOmchnfHucZ4G6Ucw==", - "ivBase64": "lj/4EAhPahAcWapY/EB86w==", - "cipherTextBase64": "AZY/+BAIT2oQHFmqWPxAfOtVAXW+rWDrrI/ZiDUS4g30ywsKVYAXkktuA488B/jv7GSwZFbt+Ludtn4gpZjVTTHqInuShGXRNmXchhsH7bLGWKWIRAKoZKElP/BXZMQMwaGFTy5UL4TV6NMmcx0ljaS7Ih7qlxfWNHQDYwxDZWsc", - "hexKey": "029e9b8f3bedf322fde51afac7b673e5", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "BNhFctR2E3Qx64KdeMYLnvlRatmiCrOq/MiC5xWuYdVhYt2dDKib9NpkJzEASSIkP+X4GN6VJzD32MzLDfYgEbpiItrXRO0=", - "ivBase64": "bq5643SR3wtnCK8tQuDfOw==", - "cipherTextBase64": "AW6ueuN0kd8LZwivLULg3zvcSsSOcbv+2EIi1V/KDd/qWluNXPFEI9IDov+lISfOf7vYUn5gM4j0Y4ExgpcJsM+KDqk3UIw/RFeeiq3Km4ydPjdcwa0dz94/4HjhWbPwU4RZC0LkR5gruG9utTu4VrgjAWurHO3o4/4/JjE6g3gh", - "hexKey": "1f29c1c2d2b1a3189faa2ff6d5766025", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "BmOtoBUmeTtC3pxAsbCSWCRjCum26mPnbpZ+7iB4eikENH5ZeOI6yhhg5wTNyNVgycvz31/Z4BCoNtrjWFOLDacRNJBpw8Pb", - "ivBase64": "2d3mdub1dWkBr6n4+UVYYQ==", - "cipherTextBase64": "Adnd5nbm9XVpAa+p+PlFWGHZhR08VoeQPnlOpTADhVSk+wpXokfpnnt1+CjzX63wYuYZmQocIjst4baq9IA0JOE23B4/pQ+nE9IisJSWHiLJi5xllRvSPMew7k8DM3ZUd3TkLMX3VcaoAmb/RsLOXrTq9jsfBAy9wdvIEkSc3jnX", - "hexKey": "29955df657947bff7343f85ee426a297", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "UDeIBylN1oxkEKUHhcBHaTiExWisKfuuYaKL3ze87luQ1lchgTcGPboSh61wI8ym3E6n3hqRC373OZ8DFDGyriMBV5pL7GQFyQ==", - "ivBase64": "AKPC23eSL0Ah6Mg6QuRcbg==", - "cipherTextBase64": "AQCjwtt3ki9AIejIOkLkXG7icHBbvcW0xUfjY3kE1gJkEM5Xl3Y6uFgIuQaHK6pPSE+9kRy2DWkiIm8ulj0slN4dco1KIeN22Qw1DlKdNrzLN4ar18XeBnC+ufGx1iDBWllMzBTYM3mZiSH6YGeXwDhndderc9SgqayhVg9W6Z/x", - "hexKey": "36838b747c490012ec2722c0f2f46fe7", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "k3gAtVmgDWO2MRxJt3CIXNIo5PhF9H3gZALDoR1VCr5dKzQ289xtuObJIJZYQ/XLWvvewmOIxVdm1cx54bikN6HF7mhon0grBzk=", - "ivBase64": "UAKnm5p/EFnFpeT+XeNxDQ==", - "cipherTextBase64": "AVACp5uafxBZxaXk/l3jcQ1VnE82C+U3UQR0pz+aJW5TFbCkPT+vDo8M1HIbOJ1IwTkFoZ4NGERUhl0ICs0DwqavlNraXzHTP+Nk41UVXLxJkbVxOvGMB0P9w3947qDFW4jti87MI1ylzPwamQygrInLtqpfDM9N1iJ+iMc10r/g", - "hexKey": "6a37ccfa891c34e93cf96f934cd8fd96", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "EWv7QMcgMsVImgt1KTs/JNsWET9At6G97NEGfkX8c55v0HI03XX2DkCX4ISDC0gharjlAoBjkvjqzBgi4yUslY47lLkx935xrZny", - "ivBase64": "7xU70X5qBzS+nxPSNRYntA==", - "cipherTextBase64": "Ae8VO9F+agc0vp8T0jUWJ7SUS43VLBEEvpgw64UMWoA2rxcdoGmd955zrNXWBdOe43IfECF6zBRAKMXFGUeber1S4iSRBkY9FT/QbPMVJzFyPd9UiktYEcyCDpUlHwPJg5bGZY35PvOaGEo37RK4tNeAs0nCxgwOg81iibCvZLkd", - "hexKey": "6f5a4cbba527f04b9f169a69649d6046", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "+rH+li/YkdJalvu/KM+OVzJmY4usU6Y5KVkIICCOd02qqSzIcEf2ovLtFfBtEmKTfAeCOQoi3HbYSZI+nXtVwzTH+B2RsdDVIAKYDA==", - "ivBase64": "K762A8kJCb+ox3DldCTD1w==", - "cipherTextBase64": "ASu+tgPJCQm/qMdw5XQkw9dsuuo3J9LL38sZ1ZcrcIJvi+7ycYvLxhxmydHzSxZ6I7hyis5wSAtORQEM0gpCTexXTjjzbI5wbr+IGg8l9qwS+EruQXL7YthMMDppE+FMae/ED0AOxmIN+sM1nEAVdNLtkcF1Hv08ZMCcee2Vy9j2", - "hexKey": "590b974c3025b7ae98ce1e90b85f62ff", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "L2MxolRq6WRnIBIahFGm/r53T/iNXLvL20NROHyHdf0/k0OLQUVfLi+ntWsSXlRX5+xZsMaDr5F+8eXHtMOg1zK9PvLhVxhl+/96IIE=", - "ivBase64": "JCEjBFeyKNql5su4Zy1/Ag==", - "cipherTextBase64": "ASQhIwRXsijapebLuGctfwIGNJ3KNLi55nbBuO2XBeTB0mXJrNp1QHhSB0XhFqO3Kfu3WBCawSy/YVn3a2W/2vMEHloiIZiJ4cJCKRY/8kGKFHe3rMfrhTCwtCfCBM6TsBKymy3SzF4q82lAlKm9ti+63YlC8VUu8QgFh6xLvd97", - "hexKey": "9213ad04bcd66e3da9c8c3e5b39ce01b", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "esVTif9eWREtF4giVGPGojNPOQaubcQNmAJ4N1O3oB6LlpHhEKfcCnKrQLW7gR2oam/1+Iw+JUKmS6cV7/B8/1h0CveGeaI5IkMLeIqF", - "ivBase64": "+HGMo1FKxwM75NAsQmiEng==", - "cipherTextBase64": "AfhxjKNRSscDO+TQLEJohJ4RTJFA4z3t7QKKZL2cv/IZ39GJkIZgQbfyxUt/G/qsWYv1EloWGpmLo4KgYnEBObot8bLspc6L+wMqUPgrKUILWXugEVTwuiA48uz+DxVizPyhq9rew0oL7aAoLMWejzT9RUPXfAGl9sQ9FGXOAP5P", - "hexKey": "4844ac7c5d7ad27a9a47b6f7cecb02bf", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "8z4wYO6nwgeZR3Ytfri1qiu3xPMZ2tf8592WvpdO0DqRzOPxRHQkCHQSSPmBptZ/CktPqrog0FdA7b0wvkodHXXDF5iyGlerhO/RXyhzyQ==", - "ivBase64": "a4m3HRu5cIPtZsXroy4ovA==", - "cipherTextBase64": "AWuJtx0buXCD7WbF66MuKLwSLCFqQm+IK31cToxT+1KIPiDqY6dYuBKL+MQW77PsZ3AUgmmkCwCp7ns9ALVG1BFcLX1vUIBpEVh+479HiB9rttnO/6u0sxMa05I5Ka58wkIKo5G1dJGGHsFK/LXCKhJT9EwzPAitU3x9NPGGrAxd", - "hexKey": "8f2c81030491a24943d129fe60e63137", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "bpJq2o0SpBsacGNxSqF8ndO173juN5N/Cv7nsvsNsYRx3OOkhzGEC9hpvwUE9ANw3pkQ6Gf3MB+uqmQiHWYd9klWXIpVF1+jD6LREYmXVz8=", - "ivBase64": "+jfoKJ/q8Otwuei/03wqwA==", - "cipherTextBase64": "Afo36Cif6vDrcLnov9N8KsBxjd3bZdFRv5j8cM1ASq7DaaO5kTlRlrVqzEbLR65ik6Kb793HQ0X3k1C0GY9eh8FXln+kbp2nWdBOUR3/y+fa/fZamIJQv9v2WIrH3HIkqgLlKmFsBOos9VDnsfHQgDfnLFWvHxBErTb+z0XDacM+EPXLlbaIL1fkyQ9ucmlmIQ==", - "hexKey": "c7ad1a66c7aafcb58178b869ac386631", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "h3Ws309e/UuSThri1bMPu5fDRIig+dPcSp66i2Fr2hsYyisPAotcBWddK289uSUaKncQe1bEPTF/ujcQ2WOmjUqeLD9o6+PvE+KPbAGwNziT", - "ivBase64": "hprXeyW/cJI4tYn9su7BIg==", - "cipherTextBase64": "AYaa13slv3CSOLWJ/bLuwSLTcNX/BCQFqKzG2FrZNEw57vDCgQjw4WTgBcBWFrwK4hZ8B8ubDvwYELURH1KQpiY/oOWDHjqqLQ3saVnjuYkn/JwH7SieFomue+mZHkiOGpy/zoMnoaCPi+aCh8QZTWy9Q/CKGwoHPdZMHuhflUQ/ZcSsYcUDgGVZcdx4fLo0eg==", - "hexKey": "5ffb23e0309752e91b78dcf6376bae3c", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "0qwfR+K2Yrc5I3iv25j0+xsXcK0lfC93qrhXK7x/lPf/M0/6P1CD6Y9CpP0qohsaavY4PjvClm60fHkwnQu7H+zmiNCLlT8m8ESQY3lbFOHPjg==", - "ivBase64": "XdR6vFWiUWLxr12t08/+5A==", - "cipherTextBase64": "AV3UerxVolFi8a9drdPP/uQhGFrO3/vqw09eHfLtyvooX/Xc+6ZQ0u5rQYhU1fogcel/1bMmY2pz2bW1qYkmMRRoIV6DNO1r+f6qCdy/RXaDtuw70qly01byZK/qhn8vBF6D75vG3UmW/REW7jowow182Nv5+EPoY8HmltILjlYhl/Q6cpruKMLNl2udwrFtPA==", - "hexKey": "b57678bb5900100b7c5e3fcf92f084c8", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "aQDtnwsT2zYVM6dqR86KYadTwUli8RoLoW3UxkxAB7Dsz2AuMj3DMtmX9pkQUUcR6NzoYaPpYTQ5RoFn5JXg1OEzAdFVSQVPjMbfNalSze0qYxs=", - "ivBase64": "ijvCYbmFjWIpydr6ZV1A9w==", - "cipherTextBase64": "AYo7wmG5hY1iKcna+mVdQPcFUhgRg2qNCoWaTiFrEX2tndUtg1U35qVu9XP9byq7+Exgz/d5XXpLJqTGPbbZrrlZxOgibovb3qa6I1J+OYY0V0R0hddMZVKTeGe/qDI/jKbuxlJizKR58eUnbzzjgkUMM576dl2f1qUI59IUYJnCvK9CF/iu/pSeAPArOOB7Cg==", - "hexKey": "0e61a06f1b24c9ed61935f46635e759e", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "Saeo/tqEmJOOTpsc6wRep5mJFpvmAzim5xXp+GdsoclcUOOXn4m+vucfnYZ5SWT+3hxKjPJNxXYQwvIcqo9lP6ZB0RDxey1sRivoVOm+tyIeOtba", - "ivBase64": "qT1e3bviGBolhCxiV9dBxA==", - "cipherTextBase64": "Aak9Xt274hgaJYQsYlfXQcR8jr9j5I0wQGf5BfSrbg2QSbNOdt2MWhnbwHmW1QCqCCH+kd5G3hjRmyThdg9ixeT6kxEEUR0WTBOjiXclBgrPST0596j9ZWGpoGbgNe+RphLcCOd5v3SSAA7PFBGA680doAfJfSe4/B4qP8GLCm32pNZPkNMM7NlhfV2FDGMAkQ==", - "hexKey": "f9fd2d875fa2689eb8921d8fae9c6cd6", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "diQnjbvCmHgGVTBn36bMk45JGRG33X7AJKreihzSs6wgn8m4yT0w97KlEcyuQDDfUG1lv83OCOZn73UsQcXpvDMg0QVhM0QsuQO+5COngdUu/c36Lg==", - "ivBase64": "C3hw2fKVSgzq5BZQWDkYTg==", - "cipherTextBase64": "AQt4cNnylUoM6uQWUFg5GE5M2ftntbAJMgf3vZQTtgBIcexPaeJ+QequPwTZjndKglHD0Pyaz6kHQyKrqvT6uk+8d7+NYjTyQjcPJUU3ccQO3r7wKr45cmjxHxUzefR1n3Vm2/FuYdFqFUGvDknrq4UcIGYgZJD68fOS0ILHMUzZj2ybOqcD1E0pB+r2oF6syA==", - "hexKey": "17e9720932d9cb454256df16a8a207bf", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "nQneWahi3DVJ0AKshmm0nGrpjTJZ649428o+hP5MzWIJTRtiDVL1wZWSoKqfSm91r1LwvPTs3AsCROKa8Mof4kmfBUKPcD7sxuwRDtGEvfhHn0grwoU=", - "ivBase64": "BtGrq7fFZZzG/Xfe7vol9w==", - "cipherTextBase64": "AQbRq6u3xWWcxv133u76Jfc6DbOD/KMUhbit/00EDrimDSwXiuwcCG5bZue/2SZKKgS6j39JB0MiK3Aq4i6wEzlL68SGOzL+3U+U3O8YuGJaxfJMz1jjauEFP1K9Tr17CmLPm7VThTpW8Wv9DOBEZbGA5zomr3AnF4mbrv58qH22YHaKXdBHaJrTMWAvgx3h1A==", - "hexKey": "42e140ce3bed5e9c95e7c29bfc3b5bcf", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "EaR6MslonwREZqK62OM7ZQpZCDKRaROMt6yv8p6J1Q/n6hkJzqA3utV0QXu7dVeNoOYBkc4fF4b7R4y+UUAjyRoovM5s8I8SwypUUiTCSHPainSQz8vA", - "ivBase64": "OGGM6bZMe6wSU66Q+6mCtA==", - "cipherTextBase64": "AThhjOm2THusElOukPupgrT9VKjo0vZfFtpFbmHl9TqACYLW0PCILOIq+5bfajMmldzrV29/LVZbsPj4EfB9sQEH7g5+wueouSCr5+a30O0qCbyNDZlQ3N3r0dc7k35Nks6DOhrdNoEvLuIy9QBWQY0y9K4x4mau58OQpvqsrdKTyL7osV0s51NQeeRWx35AGg==", - "hexKey": "1bdac78a595daf0586f025bc6f9a9bf8", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "yeCX6F+SnYV5I0gLvMSMvEyqVWH5bMKtjRN0MNQm6syz7LWr5x17+UFAFYEj8PHko2W03l+yc8EyQGYyIle8x6uGcVEwOEEgvrmyuYuK7kd+5pAK4PPy/A==", - "ivBase64": "Fz54a7YykTuRYYzLsqY/Ew==", - "cipherTextBase64": "ARc+eGu2MpE7kWGMy7KmPxOwU+x54pBVyXaWpBEOIk8rL67FrOENO4Ww2kBJvFpWpw1ZzpmGDQsCyWbEgL7HO0ezBgAVIscsDGyrMg1fjSY/F/TCRBq1pZWntpGmQJC6uMJuGE+KKq8OwuXs+VqC9lek0GXs7Cdg4Nob/BX1B6bcgHdh8CMOYjebwoLFE3/CvQ==", - "hexKey": "740ad332f02b20d64015aa08c4d07b7a", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "2V1XEJ+Gbzxw7v3jNO4V/2BmYfAYf+mX1UaFBrVoy/KQC1GjVWeDJ6Bt4S2Zj1MCAWx70ysRZIPgG5IrpyKXdLh4jevzY3CfhswoPIVkQTnHS7CBQy3Hif8=", - "ivBase64": "bs4+kyCqfTuzWMMY8OcXDA==", - "cipherTextBase64": "AW7OPpMgqn07s1jDGPDnFwx6TB86U2IaCb2eUOalTlPElePF4NBZ+mFM99OeiCDLxRmdBGjlWV1f6AJu8s8WCnfpTkK5GuTg4ANuoat/jlbFQZEFUtHvLbc5NzZC9eeKV/6+kY3/FgoyRIgD1Ixbdth/pnEQV0bfW2pU14V0DQIOZTuESYgfg1Odcmnu0wlHng==", - "hexKey": "9dca45e355ca58a4d6d3562a33f00c32", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "DWak/+fJ8f+E0TzTDIvNIQXKEbW1Ctc2GoXZIfNgBuOp8Ee+TM8TmCESojfCMRhvPF+Zxf3v+JAQFgErgbGJ+nUsqQgUXqW7+lCMz6YolvnwCuvPbMKbbkYN", - "ivBase64": "2LhFtXyde++8Syxd1kFH9Q==", - "cipherTextBase64": "Adi4RbV8nXvvvEssXdZBR/XhKPWvm2Q8pEEqXCH86OsXtHUOzPJ6bOzrpNBan8RJjqkllLb9XkOzEUvbk2LYc3eK0/rcjZjjZHYijiYg87IHX4m4lzPwPtMogVb8JcgIDAmptYRwjTMy/jq/I8Zvb/aZB05h8fLnLLnq/zyiKRHXWJl9nA6YsEzsYTxWwWkMXg==", - "hexKey": "a3e0a351353c82ee918e65b0217e8ea2", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "KwwD8V4aRjF92soPrVZZsrN5wUjAm3CruzKgmeaXvuegmPvRYmjTgSb8njLPEEfoQ0dyYVyPkEgRq6PEpR+kbgnr0okShYiUkzSC6PCB9MZCvRxhsrmbwkemJg==", - "ivBase64": "BdAgT7W6HYW2tz6XQMDVaw==", - "cipherTextBase64": "AQXQIE+1uh2Ftrc+l0DA1WtVdj0FnzNvEMIgc7+8cZzau970g4JHWkkwVOviQjxd0n5pi6d+M5MVcXeTlOrH5nnVL2qZ3Aq/vf08wX2XpcTgYEGHS1b+u2dIeeHom1mpffKXTDceL5sq72jQam5x8kWoNhuu0Y24kalZ7PH/glPAlT6pYItNsxtmfuy+eM++hA==", - "hexKey": "1dc6b2bb1760744cccf1eb9bb6f4c27f", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "Bwy+0nr00p8X3fqdrFW4h3QSqFgnOlQQuvkuibs+zP8Ms2uZ7aFmN8qw22nc+tx11HSqGgUgP7kICwB2zdbd4hvaNsDyBvJ4Bcu79luiDK2Y+Mu13H1qDPdTSU8=", - "ivBase64": "RJTI98mCmDQ6xcSv6DX+7w==", - "cipherTextBase64": "AUSUyPfJgpg0OsXEr+g1/u8mz045fWJzVphu3ujVTrzpawI64Z4cWafwhQDq4Tw5m+MIHFz58o36hxDqnJ5q2TNJgl1haie4aEQK2LwnlGOuWGbQ2miwz4Im60IaBO5VI6nhcBvQofjQ0A5DW5HOOYYCrO8Pr1fpmlkuO2ytjfbWBGDKAmSejL4HXH+OEIUWew==", - "hexKey": "da67f0d87a4004792018568dc6c9fc63", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "8KW7YhDqZct+FhTWSM/P1RHZ+UH3vKfXRda+L236dc0w88AolDHKfwdRISZ1D1kyZ7AJUib/rQvZU6Ro6WDKp5TwUXON5mGmjYXGq1YeWCxRFBKr7T/am0qpxEow", - "ivBase64": "YZRuE96sjYcWSmaZxBb5ZA==", - "cipherTextBase64": "AWGUbhPerI2HFkpmmcQW+WRA2UZu3l+Ukpwh8wRnEBZA/G6MoD57VkVA7tploNdKJeY3HZj3ogjFtgORJnwQMZ6jmk+7UAtytN2FjgPXHa4x/THHBI7+EuAidYZric+AcyENPRPU/9xlT1/PEDpSvISmwm2bNU3SM9UpeQdMoHBZVhegfFZ9nwqBOvusM2VhxQ==", - "hexKey": "8fef81b9ed0e1d5ed03c59dfbb1143d6", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "wzUFUius0ttoJRHN1+hjY6NpYaBlQqCAnbOzwkIMIDEzUjU6TgAlSb0y4McOzI/KZ/vNkFNZJ5B1fseGpe6ZKca6oWYRudDIVRkGexx0iLKksdWU7xk3qEm9OM8d5A==", - "ivBase64": "dG/dl8TWAMsMDersVEe6CA==", - "cipherTextBase64": "AXRv3ZfE1gDLDA3q7FRHuggDJHpBEQnkYau05vMmVsKsAnrk8wpxKkpFxN/NG0/ZggbeiT484Degv+cbHg8stjh+4eInxFB5S6Rsoh/RzcSMB9GP+vfSR7H0Ya5gz84MNb+UHxuU2MfBTa5QC4OI3IwMtyNI0vAiDayG+nMRb8gorTXu8zIQUkX2CI8BLtGp5A==", - "hexKey": "1edc715badf4bb81fba537a4f4918d6b", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "tQ0BiQAmeBdB3wd7CePgQcLGmBKgZQv0Yb7Z6TXqpDLyLo4ozjJHAadqVucKNjbcHPdUcKpSzAWxDIVt4ZYH6rUeKV79E7sQ74bq8QtkO05vhMsUmM+GPsUl8tu7pVQ=", - "ivBase64": "ItHe5Lh4yuFX9xW0ZXKT9A==", - "cipherTextBase64": "ASLR3uS4eMrhV/cVtGVyk/Q/f0WhGWNqKNUycgLnn80ehJJfSr1HsG+xdPGH6HH0/iz5vHzzLWRaemCJhzRHsUR0gU70BqzzS4NnTku2nKObpCl1iB3sKrCTFL2tN6dIscm/ZxgkoVe6A0kaCDKe16VnhC91PSAlg18o0xL20T6XCH3pTtK8CmSrWuAWK09VzQ==", - "hexKey": "a46f3c385dfc61ed42ad4acd0291af2a", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "Kvva0ZDr14XrANFYi2zW1W5XQCanTzzU3CxK5G471X2kQS46VZX6/tI52R2luGl9dz0ZUN1C/u0XAwZhvrvyQ1qzWnw6DZmjcyzV4f+isUbzqdvIYA7FPxfQ+xG+mjZe", - "ivBase64": "c6T2ix8Jz2Xei7VurJ1vuw==", - "cipherTextBase64": "AXOk9osfCc9l3ou1bqydb7sDXPkBJJhl/JEUSmuSqqutLKbxUXzS242P4joFmfORi2SHiVW97mVv82PyGGfZwebTvLtDMgJjzaEZbTxZcq7SzozMm/ZgEco/h0AnvYlWly1NHOfgqw1LlGoDTevGJVYM2+oaF5ueMwFjVoX6zrHInaAoMfeuxr3DdZo/ePyiIODEJ+EB97tMXyDLEPHyvwQ=", - "hexKey": "1017d8a710eb64a84c1c27cf38ebc09b", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "ppb8As8u3Mr7mJz0TE9xJt3LPbP3SB5JJp4C3/Sj4OV5+DC87o2nn2ys2xSG1l9/+0cgJ/SUP7AfWXnZ9asa9NyW/49LsYlVK3qLZ4kFIOSMQhjC3voZliVt304dexWZtg==", - "ivBase64": "BRN0m5PzbIZ7uLVyxj10QA==", - "cipherTextBase64": "AQUTdJuT82yGe7i1csY9dECvNMz9ETBMAHaDjg7H3C3n4sC2VpqTOmS2at0p7oUOqvGU1i0z5XziwVHGsl2xi9qApu0Ikpt1UHpgktsgvKJKn9uW+KCFj50R4edKRGTnbqILrQyGV0+WS+1gCppVJdxWXykc/pJq8JzBSxKrRaJ4CXqOnPkKgaAo/U62V949S6rSrYhFM0ub4SZ2Ell8mBU=", - "hexKey": "4566695e11972e7912cc240c9a3dad4a", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "EPwDOojmptK8pL3xaIYlIK81dlh4oTeSnagzjPJj+c1PMze5F2qHR8kaFjCLD5bB2QSaT9hkvygnUb1eapu4BjRGELxxsx4I2A1Y636gl1Ix2ztgw1BhiRe9RydaNaPqg90=", - "ivBase64": "MpTTgDvXafjbDZDJwWNkkw==", - "cipherTextBase64": "ATKU04A712n42w2QycFjZJNr9HwYUbd5952KSP+td+HLU+yx+dIM6HLt98aDc8RDkznaU/10cQUHUbrNn9kkRppTFZPFNq1CF4Hbk/qFiROInac3kuuP29jfTAY25POvMXdszXzDXO0+zN8V8L980ver3jtGmgFAdu78jXLd5DiyC/gyzu2EWwBmknvzjmPYFrb/EOlf85p9OxPYEdvHVRs=", - "hexKey": "2b05856743890e33f81b77621324aa98", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null - }, - { - "plainTextBase64": "p7frRAHEdkRYk5mLWjFaWqyIGMWx4+zCb6s+p5dmEUX8aJCwqShG3hY/hMPxG3Y0VQp65DrmbAh33LfFqNEvWOTh1Qcr8f1NPsh2Y5FPsTbGmC4cWvXIGeUP9V+PKFelO9KP", - "ivBase64": "uBG8sZ6KLuI9SZDCcbswdA==", - "cipherTextBase64": "AbgRvLGeii7iPUmQwnG7MHRVL9Pdz66/yZMWNHKDSdT4L2ffQeztVvQ0cKJQAZH39ER8aME76tB6e+sn8wgkRp4Mp31MZXGE0LNKJvkvOFi/i+yLARqFjzuBY9s7OM8IIMaJiZW5/nW7HK7OQMoysltmjgy4N3MRSrzykgsYBnnMGyC3JMzRwxpYU84bf8dDCbxbs2PTrsh82i6Y48xj2jQ=", - "hexKey": "2cffeb09fde31a09ad00e506ac8cc886", - "keyToEncrypt256": null, - "keyToEncrypt128": null, - "encryptedKey256": null, - "encryptedKey128": null + "aes128MacTests" : [ + { + "plainTextBase64" : "", + "ivBase64" : "AhLigt1tL0R5Dr1HuR3v0A==", + "cipherTextBase64" : "AQIS4oLdbS9EeQ69R7kd79DpPasnuLvw003DmnJ1y+U+Hb8fpgU5eBpSUInKItEiwXFZNUK3LoieMbJt6389YVQ=", + "hexKey" : "2fb8c6e0bc1d16721ea0b78b471dba1c", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "5w==", + "ivBase64" : "FyYLOIebXNfGFwelu7hbdQ==", + "cipherTextBase64" : "ARcmCziHm1zXxhcHpbu4W3Xt48oCXxJjE8g+FY2nHl0ZdHBLk7auvRn7Go8XeoMO/3PG5tKPqn4fEq5XIq95ZE8=", + "hexKey" : "5f55a55141b585ddcde171d84efefa65", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "pI0=", + "ivBase64" : "6bA5QToX3+mZpAWf+aJwug==", + "cipherTextBase64" : "AemwOUE6F9/pmaQFn/micLpJDWqSXmF+Ed+5D7mJoWXJYwLueII+e3uuXFFnAzdxBD1ayv+NV3kKbZMR4oNu1hI=", + "hexKey" : "288d22355c110d1b69e1ea1dc2fdf477", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "CnBI", + "ivBase64" : "R4tnzuJenpDyV+bMewebCg==", + "cipherTextBase64" : "AUeLZ87iXp6Q8lfmzHsHmwqXJ8Mp89QeRyKQbi3ozmXf6k1/ZhCUwzdaGTitvX9jfU+87i9Y7GIzsu3dwL3Oesg=", + "hexKey" : "8123888142af28c491f5099a5f03fffd", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "8amNWg==", + "ivBase64" : "R7ijY0S9aHcases75VbRJw==", + "cipherTextBase64" : "AUe4o2NEvWh3GrHrO+VW0ScIAj8KkudlOWBt7SzWRkCTmKM4zfJYicAxTuIT7kpDNVyPn0LFT20zZ7bxLcU/tJ4=", + "hexKey" : "ca7c143b6b113278ddf42a23cece6e57", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "pGRG4gE=", + "ivBase64" : "6jYWtCEk9O6MywukEiQmlw==", + "cipherTextBase64" : "Aeo2FrQhJPTujMsLpBIkJpc4P7B+rbhX0NO4LT+zIf1LJbmy3UVBVYmvwJ3pXuIQCDfYLOGuP7TA3/xBLzJ12vo=", + "hexKey" : "ff450bcec3c97f2f8f87b92489cae073", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "9LV7hFEP", + "ivBase64" : "lumvyyqHQ0ClwYwVY6O11Q==", + "cipherTextBase64" : "AZbpr8sqh0NApcGMFWOjtdVKy+9COtFH75O54uiJbZz+dNSlnRo3mm8XCYo9uB3hsGvh1wf97v0B0+TdAfv8/ic=", + "hexKey" : "980b856b20a6bba0e89ec76582516db0", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "3SmDFdwdPw==", + "ivBase64" : "/7OTNOE3IdasS/6f26Ggcg==", + "cipherTextBase64" : "Af+zkzThNyHWrEv+n9uhoHL3zNU0THBj9rfWDOpHzWja3/xHGFq2SDTVeU4SxUPfx/3Shpkf6l76e0dMR20hiro=", + "hexKey" : "89c652da9eacccf38806fcc76c658357", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "wK8XGv9GkG0=", + "ivBase64" : "9Tb8KbMgbgJVeWSpCN3rMg==", + "cipherTextBase64" : "AfU2/CmzIG4CVXlkqQjd6zJ7cl4QM/tM9Yw+qcCEXS6GX8b+5x1WR+bOtTrzVtB/SU+xte3cUJVBp2AnBpXzgRY=", + "hexKey" : "1fbaf091964545d20fd888179a94d7ee", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "CJ7hJUkMw/1A", + "ivBase64" : "eseal6hXOwb00zYr906B+g==", + "cipherTextBase64" : "AXrHmpeoVzsG9NM2K/dOgfpVMlVhzX5YjV9ZQX7vIwbOJt0CS8EevjuhEyZ7LjYHqTGlxgJXTtvqHXGDoW5EMIc=", + "hexKey" : "6e0725f65f4c54aad2c57073b47f3580", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "qwXwoCtO7/iTww==", + "ivBase64" : "Z2tSGpeDW/epDyZUWx5NbQ==", + "cipherTextBase64" : "AWdrUhqXg1v3qQ8mVFseTW0Rs2PDNmhn5Cfjmu3Uwe4VEY/vfgUMyneW+3wBGRUpYL876Frtjp6SO/+FVbjwv/0=", + "hexKey" : "db85e5210ea4583260600a544daf0129", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "T7GgzrCtuv+R6Ns=", + "ivBase64" : "Vm6Jso2TXBGZ/1fWFAC2dg==", + "cipherTextBase64" : "AVZuibKNk1wRmf9X1hQAtnY/wsbmglu7V/qZ21PlsYgeE+V6uP08qWLzx7MyyDIfWubR6qXWd6mDIAD2hLcm7r0=", + "hexKey" : "b85f2c87436e989a2e3bc8f3a6fe14da", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "5TGS4gLIwl51uHcR", + "ivBase64" : "yxlkzUz5D2Ttba0jtorogQ==", + "cipherTextBase64" : "AcsZZM1M+Q9k7W2tI7aK6IHKCPdDBhbDTIMiSx1/E7Y5l3MizsrRUyQavkXwqoVQDvhR5YALI6bFChCqI9ztNUI=", + "hexKey" : "7f7052b476cb4be965603f6eff130854", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "2rzm+tPWMAwsF3tCDA==", + "ivBase64" : "mqfvFD1jOy6ft3kiUnJiNA==", + "cipherTextBase64" : "AZqn7xQ9Yzsun7d5IlJyYjTLuaqqzQPtpEmEumlLXmdDUB87PuJlTZBdWlSxt1BxNA/aQVmUoEib4H1G6bzWDyI=", + "hexKey" : "c609e064ea2306a96d9f2a63a838c12d", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "QQs6tqF5GHZxPObZjvE=", + "ivBase64" : "TechBRY3TYKbOTOhkJsZww==", + "cipherTextBase64" : "AU3nIQUWN02CmzkzoZCbGcNRDbS2TZecmsgUXnTH2nTcCTv9D9ZlACJQjVWqm4ID/ZsoQ3bBRnKeWLsv71ZlFd0=", + "hexKey" : "0dc9370aeb0ef9977c8d4e3814cd392b", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "dB86TCDXQ3zI3trlyr4V", + "ivBase64" : "L1zF0Ue0GwzFIWaenP34LA==", + "cipherTextBase64" : "AS9cxdFHtBsMxSFmnpz9+Cym3NJDQlAMRxWoPPOGZpeRx+sHOY9fyLkNIIsgOm3E/qUJdJfT1Q//Ybc4IkcotR8=", + "hexKey" : "e95c2d9d999b604c17a04492374bdba7", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "UZ4TIaODDti3UVqnpnyfSw==", + "ivBase64" : "8sOcIHe1ziBr4YnTdJJd1w==", + "cipherTextBase64" : "AfLDnCB3tc4ga+GJ03SSXdf0ZY8mxWCsnQYCEEM4ciZYPKPTLVu1oM3Rjk8b5REs4H69PZvUoVBT7x/QazyGvTdaMZEVgmDv3rlJatO0RbUY", + "hexKey" : "8c0e8640bb7416c1a29bdab1254ff391", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "zxHCSiJzVrvwckdSIlGmYgc=", + "ivBase64" : "90aDyaX1/c2/QpZawwYR+g==", + "cipherTextBase64" : "AfdGg8ml9f3Nv0KWWsMGEfot05Xoe4TUkigreBhpjoIe0jtK+VzzAeyIKzxdshIwr2PBsAR8/0BXN3wP8KJ2ugkvssIgZkmgAQ0XHpj48QE2", + "hexKey" : "db89b4d27f9e557ffe84aa437d79f30a", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "UJ4END0AXrrEoIHJCJNLTGnP", + "ivBase64" : "44lXy7Sv1mq8oRbVMHhFsQ==", + "cipherTextBase64" : "AeOJV8u0r9ZqvKEW1TB4RbF4iaoxnPr3v03+9nyJ+ku6F9+jLAp2SAfDaB0M6Of61UMfyfS9Shf2brgwTU5Z7wfeBfCJOMRX10t8FXoUpWXI", + "hexKey" : "f50c775d1e68643342bf507712a73987", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "LF5VEM5rONIE191VrXKw2qeUsQ==", + "ivBase64" : "FaN2Y8QbRNi9ZSEF/eoT+w==", + "cipherTextBase64" : "ARWjdmPEG0TYvWUhBf3qE/uvn83lQYvb0B2I68IJjCEfIQst0GQcxksXxfjzwl7+liHYTuweYzeFT5IGqq/ZF7XsHFxbOWBccKY92E9Gu3Lt", + "hexKey" : "df564c22f0ebb49275c69bd0bdd8528e", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "LTjMI1DsIFeCIHtIQESbKL0A8nA=", + "ivBase64" : "4Z1TUZX5pyGD7Sws4TRIqQ==", + "cipherTextBase64" : "AeGdU1GV+achg+0sLOE0SKm8r6py7RfAngRoev6rY5KgHHXgcwry1TbNhq126WH7EHQTWSWIlcS4m+/jSheeyfGncxsj4RSsjYP0g5+1+bZq", + "hexKey" : "979bcebf5b0895e28d77715fbdcb7321", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "X1kpUCs2wRCijQRFm9bOYrZnGLGZ", + "ivBase64" : "uECCNmbUdygq469CxEnxrg==", + "cipherTextBase64" : "AbhAgjZm1HcoKuOvQsRJ8a6T4wtl9kPxb9j7v2qxckPlZVpe/gO6ukir9ss9nuWoVHrkZTMBsL3V8DeG1qdvBS4/rmayBc3CdZj0ketJrhE1", + "hexKey" : "d60dd356484289d5f70a569b569c92af", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "xglj6vcqDPJc6XFJy/VrZgcMNe4Dzw==", + "ivBase64" : "cONcORlFlNrWKsLZHwC6hg==", + "cipherTextBase64" : "AXDjXDkZRZTa1irC2R8AuoYNVfLiuJZsmFfPg8u1p97fGEkiC9kKB2OZ2xf8WO4qMHN1mlEn0quKI1f4mftSceMo/XlH2XmyErR21PDTIvIv", + "hexKey" : "42e90f1aedd85b34d6d77338fb247c58", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "RrbW1sLmk7UsdPHt/xjHxrs/WNS6DJY=", + "ivBase64" : "tvVjHlvHqzyvLh44BUC33Q==", + "cipherTextBase64" : "Abb1Yx5bx6s8ry4eOAVAt902fAqpWPQ18+vJlr/k3wdN04ai8pZILgCUQgAsS/5FoOeeEylGJaxpQMZ1EEE6beUhM6jnvMp9utSK0N+NNUV+", + "hexKey" : "2b6cf6a6e8e15efccd6a38aa42044cd9", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "oEJRaCUVj1wk6YoOGSGDBH5FaqxbxV+5", + "ivBase64" : "qrFEF5RjzDxbrCf7gol7sg==", + "cipherTextBase64" : "AaqxRBeUY8w8W6wn+4KJe7J86nNP7gunJ5TkVkI/d86ZZd5SEYJzDwXH5Pap6mnv4plnnLy9aiLv9hk3RrXJ5F4pCPFMp5i+rvVpxwCrXt+b", + "hexKey" : "f184b9b359121886b2e6c310795151ae", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "k7WP/l1nM6gf77Kar9ckdCuRRdkGf8NOqQ==", + "ivBase64" : "lgsbBxmM5GIR39JJdxNCCg==", + "cipherTextBase64" : "AZYLGwcZjORiEd/SSXcTQgqt78F4Vrz7pzmb2j651hj4z1WreHxYuV7gH7cw9ZQbZRS1O6l/ln7zAPm3CsKdPsBNXKhDGQ+6uEvnjCyuYe8i", + "hexKey" : "c9ed81ddccfee7f16d6821aa84c71007", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "sRsu9uO071mhwVWR1HTSQoR50WkGTW5lU/Q=", + "ivBase64" : "YO7F72fjE/sZXWqPX7/BQg==", + "cipherTextBase64" : "AWDuxe9n4xP7GV1qj1+/wULjTeSntKUA8eg1anz9GIBpFpvxiKnlwFoTubhU8r6dUIkhD1YHmxKI+6Aq9DwowUS3gPyUiwwmMR1Lz8ceKbSZ", + "hexKey" : "6c6e30d5dd1a6b5405d8fd8fc71a94ae", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "lanTulqCb0HyQmXCkPrzjgtokh43PEWsZ8oW", + "ivBase64" : "S337mZbB5sD9L0feKmAHPg==", + "cipherTextBase64" : "AUt9+5mWwebA/S9H3ipgBz5uSzXR15RXRFvv6VE6LjXWN/sfc2/r+KW8W5gUQlgWyx5Py5mLQTUSHw9BfKQUQWxoSxzIx7NzobTNHMPokxYj", + "hexKey" : "1a19a9332f991d3f21f6326ef59f00c7", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "JrhGuIB2UxDa8hYiuxJY1YHfLcygWYCMu/5wGQ==", + "ivBase64" : "/QgA1lEn05pGNQjyOJ49/Q==", + "cipherTextBase64" : "Af0IANZRJ9OaRjUI8jiePf0i7LQQbJV4b4Wa39CvafuKakY0GzAoAxKv/EQ3MsssiG80LQihDo1RpAz84cEV5uw2rsACXhPzLRYo+Kq4MEDS", + "hexKey" : "4013b641151cbb91c8b3d2a0cc40dda2", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "mVrIHvpICsXthnR1v5Qgot/d1hUNpH0j9C4od/g=", + "ivBase64" : "7UK+ZWQIM9glqHEVlejR5Q==", + "cipherTextBase64" : "Ae1CvmVkCDPYJahxFZXo0eXKTNmVDxAvCE3bcWNYsaePgaYoAa6nVOKYHAvo68Pp8bUSXo8ONDDlR+eao9LDex9EzbsSSXqSdfkFmfBA98jc", + "hexKey" : "f47f1b909e54fa7512d3548df6892aa4", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "P3s8PgD00Dsc1T3Z9cYZMYExzQOwEXi7xn4pepiZ", + "ivBase64" : "RG7aPq0PeP5Oszf1q2ujew==", + "cipherTextBase64" : "AURu2j6tD3j+TrM39atro3uspnUEHxsEygE5pgP9WiaWss8+rAzhNuz4Qx9kBYi7oYIQhuS/cc9r8SXOxQmxvXgMBrANq8/VHWPdQmx4DTya", + "hexKey" : "1a34d05cf5e3a51416ef6d9f33233b3a", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "fs02fDYAAse9tf4LJDuYp7ZuDRqjUg2JJ28vSenuaw==", + "ivBase64" : "Qq/qWKE2j4badbB/B922Ng==", + "cipherTextBase64" : "AUKv6lihNo+G2nWwfwfdtjbF0/JgvBqKjF+bFHEBYBfdKaer5yz54AvFSX9C+Q4WU95KuolgF0YAeDldD4FfRELhj10ceh0jA4UOxj9+jdZn", + "hexKey" : "cc2605a044df97b6052a38a8ecabd396", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "gS3dtp8RkZM1yAp/6YhfusK1rDGWk9T1nbU06jYx+yg=", + "ivBase64" : "i0jp/4YMprXv/L9dAqOIxg==", + "cipherTextBase64" : "AYtI6f+GDKa17/y/XQKjiMYU5h7JGnIhIAY9/HRdQi877Na26TYhKT83ue1fhjQnxLtCCo+wX9CJaIaBoJ15Fhj+ZrHWJfSuqCP7YJohUjO8oFi65nsxuuUUrIgKbl3C5g==", + "hexKey" : "1f6667b8f0835574050f99585bcfc708", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "v6Aj0evJIumA6mQ8YX8kH+t95Fg2FL6Adv4Qg9mylihn", + "ivBase64" : "ASbK/NlGIJY0ATI9jfaYRQ==", + "cipherTextBase64" : "AQEmyvzZRiCWNAEyPY32mEVBJmxW3JGLA2op5xdEscALOhxbAtev7wpvHFMmd1d1gkaVBm49U+EILXtXlfm+VLxEPYrJpkMGXCPXWV5SnQiwIIpf+3BZaUGslLCiOhuQ0Q==", + "hexKey" : "f54f102ca2e1ec58970a63ab1d32e268", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "6tfPRwPT8kosals2b31OR/3VdIt2BbRDQxusN2mfAwfIkQ==", + "ivBase64" : "dmG2AB6JxzY5TnNoOhU7Vg==", + "cipherTextBase64" : "AXZhtgAeicc2OU5zaDoVO1Y8KkXT20988eHhYOGtZo0kLIlwYIsbAz9BfKVp71UMd9iwNzWtjmxEzW2SNOyFyA18CqHmGs+UVqZOo/Aa75TVzS7Ujlo9Hy6LJxAaaMbPuA==", + "hexKey" : "f56f025e525dc78e700058999b3ab90e", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "X8UAXlPn4HxOT5MuGKx3SEmP+SSfpIrXFkRAvDYkhrABMtI=", + "ivBase64" : "xBikYpE3ImDypRRQAX35vg==", + "cipherTextBase64" : "AcQYpGKRNyJg8qUUUAF9+b5jgNWchufikg3SiuPlnGpvydhEA9dzrJenMaExjjRQY/thLl0mxSIFi1Kbtw5qoshhlyAl2qT0pYzLMJuARAsWdRmuO1cmqblNjX1gY4dtEg==", + "hexKey" : "45f653cea7441efc0299e2faf3647a26", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "BpnwIiPPXL7KY0KPnwFPHjGtXTLElp7xfBABMwS72NHFtRWQ", + "ivBase64" : "pIpc9oNsuB26rnb3ec/v5A==", + "cipherTextBase64" : "AaSKXPaDbLgduq5293nP7+TAv+wnCkLq6bMsvA+lfWZqobEjuJjXckB8WarJkAizaEStfE0W3jJ9sLgItEke8tfyWuZ0AjdXVW9jWzwnrFD3dDETQ1Ookopo7lBHjQ5Etg==", + "hexKey" : "79e1c2b3b863212f4123f72714f30e4f", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "zCWmXPAwZpeR/Nc/KUNO2TmEgy6v1p8GsAmNTb61Lku6ozC+yg==", + "ivBase64" : "3+/h6czF+hldFqzSKnBjqA==", + "cipherTextBase64" : "Ad/v4enMxfoZXRas0ipwY6g/a9lMVAqarVcJ9FEfjmDUlWLS+ae6A11Jpymq5XYC+DpYIaJT7sQesrfZH9I0xlNKGqx/kn+MUMG429AC5OxgJoslMZSMPU3JsE5hp3GnXw==", + "hexKey" : "cc811504354ad9fc6563f10d1ceebc0a", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "4swaNtxbYXyVnXF0XBAFCy7/D1QM/4Tmu40uQWQOlNDL5aZN3KI=", + "ivBase64" : "RPyGrU67l/hVkbbjbKZT2A==", + "cipherTextBase64" : "AUT8hq1Ou5f4VZG242ymU9j4imuU73VgSGgAIceh16iSfDN+r46tLVfQGjSZiNuBTqAG8K7JNwYqWMSVwy4vFMXoxu7C+OhLiACcyR37HXALofqstPWU+24RSzpDrFAgEg==", + "hexKey" : "8d7e08c5669a3255175bb0f98aa5dd85", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "R+G/L535nbl/BMWnIm76ONbzMpZOOFMCvb3vet/BW6/LXB5WVCLp", + "ivBase64" : "mG2VLQsqMxy9CwmZAlueqQ==", + "cipherTextBase64" : "AZhtlS0LKjMcvQsJmQJbnqnaypaX4OSmtWdtunBa1pvdOQ4/f/NAQIcBJtk4FWHtJGziMn7fO7l8PaUBNs32FSXt6lLXMZNosNrbWkMQwinZW3hyygXXhLDAmf+W8Ps83g==", + "hexKey" : "7fe91d04d5cf04872c08092c23e05a87", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "AYvwOV8CBs9uOY9OiLWxZVJA1A+VxG6wrG2U5say92l6Hl9AOtCRQA==", + "ivBase64" : "2KdeS2LebxnIDVBHSeBl9A==", + "cipherTextBase64" : "AdinXkti3m8ZyA1QR0ngZfS1VlkWk7J9u5qiPqv2sO+nYOCu8imsGiELQRnQhKtDXQyBwCrwU8rW8lgyNG+lKISoiH8tL0vWYbiNn+8E7D+bUAjuZ0la20zdG/JWdp/mLw==", + "hexKey" : "5065b761f81666ffa3c3377e4edd4585", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "DO3BvJZg8BnnmF7xn0ArNBUqXf3FIEVm+Zi/EtGzF+P4cJ2fN3WgP6M=", + "ivBase64" : "Mw6eFhjevespJ6J1uctFzQ==", + "cipherTextBase64" : "ATMOnhYY3r3rKSeidbnLRc3PETNcELTgUd2aD1UEGILjvFlblCsTaJXxqvjh3Oxvaz1xJ18iksXTnWEoZ9kNTmLcU/Z55LGwa91mT2MAhYrOPOvJTWPYsK3SOVPcqtAodg==", + "hexKey" : "71fee1569c0466c3ed8296d86a07fa36", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "NmbnxvQMmyKOiBOgp/MxFWs3D8vIm6kmtTTJuclK8P9CtpuZRex+cA7w", + "ivBase64" : "I7Wid1m580xbSobDmuoK+g==", + "cipherTextBase64" : "ASO1ondZufNMW0qGw5rqCvrGDD6qDzdGz6V9JGC4JRs5paD+awMhP9UYlx6MqJWKZLA1kuu4v8FLm7n6T+duO5hJ+ooRc9haWslD/WQqosQPrSZbgUmfYH8xcu3rFQgH/g==", + "hexKey" : "23dc1422571d325882312627192fa426", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "91qSmT/f+sipnU7BiFeTwC8RkwvT4qUaEPKlMS3slMg0oEZWitvCp4uNEQ==", + "ivBase64" : "w9xCP3ti5ePa9be3bfRRbw==", + "cipherTextBase64" : "AcPcQj97YuXj2vW3t230UW+F/Geu4N7ikV3kop/nepYd3icWAq+drlB2I3AAzR4fgZf5bD9N9jqqzandCjbpUcTayBsEW6+NUB8q1dHlRgzLqt0p1obcm4Mj8GaVKxYhHw==", + "hexKey" : "45b394be4f12a3d55dc4ba3edde6995d", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "sm8ufxGl8nCLnb9K2/QUI9O+/los5fxk6DE+vN4E8RRFcXJ7QNQZmTDR6qA=", + "ivBase64" : "6/KEa3eDWNqWB/6iB1HEzA==", + "cipherTextBase64" : "AevyhGt3g1jalgf+ogdRxMwid5jQU2BxwpKrxnRd0do4EHiDap8eSXWEdbGQFMRrY184Ifp9gG/mpKFkmlHwxSXgva2vLAXNyv+a5qR1RTzR7u2DSINoxinhsIEW00dz7g==", + "hexKey" : "acfe44bbd7dd1023e8c931905104f89b", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "ex8MNqBi8frtz0Yd/VhmAiupuINmPJ9QmnTkYZm8N2S7YFbHyO6hxJ26VtjR", + "ivBase64" : "3bLn+NH7vGhSkdl2EDA46w==", + "cipherTextBase64" : "Ad2y5/jR+7xoUpHZdhAwOOsO4gQDLelOINyu1XmGpv32CyMT8Fzu5UrWUwquPw+gOnP/tShUlgDV+ARiwmi6Ut6xL/mbdiu56Y0kvssB8oAuQ4CxualHBxOVe0VdSNhTeA==", + "hexKey" : "106fb24dd0607b114b3ca0d40da4f401", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "SpSyHEUk2rbFqvzMxCP1Ur/Tos+GvoCdsWFV5An4Bf7Y5BVw/NNVeTcQa1lAKQ==", + "ivBase64" : "o9wwjxJ6ASDBDGxsD9pqow==", + "cipherTextBase64" : "AaPcMI8SegEgwQxsbA/aaqNatr6f6AuqRunhm9WWwZI5AkELGiY9EqgIgo6CLIxb1lt88CBoNuE0mg+2cmLMJYhs3xJTpTx0FlRgtjM/nQ0CSV2taGBh1mpHBI4QUazz4Q==", + "hexKey" : "c56eac5bb0da1d58af301f2eb6e37917", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "VMnDXPblpoVZnIMpZAaRGz+T+Y8Bsbb/l7kpHWg9myCMhQM/F9+jvGCzEv7euLM=", + "ivBase64" : "ByDmLOglDSW6ymi3ZMc8lg==", + "cipherTextBase64" : "AQcg5izoJQ0luspot2THPJY8/zhMJiFpZednXDmCsLp2QxPbQL6VyavE30RgmzHDS6ViiJNw6ZUQAD5+3F/Rk+yNpym91s5JGhU8bQ4coyCITgjgVfhuMy67UV/gWGMnxg==", + "hexKey" : "2ff4a07f6fa034cb8a41bd581c355fc2", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "R6huqlt8GMX9n6oIedXn+po4oAlOllL578rJd501KrJPgtAQXqOmzwbqVMvxHF9m", + "ivBase64" : "xRsXQJIgjgJd0ZK0xtJWxQ==", + "cipherTextBase64" : "AcUbF0CSII4CXdGStMbSVsUW03e8fWN5NQQG2ZO++yjbiMefi7JaTk4+xNGO3EvAqJGuNrICswIxZ0P7mbdL5HcL5XVIlZTNLJLWGyydLCXCvvq0j8UL8lqLuIeFlltPKaP9ETIN2rrb8Mvg1xioCHw=", + "hexKey" : "ed0ace88ec74febc18bdad2297847db4", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "ZTh27J/mw8IDPH8CY/hZTj4PMdf0zoT1Muh54X/jtomatqLUopwo/1VZP1B9pJiYkA==", + "ivBase64" : "p7njVP2bRYp0FEyv6v1pPQ==", + "cipherTextBase64" : "Aae541T9m0WKdBRMr+r9aT0EiykgjccmqJ0zAKvobLskZRFJQZYrMU2IP3+wB+dzrTaiuO1gMapDzhiLRSEqXA0JkcjS7ALilNyzAcTedPBA/UX574B4MPgctVv30sRjnpyWZobxEcvjPgQYfREjAao=", + "hexKey" : "ec9fa7c7d7ab5b46a8145d0c5ab0c1e7", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "qVnS+PSlPMCitmSaA7il8lcwt373pCUljHiTS7pkEaEjt9pCS5w2larwh7m61c5YvxY=", + "ivBase64" : "BQe512uLOGimwo+VGMkv9Q==", + "cipherTextBase64" : "AQUHuddrizhopsKPlRjJL/UHlmouO3oHiEDmaDeW3Ou4sNN5wf7f6OuaE48kzUqCcgYaoLc7WQcEpzYWBFCtbzlZf7Eta24++wQ6Gq5RQko2ZjHcnKZQL1518ENRoIIyibZBAD2jFytjdgCPmqWhg/g=", + "hexKey" : "83de64dd7160a920ea85a8ad4318378b", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "W6miiNwuGCwpERNu/GBh9fJeNcTp/kb4RiQiVFy6TeeXxbyLEZFis2rbdOz5PjnPpYlc", + "ivBase64" : "IucVeDkOTWwVFs6Arv18NA==", + "cipherTextBase64" : "ASLnFXg5Dk1sFRbOgK79fDS1yxDZ+7+8lT4RyyhPkHsaIm1VeB8j2we8KMabZk9R6n2RkBEGKxqdzdQGlctQMoMDwdFggKqqsiNwmxWWJcZhIYqB96YdPdeeWkZJXmqRIhysFyQTyY3RGkTyaKWgtQQ=", + "hexKey" : "f8ecc7b7f7ce065a1ddc723a7e49c1fe", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "lfa2225Z+eG8rB0RzdK3FFE28nzCua1jJtxmiimk6RpKBiSd7WF6IYgR7RG9wgW4I9Hb8w==", + "ivBase64" : "MKlNqPR9LF5AUeP/L/eTVg==", + "cipherTextBase64" : "ATCpTaj0fSxeQFHj/y/3k1Z96q5dX+4KhuEE3YlX7vx329GgjdFdcoU74frGxPDaIxyTx5Z6Vl2Chzi7dsb9xU+ZweeGPPmh4W0T1P7V/oqU6kz13h75dXlxH3xI14hUOa/Zf5+EcN2R+LZgBOy8g+I=", + "hexKey" : "3a54df733301a975f19d68d5a6ea26c6", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "sNLpOULHLJpmrQkeumvedmxalMEREpG+7m5ssO1AYdz/Xft7V4K+tv6ikUx5EW8250qtzL4=", + "ivBase64" : "uWgpZ/9mtzd+DCFABT1KYQ==", + "cipherTextBase64" : "AbloKWf/Zrc3fgwhQAU9SmGrDGqOkSOkxaGaoq3gqbPSbJTkNcfQwciXV4YDzDwP3twSqpbHAonnNaEtlekm7wNdy7cn3pBYGRUDlKgirFgdoQ1XjYdcthGdoQnigm8u/Bz0oEYJRco30/rcxXLNlyI=", + "hexKey" : "4e5af20f4c7ba233746bb1b66b88d581", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "3D20jnHACILBAx4fu0NnuhEbClXxQuk2n1QARDSqLnIBA7W7c/4SFL/OAHcbQNGHjj28zjEx", + "ivBase64" : "2Pzr5wjtvezOlBpa1Paq3Q==", + "cipherTextBase64" : "Adj86+cI7b3szpQaWtT2qt2WROThlqV8vKaA41sNR7eQXMnC0xER8qRuAmZEhz03zAhAgaNsxDcBGcNGB6Z+m/ZSPVACQNfqJqPXxjwCMx+Lj/Nn9k04gQLBKNCM/tygdOnNGEBfSPPV9Ers2VFOIMo=", + "hexKey" : "0ac8d4fea6542835161551f4f4f5016a", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "9VbhQfJ9Rj6kOmsn5rXwr+z1Vb3zqMX5LnZClk4lAT/Z2HOjFf5Ib/M7lrFLWDV9P5cXYaMZsA==", + "ivBase64" : "Ujc8xgtp/oE5thXrLPH/+g==", + "cipherTextBase64" : "AVI3PMYLaf6BObYV6yzx//paR1zlCIK2Voe2HdkOhjYwnUqDGJeuTB9EMHUE1goICfdqulpqNdxLjc1NBup4Z+Vf8G36EwGuoNpWVT9p7RtXYfCgJPTDw70fvSeYKR9IhoUuOM5igfVVL2qRsqSxcAc=", + "hexKey" : "14561ec4e6069b810334d2edd797ae0d", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "qPLn+7g1BSzVRm6mZIdVT2Vf4wo+gtOgDUrFHrs+tkukGi+oT7naBt5Y3qzp6hKscVhSERLCmSQ=", + "ivBase64" : "it78fuEgBvXk2I99lt1uGQ==", + "cipherTextBase64" : "AYre/H7hIAb15NiPfZbdbhlZgkNEenOhu7Ygwq+6Q4zeuZE9gnp2brkidLWXFk8sEdIpt4HQkvaGC4X8A2q6BaMpXwrt2uZjXcBFFDNeCBQIQZmiLu+MTF8yrR8O8NF/+E19hd6cYqXv0cXoDs+pWds=", + "hexKey" : "1096042d90922b9bc10407547b2cfee1", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "HSQnTWUC+5SLCSYsTw3vDf//ovtWDu4eWHYMrm4TnATbPv3a8go6Zq2Y+Xtmr7vKFKC/+RXcMz7g", + "ivBase64" : "cbRNirpVPvooOwfIy2eTUg==", + "cipherTextBase64" : "AXG0TYq6VT76KDsHyMtnk1IajMo/KDx9BbpcgBAFqXFZSV8NL3aHODj6bb4VgOFrodz5ws/34pNNxRza8jfNJQ7Jd6xjbifj9XeujTlKqv+0m5Oo6NBczZ+mInKCD07N4vstyC9/D3XNWmvmXDCBhE0=", + "hexKey" : "1e98a67da0f6769b1e6e498e4700c3ef", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "qOnaHNDB1oApHRSOXB8Gtmkz77IEffHs+uzkkIZjM5aqPflIXpjEK5s1ceQxd/iXgA/irzIVwjxJ7A==", + "ivBase64" : "Uhee6p2UoAJ2+5FhJ4NQaA==", + "cipherTextBase64" : "AVIXnuqdlKACdvuRYSeDUGhx1TYNcxxFuBgQH1ZtHmsna2O5yfk3VyGLJIRlH1WEGW8f7Nj7yucOYQfU1tv7ATNpNdvTqpIbe9hkkiOf0HEUsGODf8+p6BTIQBbksFLU+aV0hZreFjRudUF278VLoeg=", + "hexKey" : "aa9e2c1b4fe2b20aaaa296d111bead3e", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "+TrwGaHaukuQjCtSCfqxRdI9gzoOsxIFhmw8EKXhrSvezF832yqN9URI6PO3ZnZcCefayrVGnZj9/GM=", + "ivBase64" : "y0Ma1zqCBqsR91BQ1W8k3A==", + "cipherTextBase64" : "ActDGtc6ggarEfdQUNVvJNzUoptj88PqwS9Gk+gfc5Kz0n9Mj20LMTTE876OBI+EpbWihFa2w5kCy5IVlHsb8vXAmYU1krl9y18iLBWv3inWosWFq3vRlRZXcLP+sQT3YO24HCQP80SshwBYE6WzV2I=", + "hexKey" : "60bd84748df11ce0d99edf6ff4df7199", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "CRFXzZ9HzWNEUK19pAsvCtCx26Wfp9BagIoSPGWxKbw7qXO65eNQAxs8+Qh6qB6APu+WrnsCbwpvJ0c2", + "ivBase64" : "rcIUZnBu2vmFkXOCyS6CWA==", + "cipherTextBase64" : "Aa3CFGZwbtr5hZFzgskuglgG/Su3DMc6y1MYIaC37lSCvC8yEd8yRwLGKCjaNg6AiFNH5v+Q92TeDf/ZU/n7jbJtNorjPzpapPilnxvd7L+n4h2lTIugmi7gN4gXxvkxQeQMApeaBWU5hNdRK0V6qHk=", + "hexKey" : "afc64fb4434337e95f1f9b4abc81fce5", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "ce5mEVSYXBSggPUrypskesNkKrWM/Ln7LXviZmo1r9y2tv/7kTvJbxR0Mli5VgbnnAT1xzm5rHN+CVQmSw==", + "ivBase64" : "5T73joHNLxX8DRztKqiJCw==", + "cipherTextBase64" : "AeU+946BzS8V/A0c7SqoiQvLHARpItbFouj7tR2VCTE0ax9hXfQR0s9WiFTKOKLx/FPfd9OW5qd3Kw5vCty9Uu0I93/QcGl4M18u0E9/axrGfe32EniUPh40bZ1CtD4m6AZw8tlU/nA7eqUs7XmalD8=", + "hexKey" : "be9c3a1dd20ddf913675196a17e098de", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "uhiT9N6RPhH2ePcLSM6EF7fMX+kCPwdqW7RAvP+ZUHut/C+7ZbRna1/rU+yeplB3FLpefga7tJ6szND/Fxk=", + "ivBase64" : "w3zTsb0iEGhj99/EEST8zg==", + "cipherTextBase64" : "AcN807G9IhBoY/ffxBEk/M5D8xe76f8mLtBEsgkiu2Bk8UnF94ArSluGHued1KFzEJWlGzV/+X/Xu5uIoIUnJa81LdHsogKHI9Ggo35BebLBVc4tMGZTwxdpw3VzcXF1s2JwBcGBxPdYqiZAQnEX/g4=", + "hexKey" : "1a49f24d1fdae6b35aea8db965c9aec5", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "frTBb4bACvemhpVdzB5YsXW+xT2Gj54c+KmLwR6kuelwDX1GQWImCu2u5wWtowRAa0RNL5BfNGsj5q2NMQyA", + "ivBase64" : "aBJDEDuQqAP8DK20VpkU1Q==", + "cipherTextBase64" : "AWgSQxA7kKgD/AyttFaZFNVBvqm3CuOfShTuyRR4BArOBe2fJske3haH9WBVA15fZmtCtT6NYBjIa6qpFmJ9lWysNISDWSj2juls5yvsimK7eGtnqhJ0p2z+60tlTxZs9UqRaxXFWDl/p2kDr3RZVL0=", + "hexKey" : "f4c97f47f48b69ff654c6e905a517049", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "N9Q6goT0gsUzSeuwh+z6gYBaPNRjfyxLmSevnfDkmgnhVRckAXOJ/AGBl3mzCzrpP0Ncz3MaYPFSVhL7S+rx9Q==", + "ivBase64" : "DBWZlAiVtzTpsPtfwBDGKQ==", + "cipherTextBase64" : "AQwVmZQIlbc06bD7X8AQximzhulwX/FIbTvKYMdJbp5pNuwbUHFCLd+nVBqHqpiJrcMPIZVIw44BwmJHpNcoJT2NvzTGXLuE9QETFwmvMAW0Ux72X0Rtx//1lsYhQOhTy2AcBgTsA2W0BxQ+83+8liEfpL/jVf6X+9iuhgeqeqQV", + "hexKey" : "d4549f2b94137d9feebfeb279db690ec", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "Y+RrOFhfvIRA8jNagT5wuOtsv/PFl/1/C17K/rcQcTXwSfMfDQXHkCaof5lGzEI01g8SZtaZTolZg3IyZsT6kdc=", + "ivBase64" : "wmiQYauOf+ITzYQI4vp8nQ==", + "cipherTextBase64" : "AcJokGGrjn/iE82ECOL6fJ3uMv2gbm/Xb+BDd6HkBrLU59nHXVp/UCTJ6+jzPC3dXNacoPURjfTNZkysgyw9ZcOSfczx1tfmXBNz82q/J2qqb7fhIie+rxFCycV4jwho16aV2jxDbOL7Q1xXe4+1iJpOCNOr7oPTYn1QOkrPOdaj", + "hexKey" : "4a64dfd13960fb3f1ca734bb85d790f2", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "7KEg/GmM5cu/0YozuccYt0XyLspe0RuCHv17N9XlbyvhKu4AoDQ21vynsA2kqnpwMZnjLjVqNE5XbVSRfkPdmjXF", + "ivBase64" : "gcK+EeN2oaAo9Dml3et5Uw==", + "cipherTextBase64" : "AYHCvhHjdqGgKPQ5pd3reVN1WmVKOz01++0etp3MP5GhJo3WsFHQILmiZ135nHwiY73ALQ3UbKbO7uMSghvARdLC268OoPbyJY2pIrrIQkUbXuvDrKvnxQeNpFwHKLIZiQMe0vuNRRys8VH6aDr7DH+6pY81vjBulVovUtG8fV3U", + "hexKey" : "fe99729ad078509d9f160e18334b76f9", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "gN1geLd0qYIeJvKE8wpuwJ8JMs11GSPIUIOkYNuaezcdbNg0+Ie2+hacKoAI/LvJKiAjLyMogE3XFlx83caYGK4Fww==", + "ivBase64" : "WJjlF03cZVX62QFf7HNxTw==", + "cipherTextBase64" : "AViY5RdN3GVV+tkBX+xzcU9PNeA+ii6+vGhmwTIwyQCWlmdlEZzWhvjazt2hgUF50ZYJjQqgdkdyQ+oabA7hUsa1AjDnrjMJ9wKa6TFcz210wHYFUbbngBcdOaaCdDkfU1DxRrS7dPGFS38OhactoOvl3z5Tfy6Qnmt9YnJ86uXG", + "hexKey" : "d6bcd72e9a9f6f8e84e8d1de3455c546", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "MQAaDRXozaAz0a7kInCHxDRbOPDtKu2xyZp+zlVOKbs4nxI33BUXWb7lNfXrL2czHIdTNgCkHqiuEtEL/Rhqzl0LITE=", + "ivBase64" : "pqlfiNrwoibqgLj6vA1oQQ==", + "cipherTextBase64" : "AaapX4ja8KIm6oC4+rwNaEGvOWam2o3e+con8qQaTvLbbPpkTgaEQIdY9f5CmOBzmYYCcUDNk1Iz+Wc/xT6oVeTFa6/hejWt6FWlSu7QD2+S3Ustzu6MGoTLOztvZfHWR8gRy5Skhi9L+nv4hWga26EObDl4uf8PhZZJ0ewOQkLf", + "hexKey" : "076c22975c39990b7dcbf53accd798a0", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "M7DOKSx9XJ/h6AijMx7gVDs0SoJC0pdwQj2aU4+294/u+HgeEOHk6X0LHlR8lffE5iX7QgqF2STATTH+Yme50ShCRyJg", + "ivBase64" : "vr6yAIsEU4EBGYiHoI0LJw==", + "cipherTextBase64" : "Ab6+sgCLBFOBARmIh6CNCyc26k+7m8PednGRkxciU8w8gR1g7TZELyXJ/rXEWglS9EBsq5CbuutLaJ2NLjzsRDmp+JKCx7atmhdUyAFKHdrX/s9v/tkXA/Dk+ojLDHcRibAqkavjYVO+i3/ZasAVq/MCD5Ia3AJHEnszGcK/17lL", + "hexKey" : "cb773c18e251b883acc5e9296332cf64", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "DQYaYm5Rw6Sc8fVUGjtw+bRuWwfN+jIklasG1w7U3puaMuj9+AghK5M9CpdNbx+t0eWlXQP6mij4KqOmchnfHucZ4G6Ucw==", + "ivBase64" : "lj/4EAhPahAcWapY/EB86w==", + "cipherTextBase64" : "AZY/+BAIT2oQHFmqWPxAfOtVAXW+rWDrrI/ZiDUS4g30ywsKVYAXkktuA488B/jv7GSwZFbt+Ludtn4gpZjVTTHqInuShGXRNmXchhsH7bLGWKWIRAKoZKElP/BXZMQMwaGFTy5UL4TV6NMmcx0ljaS7Ih7qlxfWNHQDYwxDZWsc", + "hexKey" : "029e9b8f3bedf322fde51afac7b673e5", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "BNhFctR2E3Qx64KdeMYLnvlRatmiCrOq/MiC5xWuYdVhYt2dDKib9NpkJzEASSIkP+X4GN6VJzD32MzLDfYgEbpiItrXRO0=", + "ivBase64" : "bq5643SR3wtnCK8tQuDfOw==", + "cipherTextBase64" : "AW6ueuN0kd8LZwivLULg3zvcSsSOcbv+2EIi1V/KDd/qWluNXPFEI9IDov+lISfOf7vYUn5gM4j0Y4ExgpcJsM+KDqk3UIw/RFeeiq3Km4ydPjdcwa0dz94/4HjhWbPwU4RZC0LkR5gruG9utTu4VrgjAWurHO3o4/4/JjE6g3gh", + "hexKey" : "1f29c1c2d2b1a3189faa2ff6d5766025", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "BmOtoBUmeTtC3pxAsbCSWCRjCum26mPnbpZ+7iB4eikENH5ZeOI6yhhg5wTNyNVgycvz31/Z4BCoNtrjWFOLDacRNJBpw8Pb", + "ivBase64" : "2d3mdub1dWkBr6n4+UVYYQ==", + "cipherTextBase64" : "Adnd5nbm9XVpAa+p+PlFWGHZhR08VoeQPnlOpTADhVSk+wpXokfpnnt1+CjzX63wYuYZmQocIjst4baq9IA0JOE23B4/pQ+nE9IisJSWHiLJi5xllRvSPMew7k8DM3ZUd3TkLMX3VcaoAmb/RsLOXrTq9jsfBAy9wdvIEkSc3jnX", + "hexKey" : "29955df657947bff7343f85ee426a297", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "UDeIBylN1oxkEKUHhcBHaTiExWisKfuuYaKL3ze87luQ1lchgTcGPboSh61wI8ym3E6n3hqRC373OZ8DFDGyriMBV5pL7GQFyQ==", + "ivBase64" : "AKPC23eSL0Ah6Mg6QuRcbg==", + "cipherTextBase64" : "AQCjwtt3ki9AIejIOkLkXG7icHBbvcW0xUfjY3kE1gJkEM5Xl3Y6uFgIuQaHK6pPSE+9kRy2DWkiIm8ulj0slN4dco1KIeN22Qw1DlKdNrzLN4ar18XeBnC+ufGx1iDBWllMzBTYM3mZiSH6YGeXwDhndderc9SgqayhVg9W6Z/x", + "hexKey" : "36838b747c490012ec2722c0f2f46fe7", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "k3gAtVmgDWO2MRxJt3CIXNIo5PhF9H3gZALDoR1VCr5dKzQ289xtuObJIJZYQ/XLWvvewmOIxVdm1cx54bikN6HF7mhon0grBzk=", + "ivBase64" : "UAKnm5p/EFnFpeT+XeNxDQ==", + "cipherTextBase64" : "AVACp5uafxBZxaXk/l3jcQ1VnE82C+U3UQR0pz+aJW5TFbCkPT+vDo8M1HIbOJ1IwTkFoZ4NGERUhl0ICs0DwqavlNraXzHTP+Nk41UVXLxJkbVxOvGMB0P9w3947qDFW4jti87MI1ylzPwamQygrInLtqpfDM9N1iJ+iMc10r/g", + "hexKey" : "6a37ccfa891c34e93cf96f934cd8fd96", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "EWv7QMcgMsVImgt1KTs/JNsWET9At6G97NEGfkX8c55v0HI03XX2DkCX4ISDC0gharjlAoBjkvjqzBgi4yUslY47lLkx935xrZny", + "ivBase64" : "7xU70X5qBzS+nxPSNRYntA==", + "cipherTextBase64" : "Ae8VO9F+agc0vp8T0jUWJ7SUS43VLBEEvpgw64UMWoA2rxcdoGmd955zrNXWBdOe43IfECF6zBRAKMXFGUeber1S4iSRBkY9FT/QbPMVJzFyPd9UiktYEcyCDpUlHwPJg5bGZY35PvOaGEo37RK4tNeAs0nCxgwOg81iibCvZLkd", + "hexKey" : "6f5a4cbba527f04b9f169a69649d6046", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "+rH+li/YkdJalvu/KM+OVzJmY4usU6Y5KVkIICCOd02qqSzIcEf2ovLtFfBtEmKTfAeCOQoi3HbYSZI+nXtVwzTH+B2RsdDVIAKYDA==", + "ivBase64" : "K762A8kJCb+ox3DldCTD1w==", + "cipherTextBase64" : "ASu+tgPJCQm/qMdw5XQkw9dsuuo3J9LL38sZ1ZcrcIJvi+7ycYvLxhxmydHzSxZ6I7hyis5wSAtORQEM0gpCTexXTjjzbI5wbr+IGg8l9qwS+EruQXL7YthMMDppE+FMae/ED0AOxmIN+sM1nEAVdNLtkcF1Hv08ZMCcee2Vy9j2", + "hexKey" : "590b974c3025b7ae98ce1e90b85f62ff", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "L2MxolRq6WRnIBIahFGm/r53T/iNXLvL20NROHyHdf0/k0OLQUVfLi+ntWsSXlRX5+xZsMaDr5F+8eXHtMOg1zK9PvLhVxhl+/96IIE=", + "ivBase64" : "JCEjBFeyKNql5su4Zy1/Ag==", + "cipherTextBase64" : "ASQhIwRXsijapebLuGctfwIGNJ3KNLi55nbBuO2XBeTB0mXJrNp1QHhSB0XhFqO3Kfu3WBCawSy/YVn3a2W/2vMEHloiIZiJ4cJCKRY/8kGKFHe3rMfrhTCwtCfCBM6TsBKymy3SzF4q82lAlKm9ti+63YlC8VUu8QgFh6xLvd97", + "hexKey" : "9213ad04bcd66e3da9c8c3e5b39ce01b", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "esVTif9eWREtF4giVGPGojNPOQaubcQNmAJ4N1O3oB6LlpHhEKfcCnKrQLW7gR2oam/1+Iw+JUKmS6cV7/B8/1h0CveGeaI5IkMLeIqF", + "ivBase64" : "+HGMo1FKxwM75NAsQmiEng==", + "cipherTextBase64" : "AfhxjKNRSscDO+TQLEJohJ4RTJFA4z3t7QKKZL2cv/IZ39GJkIZgQbfyxUt/G/qsWYv1EloWGpmLo4KgYnEBObot8bLspc6L+wMqUPgrKUILWXugEVTwuiA48uz+DxVizPyhq9rew0oL7aAoLMWejzT9RUPXfAGl9sQ9FGXOAP5P", + "hexKey" : "4844ac7c5d7ad27a9a47b6f7cecb02bf", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "8z4wYO6nwgeZR3Ytfri1qiu3xPMZ2tf8592WvpdO0DqRzOPxRHQkCHQSSPmBptZ/CktPqrog0FdA7b0wvkodHXXDF5iyGlerhO/RXyhzyQ==", + "ivBase64" : "a4m3HRu5cIPtZsXroy4ovA==", + "cipherTextBase64" : "AWuJtx0buXCD7WbF66MuKLwSLCFqQm+IK31cToxT+1KIPiDqY6dYuBKL+MQW77PsZ3AUgmmkCwCp7ns9ALVG1BFcLX1vUIBpEVh+479HiB9rttnO/6u0sxMa05I5Ka58wkIKo5G1dJGGHsFK/LXCKhJT9EwzPAitU3x9NPGGrAxd", + "hexKey" : "8f2c81030491a24943d129fe60e63137", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "bpJq2o0SpBsacGNxSqF8ndO173juN5N/Cv7nsvsNsYRx3OOkhzGEC9hpvwUE9ANw3pkQ6Gf3MB+uqmQiHWYd9klWXIpVF1+jD6LREYmXVz8=", + "ivBase64" : "+jfoKJ/q8Otwuei/03wqwA==", + "cipherTextBase64" : "Afo36Cif6vDrcLnov9N8KsBxjd3bZdFRv5j8cM1ASq7DaaO5kTlRlrVqzEbLR65ik6Kb793HQ0X3k1C0GY9eh8FXln+kbp2nWdBOUR3/y+fa/fZamIJQv9v2WIrH3HIkqgLlKmFsBOos9VDnsfHQgDfnLFWvHxBErTb+z0XDacM+EPXLlbaIL1fkyQ9ucmlmIQ==", + "hexKey" : "c7ad1a66c7aafcb58178b869ac386631", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "h3Ws309e/UuSThri1bMPu5fDRIig+dPcSp66i2Fr2hsYyisPAotcBWddK289uSUaKncQe1bEPTF/ujcQ2WOmjUqeLD9o6+PvE+KPbAGwNziT", + "ivBase64" : "hprXeyW/cJI4tYn9su7BIg==", + "cipherTextBase64" : "AYaa13slv3CSOLWJ/bLuwSLTcNX/BCQFqKzG2FrZNEw57vDCgQjw4WTgBcBWFrwK4hZ8B8ubDvwYELURH1KQpiY/oOWDHjqqLQ3saVnjuYkn/JwH7SieFomue+mZHkiOGpy/zoMnoaCPi+aCh8QZTWy9Q/CKGwoHPdZMHuhflUQ/ZcSsYcUDgGVZcdx4fLo0eg==", + "hexKey" : "5ffb23e0309752e91b78dcf6376bae3c", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "0qwfR+K2Yrc5I3iv25j0+xsXcK0lfC93qrhXK7x/lPf/M0/6P1CD6Y9CpP0qohsaavY4PjvClm60fHkwnQu7H+zmiNCLlT8m8ESQY3lbFOHPjg==", + "ivBase64" : "XdR6vFWiUWLxr12t08/+5A==", + "cipherTextBase64" : "AV3UerxVolFi8a9drdPP/uQhGFrO3/vqw09eHfLtyvooX/Xc+6ZQ0u5rQYhU1fogcel/1bMmY2pz2bW1qYkmMRRoIV6DNO1r+f6qCdy/RXaDtuw70qly01byZK/qhn8vBF6D75vG3UmW/REW7jowow182Nv5+EPoY8HmltILjlYhl/Q6cpruKMLNl2udwrFtPA==", + "hexKey" : "b57678bb5900100b7c5e3fcf92f084c8", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "aQDtnwsT2zYVM6dqR86KYadTwUli8RoLoW3UxkxAB7Dsz2AuMj3DMtmX9pkQUUcR6NzoYaPpYTQ5RoFn5JXg1OEzAdFVSQVPjMbfNalSze0qYxs=", + "ivBase64" : "ijvCYbmFjWIpydr6ZV1A9w==", + "cipherTextBase64" : "AYo7wmG5hY1iKcna+mVdQPcFUhgRg2qNCoWaTiFrEX2tndUtg1U35qVu9XP9byq7+Exgz/d5XXpLJqTGPbbZrrlZxOgibovb3qa6I1J+OYY0V0R0hddMZVKTeGe/qDI/jKbuxlJizKR58eUnbzzjgkUMM576dl2f1qUI59IUYJnCvK9CF/iu/pSeAPArOOB7Cg==", + "hexKey" : "0e61a06f1b24c9ed61935f46635e759e", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "Saeo/tqEmJOOTpsc6wRep5mJFpvmAzim5xXp+GdsoclcUOOXn4m+vucfnYZ5SWT+3hxKjPJNxXYQwvIcqo9lP6ZB0RDxey1sRivoVOm+tyIeOtba", + "ivBase64" : "qT1e3bviGBolhCxiV9dBxA==", + "cipherTextBase64" : "Aak9Xt274hgaJYQsYlfXQcR8jr9j5I0wQGf5BfSrbg2QSbNOdt2MWhnbwHmW1QCqCCH+kd5G3hjRmyThdg9ixeT6kxEEUR0WTBOjiXclBgrPST0596j9ZWGpoGbgNe+RphLcCOd5v3SSAA7PFBGA680doAfJfSe4/B4qP8GLCm32pNZPkNMM7NlhfV2FDGMAkQ==", + "hexKey" : "f9fd2d875fa2689eb8921d8fae9c6cd6", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "diQnjbvCmHgGVTBn36bMk45JGRG33X7AJKreihzSs6wgn8m4yT0w97KlEcyuQDDfUG1lv83OCOZn73UsQcXpvDMg0QVhM0QsuQO+5COngdUu/c36Lg==", + "ivBase64" : "C3hw2fKVSgzq5BZQWDkYTg==", + "cipherTextBase64" : "AQt4cNnylUoM6uQWUFg5GE5M2ftntbAJMgf3vZQTtgBIcexPaeJ+QequPwTZjndKglHD0Pyaz6kHQyKrqvT6uk+8d7+NYjTyQjcPJUU3ccQO3r7wKr45cmjxHxUzefR1n3Vm2/FuYdFqFUGvDknrq4UcIGYgZJD68fOS0ILHMUzZj2ybOqcD1E0pB+r2oF6syA==", + "hexKey" : "17e9720932d9cb454256df16a8a207bf", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "nQneWahi3DVJ0AKshmm0nGrpjTJZ649428o+hP5MzWIJTRtiDVL1wZWSoKqfSm91r1LwvPTs3AsCROKa8Mof4kmfBUKPcD7sxuwRDtGEvfhHn0grwoU=", + "ivBase64" : "BtGrq7fFZZzG/Xfe7vol9w==", + "cipherTextBase64" : "AQbRq6u3xWWcxv133u76Jfc6DbOD/KMUhbit/00EDrimDSwXiuwcCG5bZue/2SZKKgS6j39JB0MiK3Aq4i6wEzlL68SGOzL+3U+U3O8YuGJaxfJMz1jjauEFP1K9Tr17CmLPm7VThTpW8Wv9DOBEZbGA5zomr3AnF4mbrv58qH22YHaKXdBHaJrTMWAvgx3h1A==", + "hexKey" : "42e140ce3bed5e9c95e7c29bfc3b5bcf", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "EaR6MslonwREZqK62OM7ZQpZCDKRaROMt6yv8p6J1Q/n6hkJzqA3utV0QXu7dVeNoOYBkc4fF4b7R4y+UUAjyRoovM5s8I8SwypUUiTCSHPainSQz8vA", + "ivBase64" : "OGGM6bZMe6wSU66Q+6mCtA==", + "cipherTextBase64" : "AThhjOm2THusElOukPupgrT9VKjo0vZfFtpFbmHl9TqACYLW0PCILOIq+5bfajMmldzrV29/LVZbsPj4EfB9sQEH7g5+wueouSCr5+a30O0qCbyNDZlQ3N3r0dc7k35Nks6DOhrdNoEvLuIy9QBWQY0y9K4x4mau58OQpvqsrdKTyL7osV0s51NQeeRWx35AGg==", + "hexKey" : "1bdac78a595daf0586f025bc6f9a9bf8", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "yeCX6F+SnYV5I0gLvMSMvEyqVWH5bMKtjRN0MNQm6syz7LWr5x17+UFAFYEj8PHko2W03l+yc8EyQGYyIle8x6uGcVEwOEEgvrmyuYuK7kd+5pAK4PPy/A==", + "ivBase64" : "Fz54a7YykTuRYYzLsqY/Ew==", + "cipherTextBase64" : "ARc+eGu2MpE7kWGMy7KmPxOwU+x54pBVyXaWpBEOIk8rL67FrOENO4Ww2kBJvFpWpw1ZzpmGDQsCyWbEgL7HO0ezBgAVIscsDGyrMg1fjSY/F/TCRBq1pZWntpGmQJC6uMJuGE+KKq8OwuXs+VqC9lek0GXs7Cdg4Nob/BX1B6bcgHdh8CMOYjebwoLFE3/CvQ==", + "hexKey" : "740ad332f02b20d64015aa08c4d07b7a", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "2V1XEJ+Gbzxw7v3jNO4V/2BmYfAYf+mX1UaFBrVoy/KQC1GjVWeDJ6Bt4S2Zj1MCAWx70ysRZIPgG5IrpyKXdLh4jevzY3CfhswoPIVkQTnHS7CBQy3Hif8=", + "ivBase64" : "bs4+kyCqfTuzWMMY8OcXDA==", + "cipherTextBase64" : "AW7OPpMgqn07s1jDGPDnFwx6TB86U2IaCb2eUOalTlPElePF4NBZ+mFM99OeiCDLxRmdBGjlWV1f6AJu8s8WCnfpTkK5GuTg4ANuoat/jlbFQZEFUtHvLbc5NzZC9eeKV/6+kY3/FgoyRIgD1Ixbdth/pnEQV0bfW2pU14V0DQIOZTuESYgfg1Odcmnu0wlHng==", + "hexKey" : "9dca45e355ca58a4d6d3562a33f00c32", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "DWak/+fJ8f+E0TzTDIvNIQXKEbW1Ctc2GoXZIfNgBuOp8Ee+TM8TmCESojfCMRhvPF+Zxf3v+JAQFgErgbGJ+nUsqQgUXqW7+lCMz6YolvnwCuvPbMKbbkYN", + "ivBase64" : "2LhFtXyde++8Syxd1kFH9Q==", + "cipherTextBase64" : "Adi4RbV8nXvvvEssXdZBR/XhKPWvm2Q8pEEqXCH86OsXtHUOzPJ6bOzrpNBan8RJjqkllLb9XkOzEUvbk2LYc3eK0/rcjZjjZHYijiYg87IHX4m4lzPwPtMogVb8JcgIDAmptYRwjTMy/jq/I8Zvb/aZB05h8fLnLLnq/zyiKRHXWJl9nA6YsEzsYTxWwWkMXg==", + "hexKey" : "a3e0a351353c82ee918e65b0217e8ea2", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "KwwD8V4aRjF92soPrVZZsrN5wUjAm3CruzKgmeaXvuegmPvRYmjTgSb8njLPEEfoQ0dyYVyPkEgRq6PEpR+kbgnr0okShYiUkzSC6PCB9MZCvRxhsrmbwkemJg==", + "ivBase64" : "BdAgT7W6HYW2tz6XQMDVaw==", + "cipherTextBase64" : "AQXQIE+1uh2Ftrc+l0DA1WtVdj0FnzNvEMIgc7+8cZzau970g4JHWkkwVOviQjxd0n5pi6d+M5MVcXeTlOrH5nnVL2qZ3Aq/vf08wX2XpcTgYEGHS1b+u2dIeeHom1mpffKXTDceL5sq72jQam5x8kWoNhuu0Y24kalZ7PH/glPAlT6pYItNsxtmfuy+eM++hA==", + "hexKey" : "1dc6b2bb1760744cccf1eb9bb6f4c27f", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "Bwy+0nr00p8X3fqdrFW4h3QSqFgnOlQQuvkuibs+zP8Ms2uZ7aFmN8qw22nc+tx11HSqGgUgP7kICwB2zdbd4hvaNsDyBvJ4Bcu79luiDK2Y+Mu13H1qDPdTSU8=", + "ivBase64" : "RJTI98mCmDQ6xcSv6DX+7w==", + "cipherTextBase64" : "AUSUyPfJgpg0OsXEr+g1/u8mz045fWJzVphu3ujVTrzpawI64Z4cWafwhQDq4Tw5m+MIHFz58o36hxDqnJ5q2TNJgl1haie4aEQK2LwnlGOuWGbQ2miwz4Im60IaBO5VI6nhcBvQofjQ0A5DW5HOOYYCrO8Pr1fpmlkuO2ytjfbWBGDKAmSejL4HXH+OEIUWew==", + "hexKey" : "da67f0d87a4004792018568dc6c9fc63", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "8KW7YhDqZct+FhTWSM/P1RHZ+UH3vKfXRda+L236dc0w88AolDHKfwdRISZ1D1kyZ7AJUib/rQvZU6Ro6WDKp5TwUXON5mGmjYXGq1YeWCxRFBKr7T/am0qpxEow", + "ivBase64" : "YZRuE96sjYcWSmaZxBb5ZA==", + "cipherTextBase64" : "AWGUbhPerI2HFkpmmcQW+WRA2UZu3l+Ukpwh8wRnEBZA/G6MoD57VkVA7tploNdKJeY3HZj3ogjFtgORJnwQMZ6jmk+7UAtytN2FjgPXHa4x/THHBI7+EuAidYZric+AcyENPRPU/9xlT1/PEDpSvISmwm2bNU3SM9UpeQdMoHBZVhegfFZ9nwqBOvusM2VhxQ==", + "hexKey" : "8fef81b9ed0e1d5ed03c59dfbb1143d6", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "wzUFUius0ttoJRHN1+hjY6NpYaBlQqCAnbOzwkIMIDEzUjU6TgAlSb0y4McOzI/KZ/vNkFNZJ5B1fseGpe6ZKca6oWYRudDIVRkGexx0iLKksdWU7xk3qEm9OM8d5A==", + "ivBase64" : "dG/dl8TWAMsMDersVEe6CA==", + "cipherTextBase64" : "AXRv3ZfE1gDLDA3q7FRHuggDJHpBEQnkYau05vMmVsKsAnrk8wpxKkpFxN/NG0/ZggbeiT484Degv+cbHg8stjh+4eInxFB5S6Rsoh/RzcSMB9GP+vfSR7H0Ya5gz84MNb+UHxuU2MfBTa5QC4OI3IwMtyNI0vAiDayG+nMRb8gorTXu8zIQUkX2CI8BLtGp5A==", + "hexKey" : "1edc715badf4bb81fba537a4f4918d6b", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "tQ0BiQAmeBdB3wd7CePgQcLGmBKgZQv0Yb7Z6TXqpDLyLo4ozjJHAadqVucKNjbcHPdUcKpSzAWxDIVt4ZYH6rUeKV79E7sQ74bq8QtkO05vhMsUmM+GPsUl8tu7pVQ=", + "ivBase64" : "ItHe5Lh4yuFX9xW0ZXKT9A==", + "cipherTextBase64" : "ASLR3uS4eMrhV/cVtGVyk/Q/f0WhGWNqKNUycgLnn80ehJJfSr1HsG+xdPGH6HH0/iz5vHzzLWRaemCJhzRHsUR0gU70BqzzS4NnTku2nKObpCl1iB3sKrCTFL2tN6dIscm/ZxgkoVe6A0kaCDKe16VnhC91PSAlg18o0xL20T6XCH3pTtK8CmSrWuAWK09VzQ==", + "hexKey" : "a46f3c385dfc61ed42ad4acd0291af2a", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "Kvva0ZDr14XrANFYi2zW1W5XQCanTzzU3CxK5G471X2kQS46VZX6/tI52R2luGl9dz0ZUN1C/u0XAwZhvrvyQ1qzWnw6DZmjcyzV4f+isUbzqdvIYA7FPxfQ+xG+mjZe", + "ivBase64" : "c6T2ix8Jz2Xei7VurJ1vuw==", + "cipherTextBase64" : "AXOk9osfCc9l3ou1bqydb7sDXPkBJJhl/JEUSmuSqqutLKbxUXzS242P4joFmfORi2SHiVW97mVv82PyGGfZwebTvLtDMgJjzaEZbTxZcq7SzozMm/ZgEco/h0AnvYlWly1NHOfgqw1LlGoDTevGJVYM2+oaF5ueMwFjVoX6zrHInaAoMfeuxr3DdZo/ePyiIODEJ+EB97tMXyDLEPHyvwQ=", + "hexKey" : "1017d8a710eb64a84c1c27cf38ebc09b", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "ppb8As8u3Mr7mJz0TE9xJt3LPbP3SB5JJp4C3/Sj4OV5+DC87o2nn2ys2xSG1l9/+0cgJ/SUP7AfWXnZ9asa9NyW/49LsYlVK3qLZ4kFIOSMQhjC3voZliVt304dexWZtg==", + "ivBase64" : "BRN0m5PzbIZ7uLVyxj10QA==", + "cipherTextBase64" : "AQUTdJuT82yGe7i1csY9dECvNMz9ETBMAHaDjg7H3C3n4sC2VpqTOmS2at0p7oUOqvGU1i0z5XziwVHGsl2xi9qApu0Ikpt1UHpgktsgvKJKn9uW+KCFj50R4edKRGTnbqILrQyGV0+WS+1gCppVJdxWXykc/pJq8JzBSxKrRaJ4CXqOnPkKgaAo/U62V949S6rSrYhFM0ub4SZ2Ell8mBU=", + "hexKey" : "4566695e11972e7912cc240c9a3dad4a", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "EPwDOojmptK8pL3xaIYlIK81dlh4oTeSnagzjPJj+c1PMze5F2qHR8kaFjCLD5bB2QSaT9hkvygnUb1eapu4BjRGELxxsx4I2A1Y636gl1Ix2ztgw1BhiRe9RydaNaPqg90=", + "ivBase64" : "MpTTgDvXafjbDZDJwWNkkw==", + "cipherTextBase64" : "ATKU04A712n42w2QycFjZJNr9HwYUbd5952KSP+td+HLU+yx+dIM6HLt98aDc8RDkznaU/10cQUHUbrNn9kkRppTFZPFNq1CF4Hbk/qFiROInac3kuuP29jfTAY25POvMXdszXzDXO0+zN8V8L980ver3jtGmgFAdu78jXLd5DiyC/gyzu2EWwBmknvzjmPYFrb/EOlf85p9OxPYEdvHVRs=", + "hexKey" : "2b05856743890e33f81b77621324aa98", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null + }, + { + "plainTextBase64" : "p7frRAHEdkRYk5mLWjFaWqyIGMWx4+zCb6s+p5dmEUX8aJCwqShG3hY/hMPxG3Y0VQp65DrmbAh33LfFqNEvWOTh1Qcr8f1NPsh2Y5FPsTbGmC4cWvXIGeUP9V+PKFelO9KP", + "ivBase64" : "uBG8sZ6KLuI9SZDCcbswdA==", + "cipherTextBase64" : "AbgRvLGeii7iPUmQwnG7MHRVL9Pdz66/yZMWNHKDSdT4L2ffQeztVvQ0cKJQAZH39ER8aME76tB6e+sn8wgkRp4Mp31MZXGE0LNKJvkvOFi/i+yLARqFjzuBY9s7OM8IIMaJiZW5/nW7HK7OQMoysltmjgy4N3MRSrzykgsYBnnMGyC3JMzRwxpYU84bf8dDCbxbs2PTrsh82i6Y48xj2jQ=", + "hexKey" : "2cffeb09fde31a09ad00e506ac8cc886", + "keyToEncrypt256" : null, + "keyToEncrypt128" : null, + "encryptedKey256" : null, + "encryptedKey128" : null } ], - "encodingTests": [ + "encodingTests" : [ { - "string": "Iñtërnâtiônàlizætiøn☃💩", - "encodedString": "ScOxdMOrcm7DonRpw7Ruw6BsaXrDpnRpw7hu4piD8J+SqQ==" + "string" : "Iñtërnâtiônàlizætiøn☃💩", + "encodedString" : "ScOxdMOrcm7DonRpw7Ruw6BsaXrDpnRpw7hu4piD8J+SqQ==" }, { - "string": "Ādam", - "encodedString": "xIBkYW0=" + "string" : "Ādam", + "encodedString" : "xIBkYW0=" }, { - "string": "\u0013';Ocw‹Ÿ³ÇÛïăėīĿœŧŻƏƣƷNjǟdzȇțȯɃɗɫɿʓʧʻˏˣ˷̟̳͇̋͛ͯΉΟδψϜϰЄИЬрєѨѼҐҤҸӌӠӴԈԜԱՅ՛կփׂ֚֮מ؁ؕةؽّ٥ٹڍڡڵۉ۝۱܅ܚܮ݂ݘݬހޔިߊߞ߲ࠈ", - "encodedString": "Eyc7T2N3wovCn8Kzw4fDm8OvxIPEl8SrxL/Fk8WnxbvGj8ajxrfHi8efx7PIh8ibyK/Jg8mXyavJv8qTyqfKu8uPy6PLt8yLzJ/Ms82HzZvNr86Jzp/OtM+Iz5zPsNCE0JjQrNGA0ZTRqNG80pDSpNK404zToNO01IjUnNSx1YXVm9Wv1oPWmtau14LXntiB2JXYqdi92ZHZpdm52o3aodq124nbndux3IXcmtyu3YLdmN2s3oDelN6o34rfnt+y4KCI" + "string" : "\u0013';Ocw‹Ÿ³ÇÛïăėīĿœŧŻƏƣƷNjǟdzȇțȯɃɗɫɿʓʧʻˏˣ˷̟̳͇̋͛ͯΉΟδψϜϰЄИЬрєѨѼҐҤҸӌӠӴԈԜԱՅ՛կփׂ֚֮מ؁ؕةؽّ٥ٹڍڡڵۉ۝۱܅ܚܮ݂ݘݬހޔިߊߞ߲ࠈ", + "encodedString" : "Eyc7T2N3wovCn8Kzw4fDm8OvxIPEl8SrxL/Fk8WnxbvGj8ajxrfHi8efx7PIh8ibyK/Jg8mXyavJv8qTyqfKu8uPy6PLt8yLzJ/Ms82HzZvNr86Jzp/OtM+Iz5zPsNCE0JjQrNGA0ZTRqNG80pDSpNK404zToNO01IjUnNSx1YXVm9Wv1oPWmtau14LXntiB2JXYqdi92ZHZpdm52o3aodq124nbndux3IXcmtyu3YLdmN2s3oDelN6o34rfnt+y4KCI" }, { - "string": "ࠜ࠲ࡇ࡛ࡷࢋࢦࢺ࣎࣢ࣶऊञलॆग़८ংছরৎৱਈਢ਼੩ઈઞવ્ૻକପୂ୨இபை௳ఌఢషౖ౸ಌಢಸೝഁഗഫി൙൯අගධා෫ญมีํຈຝຳ໋༂༖༪༾ནཧཿྒྷྨྼ࿒ဋဟဳ၇ၛၯႃ႗ႫႿმჯᄃᄗᄫᄿᅓᅧᅻᆏᆣᆷ", - "encodedString": "4KCc4KCy4KGH4KGb4KG34KKL4KKm4KK64KOO4KOi4KO24KSK4KSe4KSy4KWG4KWa4KWu4KaC4Kab4Kaw4KeO4Kex4KiI4Kii4Ki84Kmp4KqI4Kqe4Kq14KuN4Ku74KyV4Kyq4K2C4K2o4K6H4K6q4K+I4K+z4LCM4LCi4LC34LGW4LG44LKM4LKi4LK44LOd4LSB4LSX4LSr4LS/4LWZ4LWv4LaF4Lac4Law4LeP4Ler4LiN4Lih4Li14LmN4LqI4Lqd4Lqz4LuL4LyC4LyW4Lyq4Ly+4L2T4L2n4L2/4L6T4L6o4L684L+S4YCL4YCf4YCz4YGH4YGb4YGv4YKD4YKX4YKr4YK/4YOb4YOv4YSD4YSX4YSr4YS/4YWT4YWn4YW74YaP4Yaj4Ya3" + "string" : "ࠜ࠲ࡇ࡛ࡷࢋࢦࢺ࣎࣢ࣶऊञलॆग़८ংছরৎৱਈਢ਼੩ઈઞવ્ૻକପୂ୨இபை௳ఌఢషౖ౸ಌಢಸೝഁഗഫി൙൯අගධා෫ญมีํຈຝຳ໋༂༖༪༾ནཧཿྒྷྨྼ࿒ဋဟဳ၇ၛၯႃ႗ႫႿმჯᄃᄗᄫᄿᅓᅧᅻᆏᆣᆷ", + "encodedString" : "4KCc4KCy4KGH4KGb4KG34KKL4KKm4KK64KOO4KOi4KO24KSK4KSe4KSy4KWG4KWa4KWu4KaC4Kab4Kaw4KeO4Kex4KiI4Kii4Ki84Kmp4KqI4Kqe4Kq14KuN4Ku74KyV4Kyq4K2C4K2o4K6H4K6q4K+I4K+z4LCM4LCi4LC34LGW4LG44LKM4LKi4LK44LOd4LSB4LSX4LSr4LS/4LWZ4LWv4LaF4Lac4Law4LeP4Ler4LiN4Lih4Li14LmN4LqI4Lqd4Lqz4LuL4LyC4LyW4Lyq4Ly+4L2T4L2n4L2/4L6T4L6o4L684L+S4YCL4YCf4YCz4YGH4YGb4YGv4YKD4YKX4YKr4YK/4YOb4YOv4YSD4YSX4YSr4YS/4YWT4YWn4YW74YaP4Yaj4Ya3" }, { - "string": "ᇋᇟᇳሇማሯቃቜቲኆኝኲዌዡድጉጠጴፈ፞፲ᎉᎣᎷᏋᏟᏳᐋᐟᐳᑇᑛᑯᒃᒗᒫᒿᓓᓧᓻᔏᔣᔷᕋᕟᕳᖇᖛᖯᗃᗗᗫᗿᘓᘧᘻᙏᙣᙷᚋᚢᚶᛊᛞᛲᜍᜪᝇᝧញឝឱៅ៙៵᠏ᠩᠽᡑᡥᢀᢔᢨᣁᣕᣩᤇᤛᤴ᥏ᥣᦄᦘᦰᧄ᧡᧵ᨉ᨟ᨳ", - "encodedString": "4YeL4Yef4Yez4YiH4Yib4Yiv4YmD4Ymc4Ymy4YqG4Yqd4Yqy4YuM4Yuh4Yu14YyJ4Yyg4Yy04Y2I4Y2e4Y2y4Y6J4Y6j4Y634Y+L4Y+f4Y+z4ZCL4ZCf4ZCz4ZGH4ZGb4ZGv4ZKD4ZKX4ZKr4ZK/4ZOT4ZOn4ZO74ZSP4ZSj4ZS34ZWL4ZWf4ZWz4ZaH4Zab4Zav4ZeD4ZeX4Zer4Ze/4ZiT4Zin4Zi74ZmP4Zmj4Zm34ZqL4Zqi4Zq24ZuK4Zue4Zuy4ZyN4Zyq4Z2H4Z2n4Z6J4Z6d4Z6x4Z+F4Z+Z4Z+14aCP4aCp4aC94aGR4aGl4aKA4aKU4aKo4aOB4aOV4aOp4aSH4aSb4aS04aWP4aWj4aaE4aaY4aaw4aeE4aeh4ae14aiJ4aif4aiz" + "string" : "ᇋᇟᇳሇማሯቃቜቲኆኝኲዌዡድጉጠጴፈ፞፲ᎉᎣᎷᏋᏟᏳᐋᐟᐳᑇᑛᑯᒃᒗᒫᒿᓓᓧᓻᔏᔣᔷᕋᕟᕳᖇᖛᖯᗃᗗᗫᗿᘓᘧᘻᙏᙣᙷᚋᚢᚶᛊᛞᛲᜍᜪᝇᝧញឝឱៅ៙៵᠏ᠩᠽᡑᡥᢀᢔᢨᣁᣕᣩᤇᤛᤴ᥏ᥣᦄᦘᦰᧄ᧡᧵ᨉ᨟ᨳ", + "encodedString" : "4YeL4Yef4Yez4YiH4Yib4Yiv4YmD4Ymc4Ymy4YqG4Yqd4Yqy4YuM4Yuh4Yu14YyJ4Yyg4Yy04Y2I4Y2e4Y2y4Y6J4Y6j4Y634Y+L4Y+f4Y+z4ZCL4ZCf4ZCz4ZGH4ZGb4ZGv4ZKD4ZKX4ZKr4ZK/4ZOT4ZOn4ZO74ZSP4ZSj4ZS34ZWL4ZWf4ZWz4ZaH4Zab4Zav4ZeD4ZeX4Zer4Ze/4ZiT4Zin4Zi74ZmP4Zmj4Zm34ZqL4Zqi4Zq24ZuK4Zue4Zuy4ZyN4Zyq4Z2H4Z2n4Z6J4Z6d4Z6x4Z+F4Z+Z4Z+14aCP4aCp4aC94aGR4aGl4aKA4aKU4aKo4aOB4aOV4aOp4aSH4aSb4aS04aWP4aWj4aaE4aaY4aaw4aeE4aeh4ae14aiJ4aif4aiz" }, { - "string": "ᩇᩛᩰ᪆᪦᪼ᬁᬕᬩᬽ᭔᭨᭼ᮑᮥ᮹ᯍᯡ᯽ᰑᰥ᰼᱓ᱧᱻᲖᲪ᳀᳜ᳰᴉᴝᴱᵅᵙᵭᶁᶕᶩᶽ᷹᷑ᷥḍḡḵṉṝṱẅẙậềổứỽἑἩἽὕὭᾃᾗᾫ῀ῗῬ ‘‬⁀⁔⁩ⁿₔ₫₿⃢℅ℙℭ⅁⅕Ⅹⅽ↕↩↽⇑⇥⇹∍∡∵≉≝≱⊅⊙⊭", - "encodedString": "4amH4amb4amw4aqG4aqm4aq84ayB4ayV4ayp4ay94a2U4a2o4a284a6R4a6l4a654a+N4a+h4a+94bCR4bCl4bC84bGT4bGn4bG74bKW4bKq4bOA4bOc4bOw4bSJ4bSd4bSx4bWF4bWZ4bWt4baB4baV4bap4ba94beR4bel4be54biN4bih4bi14bmJ4bmd4bmx4bqF4bqZ4bqt4buB4buV4bup4bu94byR4byp4by94b2V4b2t4b6D4b6X4b6r4b+A4b+X4b+s4oCE4oCY4oCs4oGA4oGU4oGp4oG/4oKU4oKr4oK/4oOi4oSF4oSZ4oSt4oWB4oWV4oWp4oW94oaV4oap4oa94oeR4oel4oe54oiN4oih4oi14omJ4omd4omx4oqF4oqZ4oqt" + "string" : "ᩇᩛᩰ᪆᪦᪼ᬁᬕᬩᬽ᭔᭨᭼ᮑᮥ᮹ᯍᯡ᯽ᰑᰥ᰼᱓ᱧᱻᲖᲪ᳀᳜ᳰᴉᴝᴱᵅᵙᵭᶁᶕᶩᶽ᷹᷑ᷥḍḡḵṉṝṱẅẙậềổứỽἑἩἽὕὭᾃᾗᾫ῀ῗῬ ‘‬⁀⁔⁩ⁿₔ₫₿⃢℅ℙℭ⅁⅕Ⅹⅽ↕↩↽⇑⇥⇹∍∡∵≉≝≱⊅⊙⊭", + "encodedString" : "4amH4amb4amw4aqG4aqm4aq84ayB4ayV4ayp4ay94a2U4a2o4a284a6R4a6l4a654a+N4a+h4a+94bCR4bCl4bC84bGT4bGn4bG74bKW4bKq4bOA4bOc4bOw4bSJ4bSd4bSx4bWF4bWZ4bWt4baB4baV4bap4ba94beR4bel4be54biN4bih4bi14bmJ4bmd4bmx4bqF4bqZ4bqt4buB4buV4bup4bu94byR4byp4by94b2V4b2t4b6D4b6X4b6r4b+A4b+X4b+s4oCE4oCY4oCs4oGA4oGU4oGp4oG/4oKU4oKr4oK/4oOi4oSF4oSZ4oSt4oWB4oWV4oWp4oW94oaV4oap4oa94oeR4oel4oe54oiN4oih4oi14omJ4omd4omx4oqF4oqZ4oqt" }, { - "string": "⋁⋕⋩⋽⌑⌥⌹⍍⍡⍵⎉⎝⎱⏅⏙⏭␁␕⑂⑫⑿⒓⒧ⒻⓏⓣ⓷┋┟┳╇╛╯▃▗▫▿◓◧◻☏☣☷♋♟♳⚇⚛⚯⛃⛗⛫⛿✓✧✻❏❣❷➋➟➳⟇⟛⟯⠃⠗⠫⠿⡓⡧⡻⢏⢣⢷⣋⣟⣳⤇⤛⤯⥃⥗⥫⥿⦓⦧⦻⧏⧣⧷⨋⨟⨳⩇⩛⩯⪃⪗⪫", - "encodedString": "4ouB4ouV4oup4ou94oyR4oyl4oy54o2N4o2h4o214o6J4o6d4o6x4o+F4o+Z4o+t4pCB4pCV4pGC4pGr4pG/4pKT4pKn4pK74pOP4pOj4pO34pSL4pSf4pSz4pWH4pWb4pWv4paD4paX4par4pa/4peT4pen4pe74piP4pij4pi34pmL4pmf4pmz4pqH4pqb4pqv4puD4puX4pur4pu/4pyT4pyn4py74p2P4p2j4p234p6L4p6f4p6z4p+H4p+b4p+v4qCD4qCX4qCr4qC/4qGT4qGn4qG74qKP4qKj4qK34qOL4qOf4qOz4qSH4qSb4qSv4qWD4qWX4qWr4qW/4qaT4qan4qa74qeP4qej4qe34qiL4qif4qiz4qmH4qmb4qmv4qqD4qqX4qqr" + "string" : "⋁⋕⋩⋽⌑⌥⌹⍍⍡⍵⎉⎝⎱⏅⏙⏭␁␕⑂⑫⑿⒓⒧ⒻⓏⓣ⓷┋┟┳╇╛╯▃▗▫▿◓◧◻☏☣☷♋♟♳⚇⚛⚯⛃⛗⛫⛿✓✧✻❏❣❷➋➟➳⟇⟛⟯⠃⠗⠫⠿⡓⡧⡻⢏⢣⢷⣋⣟⣳⤇⤛⤯⥃⥗⥫⥿⦓⦧⦻⧏⧣⧷⨋⨟⨳⩇⩛⩯⪃⪗⪫", + "encodedString" : "4ouB4ouV4oup4ou94oyR4oyl4oy54o2N4o2h4o214o6J4o6d4o6x4o+F4o+Z4o+t4pCB4pCV4pGC4pGr4pG/4pKT4pKn4pK74pOP4pOj4pO34pSL4pSf4pSz4pWH4pWb4pWv4paD4paX4par4pa/4peT4pen4pe74piP4pij4pi34pmL4pmf4pmz4pqH4pqb4pqv4puD4puX4pur4pu/4pyT4pyn4py74p2P4p2j4p234p6L4p6f4p6z4p+H4p+b4p+v4qCD4qCX4qCr4qC/4qGT4qGn4qG74qKP4qKj4qK34qOL4qOf4qOz4qSH4qSb4qSv4qWD4qWX4qWr4qW/4qaT4qan4qa74qeP4qej4qe34qiL4qif4qiz4qmH4qmb4qmv4qqD4qqX4qqr" }, { - "string": "⪿⫓⫧⫻⬏⬣⬷⭋⭟⭳⮉⮞⮲⯆⯚⯮ⰂⰖⰪⰾⱒⱦⱺⲎⲢⲶⳊⳞⳲⴋⴟⴻⵏⵣⶌⶪⷁⷘⷭ⸁⸕⸩⸽⹑⺇⺜⺰⻄⻘⻬⼌⼠⼴⽈⽜⽰⾄⾘⾬⿀⿔〆〚〮ぃしにみんォソパュヹㄒㄦㄻㅏㅣㅷㆋㆠㆴ㇈㇜ㇼ㈐㈥㈹㉍㉡㉵㊉㊝㊱㋅㋙㋭㌁㌕", - "encodedString": "4qq/4quT4qun4qu74qyP4qyj4qy34q2L4q2f4q2z4q6J4q6e4q6y4q+G4q+a4q+u4rCC4rCW4rCq4rC+4rGS4rGm4rG64rKO4rKi4rK24rOK4rOe4rOy4rSL4rSf4rS74rWP4rWj4raM4raq4reB4reY4ret4riB4riV4rip4ri94rmR4rqH4rqc4rqw4ruE4ruY4rus4ryM4ryg4ry04r2I4r2c4r2w4r6E4r6Y4r6s4r+A4r+U44CG44Ca44Cu44GD44GX44Gr44G/44KT44Kp44K944OR44Ol44O544SS44Sm44S744WP44Wj44W344aL44ag44a044eI44ec44e844iQ44il44i544mN44mh44m144qJ44qd44qx44uF44uZ44ut44yB44yV" + "string" : "⪿⫓⫧⫻⬏⬣⬷⭋⭟⭳⮉⮞⮲⯆⯚⯮ⰂⰖⰪⰾⱒⱦⱺⲎⲢⲶⳊⳞⳲⴋⴟⴻⵏⵣⶌⶪⷁⷘⷭ⸁⸕⸩⸽⹑⺇⺜⺰⻄⻘⻬⼌⼠⼴⽈⽜⽰⾄⾘⾬⿀⿔〆〚〮ぃしにみんォソパュヹㄒㄦㄻㅏㅣㅷㆋㆠㆴ㇈㇜ㇼ㈐㈥㈹㉍㉡㉵㊉㊝㊱㋅㋙㋭㌁㌕", + "encodedString" : "4qq/4quT4qun4qu74qyP4qyj4qy34q2L4q2f4q2z4q6J4q6e4q6y4q+G4q+a4q+u4rCC4rCW4rCq4rC+4rGS4rGm4rG64rKO4rKi4rK24rOK4rOe4rOy4rSL4rSf4rS74rWP4rWj4raM4raq4reB4reY4ret4riB4riV4rip4ri94rmR4rqH4rqc4rqw4ruE4ruY4rus4ryM4ryg4ry04r2I4r2c4r2w4r6E4r6Y4r6s4r+A4r+U44CG44Ca44Cu44GD44GX44Gr44G/44KT44Kp44K944OR44Ol44O544SS44Sm44S744WP44Wj44W344aL44ag44a044eI44ec44e844iQ44il44i544mN44mh44m144qJ44qd44qx44uF44uZ44ut44yB44yV" }, { - "string": "㌩㌽㍑㍥㍹㎍㎡㎵㏉㏝㏱㐅㐙㐭㑁㑕㑩㑽㒑㒥㒹㓍㓡㓵㔉㔝㔱㕅㕙㕭㖁㖕㖩㖽㗑㗥㗹㘍㘡㘵㙉㙝㙱㚅㚙㚭㛁㛕㛩㛽㜑㜥㜹㝍㝡㝵㞉㞝㞱㟅㟙㟭㠁㠕㠩㠽㡑㡥㡹㢍㢡㢵㣉㣝㣱㤅㤙㤭㥁㥕㥩㥽㦑㦥㦹㧍㧡㧵㨉㨝㨱㩅㩙㩭㪁㪕㪩㪽㫑㫥", - "encodedString": "44yp44y9442R442l4425446N446h446144+J44+d44+x45CF45CZ45Ct45GB45GV45Gp45G945KR45Kl45K545ON45Oh45O145SJ45Sd45Sx45WF45WZ45Wt45aB45aV45ap45a945eR45el45e545iN45ih45i145mJ45md45mx45qF45qZ45qt45uB45uV45up45u945yR45yl45y5452N452h4521456J456d456x45+F45+Z45+t46CB46CV46Cp46C946GR46Gl46G546KN46Kh46K146OJ46Od46Ox46SF46SZ46St46WB46WV46Wp46W946aR46al46a546eN46eh46e146iJ46id46ix46mF46mZ46mt46qB46qV46qp46q946uR46ul" + "string" : "㌩㌽㍑㍥㍹㎍㎡㎵㏉㏝㏱㐅㐙㐭㑁㑕㑩㑽㒑㒥㒹㓍㓡㓵㔉㔝㔱㕅㕙㕭㖁㖕㖩㖽㗑㗥㗹㘍㘡㘵㙉㙝㙱㚅㚙㚭㛁㛕㛩㛽㜑㜥㜹㝍㝡㝵㞉㞝㞱㟅㟙㟭㠁㠕㠩㠽㡑㡥㡹㢍㢡㢵㣉㣝㣱㤅㤙㤭㥁㥕㥩㥽㦑㦥㦹㧍㧡㧵㨉㨝㨱㩅㩙㩭㪁㪕㪩㪽㫑㫥", + "encodedString" : "44yp44y9442R442l4425446N446h446144+J44+d44+x45CF45CZ45Ct45GB45GV45Gp45G945KR45Kl45K545ON45Oh45O145SJ45Sd45Sx45WF45WZ45Wt45aB45aV45ap45a945eR45el45e545iN45ih45i145mJ45md45mx45qF45qZ45qt45uB45uV45up45u945yR45yl45y5452N452h4521456J456d456x45+F45+Z45+t46CB46CV46Cp46C946GR46Gl46G546KN46Kh46K146OJ46Od46Ox46SF46SZ46St46WB46WV46Wp46W946aR46al46a546eN46eh46e146iJ46id46ix46mF46mZ46mt46qB46qV46qp46q946uR46ul" }, { - "string": "㫹㬍㬡㬵㭉㭝㭱㮅㮙㮭㯁㯕㯩㯽㰑㰥㰹㱍㱡㱵㲉㲝㲱㳅㳙㳭㴁㴕㴩㴽㵑㵥㵹㶍㶡㶵㷉㷝㷱㸅㸙㸭㹁㹕㹩㹽㺑㺥㺹㻍㻡㻵㼉㼝㼱㽅㽙㽭㾁㾕㾩㾽㿑㿥㿹䀍䀡䀵䁉䁝䁱䂅䂙䂭䃁䃕䃩䃽䄑䄥䄹䅍䅡䅵䆉䆝䆱䇅䇙䇭䈁䈕䈩䈽䉑䉥䉹䊍䊡䊵", - "encodedString": "46u546yN46yh46y1462J462d462x466F466Z466t46+B46+V46+p46+947CR47Cl47C547GN47Gh47G147KJ47Kd47Kx47OF47OZ47Ot47SB47SV47Sp47S947WR47Wl47W547aN47ah47a147eJ47ed47ex47iF47iZ47it47mB47mV47mp47m947qR47ql47q547uN47uh47u147yJ47yd47yx472F472Z472t476B476V476p476947+R47+l47+55ICN5ICh5IC15IGJ5IGd5IGx5IKF5IKZ5IKt5IOB5IOV5IOp5IO95ISR5ISl5IS55IWN5IWh5IW15IaJ5Iad5Iax5IeF5IeZ5Iet5IiB5IiV5Iip5Ii95ImR5Iml5Im55IqN5Iqh5Iq1" + "string" : "㫹㬍㬡㬵㭉㭝㭱㮅㮙㮭㯁㯕㯩㯽㰑㰥㰹㱍㱡㱵㲉㲝㲱㳅㳙㳭㴁㴕㴩㴽㵑㵥㵹㶍㶡㶵㷉㷝㷱㸅㸙㸭㹁㹕㹩㹽㺑㺥㺹㻍㻡㻵㼉㼝㼱㽅㽙㽭㾁㾕㾩㾽㿑㿥㿹䀍䀡䀵䁉䁝䁱䂅䂙䂭䃁䃕䃩䃽䄑䄥䄹䅍䅡䅵䆉䆝䆱䇅䇙䇭䈁䈕䈩䈽䉑䉥䉹䊍䊡䊵", + "encodedString" : "46u546yN46yh46y1462J462d462x466F466Z466t46+B46+V46+p46+947CR47Cl47C547GN47Gh47G147KJ47Kd47Kx47OF47OZ47Ot47SB47SV47Sp47S947WR47Wl47W547aN47ah47a147eJ47ed47ex47iF47iZ47it47mB47mV47mp47m947qR47ql47q547uN47uh47u147yJ47yd47yx472F472Z472t476B476V476p476947+R47+l47+55ICN5ICh5IC15IGJ5IGd5IGx5IKF5IKZ5IKt5IOB5IOV5IOp5IO95ISR5ISl5IS55IWN5IWh5IW15IaJ5Iad5Iax5IeF5IeZ5Iet5IiB5IiV5Iip5Ii95ImR5Iml5Im55IqN5Iqh5Iq1" }, { - "string": "䋉䋝䋱䌅䌙䌭䍁䍕䍩䍽䎑䎥䎹䏍䏡䏵䐉䐝䐱䑅䑙䑭䒁䒕䒩䒽䓑䓥䓹䔍䔡䔵䕉䕝䕱䖅䖙䖭䗁䗕䗩䗽䘑䘥䘹䙍䙡䙵䚉䚝䚱䛅䛙䛭䜁䜕䜩䜽䝑䝥䝹䞍䞡䞵䟉䟝䟱䠅䠙䠭䡁䡕䡩䡽䢑䢥䢹䣍䣡䣵䤉䤝䤱䥅䥙䥭䦁䦕䦩䦽䧑䧥䧹䨍䨡䨵䩉䩝䩱䪅", - "encodedString": "5IuJ5Iud5Iux5IyF5IyZ5Iyt5I2B5I2V5I2p5I295I6R5I6l5I655I+N5I+h5I+15JCJ5JCd5JCx5JGF5JGZ5JGt5JKB5JKV5JKp5JK95JOR5JOl5JO55JSN5JSh5JS15JWJ5JWd5JWx5JaF5JaZ5Jat5JeB5JeV5Jep5Je95JiR5Jil5Ji55JmN5Jmh5Jm15JqJ5Jqd5Jqx5JuF5JuZ5Jut5JyB5JyV5Jyp5Jy95J2R5J2l5J255J6N5J6h5J615J+J5J+d5J+x5KCF5KCZ5KCt5KGB5KGV5KGp5KG95KKR5KKl5KK55KON5KOh5KO15KSJ5KSd5KSx5KWF5KWZ5KWt5KaB5KaV5Kap5Ka95KeR5Kel5Ke55KiN5Kih5Ki15KmJ5Kmd5Kmx5KqF" + "string" : "䋉䋝䋱䌅䌙䌭䍁䍕䍩䍽䎑䎥䎹䏍䏡䏵䐉䐝䐱䑅䑙䑭䒁䒕䒩䒽䓑䓥䓹䔍䔡䔵䕉䕝䕱䖅䖙䖭䗁䗕䗩䗽䘑䘥䘹䙍䙡䙵䚉䚝䚱䛅䛙䛭䜁䜕䜩䜽䝑䝥䝹䞍䞡䞵䟉䟝䟱䠅䠙䠭䡁䡕䡩䡽䢑䢥䢹䣍䣡䣵䤉䤝䤱䥅䥙䥭䦁䦕䦩䦽䧑䧥䧹䨍䨡䨵䩉䩝䩱䪅", + "encodedString" : "5IuJ5Iud5Iux5IyF5IyZ5Iyt5I2B5I2V5I2p5I295I6R5I6l5I655I+N5I+h5I+15JCJ5JCd5JCx5JGF5JGZ5JGt5JKB5JKV5JKp5JK95JOR5JOl5JO55JSN5JSh5JS15JWJ5JWd5JWx5JaF5JaZ5Jat5JeB5JeV5Jep5Je95JiR5Jil5Ji55JmN5Jmh5Jm15JqJ5Jqd5Jqx5JuF5JuZ5Jut5JyB5JyV5Jyp5Jy95J2R5J2l5J255J6N5J6h5J615J+J5J+d5J+x5KCF5KCZ5KCt5KGB5KGV5KGp5KG95KKR5KKl5KK55KON5KOh5KO15KSJ5KSd5KSx5KWF5KWZ5KWt5KaB5KaV5Kap5Ka95KeR5Kel5Ke55KiN5Kih5Ki15KmJ5Kmd5Kmx5KqF" }, { - "string": "䪙䪭䫁䫕䫩䫽䬑䬥䬹䭍䭡䭵䮉䮝䮱䯅䯙䯭䰁䰕䰩䰽䱑䱥䱹䲍䲡䲵䳉䳝䳱䴅䴙䴭䵁䵕䵩䵽䶑䶥䶹䷍䷡䷵三丝丱久乙乭亁井亩亽仑以仹伍伡伵佉佝佱侅侙侭俁俕俩俽們倥倹偍偡偵傉傝傱僅僙僭儁儕儩儽兑入兹再冡况凉凝凱刅则刭剁剕", - "encodedString": "5KqZ5Kqt5KuB5KuV5Kup5Ku95KyR5Kyl5Ky55K2N5K2h5K215K6J5K6d5K6x5K+F5K+Z5K+t5LCB5LCV5LCp5LC95LGR5LGl5LG55LKN5LKh5LK15LOJ5LOd5LOx5LSF5LSZ5LSt5LWB5LWV5LWp5LW95LaR5Lal5La55LeN5Leh5Le15LiJ5Lid5Lix5LmF5LmZ5Lmt5LqB5LqV5Lqp5Lq95LuR5Lul5Lu55LyN5Lyh5Ly15L2J5L2d5L2x5L6F5L6Z5L6t5L+B5L+V5L+p5L+95YCR5YCl5YC55YGN5YGh5YG15YKJ5YKd5YKx5YOF5YOZ5YOt5YSB5YSV5YSp5YS95YWR5YWl5YW55YaN5Yah5Ya15YeJ5Yed5Yex5YiF5YiZ5Yit5YmB5YmV" + "string" : "䪙䪭䫁䫕䫩䫽䬑䬥䬹䭍䭡䭵䮉䮝䮱䯅䯙䯭䰁䰕䰩䰽䱑䱥䱹䲍䲡䲵䳉䳝䳱䴅䴙䴭䵁䵕䵩䵽䶑䶥䶹䷍䷡䷵三丝丱久乙乭亁井亩亽仑以仹伍伡伵佉佝佱侅侙侭俁俕俩俽們倥倹偍偡偵傉傝傱僅僙僭儁儕儩儽兑入兹再冡况凉凝凱刅则刭剁剕", + "encodedString" : "5KqZ5Kqt5KuB5KuV5Kup5Ku95KyR5Kyl5Ky55K2N5K2h5K215K6J5K6d5K6x5K+F5K+Z5K+t5LCB5LCV5LCp5LC95LGR5LGl5LG55LKN5LKh5LK15LOJ5LOd5LOx5LSF5LSZ5LSt5LWB5LWV5LWp5LW95LaR5Lal5La55LeN5Leh5Le15LiJ5Lid5Lix5LmF5LmZ5Lmt5LqB5LqV5Lqp5Lq95LuR5Lul5Lu55LyN5Lyh5Ly15L2J5L2d5L2x5L6F5L6Z5L6t5L+B5L+V5L+p5L+95YCR5YCl5YC55YGN5YGh5YG15YKJ5YKd5YKx5YOF5YOZ5YOt5YSB5YSV5YSp5YS95YWR5YWl5YW55YaN5Yah5Ya15YeJ5Yed5Yex5YiF5YiZ5Yit5YmB5YmV" }, { - "string": "剩剽劑劥効勍勡勵匉匝匱卅卙卭厁厕厩厽发句叹名吡吵呉呝呱咅咙咭品哕哩哽唑唥唹啍啡啵喉喝喱嗅嗙嗭嘁嘕嘩嘽噑噥噹嚍嚡嚵囉囝囱圅圙圭坁坕坩坽垑垥垹埍埡埵堉堝報塅塙塭墁墕墩墽壑壥壹复夡夵奉奝奱妅妙妭姁姕姩姽娑娥", - "encodedString": "5Ymp5Ym95YqR5Yql5Yq55YuN5Yuh5Yu15YyJ5Yyd5Yyx5Y2F5Y2Z5Y2t5Y6B5Y6V5Y6p5Y695Y+R5Y+l5Y+55ZCN5ZCh5ZC15ZGJ5ZGd5ZGx5ZKF5ZKZ5ZKt5ZOB5ZOV5ZOp5ZO95ZSR5ZSl5ZS55ZWN5ZWh5ZW15ZaJ5Zad5Zax5ZeF5ZeZ5Zet5ZiB5ZiV5Zip5Zi95ZmR5Zml5Zm55ZqN5Zqh5Zq15ZuJ5Zud5Zux5ZyF5ZyZ5Zyt5Z2B5Z2V5Z2p5Z295Z6R5Z6l5Z655Z+N5Z+h5Z+15aCJ5aCd5aCx5aGF5aGZ5aGt5aKB5aKV5aKp5aK95aOR5aOl5aO55aSN5aSh5aS15aWJ5aWd5aWx5aaF5aaZ5aat5aeB5aeV5aep5ae95aiR5ail" + "string" : "剩剽劑劥効勍勡勵匉匝匱卅卙卭厁厕厩厽发句叹名吡吵呉呝呱咅咙咭品哕哩哽唑唥唹啍啡啵喉喝喱嗅嗙嗭嘁嘕嘩嘽噑噥噹嚍嚡嚵囉囝囱圅圙圭坁坕坩坽垑垥垹埍埡埵堉堝報塅塙塭墁墕墩墽壑壥壹复夡夵奉奝奱妅妙妭姁姕姩姽娑娥", + "encodedString" : "5Ymp5Ym95YqR5Yql5Yq55YuN5Yuh5Yu15YyJ5Yyd5Yyx5Y2F5Y2Z5Y2t5Y6B5Y6V5Y6p5Y695Y+R5Y+l5Y+55ZCN5ZCh5ZC15ZGJ5ZGd5ZGx5ZKF5ZKZ5ZKt5ZOB5ZOV5ZOp5ZO95ZSR5ZSl5ZS55ZWN5ZWh5ZW15ZaJ5Zad5Zax5ZeF5ZeZ5Zet5ZiB5ZiV5Zip5Zi95ZmR5Zml5Zm55ZqN5Zqh5Zq15ZuJ5Zud5Zux5ZyF5ZyZ5Zyt5Z2B5Z2V5Z2p5Z295Z6R5Z6l5Z655Z+N5Z+h5Z+15aCJ5aCd5aCx5aGF5aGZ5aGt5aKB5aKV5aKp5aK95aOR5aOl5aO55aSN5aSh5aS15aWJ5aWd5aWx5aaF5aaZ5aat5aeB5aeV5aep5ae95aiR5ail" }, { - "string": "娹婍婡婵媉媝媱嫅嫙嫭嬁嬕嬩嬽孑孥孹宍审宵寉寝寱尅尙尭屁展屩屽岑岥岹峍峡峵崉崝崱嵅嵙嵭嶁嶕嶩嶽巑工巹帍帡帵幉幝幱庅庙庭廁廕廩廽弑弥弹彍彡彵徉徝徱必忙忭态怕怩怽恑恥恹悍悡悵惉惝惱愅愙愭慁慕慩慽憑憥憹懍懡懵", - "encodedString": "5ai55amN5amh5am15aqJ5aqd5aqx5auF5auZ5aut5ayB5ayV5ayp5ay95a2R5a2l5a255a6N5a6h5a615a+J5a+d5a+x5bCF5bCZ5bCt5bGB5bGV5bGp5bG95bKR5bKl5bK55bON5bOh5bO15bSJ5bSd5bSx5bWF5bWZ5bWt5baB5baV5bap5ba95beR5bel5be55biN5bih5bi15bmJ5bmd5bmx5bqF5bqZ5bqt5buB5buV5bup5bu95byR5byl5by55b2N5b2h5b215b6J5b6d5b6x5b+F5b+Z5b+t5oCB5oCV5oCp5oC95oGR5oGl5oG55oKN5oKh5oK15oOJ5oOd5oOx5oSF5oSZ5oSt5oWB5oWV5oWp5oW95oaR5oal5oa55oeN5oeh5oe1" + "string" : "娹婍婡婵媉媝媱嫅嫙嫭嬁嬕嬩嬽孑孥孹宍审宵寉寝寱尅尙尭屁展屩屽岑岥岹峍峡峵崉崝崱嵅嵙嵭嶁嶕嶩嶽巑工巹帍帡帵幉幝幱庅庙庭廁廕廩廽弑弥弹彍彡彵徉徝徱必忙忭态怕怩怽恑恥恹悍悡悵惉惝惱愅愙愭慁慕慩慽憑憥憹懍懡懵", + "encodedString" : "5ai55amN5amh5am15aqJ5aqd5aqx5auF5auZ5aut5ayB5ayV5ayp5ay95a2R5a2l5a255a6N5a6h5a615a+J5a+d5a+x5bCF5bCZ5bCt5bGB5bGV5bGp5bG95bKR5bKl5bK55bON5bOh5bO15bSJ5bSd5bSx5bWF5bWZ5bWt5baB5baV5bap5ba95beR5bel5be55biN5bih5bi15bmJ5bmd5bmx5bqF5bqZ5bqt5buB5buV5bup5bu95byR5byl5by55b2N5b2h5b215b6J5b6d5b6x5b+F5b+Z5b+t5oCB5oCV5oCp5oC95oGR5oGl5oG55oKN5oKh5oK15oOJ5oOd5oOx5oSF5oSZ5oSt5oWB5oWV5oWp5oW95oaR5oal5oa55oeN5oeh5oe1" }, { - "string": "戉戝戱扅扙扭抁投抩抽拑拥拹挍挡挵捉捝捱掅掙掭揁揕揩揽搑搥搹摍摡摵撉撝撱擅擙擭攁攕攩攽救敥敹斍斡斵旉旝旱昅昙昭晁晕晩晽暑暥暹曍曡曵有朝朱杅杙杭极枕枩枽柑查柹栍校栵桉桝桱梅梙梭棁棕棩棽椑椥椹楍楡極榉榝榱槅", - "encodedString": "5oiJ5oid5oix5omF5omZ5omt5oqB5oqV5oqp5oq95ouR5oul5ou55oyN5oyh5oy15o2J5o2d5o2x5o6F5o6Z5o6t5o+B5o+V5o+p5o+95pCR5pCl5pC55pGN5pGh5pG15pKJ5pKd5pKx5pOF5pOZ5pOt5pSB5pSV5pSp5pS95pWR5pWl5pW55paN5pah5pa15peJ5ped5pex5piF5piZ5pit5pmB5pmV5pmp5pm95pqR5pql5pq55puN5puh5pu15pyJ5pyd5pyx5p2F5p2Z5p2t5p6B5p6V5p6p5p695p+R5p+l5p+55qCN5qCh5qC15qGJ5qGd5qGx5qKF5qKZ5qKt5qOB5qOV5qOp5qO95qSR5qSl5qS55qWN5qWh5qW15qaJ5qad5qax5qeF" + "string" : "戉戝戱扅扙扭抁投抩抽拑拥拹挍挡挵捉捝捱掅掙掭揁揕揩揽搑搥搹摍摡摵撉撝撱擅擙擭攁攕攩攽救敥敹斍斡斵旉旝旱昅昙昭晁晕晩晽暑暥暹曍曡曵有朝朱杅杙杭极枕枩枽柑查柹栍校栵桉桝桱梅梙梭棁棕棩棽椑椥椹楍楡極榉榝榱槅", + "encodedString" : "5oiJ5oid5oix5omF5omZ5omt5oqB5oqV5oqp5oq95ouR5oul5ou55oyN5oyh5oy15o2J5o2d5o2x5o6F5o6Z5o6t5o+B5o+V5o+p5o+95pCR5pCl5pC55pGN5pGh5pG15pKJ5pKd5pKx5pOF5pOZ5pOt5pSB5pSV5pSp5pS95pWR5pWl5pW55paN5pah5pa15peJ5ped5pex5piF5piZ5pit5pmB5pmV5pmp5pm95pqR5pql5pq55puN5puh5pu15pyJ5pyd5pyx5p2F5p2Z5p2t5p6B5p6V5p6p5p695p+R5p+l5p+55qCN5qCh5qC15qGJ5qGd5qGx5qKF5qKZ5qKt5qOB5qOV5qOp5qO95qSR5qSl5qS55qWN5qWh5qW15qaJ5qad5qax5qeF" }, { - "string": "槙槭樁樕権樽橑橥橹檍檡檵櫉櫝櫱欅欙欭歁歕歩歽殑殥殹母毡毵氉氝氱汅汙汭沁沕沩沽泑泥泹洍洡洵浉浝浱涅涙涭淁淕淩淽渑渥渹湍湡湵溉溝溱滅滙滭漁漕漩漽潑潥潹澍澡澵濉濝濱瀅瀙瀭灁灕灩災炑炥点烍烡烵焉焝焱煅煙煭熁熕", - "encodedString": "5qeZ5qet5qiB5qiV5qip5qi95qmR5qml5qm55qqN5qqh5qq15quJ5qud5qux5qyF5qyZ5qyt5q2B5q2V5q2p5q295q6R5q6l5q655q+N5q+h5q+15rCJ5rCd5rCx5rGF5rGZ5rGt5rKB5rKV5rKp5rK95rOR5rOl5rO55rSN5rSh5rS15rWJ5rWd5rWx5raF5raZ5rat5reB5reV5rep5re95riR5ril5ri55rmN5rmh5rm15rqJ5rqd5rqx5ruF5ruZ5rut5ryB5ryV5ryp5ry95r2R5r2l5r255r6N5r6h5r615r+J5r+d5r+x54CF54CZ54Ct54GB54GV54Gp54G954KR54Kl54K554ON54Oh54O154SJ54Sd54Sx54WF54WZ54Wt54aB54aV" + "string" : "槙槭樁樕権樽橑橥橹檍檡檵櫉櫝櫱欅欙欭歁歕歩歽殑殥殹母毡毵氉氝氱汅汙汭沁沕沩沽泑泥泹洍洡洵浉浝浱涅涙涭淁淕淩淽渑渥渹湍湡湵溉溝溱滅滙滭漁漕漩漽潑潥潹澍澡澵濉濝濱瀅瀙瀭灁灕灩災炑炥点烍烡烵焉焝焱煅煙煭熁熕", + "encodedString" : "5qeZ5qet5qiB5qiV5qip5qi95qmR5qml5qm55qqN5qqh5qq15quJ5qud5qux5qyF5qyZ5qyt5q2B5q2V5q2p5q295q6R5q6l5q655q+N5q+h5q+15rCJ5rCd5rCx5rGF5rGZ5rGt5rKB5rKV5rKp5rK95rOR5rOl5rO55rSN5rSh5rS15rWJ5rWd5rWx5raF5raZ5rat5reB5reV5rep5re95riR5ril5ri55rmN5rmh5rm15rqJ5rqd5rqx5ruF5ruZ5rut5ryB5ryV5ryp5ry95r2R5r2l5r255r6N5r6h5r615r+J5r+d5r+x54CF54CZ54Ct54GB54GV54Gp54G954KR54Kl54K554ON54Oh54O154SJ54Sd54Sx54WF54WZ54Wt54aB54aV" }, { - "string": "熩熽燑燥燹爍爡爵牉牝牱犅犙犭狁狕狩狽猑猥猹獍獡獵玉玝玱珅珙班琁琕琩琽瑑瑥瑹璍璡璵瓉瓝瓱甅甙甭畁畕畩畽疑疥疹痍痡痵瘉瘝瘱癅癙癭皁皕皩皽监盥盹眍眡眵睉睝睱瞅瞙瞭矁矕矩矽砑砥砹硍硡硵碉碝碱磅磙磭礁礕礩礽祑祥", - "encodedString": "54ap54a954eR54el54e554iN54ih54i154mJ54md54mx54qF54qZ54qt54uB54uV54up54u954yR54yl54y5542N542h5421546J546d546x54+F54+Z54+t55CB55CV55Cp55C955GR55Gl55G555KN55Kh55K155OJ55Od55Ox55SF55SZ55St55WB55WV55Wp55W955aR55al55a555eN55eh55e155iJ55id55ix55mF55mZ55mt55qB55qV55qp55q955uR55ul55u555yN55yh55y1552J552d552x556F556Z556t55+B55+V55+p55+956CR56Cl56C556GN56Gh56G156KJ56Kd56Kx56OF56OZ56Ot56SB56SV56Sp56S956WR56Wl" + "string" : "熩熽燑燥燹爍爡爵牉牝牱犅犙犭狁狕狩狽猑猥猹獍獡獵玉玝玱珅珙班琁琕琩琽瑑瑥瑹璍璡璵瓉瓝瓱甅甙甭畁畕畩畽疑疥疹痍痡痵瘉瘝瘱癅癙癭皁皕皩皽监盥盹眍眡眵睉睝睱瞅瞙瞭矁矕矩矽砑砥砹硍硡硵碉碝碱磅磙磭礁礕礩礽祑祥", + "encodedString" : "54ap54a954eR54el54e554iN54ih54i154mJ54md54mx54qF54qZ54qt54uB54uV54up54u954yR54yl54y5542N542h5421546J546d546x54+F54+Z54+t55CB55CV55Cp55C955GR55Gl55G555KN55Kh55K155OJ55Od55Ox55SF55SZ55St55WB55WV55Wp55W955aR55al55a555eN55eh55e155iJ55id55ix55mF55mZ55mt55qB55qV55qp55q955uR55ul55u555yN55yh55y1552J552d552x556F556Z556t55+B55+V55+p55+956CR56Cl56C556GN56Gh56G156KJ56Kd56Kx56OF56OZ56Ot56SB56SV56Sp56S956WR56Wl" }, { - "string": "祹禍禡禵秉秝秱稅稙稭穁穕穩穽窑窥窹竍竡竵笉笝笱筅筙筭箁箕箩箽篑篥篹簍簡簵籉籝籱粅粙粭糁糕糩糽紑紥紹絍絡絵綉綝綱緅緙緭縁縕縩總繑繥繹纍纡纵绉绝绱缅缙缭罁罕罩罽羑羥羹翍翡翵耉耝耱聅聙聭肁肕肩肽胑胥胹脍脡脵", - "encodedString": "56W556aN56ah56a156eJ56ed56ex56iF56iZ56it56mB56mV56mp56m956qR56ql56q556uN56uh56u156yJ56yd56yx562F562Z562t566B566V566p566956+R56+l56+557CN57Ch57C157GJ57Gd57Gx57KF57KZ57Kt57OB57OV57Op57O957SR57Sl57S557WN57Wh57W157aJ57ad57ax57eF57eZ57et57iB57iV57ip57i957mR57ml57m557qN57qh57q157uJ57ud57ux57yF57yZ57yt572B572V572p5729576R576l576557+N57+h57+16ICJ6ICd6ICx6IGF6IGZ6IGt6IKB6IKV6IKp6IK96IOR6IOl6IO56ISN6ISh6IS1" + "string" : "祹禍禡禵秉秝秱稅稙稭穁穕穩穽窑窥窹竍竡竵笉笝笱筅筙筭箁箕箩箽篑篥篹簍簡簵籉籝籱粅粙粭糁糕糩糽紑紥紹絍絡絵綉綝綱緅緙緭縁縕縩總繑繥繹纍纡纵绉绝绱缅缙缭罁罕罩罽羑羥羹翍翡翵耉耝耱聅聙聭肁肕肩肽胑胥胹脍脡脵", + "encodedString" : "56W556aN56ah56a156eJ56ed56ex56iF56iZ56it56mB56mV56mp56m956qR56ql56q556uN56uh56u156yJ56yd56yx562F562Z562t566B566V566p566956+R56+l56+557CN57Ch57C157GJ57Gd57Gx57KF57KZ57Kt57OB57OV57Op57O957SR57Sl57S557WN57Wh57W157aJ57ad57ax57eF57eZ57et57iB57iV57ip57i957mR57ml57m557qN57qh57q157uJ57ud57ux57yF57yZ57yt572B572V572p5729576R576l576557+N57+h57+16ICJ6ICd6ICx6IGF6IGZ6IGt6IKB6IKV6IKp6IK96IOR6IOl6IO56ISN6ISh6IS1" }, { - "string": "腉腝腱膅膙膭臁臕臩臽舑舥船艍艡艵芉芝花苅苙苭茁茕茩茽荑荥荹莍莡莵菉菝菱萅萙萭葁葕葩葽蒑蒥蒹蓍蓡蓵蔉蔝蔱蕅蕙蕭薁薕薩薽藑藥藹蘍蘡蘵虉虝虱蚅蚙蚭蛁蛕蛩蛽蜑蜥蜹蝍蝡蝵螉螝螱蟅蟙蟭蠁蠕蠩蠽衑补衹袍袡袵裉裝裱褅", - "encodedString": "6IWJ6IWd6IWx6IaF6IaZ6Iat6IeB6IeV6Iep6Ie96IiR6Iil6Ii56ImN6Imh6Im16IqJ6Iqd6Iqx6IuF6IuZ6Iut6IyB6IyV6Iyp6Iy96I2R6I2l6I256I6N6I6h6I616I+J6I+d6I+x6JCF6JCZ6JCt6JGB6JGV6JGp6JG96JKR6JKl6JK56JON6JOh6JO16JSJ6JSd6JSx6JWF6JWZ6JWt6JaB6JaV6Jap6Ja96JeR6Jel6Je56JiN6Jih6Ji16JmJ6Jmd6Jmx6JqF6JqZ6Jqt6JuB6JuV6Jup6Ju96JyR6Jyl6Jy56J2N6J2h6J216J6J6J6d6J6x6J+F6J+Z6J+t6KCB6KCV6KCp6KC96KGR6KGl6KG56KKN6KKh6KK16KOJ6KOd6KOx6KSF" + "string" : "腉腝腱膅膙膭臁臕臩臽舑舥船艍艡艵芉芝花苅苙苭茁茕茩茽荑荥荹莍莡莵菉菝菱萅萙萭葁葕葩葽蒑蒥蒹蓍蓡蓵蔉蔝蔱蕅蕙蕭薁薕薩薽藑藥藹蘍蘡蘵虉虝虱蚅蚙蚭蛁蛕蛩蛽蜑蜥蜹蝍蝡蝵螉螝螱蟅蟙蟭蠁蠕蠩蠽衑补衹袍袡袵裉裝裱褅", + "encodedString" : "6IWJ6IWd6IWx6IaF6IaZ6Iat6IeB6IeV6Iep6Ie96IiR6Iil6Ii56ImN6Imh6Im16IqJ6Iqd6Iqx6IuF6IuZ6Iut6IyB6IyV6Iyp6Iy96I2R6I2l6I256I6N6I6h6I616I+J6I+d6I+x6JCF6JCZ6JCt6JGB6JGV6JGp6JG96JKR6JKl6JK56JON6JOh6JO16JSJ6JSd6JSx6JWF6JWZ6JWt6JaB6JaV6Jap6Ja96JeR6Jel6Je56JiN6Jih6Ji16JmJ6Jmd6Jmx6JqF6JqZ6Jqt6JuB6JuV6Jup6Ju96JyR6Jyl6Jy56J2N6J2h6J216J6J6J6d6J6x6J+F6J+Z6J+t6KCB6KCV6KCp6KC96KGR6KGl6KG56KKN6KKh6KK16KOJ6KOd6KOx6KSF" }, { - "string": "褙褭襁襕襩襽覑覥覹觍觡觵訉訝許詅詙詭誁誕誩誽諑諥諹謍謡謵證譝譱讅讙训证试诩诽谑谥谹豍象豵貉貝貱賅賙賭贁贕贩贽赑赥赹趍趡趵跉距跱踅踙踭蹁蹕蹩蹽躑躥躹軍軡軵載輝輱轅轙轭辁辕辩辽近迥迹逍逡逵遉遝遱邅邙邭郁郕", - "encodedString": "6KSZ6KSt6KWB6KWV6KWp6KW96KaR6Kal6Ka56KeN6Keh6Ke16KiJ6Kid6Kix6KmF6KmZ6Kmt6KqB6KqV6Kqp6Kq96KuR6Kul6Ku56KyN6Kyh6Ky16K2J6K2d6K2x6K6F6K6Z6K6t6K+B6K+V6K+p6K+96LCR6LCl6LC56LGN6LGh6LG16LKJ6LKd6LKx6LOF6LOZ6LOt6LSB6LSV6LSp6LS96LWR6LWl6LW56LaN6Lah6La16LeJ6Led6Lex6LiF6LiZ6Lit6LmB6LmV6Lmp6Lm96LqR6Lql6Lq56LuN6Luh6Lu16LyJ6Lyd6Lyx6L2F6L2Z6L2t6L6B6L6V6L6p6L696L+R6L+l6L+56YCN6YCh6YC16YGJ6YGd6YGx6YKF6YKZ6YKt6YOB6YOV" + "string" : "褙褭襁襕襩襽覑覥覹觍觡觵訉訝許詅詙詭誁誕誩誽諑諥諹謍謡謵證譝譱讅讙训证试诩诽谑谥谹豍象豵貉貝貱賅賙賭贁贕贩贽赑赥赹趍趡趵跉距跱踅踙踭蹁蹕蹩蹽躑躥躹軍軡軵載輝輱轅轙轭辁辕辩辽近迥迹逍逡逵遉遝遱邅邙邭郁郕", + "encodedString" : "6KSZ6KSt6KWB6KWV6KWp6KW96KaR6Kal6Ka56KeN6Keh6Ke16KiJ6Kid6Kix6KmF6KmZ6Kmt6KqB6KqV6Kqp6Kq96KuR6Kul6Ku56KyN6Kyh6Ky16K2J6K2d6K2x6K6F6K6Z6K6t6K+B6K+V6K+p6K+96LCR6LCl6LC56LGN6LGh6LG16LKJ6LKd6LKx6LOF6LOZ6LOt6LSB6LSV6LSp6LS96LWR6LWl6LW56LaN6Lah6La16LeJ6Led6Lex6LiF6LiZ6Lit6LmB6LmV6Lmp6Lm96LqR6Lql6Lq56LuN6Luh6Lu16LyJ6Lyd6Lyx6L2F6L2Z6L2t6L6B6L6V6L6p6L696L+R6L+l6L+56YCN6YCh6YC16YGJ6YGd6YGx6YKF6YKZ6YKt6YOB6YOV" }, { - "string": "郩都鄑鄥鄹配酡酵醉醝醱釅釙釭鈁鈕鈩鈽鉑鉥鉹銍銡銵鋉鋝鋱錅錙錭鍁鍕鍩鍽鎑鎥鎹鏍鏡鏵鐉鐝鐱鑅鑙鑭钁钕钩钽铑铥铹锍锡锵镉镝镱閅閙閭闁闕闩闽阑阥阹降陡陵隉隝隱雅雙雭霁霕霩霽靑靥靹鞍鞡鞵韉韝韱項頙頭顁顕顩顽频颥", - "encodedString": "6YOp6YO96YSR6YSl6YS56YWN6YWh6YW16YaJ6Yad6Yax6YeF6YeZ6Yet6YiB6YiV6Yip6Yi96YmR6Yml6Ym56YqN6Yqh6Yq16YuJ6Yud6Yux6YyF6YyZ6Yyt6Y2B6Y2V6Y2p6Y296Y6R6Y6l6Y656Y+N6Y+h6Y+16ZCJ6ZCd6ZCx6ZGF6ZGZ6ZGt6ZKB6ZKV6ZKp6ZK96ZOR6ZOl6ZO56ZSN6ZSh6ZS16ZWJ6ZWd6ZWx6ZaF6ZaZ6Zat6ZeB6ZeV6Zep6Ze96ZiR6Zil6Zi56ZmN6Zmh6Zm16ZqJ6Zqd6Zqx6ZuF6ZuZ6Zut6ZyB6ZyV6Zyp6Zy96Z2R6Z2l6Z256Z6N6Z6h6Z616Z+J6Z+d6Z+x6aCF6aCZ6aCt6aGB6aGV6aGp6aG96aKR6aKl" + "string" : "郩都鄑鄥鄹配酡酵醉醝醱釅釙釭鈁鈕鈩鈽鉑鉥鉹銍銡銵鋉鋝鋱錅錙錭鍁鍕鍩鍽鎑鎥鎹鏍鏡鏵鐉鐝鐱鑅鑙鑭钁钕钩钽铑铥铹锍锡锵镉镝镱閅閙閭闁闕闩闽阑阥阹降陡陵隉隝隱雅雙雭霁霕霩霽靑靥靹鞍鞡鞵韉韝韱項頙頭顁顕顩顽频颥", + "encodedString" : "6YOp6YO96YSR6YSl6YS56YWN6YWh6YW16YaJ6Yad6Yax6YeF6YeZ6Yet6YiB6YiV6Yip6Yi96YmR6Yml6Ym56YqN6Yqh6Yq16YuJ6Yud6Yux6YyF6YyZ6Yyt6Y2B6Y2V6Y2p6Y296Y6R6Y6l6Y656Y+N6Y+h6Y+16ZCJ6ZCd6ZCx6ZGF6ZGZ6ZGt6ZKB6ZKV6ZKp6ZK96ZOR6ZOl6ZO56ZSN6ZSh6ZS16ZWJ6ZWd6ZWx6ZaF6ZaZ6Zat6ZeB6ZeV6Zep6Ze96ZiR6Zil6Zi56ZmN6Zmh6Zm16ZqJ6Zqd6Zqx6ZuF6ZuZ6Zut6ZyB6ZyV6Zyp6Zy96Z2R6Z2l6Z256Z6N6Z6h6Z616Z+J6Z+d6Z+x6aCF6aCZ6aCt6aGB6aGV6aGp6aG96aKR6aKl" }, { - "string": "颹飍飡飵餉餝餱饅饙饭馁馕馩馽駑駥駹騍騡騵驉驝驱骅骙骭髁髕髩髽鬑鬥鬹魍魡魵鮉鮝鮱鯅鯙鯭鰁鰕鰩鰽鱑鱥鱹鲍鲡鲵鳉鳝鳱鴅鴙鴭鵁鵕鵩鵽鶑鶥鶹鷍鷡鷵鸉鸝鸱鹅鹙鹭麁麕麩麽黑黥黹鼍鼡鼵齉齝齱龅龙龭鿁鿕鿩鿽ꀑꀥꀹꁍꁡꁵ", - "encodedString": "6aK56aON6aOh6aO16aSJ6aSd6aSx6aWF6aWZ6aWt6aaB6aaV6aap6aa96aeR6ael6ae56aiN6aih6ai16amJ6amd6amx6aqF6aqZ6aqt6auB6auV6aup6au96ayR6ayl6ay56a2N6a2h6a216a6J6a6d6a6x6a+F6a+Z6a+t6bCB6bCV6bCp6bC96bGR6bGl6bG56bKN6bKh6bK16bOJ6bOd6bOx6bSF6bSZ6bSt6bWB6bWV6bWp6bW96baR6bal6ba56beN6beh6be16biJ6bid6bix6bmF6bmZ6bmt6bqB6bqV6bqp6bq96buR6bul6bu56byN6byh6by16b2J6b2d6b2x6b6F6b6Z6b6t6b+B6b+V6b+p6b+96oCR6oCl6oC56oGN6oGh6oG1" + "string" : "颹飍飡飵餉餝餱饅饙饭馁馕馩馽駑駥駹騍騡騵驉驝驱骅骙骭髁髕髩髽鬑鬥鬹魍魡魵鮉鮝鮱鯅鯙鯭鰁鰕鰩鰽鱑鱥鱹鲍鲡鲵鳉鳝鳱鴅鴙鴭鵁鵕鵩鵽鶑鶥鶹鷍鷡鷵鸉鸝鸱鹅鹙鹭麁麕麩麽黑黥黹鼍鼡鼵齉齝齱龅龙龭鿁鿕鿩鿽ꀑꀥꀹꁍꁡꁵ", + "encodedString" : "6aK56aON6aOh6aO16aSJ6aSd6aSx6aWF6aWZ6aWt6aaB6aaV6aap6aa96aeR6ael6ae56aiN6aih6ai16amJ6amd6amx6aqF6aqZ6aqt6auB6auV6aup6au96ayR6ayl6ay56a2N6a2h6a216a6J6a6d6a6x6a+F6a+Z6a+t6bCB6bCV6bCp6bC96bGR6bGl6bG56bKN6bKh6bK16bOJ6bOd6bOx6bSF6bSZ6bSt6bWB6bWV6bWp6bW96baR6bal6ba56beN6beh6be16biJ6bid6bix6bmF6bmZ6bmt6bqB6bqV6bqp6bq96buR6bul6bu56byN6byh6by16b2J6b2d6b2x6b6F6b6Z6b6t6b+B6b+V6b+p6b+96oCR6oCl6oC56oGN6oGh6oG1" }, { - "string": "ꂉꂝꂱꃅꃙꃭꄁꄕꄩꄽꅑꅥꅹꆍꆡꆵꇉꇝꇱꈅꈙꈭꉁꉕꉩꉽꊑꊥꊹꋍꋡꋵꌉꌝꌱꍅꍙꍭꎁꎕꎩꎽꏑꏥꏹꐍꐡꐵꑉꑝꑱꒅ꒜꒰꓄ꓡꓵꔉꔝꔱꕅꕙꕭꖁꖕꖩꖽꗑꗥꗹ꘍꘡ꙉꙝ꙱ꚅꚙꚭꛁꛕꛩ꜅ꜙꜭꝁꝕꝩꝽꞑꞥꞹꟓꠀꠔ꠨ꡅꡙꡭꢉꢝ", - "encodedString": "6oKJ6oKd6oKx6oOF6oOZ6oOt6oSB6oSV6oSp6oS96oWR6oWl6oW56oaN6oah6oa16oeJ6oed6oex6oiF6oiZ6oit6omB6omV6omp6om96oqR6oql6oq56ouN6ouh6ou16oyJ6oyd6oyx6o2F6o2Z6o2t6o6B6o6V6o6p6o696o+R6o+l6o+56pCN6pCh6pC16pGJ6pGd6pGx6pKF6pKc6pKw6pOE6pOh6pO16pSJ6pSd6pSx6pWF6pWZ6pWt6paB6paV6pap6pa96peR6pel6pe56piN6pih6pmJ6pmd6pmx6pqF6pqZ6pqt6puB6puV6pup6pyF6pyZ6pyt6p2B6p2V6p2p6p296p6R6p6l6p656p+T6qCA6qCU6qCo6qGF6qGZ6qGt6qKJ6qKd" + "string" : "ꂉꂝꂱꃅꃙꃭꄁꄕꄩꄽꅑꅥꅹꆍꆡꆵꇉꇝꇱꈅꈙꈭꉁꉕꉩꉽꊑꊥꊹꋍꋡꋵꌉꌝꌱꍅꍙꍭꎁꎕꎩꎽꏑꏥꏹꐍꐡꐵꑉꑝꑱꒅ꒜꒰꓄ꓡꓵꔉꔝꔱꕅꕙꕭꖁꖕꖩꖽꗑꗥꗹ꘍꘡ꙉꙝ꙱ꚅꚙꚭꛁꛕꛩ꜅ꜙꜭꝁꝕꝩꝽꞑꞥꞹꟓꠀꠔ꠨ꡅꡙꡭꢉꢝ", + "encodedString" : "6oKJ6oKd6oKx6oOF6oOZ6oOt6oSB6oSV6oSp6oS96oWR6oWl6oW56oaN6oah6oa16oeJ6oed6oex6oiF6oiZ6oit6omB6omV6omp6om96oqR6oql6oq56ouN6ouh6ou16oyJ6oyd6oyx6o2F6o2Z6o2t6o6B6o6V6o6p6o696o+R6o+l6o+56pCN6pCh6pC16pGJ6pGd6pGx6pKF6pKc6pKw6pOE6pOh6pO16pSJ6pSd6pSx6pWF6pWZ6pWt6paB6paV6pap6pa96peR6pel6pe56piN6pih6pmJ6pmd6pmx6pqF6pqZ6pqt6puB6puV6pup6pyF6pyZ6pyt6p2B6p2V6p2p6p296p6R6p6l6p656p+T6qCA6qCU6qCo6qGF6qGZ6qGt6qKJ6qKd" }, { - "string": "ꢱꣅ꣧ꣻꤏꤣꤷꥋꥪꦁꦕꦩꦽ꧒ꧪꧾꨓꨧꩄ꩜ꩰꪄꪘꪬꫀꫬꬌꬬꭁꭕꭩꮁꮕꮩꮽꯑꯥ각강갩갽걑걥걹겍겡겵곉곝곱괅괙괭굁굕굩굽궑궥궹귍귡귵급긝긱깅깙깭꺁꺕꺩꺽껑껥껹꼍꼡꼵꽉꽝꽱꾅꾙꾭꿁꿕꿩꿽뀑뀥뀹끍끡끵낉낝낱냅냙", - "encodedString": "6qKx6qOF6qOn6qO76qSP6qSj6qS36qWL6qWq6qaB6qaV6qap6qa96qeS6qeq6qe+6qiT6qin6qmE6qmc6qmw6qqE6qqY6qqs6quA6qus6qyM6qys6q2B6q2V6q2p6q6B6q6V6q6p6q696q+R6q+l6rCB6rCV6rCp6rC96rGR6rGl6rG56rKN6rKh6rK16rOJ6rOd6rOx6rSF6rSZ6rSt6rWB6rWV6rWp6rW96raR6ral6ra56reN6reh6re16riJ6rid6rix6rmF6rmZ6rmt6rqB6rqV6rqp6rq96ruR6rul6ru56ryN6ryh6ry16r2J6r2d6r2x6r6F6r6Z6r6t6r+B6r+V6r+p6r+964CR64Cl64C564GN64Gh64G164KJ64Kd64Kx64OF64OZ" + "string" : "ꢱꣅ꣧ꣻꤏꤣꤷꥋꥪꦁꦕꦩꦽ꧒ꧪꧾꨓꨧꩄ꩜ꩰꪄꪘꪬꫀꫬꬌꬬꭁꭕꭩꮁꮕꮩꮽꯑꯥ각강갩갽걑걥걹겍겡겵곉곝곱괅괙괭굁굕굩굽궑궥궹귍귡귵급긝긱깅깙깭꺁꺕꺩꺽껑껥껹꼍꼡꼵꽉꽝꽱꾅꾙꾭꿁꿕꿩꿽뀑뀥뀹끍끡끵낉낝낱냅냙", + "encodedString" : "6qKx6qOF6qOn6qO76qSP6qSj6qS36qWL6qWq6qaB6qaV6qap6qa96qeS6qeq6qe+6qiT6qin6qmE6qmc6qmw6qqE6qqY6qqs6quA6qus6qyM6qys6q2B6q2V6q2p6q6B6q6V6q6p6q696q+R6q+l6rCB6rCV6rCp6rC96rGR6rGl6rG56rKN6rKh6rK16rOJ6rOd6rOx6rSF6rSZ6rSt6rWB6rWV6rWp6rW96raR6ral6ra56reN6reh6re16riJ6rid6rix6rmF6rmZ6rmt6rqB6rqV6rqp6rq96ruR6rul6ru56ryN6ryh6ry16r2J6r2d6r2x6r6F6r6Z6r6t6r+B6r+V6r+p6r+964CR64Cl64C564GN64Gh64G164KJ64Kd64Kx64OF64OZ" }, { - "string": "냭넁넕넩넽녑녥녹농놡놵뇉뇝뇱눅눙눭뉁뉕뉩뉽늑능늹닍닡답댉댝댱덅덙덭뎁뎕뎩뎽돑돥돹됍됡됵둉둝둱뒅뒙뒭듁듕듩듽딑딥딹땍땡땵떉떝떱뗅뗙뗭똁똕똩똽뙑뙥뙹뚍뚡뚵뛉뛝뛱뜅뜙뜭띁띕띩락랑랥랹럍럡럵렉렝렱롅롙롭뢁뢕뢩", - "encodedString": "64Ot64SB64SV64Sp64S964WR64Wl64W564aN64ah64a164eJ64ed64ex64iF64iZ64it64mB64mV64mp64m964qR64ql64q564uN64uh64u164yJ64yd64yx642F642Z642t646B646V646p646964+R64+l64+565CN65Ch65C165GJ65Gd65Gx65KF65KZ65Kt65OB65OV65Op65O965SR65Sl65S565WN65Wh65W165aJ65ad65ax65eF65eZ65et65iB65iV65ip65i965mR65ml65m565qN65qh65q165uJ65ud65ux65yF65yZ65yt652B652V652p6529656R656l656565+N65+h65+166CJ66Cd66Cx66GF66GZ66Gt66KB66KV66Kp" + "string" : "냭넁넕넩넽녑녥녹농놡놵뇉뇝뇱눅눙눭뉁뉕뉩뉽늑능늹닍닡답댉댝댱덅덙덭뎁뎕뎩뎽돑돥돹됍됡됵둉둝둱뒅뒙뒭듁듕듩듽딑딥딹땍땡땵떉떝떱뗅뗙뗭똁똕똩똽뙑뙥뙹뚍뚡뚵뛉뛝뛱뜅뜙뜭띁띕띩락랑랥랹럍럡럵렉렝렱롅롙롭뢁뢕뢩", + "encodedString" : "64Ot64SB64SV64Sp64S964WR64Wl64W564aN64ah64a164eJ64ed64ex64iF64iZ64it64mB64mV64mp64m964qR64ql64q564uN64uh64u164yJ64yd64yx642F642Z642t646B646V646p646964+R64+l64+565CN65Ch65C165GJ65Gd65Gx65KF65KZ65Kt65OB65OV65Op65O965SR65Sl65S565WN65Wh65W165aJ65ad65ax65eF65eZ65et65iB65iV65ip65i965mR65ml65m565qN65qh65q165uJ65ud65ux65yF65yZ65yt652B652V652p6529656R656l656565+N65+h65+166CJ66Cd66Cx66GF66GZ66Gt66KB66KV66Kp" }, { - "string": "뢽룑룥룹뤍뤡뤵륉륝륱릅릙릭링맕맩맽먑먥먹멍멡멵몉몝몱뫅뫙뫭묁묕묩묽뭑뭥뭹뮍뮡뮵믉믝믱밅밙밭뱁뱕뱩뱽벑벥벹볍볡복봉봝봱뵅뵙뵭북붕붩붽뷑뷥뷹븍븡븵빉빝빱뺅뺙뺭뻁뻕뻩뻽뼑뼥뼹뽍뽡뽵뾉뾝뾱뿅뿙뿭쀁쀕쀩쀽쁑쁥쁹", - "encodedString": "66K966OR66Ol66O566SN66Sh66S166WJ66Wd66Wx66aF66aZ66at66eB66eV66ep66e966iR66il66i566mN66mh66m166qJ66qd66qx66uF66uZ66ut66yB66yV66yp66y9662R662l6625666N666h666166+J66+d66+x67CF67CZ67Ct67GB67GV67Gp67G967KR67Kl67K567ON67Oh67O167SJ67Sd67Sx67WF67WZ67Wt67aB67aV67ap67a967eR67el67e567iN67ih67i167mJ67md67mx67qF67qZ67qt67uB67uV67up67u967yR67yl67y5672N672h6721676J676d676x67+F67+Z67+t7ICB7ICV7ICp7IC97IGR7IGl7IG5" + "string" : "뢽룑룥룹뤍뤡뤵륉륝륱릅릙릭링맕맩맽먑먥먹멍멡멵몉몝몱뫅뫙뫭묁묕묩묽뭑뭥뭹뮍뮡뮵믉믝믱밅밙밭뱁뱕뱩뱽벑벥벹볍볡복봉봝봱뵅뵙뵭북붕붩붽뷑뷥뷹븍븡븵빉빝빱뺅뺙뺭뻁뻕뻩뻽뼑뼥뼹뽍뽡뽵뾉뾝뾱뿅뿙뿭쀁쀕쀩쀽쁑쁥쁹", + "encodedString" : "66K966OR66Ol66O566SN66Sh66S166WJ66Wd66Wx66aF66aZ66at66eB66eV66ep66e966iR66il66i566mN66mh66m166qJ66qd66qx66uF66uZ66ut66yB66yV66yp66y9662R662l6625666N666h666166+J66+d66+x67CF67CZ67Ct67GB67GV67Gp67G967KR67Kl67K567ON67Oh67O167SJ67Sd67Sx67WF67WZ67Wt67aB67aV67ap67a967eR67el67e567iN67ih67i167mJ67md67mx67qF67qZ67qt67uB67uV67up67u967yR67yl67y5672N672h6721676J676d676x67+F67+Z67+t7ICB7ICV7ICp7IC97IGR7IGl7IG5" }, { - "string": "삍삡삵색생샱섅섙섭셁셕셩셽솑솥솹쇍쇡쇵숉숝숱쉅쉙쉭슁슕슩슽싑싥싹쌍쌡쌵썉썝썱쎅쎙쎭쏁쏕쏩쏽쐑쐥쐹쑍쑡쑵쒉쒝쒱쓅쓙쓭씁씕씩씽앑앥앹얍얡억엉엝엱옅옙옭왁왕왩왽욑욥욹웍웡웵윉윝윱읅읙읭잁잕잩잽쟑쟥쟹젍젡젵졉", - "encodedString": "7IKN7IKh7IK17IOJ7IOd7IOx7ISF7ISZ7ISt7IWB7IWV7IWp7IW97IaR7Ial7Ia57IeN7Ieh7Ie17IiJ7Iid7Iix7ImF7ImZ7Imt7IqB7IqV7Iqp7Iq97IuR7Iul7Iu57IyN7Iyh7Iy17I2J7I2d7I2x7I6F7I6Z7I6t7I+B7I+V7I+p7I+97JCR7JCl7JC57JGN7JGh7JG17JKJ7JKd7JKx7JOF7JOZ7JOt7JSB7JSV7JSp7JS97JWR7JWl7JW57JaN7Jah7Ja17JeJ7Jed7Jex7JiF7JiZ7Jit7JmB7JmV7Jmp7Jm97JqR7Jql7Jq57JuN7Juh7Ju17JyJ7Jyd7Jyx7J2F7J2Z7J2t7J6B7J6V7J6p7J697J+R7J+l7J+57KCN7KCh7KC17KGJ" + "string" : "삍삡삵색생샱섅섙섭셁셕셩셽솑솥솹쇍쇡쇵숉숝숱쉅쉙쉭슁슕슩슽싑싥싹쌍쌡쌵썉썝썱쎅쎙쎭쏁쏕쏩쏽쐑쐥쐹쑍쑡쑵쒉쒝쒱쓅쓙쓭씁씕씩씽앑앥앹얍얡억엉엝엱옅옙옭왁왕왩왽욑욥욹웍웡웵윉윝윱읅읙읭잁잕잩잽쟑쟥쟹젍젡젵졉", + "encodedString" : "7IKN7IKh7IK17IOJ7IOd7IOx7ISF7ISZ7ISt7IWB7IWV7IWp7IW97IaR7Ial7Ia57IeN7Ieh7Ie17IiJ7Iid7Iix7ImF7ImZ7Imt7IqB7IqV7Iqp7Iq97IuR7Iul7Iu57IyN7Iyh7Iy17I2J7I2d7I2x7I6F7I6Z7I6t7I+B7I+V7I+p7I+97JCR7JCl7JC57JGN7JGh7JG17JKJ7JKd7JKx7JOF7JOZ7JOt7JSB7JSV7JSp7JS97JWR7JWl7JW57JaN7Jah7Ja17JeJ7Jed7Jex7JiF7JiZ7Jit7JmB7JmV7Jmp7Jm97JqR7Jql7Jq57JuN7Juh7Ju17JyJ7Jyd7Jyx7J2F7J2Z7J2t7J6B7J6V7J6p7J697J+R7J+l7J+57KCN7KCh7KC17KGJ" }, { - "string": "졝족종좙좭죁죕죩죽중줥줹쥍쥡쥵즉증즱짅짙짭쨁쨕쨩쨽쩑쩥쩹쪍쪡쪵쫉쫝쫱쬅쬙쬭쭁쭕쭩쭽쮑쮥쮹쯍쯡쯵찉찝찱책챙챭첁첕첩첽쳑쳥쳹촍촡촵쵉쵝쵱춅춙춭췁췕췩췽츑츥츹칍칡칵캉캝캱컅컙컭켁켕켩켽콑콥콹쾍쾡쾵쿉쿝쿱퀅퀙", - "encodedString": "7KGd7KGx7KKF7KKZ7KKt7KOB7KOV7KOp7KO97KSR7KSl7KS57KWN7KWh7KW17KaJ7Kad7Kax7KeF7KeZ7Ket7KiB7KiV7Kip7Ki97KmR7Kml7Km57KqN7Kqh7Kq17KuJ7Kud7Kux7KyF7KyZ7Kyt7K2B7K2V7K2p7K297K6R7K6l7K657K+N7K+h7K+17LCJ7LCd7LCx7LGF7LGZ7LGt7LKB7LKV7LKp7LK97LOR7LOl7LO57LSN7LSh7LS17LWJ7LWd7LWx7LaF7LaZ7Lat7LeB7LeV7Lep7Le97LiR7Lil7Li57LmN7Lmh7Lm17LqJ7Lqd7Lqx7LuF7LuZ7Lut7LyB7LyV7Lyp7Ly97L2R7L2l7L257L6N7L6h7L617L+J7L+d7L+x7YCF7YCZ" + "string" : "졝족종좙좭죁죕죩죽중줥줹쥍쥡쥵즉증즱짅짙짭쨁쨕쨩쨽쩑쩥쩹쪍쪡쪵쫉쫝쫱쬅쬙쬭쭁쭕쭩쭽쮑쮥쮹쯍쯡쯵찉찝찱책챙챭첁첕첩첽쳑쳥쳹촍촡촵쵉쵝쵱춅춙춭췁췕췩췽츑츥츹칍칡칵캉캝캱컅컙컭켁켕켩켽콑콥콹쾍쾡쾵쿉쿝쿱퀅퀙", + "encodedString" : "7KGd7KGx7KKF7KKZ7KKt7KOB7KOV7KOp7KO97KSR7KSl7KS57KWN7KWh7KW17KaJ7Kad7Kax7KeF7KeZ7Ket7KiB7KiV7Kip7Ki97KmR7Kml7Km57KqN7Kqh7Kq17KuJ7Kud7Kux7KyF7KyZ7Kyt7K2B7K2V7K2p7K297K6R7K6l7K657K+N7K+h7K+17LCJ7LCd7LCx7LGF7LGZ7LGt7LKB7LKV7LKp7LK97LOR7LOl7LO57LSN7LSh7LS17LWJ7LWd7LWx7LaF7LaZ7Lat7LeB7LeV7Lep7Le97LiR7Lil7Li57LmN7Lmh7Lm17LqJ7Lqd7Lqx7LuF7LuZ7Lut7LyB7LyV7Lyp7Ly97L2R7L2l7L257L6N7L6h7L617L+J7L+d7L+x7YCF7YCZ" }, { - "string": "퀭큁큕큩큽킑킥킹탍탡탵턉턝턱텅텙텭톁톕톩톽퇑퇥퇹툍툡툵퉉퉝퉱튅튙튭틁틕틩틽팑팥팹퍍퍡퍵펉펝펱폅폙폭퐁퐕퐩퐽푑푥푹풍풡풵퓉퓝퓱픅픙픭핁핕합핽햑향햹헍헡헵혉혝혱홅홙홭횁횕횩횽훑훥훹휍휡휵흉흝흱힅힙ힹퟑퟥퟹ", - "encodedString": "7YCt7YGB7YGV7YGp7YG97YKR7YKl7YK57YON7YOh7YO17YSJ7YSd7YSx7YWF7YWZ7YWt7YaB7YaV7Yap7Ya97YeR7Yel7Ye57YiN7Yih7Yi17YmJ7Ymd7Ymx7YqF7YqZ7Yqt7YuB7YuV7Yup7Yu97YyR7Yyl7Yy57Y2N7Y2h7Y217Y6J7Y6d7Y6x7Y+F7Y+Z7Y+t7ZCB7ZCV7ZCp7ZC97ZGR7ZGl7ZG57ZKN7ZKh7ZK17ZOJ7ZOd7ZOx7ZSF7ZSZ7ZSt7ZWB7ZWV7ZWp7ZW97ZaR7Zal7Za57ZeN7Zeh7Ze17ZiJ7Zid7Zix7ZmF7ZmZ7Zmt7ZqB7ZqV7Zqp7Zq97ZuR7Zul7Zu57ZyN7Zyh7Zy17Z2J7Z2d7Z2x7Z6F7Z6Z7Z657Z+R7Z+l7Z+5" + "string" : "퀭큁큕큩큽킑킥킹탍탡탵턉턝턱텅텙텭톁톕톩톽퇑퇥퇹툍툡툵퉉퉝퉱튅튙튭틁틕틩틽팑팥팹퍍퍡퍵펉펝펱폅폙폭퐁퐕퐩퐽푑푥푹풍풡풵퓉퓝퓱픅픙픭핁핕합핽햑향햹헍헡헵혉혝혱홅홙홭횁횕횩횽훑훥훹휍휡휵흉흝흱힅힙ힹퟑퟥퟹ", + "encodedString" : "7YCt7YGB7YGV7YGp7YG97YKR7YKl7YK57YON7YOh7YO17YSJ7YSd7YSx7YWF7YWZ7YWt7YaB7YaV7Yap7Ya97YeR7Yel7Ye57YiN7Yih7Yi17YmJ7Ymd7Ymx7YqF7YqZ7Yqt7YuB7YuV7Yup7Yu97YyR7Yyl7Yy57Y2N7Y2h7Y217Y6J7Y6d7Y6x7Y+F7Y+Z7Y+t7ZCB7ZCV7ZCp7ZC97ZGR7ZGl7ZG57ZKN7ZKh7ZK17ZOJ7ZOd7ZOx7ZSF7ZSZ7ZSt7ZWB7ZWV7ZWp7ZW97ZaR7Zal7Za57ZeN7Zeh7Ze17ZiJ7Zid7Zix7ZmF7ZmZ7Zmt7ZqB7ZqV7Zqp7Zq97ZuR7Zul7Zu57ZyN7Zyh7Zy17Z2J7Z2d7Z2x7Z6F7Z6Z7Z657Z+R7Z+l7Z+5" }, { - "string": "", - "encodedString": "7oCR7oCl7oC57oGN7oGh7oG17oKJ7oKd7oKx7oOF7oOZ7oOt7oSB7oSV7oSp7oS97oWR7oWl7oW57oaN7oah7oa17oeJ7oed7oex7oiF7oiZ7oit7omB7omV7omp7om97oqR7oql7oq57ouN7ouh7ou17oyJ7oyd7oyx7o2F7o2Z7o2t7o6B7o6V7o6p7o697o+R7o+l7o+57pCN7pCh7pC17pGJ7pGd7pGx7pKF7pKZ7pKt7pOB7pOV7pOp7pO97pSR7pSl7pS57pWN7pWh7pW17paJ7pad7pax7peF7peZ7pet7piB7piV7pip7pi97pmR7pml7pm57pqN7pqh7pq17puJ7pud7pux7pyF7pyZ7pyt7p2B7p2V7p2p7p297p6R7p6l7p657p+N" + "string" : "", + "encodedString" : "7oCR7oCl7oC57oGN7oGh7oG17oKJ7oKd7oKx7oOF7oOZ7oOt7oSB7oSV7oSp7oS97oWR7oWl7oW57oaN7oah7oa17oeJ7oed7oex7oiF7oiZ7oit7omB7omV7omp7om97oqR7oql7oq57ouN7ouh7ou17oyJ7oyd7oyx7o2F7o2Z7o2t7o6B7o6V7o6p7o697o+R7o+l7o+57pCN7pCh7pC17pGJ7pGd7pGx7pKF7pKZ7pKt7pOB7pOV7pOp7pO97pSR7pSl7pS57pWN7pWh7pW17paJ7pad7pax7peF7peZ7pet7piB7piV7pip7pi97pmR7pml7pm57pqN7pqh7pq17puJ7pud7pux7pyF7pyZ7pyt7p2B7p2V7p2p7p297p6R7p6l7p657p+N" }, { - "string": "", - "encodedString": "7p+h7p+17qCJ7qCd7qCx7qGF7qGZ7qGt7qKB7qKV7qKp7qK97qOR7qOl7qO57qSN7qSh7qS17qWJ7qWd7qWx7qaF7qaZ7qat7qeB7qeV7qep7qe97qiR7qil7qi57qmN7qmh7qm17qqJ7qqd7qqx7quF7quZ7qut7qyB7qyV7qyp7qy97q2R7q2l7q257q6N7q6h7q617q+J7q+d7q+x7rCF7rCZ7rCt7rGB7rGV7rGp7rG97rKR7rKl7rK57rON7rOh7rO17rSJ7rSd7rSx7rWF7rWZ7rWt7raB7raV7rap7ra97reR7rel7re57riN7rih7ri17rmJ7rmd7rmx7rqF7rqZ7rqt7ruB7ruV7rup7ru97ryR7ryl7ry57r2N7r2h7r217r6J7r6d" + "string" : "", + "encodedString" : "7p+h7p+17qCJ7qCd7qCx7qGF7qGZ7qGt7qKB7qKV7qKp7qK97qOR7qOl7qO57qSN7qSh7qS17qWJ7qWd7qWx7qaF7qaZ7qat7qeB7qeV7qep7qe97qiR7qil7qi57qmN7qmh7qm17qqJ7qqd7qqx7quF7quZ7qut7qyB7qyV7qyp7qy97q2R7q2l7q257q6N7q6h7q617q+J7q+d7q+x7rCF7rCZ7rCt7rGB7rGV7rGp7rG97rKR7rKl7rK57rON7rOh7rO17rSJ7rSd7rSx7rWF7rWZ7rWt7raB7raV7rap7ra97reR7rel7re57riN7rih7ri17rmJ7rmd7rmx7rqF7rqZ7rqt7ruB7ruV7rup7ru97ryR7ryl7ry57r2N7r2h7r217r6J7r6d" }, { - "string": "", - "encodedString": "7r6x7r+F7r+Z7r+t74CB74CV74Cp74C974GR74Gl74G574KN74Kh74K174OJ74Od74Ox74SF74SZ74St74WB74WV74Wp74W974aR74al74a574eN74eh74e174iJ74id74ix74mF74mZ74mt74qB74qV74qp74q974uR74ul74u574yN74yh74y1742J742d742x746F746Z746t74+B74+V74+p74+975CR75Cl75C575GN75Gh75G175KJ75Kd75Kx75OF75OZ75Ot75SB75SV75Sp75S975WR75Wl75W575aN75ah75a175eJ75ed75ex75iF75iZ75it75mB75mV75mp75m975qR75ql75q575uN75uh75u175yJ75yd75yx752F752Z752t" + "string" : "", + "encodedString" : "7r6x7r+F7r+Z7r+t74CB74CV74Cp74C974GR74Gl74G574KN74Kh74K174OJ74Od74Ox74SF74SZ74St74WB74WV74Wp74W974aR74al74a574eN74eh74e174iJ74id74ix74mF74mZ74mt74qB74qV74qp74q974uR74ul74u574yN74yh74y1742J742d742x746F746Z746t74+B74+V74+p74+975CR75Cl75C575GN75Gh75G175KJ75Kd75Kx75OF75OZ75Ot75SB75SV75Sp75S975WR75Wl75W575aN75ah75a175eJ75ed75ex75iF75iZ75it75mB75mV75mp75m975qR75ql75q575uN75uh75u175yJ75yd75yx752F752Z752t" }, { - "string": "螺拉魯淚率掠黎劣鈴暈慄吝度凞﨩悔祝贈嗢摒画覆頋ſtשׁסּﭗﭫﭿﮓﮧ﮻ﯟﯳﰇﰛﰯﱃﱗﱫﱿﲓﲧﲻﳏﳣﳷﴋﴟﴳ﵇ﵛﵯﶃﶙﶭﷁ﷼︐︪︾﹒﹨ﺁﺕﺩﺽﻑﻥﻹ0DXl⦆エネワᄚᅦ", - "encodedString": "756B756V756p756975+R75+l75+576CN76Ch76C176GJ76Gd76Gx76KF76KZ76Kt76OB76OV76Op76O976SR76Sl76S576WN76Wh76W176aJ76ad76ax76eF76eZ76et76iB76iV76ip76i976mR76ml76m776qP76qj76q376uL76yF76yq762B762X762r762/766T766n766776+f76+z77CH77Cb77Cv77GD77GX77Gr77G/77KT77Kn77K777OP77Oj77O377SL77Sf77Sz77WH77Wb77Wv77aD77aZ77at77eB77e877iQ77iq77i+77mS77mo77qB77qV77qp77q977uR77ul77u577yQ77yk77y4772M772g7720776I776c776w77+H" + "string" : "螺拉魯淚率掠黎劣鈴暈慄吝度凞﨩悔祝贈嗢摒画覆頋ſtשׁסּﭗﭫﭿﮓﮧ﮻ﯟﯳﰇﰛﰯﱃﱗﱫﱿﲓﲧﲻﳏﳣﳷﴋﴟﴳ﵇ﵛﵯﶃﶙﶭﷁ﷼︐︪︾﹒﹨ﺁﺕﺩﺽﻑﻥﻹ0DXl⦆エネワᄚᅦ", + "encodedString" : "756B756V756p756975+R75+l75+576CN76Ch76C176GJ76Gd76Gx76KF76KZ76Kt76OB76OV76Op76O976SR76Sl76S576WN76Wh76W176aJ76ad76ax76eF76eZ76et76iB76iV76ip76i976mR76ml76m776qP76qj76q376uL76yF76yq762B762X762r762/766T766n766776+f76+z77CH77Cb77Cv77GD77GX77Gr77G/77KT77Kn77K777OP77Oj77O377SL77Sf77Sz77WH77Wb77Wv77aD77aZ77at77eB77e877iQ77iq77i+77mS77mo77qB77qV77qp77q977uR77ul77u577yQ77yk77y4772M772g7720776I776c776w77+H" }, { - "string": "¦𐀅𐀚𐀯𐁅𐁛𐂑𐂥𐂹𐃍𐃡𐃵𐄒𐄦𐄽𐅑𐅥𐅹𐆍𐇔𐇨𐇼𐊒𐊩𐊽𐋠𐋴𐌌𐌠𐌽𐍖𐍪𐎃𐎗𐎬𐏀𐐂𐐖𐐪𐐾𐑒𐑦𐑺𐒎𐒤𐒾𐓒𐓪𐔂𐔖𐔲𐕆𐕚𐕹𐖏𐖦𐖼𐘓𐘧𐘻𐙏𐙣𐙷𐚋𐚟𐚳𐛇𐛛𐛯𐜃𐜗𐜫𐝈𐝦𐞓𐞧𐠁𐠘𐠬𐡆𐡛𐡯𐢃𐢗𐣣𐣽𐤑𐤨𐦁𐦕𐦩𐧁𐧗𐧫𐧿𐨛𐨯𐩐𐩫𐩿", - "encodedString": "77+k8JCAhfCQgJrwkICv8JCBhfCQgZvwkIKR8JCCpfCQgrnwkION8JCDofCQg7XwkISS8JCEpvCQhL3wkIWR8JCFpfCQhbnwkIaN8JCHlPCQh6jwkIe88JCKkvCQiqnwkIq98JCLoPCQi7TwkIyM8JCMoPCQjL3wkI2W8JCNqvCQjoPwkI6X8JCOrPCQj4DwkJCC8JCQlvCQkKrwkJC+8JCRkvCQkabwkJG68JCSjvCQkqTwkJK+8JCTkvCQk6rwkJSC8JCUlvCQlLLwkJWG8JCVmvCQlbnwkJaP8JCWpvCQlrzwkJiT8JCYp/CQmLvwkJmP8JCZo/CQmbfwkJqL8JCan/CQmrPwkJuH8JCbm/CQm6/wkJyD8JCcl/CQnKvwkJ2I8JCdpvCQnpPwkJ6n8JCggfCQoJjwkKCs8JChhvCQoZvwkKGv8JCig/CQopfwkKOj8JCjvfCQpJHwkKSo8JCmgfCQppXwkKap8JCngfCQp5fwkKer8JCnv/CQqJvwkKiv8JCpkPCQqavwkKm/" + "string" : "¦𐀅𐀚𐀯𐁅𐁛𐂑𐂥𐂹𐃍𐃡𐃵𐄒𐄦𐄽𐅑𐅥𐅹𐆍𐇔𐇨𐇼𐊒𐊩𐊽𐋠𐋴𐌌𐌠𐌽𐍖𐍪𐎃𐎗𐎬𐏀𐐂𐐖𐐪𐐾𐑒𐑦𐑺𐒎𐒤𐒾𐓒𐓪𐔂𐔖𐔲𐕆𐕚𐕹𐖏𐖦𐖼𐘓𐘧𐘻𐙏𐙣𐙷𐚋𐚟𐚳𐛇𐛛𐛯𐜃𐜗𐜫𐝈𐝦𐞓𐞧𐠁𐠘𐠬𐡆𐡛𐡯𐢃𐢗𐣣𐣽𐤑𐤨𐦁𐦕𐦩𐧁𐧗𐧫𐧿𐨛𐨯𐩐𐩫𐩿", + "encodedString" : "77+k8JCAhfCQgJrwkICv8JCBhfCQgZvwkIKR8JCCpfCQgrnwkION8JCDofCQg7XwkISS8JCEpvCQhL3wkIWR8JCFpfCQhbnwkIaN8JCHlPCQh6jwkIe88JCKkvCQiqnwkIq98JCLoPCQi7TwkIyM8JCMoPCQjL3wkI2W8JCNqvCQjoPwkI6X8JCOrPCQj4DwkJCC8JCQlvCQkKrwkJC+8JCRkvCQkabwkJG68JCSjvCQkqTwkJK+8JCTkvCQk6rwkJSC8JCUlvCQlLLwkJWG8JCVmvCQlbnwkJaP8JCWpvCQlrzwkJiT8JCYp/CQmLvwkJmP8JCZo/CQmbfwkJqL8JCan/CQmrPwkJuH8JCbm/CQm6/wkJyD8JCcl/CQnKvwkJ2I8JCdpvCQnpPwkJ6n8JCggfCQoJjwkKCs8JChhvCQoZvwkKGv8JCig/CQopfwkKOj8JCjvfCQpJHwkKSo8JCmgfCQppXwkKap8JCngfCQp5fwkKer8JCnv/CQqJvwkKiv8JCpkPCQqavwkKm/" }, { - "string": "𐪓𐫇𐫛𐫳𐬐𐬤𐬻𐭏𐭥𐭾𐮙𐰉𐰝𐰱𐱅𐲐𐲤𐳅𐳙𐳭𐴈𐴜𐴸𐹲𐺇𐺛𐻽𐼑𐼥𐽁𐽕𐽿𐾹𐿡𐿵𑀒𑀦𑀺𑁒𑁦𑂃𑂗𑂫𑂿𑃟𑄀𑄔𑄨𑄽𑅙𑅭𑆊𑆞𑆲𑇆𑇚𑇯𑈎𑈣𑈷𑊋𑊡𑊻𑋏𑋣𑌂𑌛𑌰𑍋𑍱𑐐𑐤𑐸𑑌𑑡𑒓𑒧𑒻𑓗𑖑𑖥𑖻𑗏𑘅𑘙𑘭𑙁𑙦𑚍𑚡𑚵𑜅𑜙𑜳𑠀𑠔𑠨𑢠𑢴𑣈", - "encodedString": "8JCqk/CQq4fwkKub8JCrs/CQrJDwkKyk8JCsu/CQrY/wkK2l8JCtvvCQrpnwkLCJ8JCwnfCQsLHwkLGF8JCykPCQsqTwkLOF8JCzmfCQs63wkLSI8JC0nPCQtLjwkLmy8JC6h/CQupvwkLu98JC8kfCQvKXwkL2B8JC9lfCQvb/wkL658JC/ofCQv7XwkYCS8JGApvCRgLrwkYGS8JGBpvCRgoPwkYKX8JGCq/CRgr/wkYOf8JGEgPCRhJTwkYSo8JGEvfCRhZnwkYWt8JGGivCRhp7wkYay8JGHhvCRh5rwkYev8JGIjvCRiKPwkYi38JGKi/CRiqHwkYq78JGLj/CRi6PwkYyC8JGMm/CRjLDwkY2L8JGNsfCRkJDwkZCk8JGQuPCRkYzwkZGh8JGSk/CRkqfwkZK78JGTl/CRlpHwkZal8JGWu/CRl4/wkZiF8JGYmfCRmK3wkZmB8JGZpvCRmo3wkZqh8JGatfCRnIXwkZyZ8JGcs/CRoIDwkaCU8JGgqPCRoqDwkaK08JGjiA==" + "string" : "𐪓𐫇𐫛𐫳𐬐𐬤𐬻𐭏𐭥𐭾𐮙𐰉𐰝𐰱𐱅𐲐𐲤𐳅𐳙𐳭𐴈𐴜𐴸𐹲𐺇𐺛𐻽𐼑𐼥𐽁𐽕𐽿𐾹𐿡𐿵𑀒𑀦𑀺𑁒𑁦𑂃𑂗𑂫𑂿𑃟𑄀𑄔𑄨𑄽𑅙𑅭𑆊𑆞𑆲𑇆𑇚𑇯𑈎𑈣𑈷𑊋𑊡𑊻𑋏𑋣𑌂𑌛𑌰𑍋𑍱𑐐𑐤𑐸𑑌𑑡𑒓𑒧𑒻𑓗𑖑𑖥𑖻𑗏𑘅𑘙𑘭𑙁𑙦𑚍𑚡𑚵𑜅𑜙𑜳𑠀𑠔𑠨𑢠𑢴𑣈", + "encodedString" : "8JCqk/CQq4fwkKub8JCrs/CQrJDwkKyk8JCsu/CQrY/wkK2l8JCtvvCQrpnwkLCJ8JCwnfCQsLHwkLGF8JCykPCQsqTwkLOF8JCzmfCQs63wkLSI8JC0nPCQtLjwkLmy8JC6h/CQupvwkLu98JC8kfCQvKXwkL2B8JC9lfCQvb/wkL658JC/ofCQv7XwkYCS8JGApvCRgLrwkYGS8JGBpvCRgoPwkYKX8JGCq/CRgr/wkYOf8JGEgPCRhJTwkYSo8JGEvfCRhZnwkYWt8JGGivCRhp7wkYay8JGHhvCRh5rwkYev8JGIjvCRiKPwkYi38JGKi/CRiqHwkYq78JGLj/CRi6PwkYyC8JGMm/CRjLDwkY2L8JGNsfCRkJDwkZCk8JGQuPCRkYzwkZGh8JGSk/CRkqfwkZK78JGTl/CRlpHwkZal8JGWu/CRl4/wkZiF8JGYmfCRmK3wkZmB8JGZpvCRmo3wkZqh8JGatfCRnIXwkZyZ8JGcs/CRoIDwkaCU8JGgqPCRoqDwkaK08JGjiA==" }, { - "string": "𑣜𑣰𑤕𑤪𑥁𑦤𑦺𑧎𑧤𑨓𑨧𑨻𑩗𑩫𑩿𑪓𑪴𑫈𑫜𑫰𑰁𑰖𑰪𑰿𑱝𑱴𑲈𑲞𑲳𑴒𑴦𑴿𑵡𑵷𑶋𑶨𑻲𑼍𑼢𑼶𑽍𑿆𑿚𑿮𒀏𒀣𒀷𒁋𒁟𒁳𒂇𒂛𒂯𒃃𒃗𒃫𒃿𒄓𒄧𒄻𒅏𒅣𒅷𒆋𒆟𒆳𒇇𒇛𒇯𒈃𒈗𒈫𒈿𒉓𒉧𒉻𒊏𒊣𒊷𒋋𒋟𒋳𒌇𒌛𒌯𒍃𒍗𒍫𒍿𒎓𒐍𒐡𒐵𒑉𒑝𒑲𒒑𒒥𒒹𒓍", - "encodedString": "8JGjnPCRo7DwkaSV8JGkqvCRpYHwkaak8JGmuvCRp47wkaek8JGok/CRqKfwkai78JGpl/CRqavwkam/8JGqk/CRqrTwkauI8JGrnPCRq7DwkbCB8JGwlvCRsKrwkbC/8JGxnfCRsbTwkbKI8JGynvCRsrPwkbSS8JG0pvCRtL/wkbWh8JG1t/CRtovwkbao8JG7svCRvI3wkbyi8JG8tvCRvY3wkb+G8JG/mvCRv67wkoCP8JKAo/CSgLfwkoGL8JKBn/CSgbPwkoKH8JKCm/CSgq/wkoOD8JKDl/CSg6vwkoO/8JKEk/CShKfwkoS78JKFj/CShaPwkoW38JKGi/CShp/wkoaz8JKHh/CSh5vwkoev8JKIg/CSiJfwkoir8JKIv/CSiZPwkomn8JKJu/CSio/wkoqj8JKKt/CSi4vwkouf8JKLs/CSjIfwkoyb8JKMr/CSjYPwko2X8JKNq/CSjb/wko6T8JKQjfCSkKHwkpC18JKRifCSkZ3wkpGy8JKSkfCSkqXwkpK58JKTjQ==" + "string" : "𑣜𑣰𑤕𑤪𑥁𑦤𑦺𑧎𑧤𑨓𑨧𑨻𑩗𑩫𑩿𑪓𑪴𑫈𑫜𑫰𑰁𑰖𑰪𑰿𑱝𑱴𑲈𑲞𑲳𑴒𑴦𑴿𑵡𑵷𑶋𑶨𑻲𑼍𑼢𑼶𑽍𑿆𑿚𑿮𒀏𒀣𒀷𒁋𒁟𒁳𒂇𒂛𒂯𒃃𒃗𒃫𒃿𒄓𒄧𒄻𒅏𒅣𒅷𒆋𒆟𒆳𒇇𒇛𒇯𒈃𒈗𒈫𒈿𒉓𒉧𒉻𒊏𒊣𒊷𒋋𒋟𒋳𒌇𒌛𒌯𒍃𒍗𒍫𒍿𒎓𒐍𒐡𒐵𒑉𒑝𒑲𒒑𒒥𒒹𒓍", + "encodedString" : "8JGjnPCRo7DwkaSV8JGkqvCRpYHwkaak8JGmuvCRp47wkaek8JGok/CRqKfwkai78JGpl/CRqavwkam/8JGqk/CRqrTwkauI8JGrnPCRq7DwkbCB8JGwlvCRsKrwkbC/8JGxnfCRsbTwkbKI8JGynvCRsrPwkbSS8JG0pvCRtL/wkbWh8JG1t/CRtovwkbao8JG7svCRvI3wkbyi8JG8tvCRvY3wkb+G8JG/mvCRv67wkoCP8JKAo/CSgLfwkoGL8JKBn/CSgbPwkoKH8JKCm/CSgq/wkoOD8JKDl/CSg6vwkoO/8JKEk/CShKfwkoS78JKFj/CShaPwkoW38JKGi/CShp/wkoaz8JKHh/CSh5vwkoev8JKIg/CSiJfwkoir8JKIv/CSiZPwkomn8JKJu/CSio/wkoqj8JKKt/CSi4vwkouf8JKLs/CSjIfwkoyb8JKMr/CSjYPwko2X8JKNq/CSjb/wko6T8JKQjfCSkKHwkpC18JKRifCSkZ3wkpGy8JKSkfCSkqXwkpK58JKTjQ==" }, { - "string": "𒓡𒓵𒔉𒔝𒔱𒾑𒾥𒾹𒿍𒿡𓀂𓀖𓀪𓀾𓁒𓁦𓁺𓂎𓂢𓂶𓃊𓃞𓃲𓄆𓄚𓄮𓅂𓅖𓅪𓅾𓆒𓆦𓆺𓇎𓇢𓇶𓈊𓈞𓈲𓉆𓉚𓉮𓊂𓊖𓊪𓊾𓋒𓋦𓋺𓌎𓌢𓌶𓍊𓍞𓍲𓎆𓎚𓎮𓏂𓏖𓏪𓏾𓐒𓐦𓐺𓑎𔐌𔐠𔐴𔑈𔑜𔑰𔒄𔒘𔒬𔓀𔓔𔓨𔓼𔔐𔔤𔔸𔕌𔕠𔕴𔖈𔖜𔖰𔗄𔗘𔗬𔘀𔘔𔘨𔘼𖠉𖠝𖠱𖡅𖡙", - "encodedString": "8JKTofCSk7XwkpSJ8JKUnfCSlLHwkr6R8JK+pfCSvrnwkr+N8JK/ofCTgILwk4CW8JOAqvCTgL7wk4GS8JOBpvCTgbrwk4KO8JOCovCTgrbwk4OK8JODnvCTg7Lwk4SG8JOEmvCThK7wk4WC8JOFlvCTharwk4W+8JOGkvCThqbwk4a68JOHjvCTh6Lwk4e28JOIivCTiJ7wk4iy8JOJhvCTiZrwk4mu8JOKgvCTipbwk4qq8JOKvvCTi5Lwk4um8JOLuvCTjI7wk4yi8JOMtvCTjYrwk42e8JONsvCTjobwk46a8JOOrvCTj4Lwk4+W8JOPqvCTj77wk5CS8JOQpvCTkLrwk5GO8JSQjPCUkKDwlJC08JSRiPCUkZzwlJGw8JSShPCUkpjwlJKs8JSTgPCUk5TwlJOo8JSTvPCUlJDwlJSk8JSUuPCUlYzwlJWg8JSVtPCUlojwlJac8JSWsPCUl4TwlJeY8JSXrPCUmIDwlJiU8JSYqPCUmLzwlqCJ8JagnfCWoLHwlqGF8JahmQ==" + "string" : "𒓡𒓵𒔉𒔝𒔱𒾑𒾥𒾹𒿍𒿡𓀂𓀖𓀪𓀾𓁒𓁦𓁺𓂎𓂢𓂶𓃊𓃞𓃲𓄆𓄚𓄮𓅂𓅖𓅪𓅾𓆒𓆦𓆺𓇎𓇢𓇶𓈊𓈞𓈲𓉆𓉚𓉮𓊂𓊖𓊪𓊾𓋒𓋦𓋺𓌎𓌢𓌶𓍊𓍞𓍲𓎆𓎚𓎮𓏂𓏖𓏪𓏾𓐒𓐦𓐺𓑎𔐌𔐠𔐴𔑈𔑜𔑰𔒄𔒘𔒬𔓀𔓔𔓨𔓼𔔐𔔤𔔸𔕌𔕠𔕴𔖈𔖜𔖰𔗄𔗘𔗬𔘀𔘔𔘨𔘼𖠉𖠝𖠱𖡅𖡙", + "encodedString" : "8JKTofCSk7XwkpSJ8JKUnfCSlLHwkr6R8JK+pfCSvrnwkr+N8JK/ofCTgILwk4CW8JOAqvCTgL7wk4GS8JOBpvCTgbrwk4KO8JOCovCTgrbwk4OK8JODnvCTg7Lwk4SG8JOEmvCThK7wk4WC8JOFlvCTharwk4W+8JOGkvCThqbwk4a68JOHjvCTh6Lwk4e28JOIivCTiJ7wk4iy8JOJhvCTiZrwk4mu8JOKgvCTipbwk4qq8JOKvvCTi5Lwk4um8JOLuvCTjI7wk4yi8JOMtvCTjYrwk42e8JONsvCTjobwk46a8JOOrvCTj4Lwk4+W8JOPqvCTj77wk5CS8JOQpvCTkLrwk5GO8JSQjPCUkKDwlJC08JSRiPCUkZzwlJGw8JSShPCUkpjwlJKs8JSTgPCUk5TwlJOo8JSTvPCUlJDwlJSk8JSUuPCUlYzwlJWg8JSVtPCUlojwlJac8JSWsPCUl4TwlJeY8JSXrPCUmIDwlJiU8JSYqPCUmLzwlqCJ8JagnfCWoLHwlqGF8JahmQ==" }, { - "string": "𖡭𖢁𖢕𖢩𖢽𖣑𖣥𖣹𖤍𖤡𖤵𖥉𖥝𖥱𖦅𖦙𖦭𖧁𖧕𖧩𖧽𖨑𖨥𖩀𖩔𖩩𖪁𖪕𖪩𖪽𖫘𖫬𖬌𖬠𖬴𖭒𖭨𖮁𖹅𖹙𖹭𖺁𖺕𖼎𖼢𖼶𖽊𖽢𖽶𖾑𖿰𗀒𗀦𗀺𗁎𗁢𗁶𗂊𗂞𗂲𗃆𗃚𗃮𗄂𗄖𗄪𗄾𗅒𗅦𗅺𗆎𗆢𗆶𗇊𗇞𗇲𗈆𗈚𗈮𗉂𗉖𗉪𗉾𗊒𗊦𗊺𗋎𗋢𗋶𗌊𗌞𗌲𗍆𗍚𗍮𗎂𗎖𗎪𗎾𗏒", - "encodedString": "8JahrfCWooHwlqKV8JaiqfCWor3wlqOR8JajpfCWo7nwlqSN8JakofCWpLXwlqWJ8JalnfCWpbHwlqaF8JammfCWpq3wlqeB8JanlfCWp6nwlqe98JaokfCWqKXwlqmA8JaplPCWqanwlqqB8JaqlfCWqqnwlqq98JarmPCWq6zwlqyM8JasoPCWrLTwlq2S8JatqPCWroHwlrmF8Ja5mfCWua3wlrqB8Ja6lfCWvI7wlryi8Ja8tvCWvYrwlr2i8Ja9tvCWvpHwlr+w8JeAkvCXgKbwl4C68JeBjvCXgaLwl4G28JeCivCXgp7wl4Ky8JeDhvCXg5rwl4Ou8JeEgvCXhJbwl4Sq8JeEvvCXhZLwl4Wm8JeFuvCXho7wl4ai8JeGtvCXh4rwl4ee8JeHsvCXiIbwl4ia8JeIrvCXiYLwl4mW8JeJqvCXib7wl4qS8JeKpvCXirrwl4uO8JeLovCXi7bwl4yK8JeMnvCXjLLwl42G8JeNmvCXja7wl46C8JeOlvCXjqrwl46+8JePkg==" + "string" : "𖡭𖢁𖢕𖢩𖢽𖣑𖣥𖣹𖤍𖤡𖤵𖥉𖥝𖥱𖦅𖦙𖦭𖧁𖧕𖧩𖧽𖨑𖨥𖩀𖩔𖩩𖪁𖪕𖪩𖪽𖫘𖫬𖬌𖬠𖬴𖭒𖭨𖮁𖹅𖹙𖹭𖺁𖺕𖼎𖼢𖼶𖽊𖽢𖽶𖾑𖿰𗀒𗀦𗀺𗁎𗁢𗁶𗂊𗂞𗂲𗃆𗃚𗃮𗄂𗄖𗄪𗄾𗅒𗅦𗅺𗆎𗆢𗆶𗇊𗇞𗇲𗈆𗈚𗈮𗉂𗉖𗉪𗉾𗊒𗊦𗊺𗋎𗋢𗋶𗌊𗌞𗌲𗍆𗍚𗍮𗎂𗎖𗎪𗎾𗏒", + "encodedString" : "8JahrfCWooHwlqKV8JaiqfCWor3wlqOR8JajpfCWo7nwlqSN8JakofCWpLXwlqWJ8JalnfCWpbHwlqaF8JammfCWpq3wlqeB8JanlfCWp6nwlqe98JaokfCWqKXwlqmA8JaplPCWqanwlqqB8JaqlfCWqqnwlqq98JarmPCWq6zwlqyM8JasoPCWrLTwlq2S8JatqPCWroHwlrmF8Ja5mfCWua3wlrqB8Ja6lfCWvI7wlryi8Ja8tvCWvYrwlr2i8Ja9tvCWvpHwlr+w8JeAkvCXgKbwl4C68JeBjvCXgaLwl4G28JeCivCXgp7wl4Ky8JeDhvCXg5rwl4Ou8JeEgvCXhJbwl4Sq8JeEvvCXhZLwl4Wm8JeFuvCXho7wl4ai8JeGtvCXh4rwl4ee8JeHsvCXiIbwl4ia8JeIrvCXiYLwl4mW8JeJqvCXib7wl4qS8JeKpvCXirrwl4uO8JeLovCXi7bwl4yK8JeMnvCXjLLwl42G8JeNmvCXja7wl46C8JeOlvCXjqrwl46+8JePkg==" }, { - "string": "𗏦𗏺𗐎𗐢𗐶𗑊𗑞𗑲𗒆𗒚𗒮𗓂𗓖𗓪𗓾𗔒𗔦𗔺𗕎𗕢𗕶𗖊𗖞𗖲𗗆𗗚𗗮𗘂𗘖𗘪𗘾𗙒𗙦𗙺𗚎𗚢𗚶𗛊𗛞𗛲𗜆𗜚𗜮𗝂𗝖𗝪𗝾𗞒𗞦𗞺𗟎𗟢𗟶𗠊𗠞𗠲𗡆𗡚𗡮𗢂𗢖𗢪𗢾𗣒𗣦𗣺𗤎𗤢𗤶𗥊𗥞𗥲𗦆𗦚𗦮𗧂𗧖𗧪𗧾𗨒𗨦𗨺𗩎𗩢𗩶𗪊𗪞𗪲𗫆𗫚𗫮𗬂𗬖𗬪𗬾𗭒𗭦𗭺𗮎𗮢", - "encodedString": "8JePpvCXj7rwl5CO8JeQovCXkLbwl5GK8JeRnvCXkbLwl5KG8JeSmvCXkq7wl5OC8JeTlvCXk6rwl5O+8JeUkvCXlKbwl5S68JeVjvCXlaLwl5W28JeWivCXlp7wl5ay8JeXhvCXl5rwl5eu8JeYgvCXmJbwl5iq8JeYvvCXmZLwl5mm8JeZuvCXmo7wl5qi8JeatvCXm4rwl5ue8JebsvCXnIbwl5ya8JecrvCXnYLwl52W8JedqvCXnb7wl56S8JeepvCXnrrwl5+O8JefovCXn7bwl6CK8JegnvCXoLLwl6GG8JehmvCXoa7wl6KC8JeilvCXoqrwl6K+8JejkvCXo6bwl6O68JekjvCXpKLwl6S28JelivCXpZ7wl6Wy8JemhvCXpprwl6au8JengvCXp5bwl6eq8JenvvCXqJLwl6im8JeouvCXqY7wl6mi8JeptvCXqorwl6qe8JeqsvCXq4bwl6ua8JerrvCXrILwl6yW8JesqvCXrL7wl62S8JetpvCXrbrwl66O8Jeuog==" + "string" : "𗏦𗏺𗐎𗐢𗐶𗑊𗑞𗑲𗒆𗒚𗒮𗓂𗓖𗓪𗓾𗔒𗔦𗔺𗕎𗕢𗕶𗖊𗖞𗖲𗗆𗗚𗗮𗘂𗘖𗘪𗘾𗙒𗙦𗙺𗚎𗚢𗚶𗛊𗛞𗛲𗜆𗜚𗜮𗝂𗝖𗝪𗝾𗞒𗞦𗞺𗟎𗟢𗟶𗠊𗠞𗠲𗡆𗡚𗡮𗢂𗢖𗢪𗢾𗣒𗣦𗣺𗤎𗤢𗤶𗥊𗥞𗥲𗦆𗦚𗦮𗧂𗧖𗧪𗧾𗨒𗨦𗨺𗩎𗩢𗩶𗪊𗪞𗪲𗫆𗫚𗫮𗬂𗬖𗬪𗬾𗭒𗭦𗭺𗮎𗮢", + "encodedString" : "8JePpvCXj7rwl5CO8JeQovCXkLbwl5GK8JeRnvCXkbLwl5KG8JeSmvCXkq7wl5OC8JeTlvCXk6rwl5O+8JeUkvCXlKbwl5S68JeVjvCXlaLwl5W28JeWivCXlp7wl5ay8JeXhvCXl5rwl5eu8JeYgvCXmJbwl5iq8JeYvvCXmZLwl5mm8JeZuvCXmo7wl5qi8JeatvCXm4rwl5ue8JebsvCXnIbwl5ya8JecrvCXnYLwl52W8JedqvCXnb7wl56S8JeepvCXnrrwl5+O8JefovCXn7bwl6CK8JegnvCXoLLwl6GG8JehmvCXoa7wl6KC8JeilvCXoqrwl6K+8JejkvCXo6bwl6O68JekjvCXpKLwl6S28JelivCXpZ7wl6Wy8JemhvCXpprwl6au8JengvCXp5bwl6eq8JenvvCXqJLwl6im8JeouvCXqY7wl6mi8JeptvCXqorwl6qe8JeqsvCXq4bwl6ua8JerrvCXrILwl6yW8JesqvCXrL7wl62S8JetpvCXrbrwl66O8Jeuog==" }, { - "string": "𗮶𗯊𗯞𗯲𗰆𗰚𗰮𗱂𗱖𗱪𗱾𗲒𗲦𗲺𗳎𗳢𗳶𗴊𗴞𗴲𗵆𗵚𗵮𗶂𗶖𗶪𗶾𗷒𗷦𗷺𗸎𗸢𗸶𗹊𗹞𗹲𗺆𗺚𗺮𗻂𗻖𗻪𗻾𗼒𗼦𗼺𗽎𗽢𗽶𗾊𗾞𗾲𗿆𗿚𗿮𘀂𘀖𘀪𘀾𘁒𘁦𘁺𘂎𘂢𘂶𘃊𘃞𘃲𘄆𘄚𘄮𘅂𘅖𘅪𘅾𘆒𘆦𘆺𘇎𘇢𘇶𘈊𘈞𘈲𘉆𘉚𘉮𘊂𘊖𘊪𘊾𘋒𘋦𘋺𘌎𘌢𘌶𘍊𘍞𘍲", - "encodedString": "8JeutvCXr4rwl6+e8JevsvCXsIbwl7Ca8JewrvCXsYLwl7GW8JexqvCXsb7wl7KS8JeypvCXsrrwl7OO8JezovCXs7bwl7SK8Je0nvCXtLLwl7WG8Je1mvCXta7wl7aC8Je2lvCXtqrwl7a+8Je3kvCXt6bwl7e68Je4jvCXuKLwl7i28Je5ivCXuZ7wl7my8Je6hvCXuprwl7qu8Je7gvCXu5bwl7uq8Je7vvCXvJLwl7ym8Je8uvCXvY7wl72i8Je9tvCXvorwl76e8Je+svCXv4bwl7+a8Je/rvCYgILwmICW8JiAqvCYgL7wmIGS8JiBpvCYgbrwmIKO8JiCovCYgrbwmIOK8JiDnvCYg7LwmISG8JiEmvCYhK7wmIWC8JiFlvCYharwmIW+8JiGkvCYhqbwmIa68JiHjvCYh6LwmIe28JiIivCYiJ7wmIiy8JiJhvCYiZrwmImu8JiKgvCYipbwmIqq8JiKvvCYi5LwmIum8JiLuvCYjI7wmIyi8JiMtvCYjYrwmI2e8JiNsg==" + "string" : "𗮶𗯊𗯞𗯲𗰆𗰚𗰮𗱂𗱖𗱪𗱾𗲒𗲦𗲺𗳎𗳢𗳶𗴊𗴞𗴲𗵆𗵚𗵮𗶂𗶖𗶪𗶾𗷒𗷦𗷺𗸎𗸢𗸶𗹊𗹞𗹲𗺆𗺚𗺮𗻂𗻖𗻪𗻾𗼒𗼦𗼺𗽎𗽢𗽶𗾊𗾞𗾲𗿆𗿚𗿮𘀂𘀖𘀪𘀾𘁒𘁦𘁺𘂎𘂢𘂶𘃊𘃞𘃲𘄆𘄚𘄮𘅂𘅖𘅪𘅾𘆒𘆦𘆺𘇎𘇢𘇶𘈊𘈞𘈲𘉆𘉚𘉮𘊂𘊖𘊪𘊾𘋒𘋦𘋺𘌎𘌢𘌶𘍊𘍞𘍲", + "encodedString" : "8JeutvCXr4rwl6+e8JevsvCXsIbwl7Ca8JewrvCXsYLwl7GW8JexqvCXsb7wl7KS8JeypvCXsrrwl7OO8JezovCXs7bwl7SK8Je0nvCXtLLwl7WG8Je1mvCXta7wl7aC8Je2lvCXtqrwl7a+8Je3kvCXt6bwl7e68Je4jvCXuKLwl7i28Je5ivCXuZ7wl7my8Je6hvCXuprwl7qu8Je7gvCXu5bwl7uq8Je7vvCXvJLwl7ym8Je8uvCXvY7wl72i8Je9tvCXvorwl76e8Je+svCXv4bwl7+a8Je/rvCYgILwmICW8JiAqvCYgL7wmIGS8JiBpvCYgbrwmIKO8JiCovCYgrbwmIOK8JiDnvCYg7LwmISG8JiEmvCYhK7wmIWC8JiFlvCYharwmIW+8JiGkvCYhqbwmIa68JiHjvCYh6LwmIe28JiIivCYiJ7wmIiy8JiJhvCYiZrwmImu8JiKgvCYipbwmIqq8JiKvvCYi5LwmIum8JiLuvCYjI7wmIyi8JiMtvCYjYrwmI2e8JiNsg==" }, { - "string": "𘎆𘎚𘎮𘏂𘏖𘏪𘏾𘐒𘐦𘐺𘑎𘑢𘑶𘒊𘒞𘒲𘓆𘓚𘓮𘔂𘔖𘔪𘔾𘕒𘕦𘕺𘖎𘖢𘖶𘗊𘗞𘗲𘘆𘘚𘘮𘙂𘙖𘙪𘙾𘚒𘚦𘚺𘛎𘛢𘛶𘜊𘜞𘜲𘝆𘝚𘝮𘞂𘞖𘞪𘞾𘟒𘟦𘠂𘠖𘠪𘠾𘡒𘡦𘡺𘢎𘢢𘢶𘣊𘣞𘣲𘤆𘤚𘤮𘥂𘥖𘥪𘥾𘦒𘦦𘦺𘧎𘧢𘧶𘨊𘨞𘨲𘩆𘩚𘩮𘪂𘪖𘪪𘪾𘫒𘫦𘫺𘬎𘬢𘬶𘭊", - "encodedString": "8JiOhvCYjprwmI6u8JiPgvCYj5bwmI+q8JiPvvCYkJLwmJCm8JiQuvCYkY7wmJGi8JiRtvCYkorwmJKe8JiSsvCYk4bwmJOa8JiTrvCYlILwmJSW8JiUqvCYlL7wmJWS8JiVpvCYlbrwmJaO8JiWovCYlrbwmJeK8JiXnvCYl7LwmJiG8JiYmvCYmK7wmJmC8JiZlvCYmarwmJm+8JiakvCYmqbwmJq68JibjvCYm6LwmJu28JicivCYnJ7wmJyy8JidhvCYnZrwmJ2u8JiegvCYnpbwmJ6q8JievvCYn5LwmJ+m8JiggvCYoJbwmKCq8JigvvCYoZLwmKGm8JihuvCYoo7wmKKi8JiitvCYo4rwmKOe8JijsvCYpIbwmKSa8JikrvCYpYLwmKWW8JilqvCYpb7wmKaS8JimpvCYprrwmKeO8JinovCYp7bwmKiK8JionvCYqLLwmKmG8JipmvCYqa7wmKqC8JiqlvCYqqrwmKq+8JirkvCYq6bwmKu68JisjvCYrKLwmKy28Jitig==" + "string" : "𘎆𘎚𘎮𘏂𘏖𘏪𘏾𘐒𘐦𘐺𘑎𘑢𘑶𘒊𘒞𘒲𘓆𘓚𘓮𘔂𘔖𘔪𘔾𘕒𘕦𘕺𘖎𘖢𘖶𘗊𘗞𘗲𘘆𘘚𘘮𘙂𘙖𘙪𘙾𘚒𘚦𘚺𘛎𘛢𘛶𘜊𘜞𘜲𘝆𘝚𘝮𘞂𘞖𘞪𘞾𘟒𘟦𘠂𘠖𘠪𘠾𘡒𘡦𘡺𘢎𘢢𘢶𘣊𘣞𘣲𘤆𘤚𘤮𘥂𘥖𘥪𘥾𘦒𘦦𘦺𘧎𘧢𘧶𘨊𘨞𘨲𘩆𘩚𘩮𘪂𘪖𘪪𘪾𘫒𘫦𘫺𘬎𘬢𘬶𘭊", + "encodedString" : "8JiOhvCYjprwmI6u8JiPgvCYj5bwmI+q8JiPvvCYkJLwmJCm8JiQuvCYkY7wmJGi8JiRtvCYkorwmJKe8JiSsvCYk4bwmJOa8JiTrvCYlILwmJSW8JiUqvCYlL7wmJWS8JiVpvCYlbrwmJaO8JiWovCYlrbwmJeK8JiXnvCYl7LwmJiG8JiYmvCYmK7wmJmC8JiZlvCYmarwmJm+8JiakvCYmqbwmJq68JibjvCYm6LwmJu28JicivCYnJ7wmJyy8JidhvCYnZrwmJ2u8JiegvCYnpbwmJ6q8JievvCYn5LwmJ+m8JiggvCYoJbwmKCq8JigvvCYoZLwmKGm8JihuvCYoo7wmKKi8JiitvCYo4rwmKOe8JijsvCYpIbwmKSa8JikrvCYpYLwmKWW8JilqvCYpb7wmKaS8JimpvCYprrwmKeO8JinovCYp7bwmKiK8JionvCYqLLwmKmG8JipmvCYqa7wmKqC8JiqlvCYqqrwmKq+8JirkvCYq6bwmKu68JisjvCYrKLwmKy28Jitig==" }, { - "string": "𘭞𘭲𘮆𘮚𘮮𘯂𘯖𘯪𘯾𘰒𘰦𘰺𘱎𘱢𘱶𘲊𘲞𘲲𘳆𘴄𛀂𛀖𛀪𛀾𛁒𛁦𛁺𛂎𛂢𛂶𛃊𛃞𛃲𛄆𛄚𛅲𛆆𛆚𛆮𛇂𛇖𛇪𛇾𛈒𛈦𛈺𛉎𛉢𛉶𛊊𛊞𛊲𛋆𛋚𛋮𛰆𛰚𛰮𛱂𛱖𛱪𛲆𛲣𜼓𜼧𜼽𜽚𜽮𜾂𜾖𜾪𜾾𝀎𝀢𝀶𝁊𝁞𝁲𝂆𝂚𝂮𝃂𝃖𝃪𝄈𝄜𝄲𝅆𝅚𝅮𝆂𝆖𝆪𝆺𝅥𝅮𝇒𝇦𝈏𝈣𝈷𝋅", - "encodedString": "8JitnvCYrbLwmK6G8JiumvCYrq7wmK+C8JivlvCYr6rwmK++8JiwkvCYsKbwmLC68JixjvCYsaLwmLG28JiyivCYsp7wmLKy8JizhvCYtITwm4CC8JuAlvCbgKrwm4C+8JuBkvCbgabwm4G68JuCjvCbgqLwm4K28JuDivCbg57wm4Oy8JuEhvCbhJrwm4Wy8JuGhvCbhprwm4au8JuHgvCbh5bwm4eq8JuHvvCbiJLwm4im8JuIuvCbiY7wm4mi8JuJtvCbiorwm4qe8JuKsvCbi4bwm4ua8JuLrvCbsIbwm7Ca8JuwrvCbsYLwm7GW8JuxqvCbsobwm7Kj8Jy8k/CcvKfwnLy98Jy9mvCcva7wnL6C8Jy+lvCcvqrwnL6+8J2AjvCdgKLwnYC28J2BivCdgZ7wnYGy8J2ChvCdgprwnYKu8J2DgvCdg5bwnYOq8J2EiPCdhJzwnYSy8J2FhvCdhZrwnYWu8J2GgvCdhpbwnYaq8J2GvvCdh5LwnYem8J2Ij/CdiKPwnYi38J2LhQ==" + "string" : "𘭞𘭲𘮆𘮚𘮮𘯂𘯖𘯪𘯾𘰒𘰦𘰺𘱎𘱢𘱶𘲊𘲞𘲲𘳆𘴄𛀂𛀖𛀪𛀾𛁒𛁦𛁺𛂎𛂢𛂶𛃊𛃞𛃲𛄆𛄚𛅲𛆆𛆚𛆮𛇂𛇖𛇪𛇾𛈒𛈦𛈺𛉎𛉢𛉶𛊊𛊞𛊲𛋆𛋚𛋮𛰆𛰚𛰮𛱂𛱖𛱪𛲆𛲣𜼓𜼧𜼽𜽚𜽮𜾂𜾖𜾪𜾾𝀎𝀢𝀶𝁊𝁞𝁲𝂆𝂚𝂮𝃂𝃖𝃪𝄈𝄜𝄲𝅆𝅚𝅮𝆂𝆖𝆪𝆺𝅥𝅮𝇒𝇦𝈏𝈣𝈷𝋅", + "encodedString" : "8JitnvCYrbLwmK6G8JiumvCYrq7wmK+C8JivlvCYr6rwmK++8JiwkvCYsKbwmLC68JixjvCYsaLwmLG28JiyivCYsp7wmLKy8JizhvCYtITwm4CC8JuAlvCbgKrwm4C+8JuBkvCbgabwm4G68JuCjvCbgqLwm4K28JuDivCbg57wm4Oy8JuEhvCbhJrwm4Wy8JuGhvCbhprwm4au8JuHgvCbh5bwm4eq8JuHvvCbiJLwm4im8JuIuvCbiY7wm4mi8JuJtvCbiorwm4qe8JuKsvCbi4bwm4ua8JuLrvCbsIbwm7Ca8JuwrvCbsYLwm7GW8JuxqvCbsobwm7Kj8Jy8k/CcvKfwnLy98Jy9mvCcva7wnL6C8Jy+lvCcvqrwnL6+8J2AjvCdgKLwnYC28J2BivCdgZ7wnYGy8J2ChvCdgprwnYKu8J2DgvCdg5bwnYOq8J2EiPCdhJzwnYSy8J2FhvCdhZrwnYWu8J2GgvCdhpbwnYaq8J2GvvCdh5LwnYem8J2Ij/CdiKPwnYi38J2LhQ==" }, { - "string": "𝋥𝌅𝌙𝌭𝍁𝍕𝍲𝐍𝐡𝐵𝑉𝑞𝑲𝒆𝒚𝒶𝓍𝓡𝓵𝔊𝔢𝔶𝕐𝕥𝕹𝖍𝖡𝖵𝗉𝗝𝗱𝘅𝘙𝘭𝙁𝙕𝙩𝙽𝚑𝚥𝚻𝛏𝛣𝛷𝜋𝜟𝜳𝝇𝝛𝝯𝞃𝞗𝞫𝞿𝟕𝟩𝟽𝠑𝠥𝠹𝡍𝡡𝡵𝢉𝢝𝢱𝣅𝣙𝣭𝤁𝤕𝤩𝤽𝥑𝥥𝥹𝦍𝦡𝦵𝧉𝧝𝧱𝨅𝨙𝨭𝩁𝩕𝩩𝩽𝪡𝼅𝼙𞀉𞀟𞀺𞁎𞁢𞄇𞄛𞄲", - "encodedString": "8J2LpfCdjIXwnYyZ8J2MrfCdjYHwnY2V8J2NsvCdkI3wnZCh8J2QtfCdkYnwnZGe8J2RsvCdkobwnZKa8J2StvCdk43wnZOh8J2TtfCdlIrwnZSi8J2UtvCdlZDwnZWl8J2VufCdlo3wnZah8J2WtfCdl4nwnZed8J2XsfCdmIXwnZiZ8J2YrfCdmYHwnZmV8J2ZqfCdmb3wnZqR8J2apfCdmrvwnZuP8J2bo/Cdm7fwnZyL8J2cn/CdnLPwnZ2H8J2dm/Cdna/wnZ6D8J2el/CdnqvwnZ6/8J2flfCdn6nwnZ+98J2gkfCdoKXwnaC58J2hjfCdoaHwnaG18J2iifCdop3wnaKx8J2jhfCdo5nwnaOt8J2kgfCdpJXwnaSp8J2kvfCdpZHwnaWl8J2lufCdpo3wnaah8J2mtfCdp4nwnaed8J2nsfCdqIXwnaiZ8J2orfCdqYHwnamV8J2pqfCdqb3wnaqh8J28hfCdvJnwnoCJ8J6An/CegLrwnoGO8J6BovCehIfwnoSb8J6Esg==" + "string" : "𝋥𝌅𝌙𝌭𝍁𝍕𝍲𝐍𝐡𝐵𝑉𝑞𝑲𝒆𝒚𝒶𝓍𝓡𝓵𝔊𝔢𝔶𝕐𝕥𝕹𝖍𝖡𝖵𝗉𝗝𝗱𝘅𝘙𝘭𝙁𝙕𝙩𝙽𝚑𝚥𝚻𝛏𝛣𝛷𝜋𝜟𝜳𝝇𝝛𝝯𝞃𝞗𝞫𝞿𝟕𝟩𝟽𝠑𝠥𝠹𝡍𝡡𝡵𝢉𝢝𝢱𝣅𝣙𝣭𝤁𝤕𝤩𝤽𝥑𝥥𝥹𝦍𝦡𝦵𝧉𝧝𝧱𝨅𝨙𝨭𝩁𝩕𝩩𝩽𝪡𝼅𝼙𞀉𞀟𞀺𞁎𞁢𞄇𞄛𞄲", + "encodedString" : "8J2LpfCdjIXwnYyZ8J2MrfCdjYHwnY2V8J2NsvCdkI3wnZCh8J2QtfCdkYnwnZGe8J2RsvCdkobwnZKa8J2StvCdk43wnZOh8J2TtfCdlIrwnZSi8J2UtvCdlZDwnZWl8J2VufCdlo3wnZah8J2WtfCdl4nwnZed8J2XsfCdmIXwnZiZ8J2YrfCdmYHwnZmV8J2ZqfCdmb3wnZqR8J2apfCdmrvwnZuP8J2bo/Cdm7fwnZyL8J2cn/CdnLPwnZ2H8J2dm/Cdna/wnZ6D8J2el/CdnqvwnZ6/8J2flfCdn6nwnZ+98J2gkfCdoKXwnaC58J2hjfCdoaHwnaG18J2iifCdop3wnaKx8J2jhfCdo5nwnaOt8J2kgfCdpJXwnaSp8J2kvfCdpZHwnaWl8J2lufCdpo3wnaah8J2mtfCdp4nwnaed8J2nsfCdqIXwnaiZ8J2orfCdqYHwnamV8J2pqfCdqb3wnaqh8J28hfCdvJnwnoCJ8J6An/CegLrwnoGO8J6BovCehIfwnoSb8J6Esg==" }, { - "string": "𞅈𞊠𞋅𞋙𞋭𞓖𞓪𞟤𞟻𞠐𞠤𞠸𞡌𞡠𞡴𞢈𞢜𞢰𞣄𞤃𞤗𞤫𞤿𞥗𞲀𞲔𞲨𞴈𞴜𞴰𞸇𞸛𞸵𞹡𞹻𞺒𞺭🀃🀗🀫🁃🁗🁫🁿🂓🂵🃊🃟🃳🄑🄥🄹🅍🅡🅵🆉🆝🇩🇽🈞🈲🉑🌍🌡🌵🍉🍝🍱🎅🎙🎭🏁🏕🏩🏽🐑🐥🐹👍👡👵💉💝💱📅📙📭🔁🔕🔩🔽🕑🕥🕹🖍🖡🖵🗉🗝🗱", - "encodedString": "8J6FiPCeiqDwnouF8J6LmfCei63wnpOW8J6TqvCen6Twnp+78J6gkPCeoKTwnqC48J6hjPCeoaDwnqG08J6iiPCeopzwnqKw8J6jhPCepIPwnqSX8J6kq/CepL/wnqWX8J6ygPCespTwnrKo8J60iPCetJzwnrSw8J64h/CeuJvwnri18J65ofCeubvwnrqS8J66rfCfgIPwn4CX8J+Aq/CfgYPwn4GX8J+Bq/Cfgb/wn4KT8J+CtfCfg4rwn4Of8J+Ds/CfhJHwn4Sl8J+EufCfhY3wn4Wh8J+FtfCfhonwn4ad8J+HqfCfh73wn4ie8J+IsvCfiZHwn4yN8J+MofCfjLXwn42J8J+NnfCfjbHwn46F8J+OmfCfjq3wn4+B8J+PlfCfj6nwn4+98J+QkfCfkKXwn5C58J+RjfCfkaHwn5G18J+SifCfkp3wn5Kx8J+ThfCfk5nwn5Ot8J+UgfCflJXwn5Sp8J+UvfCflZHwn5Wl8J+VufCflo3wn5ah8J+WtfCfl4nwn5ed8J+XsQ==" + "string" : "𞅈𞊠𞋅𞋙𞋭𞓖𞓪𞟤𞟻𞠐𞠤𞠸𞡌𞡠𞡴𞢈𞢜𞢰𞣄𞤃𞤗𞤫𞤿𞥗𞲀𞲔𞲨𞴈𞴜𞴰𞸇𞸛𞸵𞹡𞹻𞺒𞺭🀃🀗🀫🁃🁗🁫🁿🂓🂵🃊🃟🃳🄑🄥🄹🅍🅡🅵🆉🆝🇩🇽🈞🈲🉑🌍🌡🌵🍉🍝🍱🎅🎙🎭🏁🏕🏩🏽🐑🐥🐹👍👡👵💉💝💱📅📙📭🔁🔕🔩🔽🕑🕥🕹🖍🖡🖵🗉🗝🗱", + "encodedString" : "8J6FiPCeiqDwnouF8J6LmfCei63wnpOW8J6TqvCen6Twnp+78J6gkPCeoKTwnqC48J6hjPCeoaDwnqG08J6iiPCeopzwnqKw8J6jhPCepIPwnqSX8J6kq/CepL/wnqWX8J6ygPCespTwnrKo8J60iPCetJzwnrSw8J64h/CeuJvwnri18J65ofCeubvwnrqS8J66rfCfgIPwn4CX8J+Aq/CfgYPwn4GX8J+Bq/Cfgb/wn4KT8J+CtfCfg4rwn4Of8J+Ds/CfhJHwn4Sl8J+EufCfhY3wn4Wh8J+FtfCfhonwn4ad8J+HqfCfh73wn4ie8J+IsvCfiZHwn4yN8J+MofCfjLXwn42J8J+NnfCfjbHwn46F8J+OmfCfjq3wn4+B8J+PlfCfj6nwn4+98J+QkfCfkKXwn5C58J+RjfCfkaHwn5G18J+SifCfkp3wn5Kx8J+ThfCfk5nwn5Ot8J+UgfCflJXwn5Sp8J+UvfCflZHwn5Wl8J+VufCflo3wn5ah8J+WtfCfl4nwn5ed8J+XsQ==" }, { - "string": "😅😙😭🙁🙕🙩🙽🚑🚥🚹🛍🛥🛼🜓🜧🜻🝏🝣🝻🞏🞣🞷🟋🟥🠐🠤🠸🡔🡮🢂🢞🤂🤖🤪🤾🥒🥦🥺🦎🦢🦶🧊🧞🧲🨆🨚🨮🩂🩢🩸🪖🪪🪿🫛🬁🬕🬩🬽🭑🭥🭹🮍🮢🮶🯊𠀉𠀝𠀱𠁅𠁙𠁭𠂁𠂕𠂩𠂽𠃑𠃥𠃹𠄍𠄡𠄵𠅉𠅝𠅱𠆅𠆙𠆭𠇁𠇕𠇩𠇽𠈑𠈥𠈹𠉍𠉡𠉵𠊉𠊝𠊱", - "encodedString": "8J+YhfCfmJnwn5it8J+ZgfCfmZXwn5mp8J+ZvfCfmpHwn5ql8J+aufCfm43wn5ul8J+bvPCfnJPwn5yn8J+cu/CfnY/wn52j8J+du/Cfno/wn56j8J+et/Cfn4vwn5+l8J+gkPCfoKTwn6C48J+hlPCfoa7wn6KC8J+invCfpILwn6SW8J+kqvCfpL7wn6WS8J+lpvCfpbrwn6aO8J+movCfprbwn6eK8J+nnvCfp7Lwn6iG8J+omvCfqK7wn6mC8J+povCfqbjwn6qW8J+qqvCfqr/wn6ub8J+sgfCfrJXwn6yp8J+svfCfrZHwn62l8J+tufCfro3wn66i8J+utvCfr4rwoICJ8KCAnfCggLHwoIGF8KCBmfCgga3woIKB8KCClfCggqnwoIK98KCDkfCgg6XwoIO58KCEjfCghKHwoIS18KCFifCghZ3woIWx8KCGhfCghpnwoIat8KCHgfCgh5XwoIep8KCHvfCgiJHwoIil8KCIufCgiY3woImh8KCJtfCgionwoIqd8KCKsQ==" + "string" : "😅😙😭🙁🙕🙩🙽🚑🚥🚹🛍🛥🛼🜓🜧🜻🝏🝣🝻🞏🞣🞷🟋🟥🠐🠤🠸🡔🡮🢂🢞🤂🤖🤪🤾🥒🥦🥺🦎🦢🦶🧊🧞🧲🨆🨚🨮🩂🩢🩸🪖🪪🪿🫛🬁🬕🬩🬽🭑🭥🭹🮍🮢🮶🯊𠀉𠀝𠀱𠁅𠁙𠁭𠂁𠂕𠂩𠂽𠃑𠃥𠃹𠄍𠄡𠄵𠅉𠅝𠅱𠆅𠆙𠆭𠇁𠇕𠇩𠇽𠈑𠈥𠈹𠉍𠉡𠉵𠊉𠊝𠊱", + "encodedString" : "8J+YhfCfmJnwn5it8J+ZgfCfmZXwn5mp8J+ZvfCfmpHwn5ql8J+aufCfm43wn5ul8J+bvPCfnJPwn5yn8J+cu/CfnY/wn52j8J+du/Cfno/wn56j8J+et/Cfn4vwn5+l8J+gkPCfoKTwn6C48J+hlPCfoa7wn6KC8J+invCfpILwn6SW8J+kqvCfpL7wn6WS8J+lpvCfpbrwn6aO8J+movCfprbwn6eK8J+nnvCfp7Lwn6iG8J+omvCfqK7wn6mC8J+povCfqbjwn6qW8J+qqvCfqr/wn6ub8J+sgfCfrJXwn6yp8J+svfCfrZHwn62l8J+tufCfro3wn66i8J+utvCfr4rwoICJ8KCAnfCggLHwoIGF8KCBmfCgga3woIKB8KCClfCggqnwoIK98KCDkfCgg6XwoIO58KCEjfCghKHwoIS18KCFifCghZ3woIWx8KCGhfCghpnwoIat8KCHgfCgh5XwoIep8KCHvfCgiJHwoIil8KCIufCgiY3woImh8KCJtfCgionwoIqd8KCKsQ==" }, { - "string": "𠋅𠋙𠋭𠌁𠌕𠌩𠌽𠍑𠍥𠍹𠎍𠎡𠎵𠏉𠏝𠏱𠐅𠐙𠐭𠑁𠑕𠑩𠑽𠒑𠒥𠒹𠓍𠓡𠓵𠔉𠔝𠔱𠕅𠕙𠕭𠖁𠖕𠖩𠖽𠗑𠗥𠗹𠘍𠘡𠘵𠙉𠙝𠙱𠚅𠚙𠚭𠛁𠛕𠛩𠛽𠜑𠜥𠜹𠝍𠝡𠝵𠞉𠞝𠞱𠟅𠟙𠟭𠠁𠠕𠠩𠠽𠡑𠡥𠡹𠢍𠢡𠢵𠣉𠣝𠣱𠤅𠤙𠤭𠥁𠥕𠥩𠥽𠦑𠦥𠦹𠧍𠧡𠧵𠨉𠨝𠨱𠩅𠩙𠩭𠪁", - "encodedString": "8KCLhfCgi5nwoIut8KCMgfCgjJXwoIyp8KCMvfCgjZHwoI2l8KCNufCgjo3woI6h8KCOtfCgj4nwoI+d8KCPsfCgkIXwoJCZ8KCQrfCgkYHwoJGV8KCRqfCgkb3woJKR8KCSpfCgkrnwoJON8KCTofCgk7XwoJSJ8KCUnfCglLHwoJWF8KCVmfCgla3woJaB8KCWlfCglqnwoJa98KCXkfCgl6XwoJe58KCYjfCgmKHwoJi18KCZifCgmZ3woJmx8KCahfCgmpnwoJqt8KCbgfCgm5XwoJup8KCbvfCgnJHwoJyl8KCcufCgnY3woJ2h8KCdtfCgnonwoJ6d8KCesfCgn4XwoJ+Z8KCfrfCgoIHwoKCV8KCgqfCgoL3woKGR8KChpfCgobnwoKKN8KCiofCgorXwoKOJ8KCjnfCgo7HwoKSF8KCkmfCgpK3woKWB8KCllfCgpanwoKW98KCmkfCgpqXwoKa58KCnjfCgp6HwoKe18KCoifCgqJ3woKix8KCphfCgqZnwoKmt8KCqgQ==" + "string" : "𠋅𠋙𠋭𠌁𠌕𠌩𠌽𠍑𠍥𠍹𠎍𠎡𠎵𠏉𠏝𠏱𠐅𠐙𠐭𠑁𠑕𠑩𠑽𠒑𠒥𠒹𠓍𠓡𠓵𠔉𠔝𠔱𠕅𠕙𠕭𠖁𠖕𠖩𠖽𠗑𠗥𠗹𠘍𠘡𠘵𠙉𠙝𠙱𠚅𠚙𠚭𠛁𠛕𠛩𠛽𠜑𠜥𠜹𠝍𠝡𠝵𠞉𠞝𠞱𠟅𠟙𠟭𠠁𠠕𠠩𠠽𠡑𠡥𠡹𠢍𠢡𠢵𠣉𠣝𠣱𠤅𠤙𠤭𠥁𠥕𠥩𠥽𠦑𠦥𠦹𠧍𠧡𠧵𠨉𠨝𠨱𠩅𠩙𠩭𠪁", + "encodedString" : "8KCLhfCgi5nwoIut8KCMgfCgjJXwoIyp8KCMvfCgjZHwoI2l8KCNufCgjo3woI6h8KCOtfCgj4nwoI+d8KCPsfCgkIXwoJCZ8KCQrfCgkYHwoJGV8KCRqfCgkb3woJKR8KCSpfCgkrnwoJON8KCTofCgk7XwoJSJ8KCUnfCglLHwoJWF8KCVmfCgla3woJaB8KCWlfCglqnwoJa98KCXkfCgl6XwoJe58KCYjfCgmKHwoJi18KCZifCgmZ3woJmx8KCahfCgmpnwoJqt8KCbgfCgm5XwoJup8KCbvfCgnJHwoJyl8KCcufCgnY3woJ2h8KCdtfCgnonwoJ6d8KCesfCgn4XwoJ+Z8KCfrfCgoIHwoKCV8KCgqfCgoL3woKGR8KChpfCgobnwoKKN8KCiofCgorXwoKOJ8KCjnfCgo7HwoKSF8KCkmfCgpK3woKWB8KCllfCgpanwoKW98KCmkfCgpqXwoKa58KCnjfCgp6HwoKe18KCoifCgqJ3woKix8KCphfCgqZnwoKmt8KCqgQ==" }, { - "string": "𠪕𠪩𠪽𠫑𠫥𠫹𠬍𠬡𠬵𠭉𠭝𠭱𠮅𠮙𠮭𠯁𠯕𠯩𠯽𠰑𠰥𠰹𠱍𠱡𠱵𠲉𠲝𠲱𠳅𠳙𠳭𠴁𠴕𠴩𠴽𠵑𠵥𠵹𠶍𠶡𠶵𠷉𠷝𠷱𠸅𠸙𠸭𠹁𠹕𠹩𠹽𠺑𠺥𠺹𠻍𠻡𠻵𠼉𠼝𠼱𠽅𠽙𠽭𠾁𠾕𠾩𠾽𠿑𠿥𠿹𡀍𡀡𡀵𡁉𡁝𡁱𡂅𡂙𡂭𡃁𡃕𡃩𡃽𡄑𡄥𡄹𡅍𡅡𡅵𡆉𡆝𡆱𡇅𡇙𡇭𡈁𡈕𡈩𡈽𡉑", - "encodedString": "8KCqlfCgqqnwoKq98KCrkfCgq6XwoKu58KCsjfCgrKHwoKy18KCtifCgrZ3woK2x8KCuhfCgrpnwoK6t8KCvgfCgr5XwoK+p8KCvvfCgsJHwoLCl8KCwufCgsY3woLGh8KCxtfCgsonwoLKd8KCysfCgs4XwoLOZ8KCzrfCgtIHwoLSV8KC0qfCgtL3woLWR8KC1pfCgtbnwoLaN8KC2ofCgtrXwoLeJ8KC3nfCgt7HwoLiF8KC4mfCguK3woLmB8KC5lfCguanwoLm98KC6kfCguqXwoLq58KC7jfCgu6HwoLu18KC8ifCgvJ3woLyx8KC9hfCgvZnwoL2t8KC+gfCgvpXwoL6p8KC+vfCgv5HwoL+l8KC/ufChgI3woYCh8KGAtfChgYnwoYGd8KGBsfChgoXwoYKZ8KGCrfChg4HwoYOV8KGDqfChg73woYSR8KGEpfChhLnwoYWN8KGFofChhbXwoYaJ8KGGnfChhrHwoYeF8KGHmfChh63woYiB8KGIlfChiKnwoYi98KGJkQ==" + "string" : "𠪕𠪩𠪽𠫑𠫥𠫹𠬍𠬡𠬵𠭉𠭝𠭱𠮅𠮙𠮭𠯁𠯕𠯩𠯽𠰑𠰥𠰹𠱍𠱡𠱵𠲉𠲝𠲱𠳅𠳙𠳭𠴁𠴕𠴩𠴽𠵑𠵥𠵹𠶍𠶡𠶵𠷉𠷝𠷱𠸅𠸙𠸭𠹁𠹕𠹩𠹽𠺑𠺥𠺹𠻍𠻡𠻵𠼉𠼝𠼱𠽅𠽙𠽭𠾁𠾕𠾩𠾽𠿑𠿥𠿹𡀍𡀡𡀵𡁉𡁝𡁱𡂅𡂙𡂭𡃁𡃕𡃩𡃽𡄑𡄥𡄹𡅍𡅡𡅵𡆉𡆝𡆱𡇅𡇙𡇭𡈁𡈕𡈩𡈽𡉑", + "encodedString" : "8KCqlfCgqqnwoKq98KCrkfCgq6XwoKu58KCsjfCgrKHwoKy18KCtifCgrZ3woK2x8KCuhfCgrpnwoK6t8KCvgfCgr5XwoK+p8KCvvfCgsJHwoLCl8KCwufCgsY3woLGh8KCxtfCgsonwoLKd8KCysfCgs4XwoLOZ8KCzrfCgtIHwoLSV8KC0qfCgtL3woLWR8KC1pfCgtbnwoLaN8KC2ofCgtrXwoLeJ8KC3nfCgt7HwoLiF8KC4mfCguK3woLmB8KC5lfCguanwoLm98KC6kfCguqXwoLq58KC7jfCgu6HwoLu18KC8ifCgvJ3woLyx8KC9hfCgvZnwoL2t8KC+gfCgvpXwoL6p8KC+vfCgv5HwoL+l8KC/ufChgI3woYCh8KGAtfChgYnwoYGd8KGBsfChgoXwoYKZ8KGCrfChg4HwoYOV8KGDqfChg73woYSR8KGEpfChhLnwoYWN8KGFofChhbXwoYaJ8KGGnfChhrHwoYeF8KGHmfChh63woYiB8KGIlfChiKnwoYi98KGJkQ==" }, { - "string": "𡉥𡉹𡊍𡊡𡊵𡋉𡋝𡋱𡌅𡌙𡌭𡍁𡍕𡍩𡍽𡎑𡎥𡎹𡏍𡏡𡏵𡐉𡐝𡐱𡑅𡑙𡑭𡒁𡒕𡒩𡒽𡓑𡓥𡓹𡔍𡔡𡔵𡕉𡕝𡕱𡖅𡖙𡖭𡗁𡗕𡗩𡗽𡘑𡘥𡘹𡙍𡙡𡙵𡚉𡚝𡚱𡛅𡛙𡛭𡜁𡜕𡜩𡜽𡝑𡝥𡝹𡞍𡞡𡞵𡟉𡟝𡟱𡠅𡠙𡠭𡡁𡡕𡡩𡡽𡢑𡢥𡢹𡣍𡣡𡣵𡤉𡤝𡤱𡥅𡥙𡥭𡦁𡦕𡦩𡦽𡧑𡧥𡧹𡨍𡨡", - "encodedString": "8KGJpfChibnwoYqN8KGKofChirXwoYuJ8KGLnfChi7HwoYyF8KGMmfChjK3woY2B8KGNlfChjanwoY298KGOkfChjqXwoY658KGPjfChj6HwoY+18KGQifChkJ3woZCx8KGRhfChkZnwoZGt8KGSgfChkpXwoZKp8KGSvfChk5HwoZOl8KGTufChlI3woZSh8KGUtfChlYnwoZWd8KGVsfChloXwoZaZ8KGWrfChl4HwoZeV8KGXqfChl73woZiR8KGYpfChmLnwoZmN8KGZofChmbXwoZqJ8KGanfChmrHwoZuF8KGbmfChm63woZyB8KGclfChnKnwoZy98KGdkfChnaXwoZ258KGejfChnqHwoZ618KGfifChn53woZ+x8KGghfChoJnwoaCt8KGhgfChoZXwoaGp8KGhvfChopHwoaKl8KGiufCho43woaOh8KGjtfChpInwoaSd8KGksfChpYXwoaWZ8KGlrfChpoHwoaaV8KGmqfChpr3woaeR8KGnpfChp7nwoaiN8KGooQ==" + "string" : "𡉥𡉹𡊍𡊡𡊵𡋉𡋝𡋱𡌅𡌙𡌭𡍁𡍕𡍩𡍽𡎑𡎥𡎹𡏍𡏡𡏵𡐉𡐝𡐱𡑅𡑙𡑭𡒁𡒕𡒩𡒽𡓑𡓥𡓹𡔍𡔡𡔵𡕉𡕝𡕱𡖅𡖙𡖭𡗁𡗕𡗩𡗽𡘑𡘥𡘹𡙍𡙡𡙵𡚉𡚝𡚱𡛅𡛙𡛭𡜁𡜕𡜩𡜽𡝑𡝥𡝹𡞍𡞡𡞵𡟉𡟝𡟱𡠅𡠙𡠭𡡁𡡕𡡩𡡽𡢑𡢥𡢹𡣍𡣡𡣵𡤉𡤝𡤱𡥅𡥙𡥭𡦁𡦕𡦩𡦽𡧑𡧥𡧹𡨍𡨡", + "encodedString" : "8KGJpfChibnwoYqN8KGKofChirXwoYuJ8KGLnfChi7HwoYyF8KGMmfChjK3woY2B8KGNlfChjanwoY298KGOkfChjqXwoY658KGPjfChj6HwoY+18KGQifChkJ3woZCx8KGRhfChkZnwoZGt8KGSgfChkpXwoZKp8KGSvfChk5HwoZOl8KGTufChlI3woZSh8KGUtfChlYnwoZWd8KGVsfChloXwoZaZ8KGWrfChl4HwoZeV8KGXqfChl73woZiR8KGYpfChmLnwoZmN8KGZofChmbXwoZqJ8KGanfChmrHwoZuF8KGbmfChm63woZyB8KGclfChnKnwoZy98KGdkfChnaXwoZ258KGejfChnqHwoZ618KGfifChn53woZ+x8KGghfChoJnwoaCt8KGhgfChoZXwoaGp8KGhvfChopHwoaKl8KGiufCho43woaOh8KGjtfChpInwoaSd8KGksfChpYXwoaWZ8KGlrfChpoHwoaaV8KGmqfChpr3woaeR8KGnpfChp7nwoaiN8KGooQ==" }, { - "string": "𡨵𡩉𡩝𡩱𡪅𡪙𡪭𡫁𡫕𡫩𡫽𡬑𡬥𡬹𡭍𡭡𡭵𡮉𡮝𡮱𡯅𡯙𡯭𡰁𡰕𡰩𡰽𡱑𡱥𡱹𡲍𡲡𡲵𡳉𡳝𡳱𡴅𡴙𡴭𡵁𡵕𡵩𡵽𡶑𡶥𡶹𡷍𡷡𡷵𡸉𡸝𡸱𡹅𡹙𡹭𡺁𡺕𡺩𡺽𡻑𡻥𡻹𡼍𡼡𡼵𡽉𡽝𡽱𡾅𡾙𡾭𡿁𡿕𡿩𡿽𢀑𢀥𢀹𢁍𢁡𢁵𢂉𢂝𢂱𢃅𢃙𢃭𢄁𢄕𢄩𢄽𢅑𢅥𢅹𢆍𢆡𢆵𢇉𢇝𢇱", - "encodedString": "8KGotfChqYnwoamd8KGpsfChqoXwoaqZ8KGqrfChq4HwoauV8KGrqfChq73woayR8KGspfChrLnwoa2N8KGtofChrbXwoa6J8KGunfChrrHwoa+F8KGvmfChr63wobCB8KGwlfChsKnwobC98KGxkfChsaXwobG58KGyjfChsqHwobK18KGzifChs53wobOx8KG0hfChtJnwobSt8KG1gfChtZXwobWp8KG1vfChtpHwobal8KG2ufCht43wobeh8KG3tfChuInwobid8KG4sfChuYXwobmZ8KG5rfChuoHwobqV8KG6qfChur3wobuR8KG7pfChu7nwobyN8KG8ofChvLXwob2J8KG9nfChvbHwob6F8KG+mfChvq3wob+B8KG/lfChv6nwob+98KKAkfCigKXwooC58KKBjfCigaHwooG18KKCifCigp3wooKx8KKDhfCig5nwooOt8KKEgfCihJXwooSp8KKEvfCihZHwooWl8KKFufCiho3wooah8KKGtfCih4nwooed8KKHsQ==" + "string" : "𡨵𡩉𡩝𡩱𡪅𡪙𡪭𡫁𡫕𡫩𡫽𡬑𡬥𡬹𡭍𡭡𡭵𡮉𡮝𡮱𡯅𡯙𡯭𡰁𡰕𡰩𡰽𡱑𡱥𡱹𡲍𡲡𡲵𡳉𡳝𡳱𡴅𡴙𡴭𡵁𡵕𡵩𡵽𡶑𡶥𡶹𡷍𡷡𡷵𡸉𡸝𡸱𡹅𡹙𡹭𡺁𡺕𡺩𡺽𡻑𡻥𡻹𡼍𡼡𡼵𡽉𡽝𡽱𡾅𡾙𡾭𡿁𡿕𡿩𡿽𢀑𢀥𢀹𢁍𢁡𢁵𢂉𢂝𢂱𢃅𢃙𢃭𢄁𢄕𢄩𢄽𢅑𢅥𢅹𢆍𢆡𢆵𢇉𢇝𢇱", + "encodedString" : "8KGotfChqYnwoamd8KGpsfChqoXwoaqZ8KGqrfChq4HwoauV8KGrqfChq73woayR8KGspfChrLnwoa2N8KGtofChrbXwoa6J8KGunfChrrHwoa+F8KGvmfChr63wobCB8KGwlfChsKnwobC98KGxkfChsaXwobG58KGyjfChsqHwobK18KGzifChs53wobOx8KG0hfChtJnwobSt8KG1gfChtZXwobWp8KG1vfChtpHwobal8KG2ufCht43wobeh8KG3tfChuInwobid8KG4sfChuYXwobmZ8KG5rfChuoHwobqV8KG6qfChur3wobuR8KG7pfChu7nwobyN8KG8ofChvLXwob2J8KG9nfChvbHwob6F8KG+mfChvq3wob+B8KG/lfChv6nwob+98KKAkfCigKXwooC58KKBjfCigaHwooG18KKCifCigp3wooKx8KKDhfCig5nwooOt8KKEgfCihJXwooSp8KKEvfCihZHwooWl8KKFufCiho3wooah8KKGtfCih4nwooed8KKHsQ==" }, { - "string": "𢈅𢈙𢈭𢉁𢉕𢉩𢉽𢊑𢊥𢊹𢋍𢋡𢋵𢌉𢌝𢌱𢍅𢍙𢍭𢎁𢎕𢎩𢎽𢏑𢏥𢏹𢐍𢐡𢐵𢑉𢑝𢑱𢒅𢒙𢒭𢓁𢓕𢓩𢓽𢔑𢔥𢔹𢕍𢕡𢕵𢖉𢖝𢖱𢗅𢗙𢗭𢘁𢘕𢘩𢘽𢙑𢙥𢙹𢚍𢚡𢚵𢛉𢛝𢛱𢜅𢜙𢜭𢝁𢝕𢝩𢝽𢞑𢞥𢞹𢟍𢟡𢟵𢠉𢠝𢠱𢡅𢡙𢡭𢢁𢢕𢢩𢢽𢣑𢣥𢣹𢤍𢤡𢤵𢥉𢥝𢥱𢦅𢦙𢦭𢧁", - "encodedString": "8KKIhfCiiJnwooit8KKJgfCiiZXwoomp8KKJvfCiipHwooql8KKKufCii43woouh8KKLtfCijInwooyd8KKMsfCijYXwoo2Z8KKNrfCijoHwoo6V8KKOqfCijr3woo+R8KKPpfCij7nwopCN8KKQofCikLXwopGJ8KKRnfCikbHwopKF8KKSmfCikq3wopOB8KKTlfCik6nwopO98KKUkfCilKXwopS58KKVjfCilaHwopW18KKWifCilp3wopax8KKXhfCil5nwopet8KKYgfCimJXwopip8KKYvfCimZHwopml8KKZufCimo3wopqh8KKatfCim4nwopud8KKbsfCinIXwopyZ8KKcrfCinYHwop2V8KKdqfCinb3wop6R8KKepfCinrnwop+N8KKfofCin7XwoqCJ8KKgnfCioLHwoqGF8KKhmfCioa3woqKB8KKilfCioqnwoqK98KKjkfCio6XwoqO58KKkjfCipKHwoqS18KKlifCipZ3woqWx8KKmhfCippnwoqat8KKngQ==" + "string" : "𢈅𢈙𢈭𢉁𢉕𢉩𢉽𢊑𢊥𢊹𢋍𢋡𢋵𢌉𢌝𢌱𢍅𢍙𢍭𢎁𢎕𢎩𢎽𢏑𢏥𢏹𢐍𢐡𢐵𢑉𢑝𢑱𢒅𢒙𢒭𢓁𢓕𢓩𢓽𢔑𢔥𢔹𢕍𢕡𢕵𢖉𢖝𢖱𢗅𢗙𢗭𢘁𢘕𢘩𢘽𢙑𢙥𢙹𢚍𢚡𢚵𢛉𢛝𢛱𢜅𢜙𢜭𢝁𢝕𢝩𢝽𢞑𢞥𢞹𢟍𢟡𢟵𢠉𢠝𢠱𢡅𢡙𢡭𢢁𢢕𢢩𢢽𢣑𢣥𢣹𢤍𢤡𢤵𢥉𢥝𢥱𢦅𢦙𢦭𢧁", + "encodedString" : "8KKIhfCiiJnwooit8KKJgfCiiZXwoomp8KKJvfCiipHwooql8KKKufCii43woouh8KKLtfCijInwooyd8KKMsfCijYXwoo2Z8KKNrfCijoHwoo6V8KKOqfCijr3woo+R8KKPpfCij7nwopCN8KKQofCikLXwopGJ8KKRnfCikbHwopKF8KKSmfCikq3wopOB8KKTlfCik6nwopO98KKUkfCilKXwopS58KKVjfCilaHwopW18KKWifCilp3wopax8KKXhfCil5nwopet8KKYgfCimJXwopip8KKYvfCimZHwopml8KKZufCimo3wopqh8KKatfCim4nwopud8KKbsfCinIXwopyZ8KKcrfCinYHwop2V8KKdqfCinb3wop6R8KKepfCinrnwop+N8KKfofCin7XwoqCJ8KKgnfCioLHwoqGF8KKhmfCioa3woqKB8KKilfCioqnwoqK98KKjkfCio6XwoqO58KKkjfCipKHwoqS18KKlifCipZ3woqWx8KKmhfCippnwoqat8KKngQ==" }, { - "string": "𢧕𢧩𢧽𢨑𢨥𢨹𢩍𢩡𢩵𢪉𢪝𢪱𢫅𢫙𢫭𢬁𢬕𢬩𢬽𢭑𢭥𢭹𢮍𢮡𢮵𢯉𢯝𢯱𢰅𢰙𢰭𢱁𢱕𢱩𢱽𢲑𢲥𢲹𢳍𢳡𢳵𢴉𢴝𢴱𢵅𢵙𢵭𢶁𢶕𢶩𢶽𢷑𢷥𢷹𢸍𢸡𢸵𢹉𢹝𢹱𢺅𢺙𢺭𢻁𢻕𢻩𢻽𢼑𢼥𢼹𢽍𢽡𢽵𢾉𢾝𢾱𢿅𢿙𢿭𣀁𣀕𣀩𣀽𣁑𣁥𣁹𣂍𣂡𣂵𣃉𣃝𣃱𣄅𣄙𣄭𣅁𣅕𣅩𣅽𣆑", - "encodedString": "8KKnlfCip6nwoqe98KKokfCiqKXwoqi58KKpjfCiqaHwoqm18KKqifCiqp3woqqx8KKrhfCiq5nwoqut8KKsgfCirJXwoqyp8KKsvfCirZHwoq2l8KKtufCiro3woq6h8KKutfCir4nwoq+d8KKvsfCisIXworCZ8KKwrfCisYHworGV8KKxqfCisb3worKR8KKypfCisrnworON8KKzofCis7XworSJ8KK0nfCitLHworWF8KK1mfCita3woraB8KK2lfCitqnwora98KK3kfCit6Xwore58KK4jfCiuKHwori18KK5ifCiuZ3wormx8KK6hfCiupnworqt8KK7gfCiu5Xworup8KK7vfCivJHworyl8KK8ufCivY3wor2h8KK9tfCivonwor6d8KK+sfCiv4Xwor+Z8KK/rfCjgIHwo4CV8KOAqfCjgL3wo4GR8KOBpfCjgbnwo4KN8KOCofCjgrXwo4OJ8KODnfCjg7Hwo4SF8KOEmfCjhK3wo4WB8KOFlfCjhanwo4W98KOGkQ==" + "string" : "𢧕𢧩𢧽𢨑𢨥𢨹𢩍𢩡𢩵𢪉𢪝𢪱𢫅𢫙𢫭𢬁𢬕𢬩𢬽𢭑𢭥𢭹𢮍𢮡𢮵𢯉𢯝𢯱𢰅𢰙𢰭𢱁𢱕𢱩𢱽𢲑𢲥𢲹𢳍𢳡𢳵𢴉𢴝𢴱𢵅𢵙𢵭𢶁𢶕𢶩𢶽𢷑𢷥𢷹𢸍𢸡𢸵𢹉𢹝𢹱𢺅𢺙𢺭𢻁𢻕𢻩𢻽𢼑𢼥𢼹𢽍𢽡𢽵𢾉𢾝𢾱𢿅𢿙𢿭𣀁𣀕𣀩𣀽𣁑𣁥𣁹𣂍𣂡𣂵𣃉𣃝𣃱𣄅𣄙𣄭𣅁𣅕𣅩𣅽𣆑", + "encodedString" : "8KKnlfCip6nwoqe98KKokfCiqKXwoqi58KKpjfCiqaHwoqm18KKqifCiqp3woqqx8KKrhfCiq5nwoqut8KKsgfCirJXwoqyp8KKsvfCirZHwoq2l8KKtufCiro3woq6h8KKutfCir4nwoq+d8KKvsfCisIXworCZ8KKwrfCisYHworGV8KKxqfCisb3worKR8KKypfCisrnworON8KKzofCis7XworSJ8KK0nfCitLHworWF8KK1mfCita3woraB8KK2lfCitqnwora98KK3kfCit6Xwore58KK4jfCiuKHwori18KK5ifCiuZ3wormx8KK6hfCiupnworqt8KK7gfCiu5Xworup8KK7vfCivJHworyl8KK8ufCivY3wor2h8KK9tfCivonwor6d8KK+sfCiv4Xwor+Z8KK/rfCjgIHwo4CV8KOAqfCjgL3wo4GR8KOBpfCjgbnwo4KN8KOCofCjgrXwo4OJ8KODnfCjg7Hwo4SF8KOEmfCjhK3wo4WB8KOFlfCjhanwo4W98KOGkQ==" }, { - "string": "𣆥𣆹𣇍𣇡𣇵𣈉𣈝𣈱𣉅𣉙𣉭𣊁𣊕𣊩𣊽𣋑𣋥𣋹𣌍𣌡𣌵𣍉𣍝𣍱𣎅𣎙𣎭𣏁𣏕𣏩𣏽𣐑𣐥𣐹𣑍𣑡𣑵𣒉𣒝𣒱𣓅𣓙𣓭𣔁𣔕𣔩𣔽𣕑𣕥𣕹𣖍𣖡𣖵𣗉𣗝𣗱𣘅𣘙𣘭𣙁𣙕𣙩𣙽𣚑𣚥𣚹𣛍𣛡𣛵𣜉𣜝𣜱𣝅𣝙𣝭𣞁𣞕𣞩𣞽𣟑𣟥𣟹𣠍𣠡𣠵𣡉𣡝𣡱𣢅𣢙𣢭𣣁𣣕𣣩𣣽𣤑𣤥𣤹𣥍𣥡", - "encodedString": "8KOGpfCjhrnwo4eN8KOHofCjh7Xwo4iJ8KOInfCjiLHwo4mF8KOJmfCjia3wo4qB8KOKlfCjiqnwo4q98KOLkfCji6Xwo4u58KOMjfCjjKHwo4y18KONifCjjZ3wo42x8KOOhfCjjpnwo46t8KOPgfCjj5Xwo4+p8KOPvfCjkJHwo5Cl8KOQufCjkY3wo5Gh8KORtfCjkonwo5Kd8KOSsfCjk4Xwo5OZ8KOTrfCjlIHwo5SV8KOUqfCjlL3wo5WR8KOVpfCjlbnwo5aN8KOWofCjlrXwo5eJ8KOXnfCjl7Hwo5iF8KOYmfCjmK3wo5mB8KOZlfCjmanwo5m98KOakfCjmqXwo5q58KObjfCjm6Hwo5u18KOcifCjnJ3wo5yx8KOdhfCjnZnwo52t8KOegfCjnpXwo56p8KOevfCjn5Hwo5+l8KOfufCjoI3wo6Ch8KOgtfCjoYnwo6Gd8KOhsfCjooXwo6KZ8KOirfCjo4Hwo6OV8KOjqfCjo73wo6SR8KOkpfCjpLnwo6WN8KOloQ==" + "string" : "𣆥𣆹𣇍𣇡𣇵𣈉𣈝𣈱𣉅𣉙𣉭𣊁𣊕𣊩𣊽𣋑𣋥𣋹𣌍𣌡𣌵𣍉𣍝𣍱𣎅𣎙𣎭𣏁𣏕𣏩𣏽𣐑𣐥𣐹𣑍𣑡𣑵𣒉𣒝𣒱𣓅𣓙𣓭𣔁𣔕𣔩𣔽𣕑𣕥𣕹𣖍𣖡𣖵𣗉𣗝𣗱𣘅𣘙𣘭𣙁𣙕𣙩𣙽𣚑𣚥𣚹𣛍𣛡𣛵𣜉𣜝𣜱𣝅𣝙𣝭𣞁𣞕𣞩𣞽𣟑𣟥𣟹𣠍𣠡𣠵𣡉𣡝𣡱𣢅𣢙𣢭𣣁𣣕𣣩𣣽𣤑𣤥𣤹𣥍𣥡", + "encodedString" : "8KOGpfCjhrnwo4eN8KOHofCjh7Xwo4iJ8KOInfCjiLHwo4mF8KOJmfCjia3wo4qB8KOKlfCjiqnwo4q98KOLkfCji6Xwo4u58KOMjfCjjKHwo4y18KONifCjjZ3wo42x8KOOhfCjjpnwo46t8KOPgfCjj5Xwo4+p8KOPvfCjkJHwo5Cl8KOQufCjkY3wo5Gh8KORtfCjkonwo5Kd8KOSsfCjk4Xwo5OZ8KOTrfCjlIHwo5SV8KOUqfCjlL3wo5WR8KOVpfCjlbnwo5aN8KOWofCjlrXwo5eJ8KOXnfCjl7Hwo5iF8KOYmfCjmK3wo5mB8KOZlfCjmanwo5m98KOakfCjmqXwo5q58KObjfCjm6Hwo5u18KOcifCjnJ3wo5yx8KOdhfCjnZnwo52t8KOegfCjnpXwo56p8KOevfCjn5Hwo5+l8KOfufCjoI3wo6Ch8KOgtfCjoYnwo6Gd8KOhsfCjooXwo6KZ8KOirfCjo4Hwo6OV8KOjqfCjo73wo6SR8KOkpfCjpLnwo6WN8KOloQ==" }, { - "string": "𣥵𣦉𣦝𣦱𣧅𣧙𣧭𣨁𣨕𣨩𣨽𣩑𣩥𣩹𣪍𣪡𣪵𣫉𣫝𣫱𣬅𣬙𣬭𣭁𣭕𣭩𣭽𣮑𣮥𣮹𣯍𣯡𣯵𣰉𣰝𣰱𣱅𣱙𣱭𣲁𣲕𣲩𣲽𣳑𣳥𣳹𣴍𣴡𣴵𣵉𣵝𣵱𣶅𣶙𣶭𣷁𣷕𣷩𣷽𣸑𣸥𣸹𣹍𣹡𣹵𣺉𣺝𣺱𣻅𣻙𣻭𣼁𣼕𣼩𣼽𣽑𣽥𣽹𣾍𣾡𣾵𣿉𣿝𣿱𤀅𤀙𤀭𤁁𤁕𤁩𤁽𤂑𤂥𤂹𤃍𤃡𤃵𤄉𤄝𤄱", - "encodedString": "8KOltfCjponwo6ad8KOmsfCjp4Xwo6eZ8KOnrfCjqIHwo6iV8KOoqfCjqL3wo6mR8KOppfCjqbnwo6qN8KOqofCjqrXwo6uJ8KOrnfCjq7Hwo6yF8KOsmfCjrK3wo62B8KOtlfCjranwo6298KOukfCjrqXwo6658KOvjfCjr6Hwo6+18KOwifCjsJ3wo7Cx8KOxhfCjsZnwo7Gt8KOygfCjspXwo7Kp8KOyvfCjs5Hwo7Ol8KOzufCjtI3wo7Sh8KO0tfCjtYnwo7Wd8KO1sfCjtoXwo7aZ8KO2rfCjt4Hwo7eV8KO3qfCjt73wo7iR8KO4pfCjuLnwo7mN8KO5ofCjubXwo7qJ8KO6nfCjurHwo7uF8KO7mfCju63wo7yB8KO8lfCjvKnwo7y98KO9kfCjvaXwo7258KO+jfCjvqHwo7618KO/ifCjv53wo7+x8KSAhfCkgJnwpICt8KSBgfCkgZXwpIGp8KSBvfCkgpHwpIKl8KSCufCkg43wpIOh8KSDtfCkhInwpISd8KSEsQ==" + "string" : "𣥵𣦉𣦝𣦱𣧅𣧙𣧭𣨁𣨕𣨩𣨽𣩑𣩥𣩹𣪍𣪡𣪵𣫉𣫝𣫱𣬅𣬙𣬭𣭁𣭕𣭩𣭽𣮑𣮥𣮹𣯍𣯡𣯵𣰉𣰝𣰱𣱅𣱙𣱭𣲁𣲕𣲩𣲽𣳑𣳥𣳹𣴍𣴡𣴵𣵉𣵝𣵱𣶅𣶙𣶭𣷁𣷕𣷩𣷽𣸑𣸥𣸹𣹍𣹡𣹵𣺉𣺝𣺱𣻅𣻙𣻭𣼁𣼕𣼩𣼽𣽑𣽥𣽹𣾍𣾡𣾵𣿉𣿝𣿱𤀅𤀙𤀭𤁁𤁕𤁩𤁽𤂑𤂥𤂹𤃍𤃡𤃵𤄉𤄝𤄱", + "encodedString" : "8KOltfCjponwo6ad8KOmsfCjp4Xwo6eZ8KOnrfCjqIHwo6iV8KOoqfCjqL3wo6mR8KOppfCjqbnwo6qN8KOqofCjqrXwo6uJ8KOrnfCjq7Hwo6yF8KOsmfCjrK3wo62B8KOtlfCjranwo6298KOukfCjrqXwo6658KOvjfCjr6Hwo6+18KOwifCjsJ3wo7Cx8KOxhfCjsZnwo7Gt8KOygfCjspXwo7Kp8KOyvfCjs5Hwo7Ol8KOzufCjtI3wo7Sh8KO0tfCjtYnwo7Wd8KO1sfCjtoXwo7aZ8KO2rfCjt4Hwo7eV8KO3qfCjt73wo7iR8KO4pfCjuLnwo7mN8KO5ofCjubXwo7qJ8KO6nfCjurHwo7uF8KO7mfCju63wo7yB8KO8lfCjvKnwo7y98KO9kfCjvaXwo7258KO+jfCjvqHwo7618KO/ifCjv53wo7+x8KSAhfCkgJnwpICt8KSBgfCkgZXwpIGp8KSBvfCkgpHwpIKl8KSCufCkg43wpIOh8KSDtfCkhInwpISd8KSEsQ==" }, { - "string": "𤅅𤅙𤅭𤆁𤆕𤆩𤆽𤇑𤇥𤇹𤈍𤈡𤈵𤉉𤉝𤉱𤊅𤊙𤊭𤋁𤋕𤋩𤋽𤌑𤌥𤌹𤍍𤍡𤍵𤎉𤎝𤎱𤏅𤏙𤏭𤐁𤐕𤐩𤐽𤑑𤑥𤑹𤒍𤒡𤒵𤓉𤓝𤓱𤔅𤔙𤔭𤕁𤕕𤕩𤕽𤖑𤖥𤖹𤗍𤗡𤗵𤘉𤘝𤘱𤙅𤙙𤙭𤚁𤚕𤚩𤚽𤛑𤛥𤛹𤜍𤜡𤜵𤝉𤝝𤝱𤞅𤞙𤞭𤟁𤟕𤟩𤟽𤠑𤠥𤠹𤡍𤡡𤡵𤢉𤢝𤢱𤣅𤣙𤣭𤤁", - "encodedString": "8KSFhfCkhZnwpIWt8KSGgfCkhpXwpIap8KSGvfCkh5HwpIel8KSHufCkiI3wpIih8KSItfCkiYnwpImd8KSJsfCkioXwpIqZ8KSKrfCki4HwpIuV8KSLqfCki73wpIyR8KSMpfCkjLnwpI2N8KSNofCkjbXwpI6J8KSOnfCkjrHwpI+F8KSPmfCkj63wpJCB8KSQlfCkkKnwpJC98KSRkfCkkaXwpJG58KSSjfCkkqHwpJK18KSTifCkk53wpJOx8KSUhfCklJnwpJSt8KSVgfCklZXwpJWp8KSVvfCklpHwpJal8KSWufCkl43wpJeh8KSXtfCkmInwpJid8KSYsfCkmYXwpJmZ8KSZrfCkmoHwpJqV8KSaqfCkmr3wpJuR8KSbpfCkm7nwpJyN8KScofCknLXwpJ2J8KSdnfCknbHwpJ6F8KSemfCknq3wpJ+B8KSflfCkn6nwpJ+98KSgkfCkoKXwpKC58KShjfCkoaHwpKG18KSiifCkop3wpKKx8KSjhfCko5nwpKOt8KSkgQ==" + "string" : "𤅅𤅙𤅭𤆁𤆕𤆩𤆽𤇑𤇥𤇹𤈍𤈡𤈵𤉉𤉝𤉱𤊅𤊙𤊭𤋁𤋕𤋩𤋽𤌑𤌥𤌹𤍍𤍡𤍵𤎉𤎝𤎱𤏅𤏙𤏭𤐁𤐕𤐩𤐽𤑑𤑥𤑹𤒍𤒡𤒵𤓉𤓝𤓱𤔅𤔙𤔭𤕁𤕕𤕩𤕽𤖑𤖥𤖹𤗍𤗡𤗵𤘉𤘝𤘱𤙅𤙙𤙭𤚁𤚕𤚩𤚽𤛑𤛥𤛹𤜍𤜡𤜵𤝉𤝝𤝱𤞅𤞙𤞭𤟁𤟕𤟩𤟽𤠑𤠥𤠹𤡍𤡡𤡵𤢉𤢝𤢱𤣅𤣙𤣭𤤁", + "encodedString" : "8KSFhfCkhZnwpIWt8KSGgfCkhpXwpIap8KSGvfCkh5HwpIel8KSHufCkiI3wpIih8KSItfCkiYnwpImd8KSJsfCkioXwpIqZ8KSKrfCki4HwpIuV8KSLqfCki73wpIyR8KSMpfCkjLnwpI2N8KSNofCkjbXwpI6J8KSOnfCkjrHwpI+F8KSPmfCkj63wpJCB8KSQlfCkkKnwpJC98KSRkfCkkaXwpJG58KSSjfCkkqHwpJK18KSTifCkk53wpJOx8KSUhfCklJnwpJSt8KSVgfCklZXwpJWp8KSVvfCklpHwpJal8KSWufCkl43wpJeh8KSXtfCkmInwpJid8KSYsfCkmYXwpJmZ8KSZrfCkmoHwpJqV8KSaqfCkmr3wpJuR8KSbpfCkm7nwpJyN8KScofCknLXwpJ2J8KSdnfCknbHwpJ6F8KSemfCknq3wpJ+B8KSflfCkn6nwpJ+98KSgkfCkoKXwpKC58KShjfCkoaHwpKG18KSiifCkop3wpKKx8KSjhfCko5nwpKOt8KSkgQ==" }, { - "string": "𤤕𤤩𤤽𤥑𤥥𤥹𤦍𤦡𤦵𤧉𤧝𤧱𤨅𤨙𤨭𤩁𤩕𤩩𤩽𤪑𤪥𤪹𤫍𤫡𤫵𤬉𤬝𤬱𤭅𤭙𤭭𤮁𤮕𤮩𤮽𤯑𤯥𤯹𤰍𤰡𤰵𤱉𤱝𤱱𤲅𤲙𤲭𤳁𤳕𤳩𤳽𤴑𤴥𤴹𤵍𤵡𤵵𤶉𤶝𤶱𤷅𤷙𤷭𤸁𤸕𤸩𤸽𤹑𤹥𤹹𤺍𤺡𤺵𤻉𤻝𤻱𤼅𤼙𤼭𤽁𤽕𤽩𤽽𤾑𤾥𤾹𤿍𤿡𤿵𥀉𥀝𥀱𥁅𥁙𥁭𥂁𥂕𥂩𥂽𥃑", - "encodedString": "8KSklfCkpKnwpKS98KSlkfCkpaXwpKW58KSmjfCkpqHwpKa18KSnifCkp53wpKex8KSohfCkqJnwpKit8KSpgfCkqZXwpKmp8KSpvfCkqpHwpKql8KSqufCkq43wpKuh8KSrtfCkrInwpKyd8KSssfCkrYXwpK2Z8KStrfCkroHwpK6V8KSuqfCkrr3wpK+R8KSvpfCkr7nwpLCN8KSwofCksLXwpLGJ8KSxnfCksbHwpLKF8KSymfCksq3wpLOB8KSzlfCks6nwpLO98KS0kfCktKXwpLS58KS1jfCktaHwpLW18KS2ifCktp3wpLax8KS3hfCkt5nwpLet8KS4gfCkuJXwpLip8KS4vfCkuZHwpLml8KS5ufCkuo3wpLqh8KS6tfCku4nwpLud8KS7sfCkvIXwpLyZ8KS8rfCkvYHwpL2V8KS9qfCkvb3wpL6R8KS+pfCkvrnwpL+N8KS/ofCkv7XwpYCJ8KWAnfClgLHwpYGF8KWBmfClga3wpYKB8KWClfClgqnwpYK98KWDkQ==" + "string" : "𤤕𤤩𤤽𤥑𤥥𤥹𤦍𤦡𤦵𤧉𤧝𤧱𤨅𤨙𤨭𤩁𤩕𤩩𤩽𤪑𤪥𤪹𤫍𤫡𤫵𤬉𤬝𤬱𤭅𤭙𤭭𤮁𤮕𤮩𤮽𤯑𤯥𤯹𤰍𤰡𤰵𤱉𤱝𤱱𤲅𤲙𤲭𤳁𤳕𤳩𤳽𤴑𤴥𤴹𤵍𤵡𤵵𤶉𤶝𤶱𤷅𤷙𤷭𤸁𤸕𤸩𤸽𤹑𤹥𤹹𤺍𤺡𤺵𤻉𤻝𤻱𤼅𤼙𤼭𤽁𤽕𤽩𤽽𤾑𤾥𤾹𤿍𤿡𤿵𥀉𥀝𥀱𥁅𥁙𥁭𥂁𥂕𥂩𥂽𥃑", + "encodedString" : "8KSklfCkpKnwpKS98KSlkfCkpaXwpKW58KSmjfCkpqHwpKa18KSnifCkp53wpKex8KSohfCkqJnwpKit8KSpgfCkqZXwpKmp8KSpvfCkqpHwpKql8KSqufCkq43wpKuh8KSrtfCkrInwpKyd8KSssfCkrYXwpK2Z8KStrfCkroHwpK6V8KSuqfCkrr3wpK+R8KSvpfCkr7nwpLCN8KSwofCksLXwpLGJ8KSxnfCksbHwpLKF8KSymfCksq3wpLOB8KSzlfCks6nwpLO98KS0kfCktKXwpLS58KS1jfCktaHwpLW18KS2ifCktp3wpLax8KS3hfCkt5nwpLet8KS4gfCkuJXwpLip8KS4vfCkuZHwpLml8KS5ufCkuo3wpLqh8KS6tfCku4nwpLud8KS7sfCkvIXwpLyZ8KS8rfCkvYHwpL2V8KS9qfCkvb3wpL6R8KS+pfCkvrnwpL+N8KS/ofCkv7XwpYCJ8KWAnfClgLHwpYGF8KWBmfClga3wpYKB8KWClfClgqnwpYK98KWDkQ==" }, { - "string": "𥃥𥃹𥄍𥄡𥄵𥅉𥅝𥅱𥆅𥆙𥆭𥇁𥇕𥇩𥇽𥈑𥈥𥈹𥉍𥉡𥉵𥊉𥊝𥊱𥋅𥋙𥋭𥌁𥌕𥌩𥌽𥍑𥍥𥍹𥎍𥎡𥎵𥏉𥏝𥏱𥐅𥐙𥐭𥑁𥑕𥑩𥑽𥒑𥒥𥒹𥓍𥓡𥓵𥔉𥔝𥔱𥕅𥕙𥕭𥖁𥖕𥖩𥖽𥗑𥗥𥗹𥘍𥘡𥘵𥙉𥙝𥙱𥚅𥚙𥚭𥛁𥛕𥛩𥛽𥜑𥜥𥜹𥝍𥝡𥝵𥞉𥞝𥞱𥟅𥟙𥟭𥠁𥠕𥠩𥠽𥡑𥡥𥡹𥢍𥢡", - "encodedString": "8KWDpfClg7nwpYSN8KWEofClhLXwpYWJ8KWFnfClhbHwpYaF8KWGmfClhq3wpYeB8KWHlfClh6nwpYe98KWIkfCliKXwpYi58KWJjfCliaHwpYm18KWKifClip3wpYqx8KWLhfCli5nwpYut8KWMgfCljJXwpYyp8KWMvfCljZHwpY2l8KWNufCljo3wpY6h8KWOtfClj4nwpY+d8KWPsfClkIXwpZCZ8KWQrfClkYHwpZGV8KWRqfClkb3wpZKR8KWSpfClkrnwpZON8KWTofClk7XwpZSJ8KWUnfCllLHwpZWF8KWVmfClla3wpZaB8KWWlfCllqnwpZa98KWXkfCll6XwpZe58KWYjfClmKHwpZi18KWZifClmZ3wpZmx8KWahfClmpnwpZqt8KWbgfClm5XwpZup8KWbvfClnJHwpZyl8KWcufClnY3wpZ2h8KWdtfClnonwpZ6d8KWesfCln4XwpZ+Z8KWfrfCloIHwpaCV8KWgqfCloL3wpaGR8KWhpfClobnwpaKN8KWioQ==" + "string" : "𥃥𥃹𥄍𥄡𥄵𥅉𥅝𥅱𥆅𥆙𥆭𥇁𥇕𥇩𥇽𥈑𥈥𥈹𥉍𥉡𥉵𥊉𥊝𥊱𥋅𥋙𥋭𥌁𥌕𥌩𥌽𥍑𥍥𥍹𥎍𥎡𥎵𥏉𥏝𥏱𥐅𥐙𥐭𥑁𥑕𥑩𥑽𥒑𥒥𥒹𥓍𥓡𥓵𥔉𥔝𥔱𥕅𥕙𥕭𥖁𥖕𥖩𥖽𥗑𥗥𥗹𥘍𥘡𥘵𥙉𥙝𥙱𥚅𥚙𥚭𥛁𥛕𥛩𥛽𥜑𥜥𥜹𥝍𥝡𥝵𥞉𥞝𥞱𥟅𥟙𥟭𥠁𥠕𥠩𥠽𥡑𥡥𥡹𥢍𥢡", + "encodedString" : "8KWDpfClg7nwpYSN8KWEofClhLXwpYWJ8KWFnfClhbHwpYaF8KWGmfClhq3wpYeB8KWHlfClh6nwpYe98KWIkfCliKXwpYi58KWJjfCliaHwpYm18KWKifClip3wpYqx8KWLhfCli5nwpYut8KWMgfCljJXwpYyp8KWMvfCljZHwpY2l8KWNufCljo3wpY6h8KWOtfClj4nwpY+d8KWPsfClkIXwpZCZ8KWQrfClkYHwpZGV8KWRqfClkb3wpZKR8KWSpfClkrnwpZON8KWTofClk7XwpZSJ8KWUnfCllLHwpZWF8KWVmfClla3wpZaB8KWWlfCllqnwpZa98KWXkfCll6XwpZe58KWYjfClmKHwpZi18KWZifClmZ3wpZmx8KWahfClmpnwpZqt8KWbgfClm5XwpZup8KWbvfClnJHwpZyl8KWcufClnY3wpZ2h8KWdtfClnonwpZ6d8KWesfCln4XwpZ+Z8KWfrfCloIHwpaCV8KWgqfCloL3wpaGR8KWhpfClobnwpaKN8KWioQ==" }, { - "string": "𥢵𥣉𥣝𥣱𥤅𥤙𥤭𥥁𥥕𥥩𥥽𥦑𥦥𥦹𥧍𥧡𥧵𥨉𥨝𥨱𥩅𥩙𥩭𥪁𥪕𥪩𥪽𥫑𥫥𥫹𥬍𥬡𥬵𥭉𥭝𥭱𥮅𥮙𥮭𥯁𥯕𥯩𥯽𥰑𥰥𥰹𥱍𥱡𥱵𥲉𥲝𥲱𥳅𥳙𥳭𥴁𥴕𥴩𥴽𥵑𥵥𥵹𥶍𥶡𥶵𥷉𥷝𥷱𥸅𥸙𥸭𥹁𥹕𥹩𥹽𥺑𥺥𥺹𥻍𥻡𥻵𥼉𥼝𥼱𥽅𥽙𥽭𥾁𥾕𥾩𥾽𥿑𥿥𥿹𦀍𦀡𦀵𦁉𦁝𦁱", - "encodedString": "8KWitfClo4nwpaOd8KWjsfClpIXwpaSZ8KWkrfClpYHwpaWV8KWlqfClpb3wpaaR8KWmpfClprnwpaeN8KWnofClp7XwpaiJ8KWonfClqLHwpamF8KWpmfClqa3wpaqB8KWqlfClqqnwpaq98KWrkfClq6Xwpau58KWsjfClrKHwpay18KWtifClrZ3wpa2x8KWuhfClrpnwpa6t8KWvgfClr5Xwpa+p8KWvvfClsJHwpbCl8KWwufClsY3wpbGh8KWxtfClsonwpbKd8KWysfCls4XwpbOZ8KWzrfCltIHwpbSV8KW0qfCltL3wpbWR8KW1pfCltbnwpbaN8KW2ofCltrXwpbeJ8KW3nfClt7HwpbiF8KW4mfCluK3wpbmB8KW5lfCluanwpbm98KW6kfCluqXwpbq58KW7jfClu6Hwpbu18KW8ifClvJ3wpbyx8KW9hfClvZnwpb2t8KW+gfClvpXwpb6p8KW+vfClv5Hwpb+l8KW/ufCmgI3wpoCh8KaAtfCmgYnwpoGd8KaBsQ==" + "string" : "𥢵𥣉𥣝𥣱𥤅𥤙𥤭𥥁𥥕𥥩𥥽𥦑𥦥𥦹𥧍𥧡𥧵𥨉𥨝𥨱𥩅𥩙𥩭𥪁𥪕𥪩𥪽𥫑𥫥𥫹𥬍𥬡𥬵𥭉𥭝𥭱𥮅𥮙𥮭𥯁𥯕𥯩𥯽𥰑𥰥𥰹𥱍𥱡𥱵𥲉𥲝𥲱𥳅𥳙𥳭𥴁𥴕𥴩𥴽𥵑𥵥𥵹𥶍𥶡𥶵𥷉𥷝𥷱𥸅𥸙𥸭𥹁𥹕𥹩𥹽𥺑𥺥𥺹𥻍𥻡𥻵𥼉𥼝𥼱𥽅𥽙𥽭𥾁𥾕𥾩𥾽𥿑𥿥𥿹𦀍𦀡𦀵𦁉𦁝𦁱", + "encodedString" : "8KWitfClo4nwpaOd8KWjsfClpIXwpaSZ8KWkrfClpYHwpaWV8KWlqfClpb3wpaaR8KWmpfClprnwpaeN8KWnofClp7XwpaiJ8KWonfClqLHwpamF8KWpmfClqa3wpaqB8KWqlfClqqnwpaq98KWrkfClq6Xwpau58KWsjfClrKHwpay18KWtifClrZ3wpa2x8KWuhfClrpnwpa6t8KWvgfClr5Xwpa+p8KWvvfClsJHwpbCl8KWwufClsY3wpbGh8KWxtfClsonwpbKd8KWysfCls4XwpbOZ8KWzrfCltIHwpbSV8KW0qfCltL3wpbWR8KW1pfCltbnwpbaN8KW2ofCltrXwpbeJ8KW3nfClt7HwpbiF8KW4mfCluK3wpbmB8KW5lfCluanwpbm98KW6kfCluqXwpbq58KW7jfClu6Hwpbu18KW8ifClvJ3wpbyx8KW9hfClvZnwpb2t8KW+gfClvpXwpb6p8KW+vfClv5Hwpb+l8KW/ufCmgI3wpoCh8KaAtfCmgYnwpoGd8KaBsQ==" }, { - "string": "𦂅𦂙𦂭𦃁𦃕𦃩𦃽𦄑𦄥𦄹𦅍𦅡𦅵𦆉𦆝𦆱𦇅𦇙𦇭𦈁𦈕𦈩𦈽𦉑𦉥𦉹𦊍𦊡𦊵𦋉𦋝𦋱𦌅𦌙𦌭𦍁𦍕𦍩𦍽𦎑𦎥𦎹𦏍𦏡𦏵𦐉𦐝𦐱𦑅𦑙𦑭𦒁𦒕𦒩𦒽𦓑𦓥𦓹𦔍𦔡𦔵𦕉𦕝𦕱𦖅𦖙𦖭𦗁𦗕𦗩𦗽𦘑𦘥𦘹𦙍𦙡𦙵𦚉𦚝𦚱𦛅𦛙𦛭𦜁𦜕𦜩𦜽𦝑𦝥𦝹𦞍𦞡𦞵𦟉𦟝𦟱𦠅𦠙𦠭𦡁", - "encodedString": "8KaChfCmgpnwpoKt8KaDgfCmg5XwpoOp8KaDvfCmhJHwpoSl8KaEufCmhY3wpoWh8KaFtfCmhonwpoad8KaGsfCmh4XwpoeZ8KaHrfCmiIHwpoiV8KaIqfCmiL3wpomR8KaJpfCmibnwpoqN8KaKofCmirXwpouJ8KaLnfCmi7HwpoyF8KaMmfCmjK3wpo2B8KaNlfCmjanwpo298KaOkfCmjqXwpo658KaPjfCmj6Hwpo+18KaQifCmkJ3wppCx8KaRhfCmkZnwppGt8KaSgfCmkpXwppKp8KaSvfCmk5HwppOl8KaTufCmlI3wppSh8KaUtfCmlYnwppWd8KaVsfCmloXwppaZ8KaWrfCml4HwppeV8KaXqfCml73wppiR8KaYpfCmmLnwppmN8KaZofCmmbXwppqJ8KaanfCmmrHwppuF8KabmfCmm63wppyB8KaclfCmnKnwppy98KadkfCmnaXwpp258KaejfCmnqHwpp618KafifCmn53wpp+x8KaghfCmoJnwpqCt8KahgQ==" + "string" : "𦂅𦂙𦂭𦃁𦃕𦃩𦃽𦄑𦄥𦄹𦅍𦅡𦅵𦆉𦆝𦆱𦇅𦇙𦇭𦈁𦈕𦈩𦈽𦉑𦉥𦉹𦊍𦊡𦊵𦋉𦋝𦋱𦌅𦌙𦌭𦍁𦍕𦍩𦍽𦎑𦎥𦎹𦏍𦏡𦏵𦐉𦐝𦐱𦑅𦑙𦑭𦒁𦒕𦒩𦒽𦓑𦓥𦓹𦔍𦔡𦔵𦕉𦕝𦕱𦖅𦖙𦖭𦗁𦗕𦗩𦗽𦘑𦘥𦘹𦙍𦙡𦙵𦚉𦚝𦚱𦛅𦛙𦛭𦜁𦜕𦜩𦜽𦝑𦝥𦝹𦞍𦞡𦞵𦟉𦟝𦟱𦠅𦠙𦠭𦡁", + "encodedString" : "8KaChfCmgpnwpoKt8KaDgfCmg5XwpoOp8KaDvfCmhJHwpoSl8KaEufCmhY3wpoWh8KaFtfCmhonwpoad8KaGsfCmh4XwpoeZ8KaHrfCmiIHwpoiV8KaIqfCmiL3wpomR8KaJpfCmibnwpoqN8KaKofCmirXwpouJ8KaLnfCmi7HwpoyF8KaMmfCmjK3wpo2B8KaNlfCmjanwpo298KaOkfCmjqXwpo658KaPjfCmj6Hwpo+18KaQifCmkJ3wppCx8KaRhfCmkZnwppGt8KaSgfCmkpXwppKp8KaSvfCmk5HwppOl8KaTufCmlI3wppSh8KaUtfCmlYnwppWd8KaVsfCmloXwppaZ8KaWrfCml4HwppeV8KaXqfCml73wppiR8KaYpfCmmLnwppmN8KaZofCmmbXwppqJ8KaanfCmmrHwppuF8KabmfCmm63wppyB8KaclfCmnKnwppy98KadkfCmnaXwpp258KaejfCmnqHwpp618KafifCmn53wpp+x8KaghfCmoJnwpqCt8KahgQ==" }, { - "string": "𦡕𦡩𦡽𦢑𦢥𦢹𦣍𦣡𦣵𦤉𦤝𦤱𦥅𦥙𦥭𦦁𦦕𦦩𦦽𦧑𦧥𦧹𦨍𦨡𦨵𦩉𦩝𦩱𦪅𦪙𦪭𦫁𦫕𦫩𦫽𦬑𦬥𦬹𦭍𦭡𦭵𦮉𦮝𦮱𦯅𦯙𦯭𦰁𦰕𦰩𦰽𦱑𦱥𦱹𦲍𦲡𦲵𦳉𦳝𦳱𦴅𦴙𦴭𦵁𦵕𦵩𦵽𦶑𦶥𦶹𦷍𦷡𦷵𦸉𦸝𦸱𦹅𦹙𦹭𦺁𦺕𦺩𦺽𦻑𦻥𦻹𦼍𦼡𦼵𦽉𦽝𦽱𦾅𦾙𦾭𦿁𦿕𦿩𦿽𧀑", - "encodedString": "8KahlfCmoanwpqG98KaikfCmoqXwpqK58KajjfCmo6HwpqO18KakifCmpJ3wpqSx8KalhfCmpZnwpqWt8KamgfCmppXwpqap8KamvfCmp5Hwpqel8KanufCmqI3wpqih8KaotfCmqYnwpqmd8KapsfCmqoXwpqqZ8KaqrfCmq4HwpquV8KarqfCmq73wpqyR8KaspfCmrLnwpq2N8KatofCmrbXwpq6J8KaunfCmrrHwpq+F8KavmfCmr63wprCB8KawlfCmsKnwprC98KaxkfCmsaXwprG58KayjfCmsqHwprK18KazifCms53wprOx8Ka0hfCmtJnwprSt8Ka1gfCmtZXwprWp8Ka1vfCmtpHwpral8Ka2ufCmt43wpreh8Ka3tfCmuInwprid8Ka4sfCmuYXwprmZ8Ka5rfCmuoHwprqV8Ka6qfCmur3wpruR8Ka7pfCmu7nwpryN8Ka8ofCmvLXwpr2J8Ka9nfCmvbHwpr6F8Ka+mfCmvq3wpr+B8Ka/lfCmv6nwpr+98KeAkQ==" + "string" : "𦡕𦡩𦡽𦢑𦢥𦢹𦣍𦣡𦣵𦤉𦤝𦤱𦥅𦥙𦥭𦦁𦦕𦦩𦦽𦧑𦧥𦧹𦨍𦨡𦨵𦩉𦩝𦩱𦪅𦪙𦪭𦫁𦫕𦫩𦫽𦬑𦬥𦬹𦭍𦭡𦭵𦮉𦮝𦮱𦯅𦯙𦯭𦰁𦰕𦰩𦰽𦱑𦱥𦱹𦲍𦲡𦲵𦳉𦳝𦳱𦴅𦴙𦴭𦵁𦵕𦵩𦵽𦶑𦶥𦶹𦷍𦷡𦷵𦸉𦸝𦸱𦹅𦹙𦹭𦺁𦺕𦺩𦺽𦻑𦻥𦻹𦼍𦼡𦼵𦽉𦽝𦽱𦾅𦾙𦾭𦿁𦿕𦿩𦿽𧀑", + "encodedString" : "8KahlfCmoanwpqG98KaikfCmoqXwpqK58KajjfCmo6HwpqO18KakifCmpJ3wpqSx8KalhfCmpZnwpqWt8KamgfCmppXwpqap8KamvfCmp5Hwpqel8KanufCmqI3wpqih8KaotfCmqYnwpqmd8KapsfCmqoXwpqqZ8KaqrfCmq4HwpquV8KarqfCmq73wpqyR8KaspfCmrLnwpq2N8KatofCmrbXwpq6J8KaunfCmrrHwpq+F8KavmfCmr63wprCB8KawlfCmsKnwprC98KaxkfCmsaXwprG58KayjfCmsqHwprK18KazifCms53wprOx8Ka0hfCmtJnwprSt8Ka1gfCmtZXwprWp8Ka1vfCmtpHwpral8Ka2ufCmt43wpreh8Ka3tfCmuInwprid8Ka4sfCmuYXwprmZ8Ka5rfCmuoHwprqV8Ka6qfCmur3wpruR8Ka7pfCmu7nwpryN8Ka8ofCmvLXwpr2J8Ka9nfCmvbHwpr6F8Ka+mfCmvq3wpr+B8Ka/lfCmv6nwpr+98KeAkQ==" }, { - "string": "𧀥𧀹𧁍𧁡𧁵𧂉𧂝𧂱𧃅𧃙𧃭𧄁𧄕𧄩𧄽𧅑𧅥𧅹𧆍𧆡𧆵𧇉𧇝𧇱𧈅𧈙𧈭𧉁𧉕𧉩𧉽𧊑𧊥𧊹𧋍𧋡𧋵𧌉𧌝𧌱𧍅𧍙𧍭𧎁𧎕𧎩𧎽𧏑𧏥𧏹𧐍𧐡𧐵𧑉𧑝𧑱𧒅𧒙𧒭𧓁𧓕𧓩𧓽𧔑𧔥𧔹𧕍𧕡𧕵𧖉𧖝𧖱𧗅𧗙𧗭𧘁𧘕𧘩𧘽𧙑𧙥𧙹𧚍𧚡𧚵𧛉𧛝𧛱𧜅𧜙𧜭𧝁𧝕𧝩𧝽𧞑𧞥𧞹𧟍𧟡", - "encodedString": "8KeApfCngLnwp4GN8KeBofCngbXwp4KJ8KeCnfCngrHwp4OF8KeDmfCng63wp4SB8KeElfCnhKnwp4S98KeFkfCnhaXwp4W58KeGjfCnhqHwp4a18KeHifCnh53wp4ex8KeIhfCniJnwp4it8KeJgfCniZXwp4mp8KeJvfCnipHwp4ql8KeKufCni43wp4uh8KeLtfCnjInwp4yd8KeMsfCnjYXwp42Z8KeNrfCnjoHwp46V8KeOqfCnjr3wp4+R8KePpfCnj7nwp5CN8KeQofCnkLXwp5GJ8KeRnfCnkbHwp5KF8KeSmfCnkq3wp5OB8KeTlfCnk6nwp5O98KeUkfCnlKXwp5S58KeVjfCnlaHwp5W18KeWifCnlp3wp5ax8KeXhfCnl5nwp5et8KeYgfCnmJXwp5ip8KeYvfCnmZHwp5ml8KeZufCnmo3wp5qh8KeatfCnm4nwp5ud8KebsfCnnIXwp5yZ8KecrfCnnYHwp52V8KedqfCnnb3wp56R8KeepfCnnrnwp5+N8KefoQ==" + "string" : "𧀥𧀹𧁍𧁡𧁵𧂉𧂝𧂱𧃅𧃙𧃭𧄁𧄕𧄩𧄽𧅑𧅥𧅹𧆍𧆡𧆵𧇉𧇝𧇱𧈅𧈙𧈭𧉁𧉕𧉩𧉽𧊑𧊥𧊹𧋍𧋡𧋵𧌉𧌝𧌱𧍅𧍙𧍭𧎁𧎕𧎩𧎽𧏑𧏥𧏹𧐍𧐡𧐵𧑉𧑝𧑱𧒅𧒙𧒭𧓁𧓕𧓩𧓽𧔑𧔥𧔹𧕍𧕡𧕵𧖉𧖝𧖱𧗅𧗙𧗭𧘁𧘕𧘩𧘽𧙑𧙥𧙹𧚍𧚡𧚵𧛉𧛝𧛱𧜅𧜙𧜭𧝁𧝕𧝩𧝽𧞑𧞥𧞹𧟍𧟡", + "encodedString" : "8KeApfCngLnwp4GN8KeBofCngbXwp4KJ8KeCnfCngrHwp4OF8KeDmfCng63wp4SB8KeElfCnhKnwp4S98KeFkfCnhaXwp4W58KeGjfCnhqHwp4a18KeHifCnh53wp4ex8KeIhfCniJnwp4it8KeJgfCniZXwp4mp8KeJvfCnipHwp4ql8KeKufCni43wp4uh8KeLtfCnjInwp4yd8KeMsfCnjYXwp42Z8KeNrfCnjoHwp46V8KeOqfCnjr3wp4+R8KePpfCnj7nwp5CN8KeQofCnkLXwp5GJ8KeRnfCnkbHwp5KF8KeSmfCnkq3wp5OB8KeTlfCnk6nwp5O98KeUkfCnlKXwp5S58KeVjfCnlaHwp5W18KeWifCnlp3wp5ax8KeXhfCnl5nwp5et8KeYgfCnmJXwp5ip8KeYvfCnmZHwp5ml8KeZufCnmo3wp5qh8KeatfCnm4nwp5ud8KebsfCnnIXwp5yZ8KecrfCnnYHwp52V8KedqfCnnb3wp56R8KeepfCnnrnwp5+N8KefoQ==" }, { - "string": "𧟵𧠉𧠝𧠱𧡅𧡙𧡭𧢁𧢕𧢩𧢽𧣑𧣥𧣹𧤍𧤡𧤵𧥉𧥝𧥱𧦅𧦙𧦭𧧁𧧕𧧩𧧽𧨑𧨥𧨹𧩍𧩡𧩵𧪉𧪝𧪱𧫅𧫙𧫭𧬁𧬕𧬩𧬽𧭑𧭥𧭹𧮍𧮡𧮵𧯉𧯝𧯱𧰅𧰙𧰭𧱁𧱕𧱩𧱽𧲑𧲥𧲹𧳍𧳡𧳵𧴉𧴝𧴱𧵅𧵙𧵭𧶁𧶕𧶩𧶽𧷑𧷥𧷹𧸍𧸡𧸵𧹉𧹝𧹱𧺅𧺙𧺭𧻁𧻕𧻩𧻽𧼑𧼥𧼹𧽍𧽡𧽵𧾉𧾝𧾱", - "encodedString": "8KeftfCnoInwp6Cd8KegsfCnoYXwp6GZ8KehrfCnooHwp6KV8KeiqfCnor3wp6OR8KejpfCno7nwp6SN8KekofCnpLXwp6WJ8KelnfCnpbHwp6aF8KemmfCnpq3wp6eB8KenlfCnp6nwp6e98KeokfCnqKXwp6i58KepjfCnqaHwp6m18KeqifCnqp3wp6qx8KerhfCnq5nwp6ut8KesgfCnrJXwp6yp8KesvfCnrZHwp62l8KetufCnro3wp66h8KeutfCnr4nwp6+d8KevsfCnsIXwp7CZ8KewrfCnsYHwp7GV8KexqfCnsb3wp7KR8KeypfCnsrnwp7ON8KezofCns7Xwp7SJ8Ke0nfCntLHwp7WF8Ke1mfCnta3wp7aB8Ke2lfCntqnwp7a98Ke3kfCnt6Xwp7e58Ke4jfCnuKHwp7i18Ke5ifCnuZ3wp7mx8Ke6hfCnupnwp7qt8Ke7gfCnu5Xwp7up8Ke7vfCnvJHwp7yl8Ke8ufCnvY3wp72h8Ke9tfCnvonwp76d8Ke+sQ==" + "string" : "𧟵𧠉𧠝𧠱𧡅𧡙𧡭𧢁𧢕𧢩𧢽𧣑𧣥𧣹𧤍𧤡𧤵𧥉𧥝𧥱𧦅𧦙𧦭𧧁𧧕𧧩𧧽𧨑𧨥𧨹𧩍𧩡𧩵𧪉𧪝𧪱𧫅𧫙𧫭𧬁𧬕𧬩𧬽𧭑𧭥𧭹𧮍𧮡𧮵𧯉𧯝𧯱𧰅𧰙𧰭𧱁𧱕𧱩𧱽𧲑𧲥𧲹𧳍𧳡𧳵𧴉𧴝𧴱𧵅𧵙𧵭𧶁𧶕𧶩𧶽𧷑𧷥𧷹𧸍𧸡𧸵𧹉𧹝𧹱𧺅𧺙𧺭𧻁𧻕𧻩𧻽𧼑𧼥𧼹𧽍𧽡𧽵𧾉𧾝𧾱", + "encodedString" : "8KeftfCnoInwp6Cd8KegsfCnoYXwp6GZ8KehrfCnooHwp6KV8KeiqfCnor3wp6OR8KejpfCno7nwp6SN8KekofCnpLXwp6WJ8KelnfCnpbHwp6aF8KemmfCnpq3wp6eB8KenlfCnp6nwp6e98KeokfCnqKXwp6i58KepjfCnqaHwp6m18KeqifCnqp3wp6qx8KerhfCnq5nwp6ut8KesgfCnrJXwp6yp8KesvfCnrZHwp62l8KetufCnro3wp66h8KeutfCnr4nwp6+d8KevsfCnsIXwp7CZ8KewrfCnsYHwp7GV8KexqfCnsb3wp7KR8KeypfCnsrnwp7ON8KezofCns7Xwp7SJ8Ke0nfCntLHwp7WF8Ke1mfCnta3wp7aB8Ke2lfCntqnwp7a98Ke3kfCnt6Xwp7e58Ke4jfCnuKHwp7i18Ke5ifCnuZ3wp7mx8Ke6hfCnupnwp7qt8Ke7gfCnu5Xwp7up8Ke7vfCnvJHwp7yl8Ke8ufCnvY3wp72h8Ke9tfCnvonwp76d8Ke+sQ==" }, { - "string": "𧿅𧿙𧿭𨀁𨀕𨀩𨀽𨁑𨁥𨁹𨂍𨂡𨂵𨃉𨃝𨃱𨄅𨄙𨄭𨅁𨅕𨅩𨅽𨆑𨆥𨆹𨇍𨇡𨇵𨈉𨈝𨈱𨉅𨉙𨉭𨊁𨊕𨊩𨊽𨋑𨋥𨋹𨌍𨌡𨌵𨍉𨍝𨍱𨎅𨎙𨎭𨏁𨏕𨏩𨏽𨐑𨐥𨐹𨑍𨑡𨑵𨒉𨒝𨒱𨓅𨓙𨓭𨔁𨔕𨔩𨔽𨕑𨕥𨕹𨖍𨖡𨖵𨗉𨗝𨗱𨘅𨘙𨘭𨙁𨙕𨙩𨙽𨚑𨚥𨚹𨛍𨛡𨛵𨜉𨜝𨜱𨝅𨝙𨝭𨞁", - "encodedString": "8Ke/hfCnv5nwp7+t8KiAgfCogJXwqICp8KiAvfCogZHwqIGl8KiBufCogo3wqIKh8KiCtfCog4nwqIOd8KiDsfCohIXwqISZ8KiErfCohYHwqIWV8KiFqfCohb3wqIaR8KiGpfCohrnwqIeN8KiHofCoh7XwqIiJ8KiInfCoiLHwqImF8KiJmfCoia3wqIqB8KiKlfCoiqnwqIq98KiLkfCoi6XwqIu58KiMjfCojKHwqIy18KiNifCojZ3wqI2x8KiOhfCojpnwqI6t8KiPgfCoj5XwqI+p8KiPvfCokJHwqJCl8KiQufCokY3wqJGh8KiRtfCokonwqJKd8KiSsfCok4XwqJOZ8KiTrfColIHwqJSV8KiUqfColL3wqJWR8KiVpfColbnwqJaN8KiWofColrXwqJeJ8KiXnfCol7HwqJiF8KiYmfComK3wqJmB8KiZlfComanwqJm98KiakfComqXwqJq58KibjfCom6HwqJu18KicifConJ3wqJyx8KidhfConZnwqJ2t8KiegQ==" + "string" : "𧿅𧿙𧿭𨀁𨀕𨀩𨀽𨁑𨁥𨁹𨂍𨂡𨂵𨃉𨃝𨃱𨄅𨄙𨄭𨅁𨅕𨅩𨅽𨆑𨆥𨆹𨇍𨇡𨇵𨈉𨈝𨈱𨉅𨉙𨉭𨊁𨊕𨊩𨊽𨋑𨋥𨋹𨌍𨌡𨌵𨍉𨍝𨍱𨎅𨎙𨎭𨏁𨏕𨏩𨏽𨐑𨐥𨐹𨑍𨑡𨑵𨒉𨒝𨒱𨓅𨓙𨓭𨔁𨔕𨔩𨔽𨕑𨕥𨕹𨖍𨖡𨖵𨗉𨗝𨗱𨘅𨘙𨘭𨙁𨙕𨙩𨙽𨚑𨚥𨚹𨛍𨛡𨛵𨜉𨜝𨜱𨝅𨝙𨝭𨞁", + "encodedString" : "8Ke/hfCnv5nwp7+t8KiAgfCogJXwqICp8KiAvfCogZHwqIGl8KiBufCogo3wqIKh8KiCtfCog4nwqIOd8KiDsfCohIXwqISZ8KiErfCohYHwqIWV8KiFqfCohb3wqIaR8KiGpfCohrnwqIeN8KiHofCoh7XwqIiJ8KiInfCoiLHwqImF8KiJmfCoia3wqIqB8KiKlfCoiqnwqIq98KiLkfCoi6XwqIu58KiMjfCojKHwqIy18KiNifCojZ3wqI2x8KiOhfCojpnwqI6t8KiPgfCoj5XwqI+p8KiPvfCokJHwqJCl8KiQufCokY3wqJGh8KiRtfCokonwqJKd8KiSsfCok4XwqJOZ8KiTrfColIHwqJSV8KiUqfColL3wqJWR8KiVpfColbnwqJaN8KiWofColrXwqJeJ8KiXnfCol7HwqJiF8KiYmfComK3wqJmB8KiZlfComanwqJm98KiakfComqXwqJq58KibjfCom6HwqJu18KicifConJ3wqJyx8KidhfConZnwqJ2t8KiegQ==" }, { - "string": "𨞕𨞩𨞽𨟑𨟥𨟹𨠍𨠡𨠵𨡉𨡝𨡱𨢅𨢙𨢭𨣁𨣕𨣩𨣽𨤑𨤥𨤹𨥍𨥡𨥵𨦉𨦝𨦱𨧅𨧙𨧭𨨁𨨕𨨩𨨽𨩑𨩥𨩹𨪍𨪡𨪵𨫉𨫝𨫱𨬅𨬙𨬭𨭁𨭕𨭩𨭽𨮑𨮥𨮹𨯍𨯡𨯵𨰉𨰝𨰱𨱅𨱙𨱭𨲁𨲕𨲩𨲽𨳑𨳥𨳹𨴍𨴡𨴵𨵉𨵝𨵱𨶅𨶙𨶭𨷁𨷕𨷩𨷽𨸑𨸥𨸹𨹍𨹡𨹵𨺉𨺝𨺱𨻅𨻙𨻭𨼁𨼕𨼩𨼽𨽑", - "encodedString": "8KielfConqnwqJ698KifkfCon6XwqJ+58KigjfCooKHwqKC18KihifCooZ3wqKGx8KiihfCoopnwqKKt8KijgfCoo5XwqKOp8KijvfCopJHwqKSl8KikufCopY3wqKWh8KiltfCoponwqKad8KimsfCop4XwqKeZ8KinrfCoqIHwqKiV8KioqfCoqL3wqKmR8KippfCoqbnwqKqN8KiqofCoqrXwqKuJ8KirnfCoq7HwqKyF8KismfCorK3wqK2B8KitlfCoranwqK298KiukfCorqXwqK658KivjfCor6HwqK+18KiwifCosJ3wqLCx8KixhfCosZnwqLGt8KiygfCospXwqLKp8KiyvfCos5HwqLOl8KizufCotI3wqLSh8Ki0tfCotYnwqLWd8Ki1sfCotoXwqLaZ8Ki2rfCot4HwqLeV8Ki3qfCot73wqLiR8Ki4pfCouLnwqLmN8Ki5ofCoubXwqLqJ8Ki6nfCourHwqLuF8Ki7mfCou63wqLyB8Ki8lfCovKnwqLy98Ki9kQ==" + "string" : "𨞕𨞩𨞽𨟑𨟥𨟹𨠍𨠡𨠵𨡉𨡝𨡱𨢅𨢙𨢭𨣁𨣕𨣩𨣽𨤑𨤥𨤹𨥍𨥡𨥵𨦉𨦝𨦱𨧅𨧙𨧭𨨁𨨕𨨩𨨽𨩑𨩥𨩹𨪍𨪡𨪵𨫉𨫝𨫱𨬅𨬙𨬭𨭁𨭕𨭩𨭽𨮑𨮥𨮹𨯍𨯡𨯵𨰉𨰝𨰱𨱅𨱙𨱭𨲁𨲕𨲩𨲽𨳑𨳥𨳹𨴍𨴡𨴵𨵉𨵝𨵱𨶅𨶙𨶭𨷁𨷕𨷩𨷽𨸑𨸥𨸹𨹍𨹡𨹵𨺉𨺝𨺱𨻅𨻙𨻭𨼁𨼕𨼩𨼽𨽑", + "encodedString" : "8KielfConqnwqJ698KifkfCon6XwqJ+58KigjfCooKHwqKC18KihifCooZ3wqKGx8KiihfCoopnwqKKt8KijgfCoo5XwqKOp8KijvfCopJHwqKSl8KikufCopY3wqKWh8KiltfCoponwqKad8KimsfCop4XwqKeZ8KinrfCoqIHwqKiV8KioqfCoqL3wqKmR8KippfCoqbnwqKqN8KiqofCoqrXwqKuJ8KirnfCoq7HwqKyF8KismfCorK3wqK2B8KitlfCoranwqK298KiukfCorqXwqK658KivjfCor6HwqK+18KiwifCosJ3wqLCx8KixhfCosZnwqLGt8KiygfCospXwqLKp8KiyvfCos5HwqLOl8KizufCotI3wqLSh8Ki0tfCotYnwqLWd8Ki1sfCotoXwqLaZ8Ki2rfCot4HwqLeV8Ki3qfCot73wqLiR8Ki4pfCouLnwqLmN8Ki5ofCoubXwqLqJ8Ki6nfCourHwqLuF8Ki7mfCou63wqLyB8Ki8lfCovKnwqLy98Ki9kQ==" }, { - "string": "𨽥𨽹𨾍𨾡𨾵𨿉𨿝𨿱𩀅𩀙𩀭𩁁𩁕𩁩𩁽𩂑𩂥𩂹𩃍𩃡𩃵𩄉𩄝𩄱𩅅𩅙𩅭𩆁𩆕𩆩𩆽𩇑𩇥𩇹𩈍𩈡𩈵𩉉𩉝𩉱𩊅𩊙𩊭𩋁𩋕𩋩𩋽𩌑𩌥𩌹𩍍𩍡𩍵𩎉𩎝𩎱𩏅𩏙𩏭𩐁𩐕𩐩𩐽𩑑𩑥𩑹𩒍𩒡𩒵𩓉𩓝𩓱𩔅𩔙𩔭𩕁𩕕𩕩𩕽𩖑𩖥𩖹𩗍𩗡𩗵𩘉𩘝𩘱𩙅𩙙𩙭𩚁𩚕𩚩𩚽𩛑𩛥𩛹𩜍𩜡", - "encodedString": "8Ki9pfCovbnwqL6N8Ki+ofCovrXwqL+J8Ki/nfCov7HwqYCF8KmAmfCpgK3wqYGB8KmBlfCpganwqYG98KmCkfCpgqXwqYK58KmDjfCpg6HwqYO18KmEifCphJ3wqYSx8KmFhfCphZnwqYWt8KmGgfCphpXwqYap8KmGvfCph5HwqYel8KmHufCpiI3wqYih8KmItfCpiYnwqYmd8KmJsfCpioXwqYqZ8KmKrfCpi4HwqYuV8KmLqfCpi73wqYyR8KmMpfCpjLnwqY2N8KmNofCpjbXwqY6J8KmOnfCpjrHwqY+F8KmPmfCpj63wqZCB8KmQlfCpkKnwqZC98KmRkfCpkaXwqZG58KmSjfCpkqHwqZK18KmTifCpk53wqZOx8KmUhfCplJnwqZSt8KmVgfCplZXwqZWp8KmVvfCplpHwqZal8KmWufCpl43wqZeh8KmXtfCpmInwqZid8KmYsfCpmYXwqZmZ8KmZrfCpmoHwqZqV8KmaqfCpmr3wqZuR8KmbpfCpm7nwqZyN8KmcoQ==" + "string" : "𨽥𨽹𨾍𨾡𨾵𨿉𨿝𨿱𩀅𩀙𩀭𩁁𩁕𩁩𩁽𩂑𩂥𩂹𩃍𩃡𩃵𩄉𩄝𩄱𩅅𩅙𩅭𩆁𩆕𩆩𩆽𩇑𩇥𩇹𩈍𩈡𩈵𩉉𩉝𩉱𩊅𩊙𩊭𩋁𩋕𩋩𩋽𩌑𩌥𩌹𩍍𩍡𩍵𩎉𩎝𩎱𩏅𩏙𩏭𩐁𩐕𩐩𩐽𩑑𩑥𩑹𩒍𩒡𩒵𩓉𩓝𩓱𩔅𩔙𩔭𩕁𩕕𩕩𩕽𩖑𩖥𩖹𩗍𩗡𩗵𩘉𩘝𩘱𩙅𩙙𩙭𩚁𩚕𩚩𩚽𩛑𩛥𩛹𩜍𩜡", + "encodedString" : "8Ki9pfCovbnwqL6N8Ki+ofCovrXwqL+J8Ki/nfCov7HwqYCF8KmAmfCpgK3wqYGB8KmBlfCpganwqYG98KmCkfCpgqXwqYK58KmDjfCpg6HwqYO18KmEifCphJ3wqYSx8KmFhfCphZnwqYWt8KmGgfCphpXwqYap8KmGvfCph5HwqYel8KmHufCpiI3wqYih8KmItfCpiYnwqYmd8KmJsfCpioXwqYqZ8KmKrfCpi4HwqYuV8KmLqfCpi73wqYyR8KmMpfCpjLnwqY2N8KmNofCpjbXwqY6J8KmOnfCpjrHwqY+F8KmPmfCpj63wqZCB8KmQlfCpkKnwqZC98KmRkfCpkaXwqZG58KmSjfCpkqHwqZK18KmTifCpk53wqZOx8KmUhfCplJnwqZSt8KmVgfCplZXwqZWp8KmVvfCplpHwqZal8KmWufCpl43wqZeh8KmXtfCpmInwqZid8KmYsfCpmYXwqZmZ8KmZrfCpmoHwqZqV8KmaqfCpmr3wqZuR8KmbpfCpm7nwqZyN8KmcoQ==" }, { - "string": "𩜵𩝉𩝝𩝱𩞅𩞙𩞭𩟁𩟕𩟩𩟽𩠑𩠥𩠹𩡍𩡡𩡵𩢉𩢝𩢱𩣅𩣙𩣭𩤁𩤕𩤩𩤽𩥑𩥥𩥹𩦍𩦡𩦵𩧉𩧝𩧱𩨅𩨙𩨭𩩁𩩕𩩩𩩽𩪑𩪥𩪹𩫍𩫡𩫵𩬉𩬝𩬱𩭅𩭙𩭭𩮁𩮕𩮩𩮽𩯑𩯥𩯹𩰍𩰡𩰵𩱉𩱝𩱱𩲅𩲙𩲭𩳁𩳕𩳩𩳽𩴑𩴥𩴹𩵍𩵡𩵵𩶉𩶝𩶱𩷅𩷙𩷭𩸁𩸕𩸩𩸽𩹑𩹥𩹹𩺍𩺡𩺵𩻉𩻝𩻱", - "encodedString": "8KmctfCpnYnwqZ2d8KmdsfCpnoXwqZ6Z8KmerfCpn4HwqZ+V8KmfqfCpn73wqaCR8KmgpfCpoLnwqaGN8KmhofCpobXwqaKJ8KminfCporHwqaOF8KmjmfCpo63wqaSB8KmklfCppKnwqaS98KmlkfCppaXwqaW58KmmjfCppqHwqaa18KmnifCpp53wqaex8KmohfCpqJnwqait8KmpgfCpqZXwqamp8KmpvfCpqpHwqaql8KmqufCpq43wqauh8KmrtfCprInwqayd8KmssfCprYXwqa2Z8KmtrfCproHwqa6V8KmuqfCprr3wqa+R8KmvpfCpr7nwqbCN8KmwofCpsLXwqbGJ8KmxnfCpsbHwqbKF8KmymfCpsq3wqbOB8KmzlfCps6nwqbO98Km0kfCptKXwqbS58Km1jfCptaHwqbW18Km2ifCptp3wqbax8Km3hfCpt5nwqbet8Km4gfCpuJXwqbip8Km4vfCpuZHwqbml8Km5ufCpuo3wqbqh8Km6tfCpu4nwqbud8Km7sQ==" + "string" : "𩜵𩝉𩝝𩝱𩞅𩞙𩞭𩟁𩟕𩟩𩟽𩠑𩠥𩠹𩡍𩡡𩡵𩢉𩢝𩢱𩣅𩣙𩣭𩤁𩤕𩤩𩤽𩥑𩥥𩥹𩦍𩦡𩦵𩧉𩧝𩧱𩨅𩨙𩨭𩩁𩩕𩩩𩩽𩪑𩪥𩪹𩫍𩫡𩫵𩬉𩬝𩬱𩭅𩭙𩭭𩮁𩮕𩮩𩮽𩯑𩯥𩯹𩰍𩰡𩰵𩱉𩱝𩱱𩲅𩲙𩲭𩳁𩳕𩳩𩳽𩴑𩴥𩴹𩵍𩵡𩵵𩶉𩶝𩶱𩷅𩷙𩷭𩸁𩸕𩸩𩸽𩹑𩹥𩹹𩺍𩺡𩺵𩻉𩻝𩻱", + "encodedString" : "8KmctfCpnYnwqZ2d8KmdsfCpnoXwqZ6Z8KmerfCpn4HwqZ+V8KmfqfCpn73wqaCR8KmgpfCpoLnwqaGN8KmhofCpobXwqaKJ8KminfCporHwqaOF8KmjmfCpo63wqaSB8KmklfCppKnwqaS98KmlkfCppaXwqaW58KmmjfCppqHwqaa18KmnifCpp53wqaex8KmohfCpqJnwqait8KmpgfCpqZXwqamp8KmpvfCpqpHwqaql8KmqufCpq43wqauh8KmrtfCprInwqayd8KmssfCprYXwqa2Z8KmtrfCproHwqa6V8KmuqfCprr3wqa+R8KmvpfCpr7nwqbCN8KmwofCpsLXwqbGJ8KmxnfCpsbHwqbKF8KmymfCpsq3wqbOB8KmzlfCps6nwqbO98Km0kfCptKXwqbS58Km1jfCptaHwqbW18Km2ifCptp3wqbax8Km3hfCpt5nwqbet8Km4gfCpuJXwqbip8Km4vfCpuZHwqbml8Km5ufCpuo3wqbqh8Km6tfCpu4nwqbud8Km7sQ==" }, { - "string": "𩼅𩼙𩼭𩽁𩽕𩽩𩽽𩾑𩾥𩾹𩿍𩿡𩿵𪀉𪀝𪀱𪁅𪁙𪁭𪂁𪂕𪂩𪂽𪃑𪃥𪃹𪄍𪄡𪄵𪅉𪅝𪅱𪆅𪆙𪆭𪇁𪇕𪇩𪇽𪈑𪈥𪈹𪉍𪉡𪉵𪊉𪊝𪊱𪋅𪋙𪋭𪌁𪌕𪌩𪌽𪍑𪍥𪍹𪎍𪎡𪎵𪏉𪏝𪏱𪐅𪐙𪐭𪑁𪑕𪑩𪑽𪒑𪒥𪒹𪓍𪓡𪓵𪔉𪔝𪔱𪕅𪕙𪕭𪖁𪖕𪖩𪖽𪗑𪗥𪗹𪘍𪘡𪘵𪙉𪙝𪙱𪚅𪚙𪚭𪛁", - "encodedString": "8Km8hfCpvJnwqbyt8Km9gfCpvZXwqb2p8Km9vfCpvpHwqb6l8Km+ufCpv43wqb+h8Km/tfCqgInwqoCd8KqAsfCqgYXwqoGZ8KqBrfCqgoHwqoKV8KqCqfCqgr3wqoOR8KqDpfCqg7nwqoSN8KqEofCqhLXwqoWJ8KqFnfCqhbHwqoaF8KqGmfCqhq3wqoeB8KqHlfCqh6nwqoe98KqIkfCqiKXwqoi58KqJjfCqiaHwqom18KqKifCqip3wqoqx8KqLhfCqi5nwqout8KqMgfCqjJXwqoyp8KqMvfCqjZHwqo2l8KqNufCqjo3wqo6h8KqOtfCqj4nwqo+d8KqPsfCqkIXwqpCZ8KqQrfCqkYHwqpGV8KqRqfCqkb3wqpKR8KqSpfCqkrnwqpON8KqTofCqk7XwqpSJ8KqUnfCqlLHwqpWF8KqVmfCqla3wqpaB8KqWlfCqlqnwqpa98KqXkfCql6Xwqpe58KqYjfCqmKHwqpi18KqZifCqmZ3wqpmx8KqahfCqmpnwqpqt8KqbgQ==" + "string" : "𩼅𩼙𩼭𩽁𩽕𩽩𩽽𩾑𩾥𩾹𩿍𩿡𩿵𪀉𪀝𪀱𪁅𪁙𪁭𪂁𪂕𪂩𪂽𪃑𪃥𪃹𪄍𪄡𪄵𪅉𪅝𪅱𪆅𪆙𪆭𪇁𪇕𪇩𪇽𪈑𪈥𪈹𪉍𪉡𪉵𪊉𪊝𪊱𪋅𪋙𪋭𪌁𪌕𪌩𪌽𪍑𪍥𪍹𪎍𪎡𪎵𪏉𪏝𪏱𪐅𪐙𪐭𪑁𪑕𪑩𪑽𪒑𪒥𪒹𪓍𪓡𪓵𪔉𪔝𪔱𪕅𪕙𪕭𪖁𪖕𪖩𪖽𪗑𪗥𪗹𪘍𪘡𪘵𪙉𪙝𪙱𪚅𪚙𪚭𪛁", + "encodedString" : "8Km8hfCpvJnwqbyt8Km9gfCpvZXwqb2p8Km9vfCpvpHwqb6l8Km+ufCpv43wqb+h8Km/tfCqgInwqoCd8KqAsfCqgYXwqoGZ8KqBrfCqgoHwqoKV8KqCqfCqgr3wqoOR8KqDpfCqg7nwqoSN8KqEofCqhLXwqoWJ8KqFnfCqhbHwqoaF8KqGmfCqhq3wqoeB8KqHlfCqh6nwqoe98KqIkfCqiKXwqoi58KqJjfCqiaHwqom18KqKifCqip3wqoqx8KqLhfCqi5nwqout8KqMgfCqjJXwqoyp8KqMvfCqjZHwqo2l8KqNufCqjo3wqo6h8KqOtfCqj4nwqo+d8KqPsfCqkIXwqpCZ8KqQrfCqkYHwqpGV8KqRqfCqkb3wqpKR8KqSpfCqkrnwqpON8KqTofCqk7XwqpSJ8KqUnfCqlLHwqpWF8KqVmfCqla3wqpaB8KqWlfCqlqnwqpa98KqXkfCql6Xwqpe58KqYjfCqmKHwqpi18KqZifCqmZ3wqpmx8KqahfCqmpnwqpqt8KqbgQ==" }, { - "string": "𪛕𪜉𪜝𪜱𪝅𪝙𪝭𪞁𪞕𪞩𪞽𪟑𪟥𪟹𪠍𪠡𪠵𪡉𪡝𪡱𪢅𪢙𪢭𪣁𪣕𪣩𪣽𪤑𪤥𪤹𪥍𪥡𪥵𪦉𪦝𪦱𪧅𪧙𪧭𪨁𪨕𪨩𪨽𪩑𪩥𪩹𪪍𪪡𪪵𪫉𪫝𪫱𪬅𪬙𪬭𪭁𪭕𪭩𪭽𪮑𪮥𪮹𪯍𪯡𪯵𪰉𪰝𪰱𪱅𪱙𪱭𪲁𪲕𪲩𪲽𪳑𪳥𪳹𪴍𪴡𪴵𪵉𪵝𪵱𪶅𪶙𪶭𪷁𪷕𪷩𪷽𪸑𪸥𪸹𪹍𪹡𪹵𪺉𪺝𪺱", - "encodedString": "8KqblfCqnInwqpyd8KqcsfCqnYXwqp2Z8KqdrfCqnoHwqp6V8KqeqfCqnr3wqp+R8KqfpfCqn7nwqqCN8KqgofCqoLXwqqGJ8KqhnfCqobHwqqKF8KqimfCqoq3wqqOB8KqjlfCqo6nwqqO98KqkkfCqpKXwqqS58KqljfCqpaHwqqW18KqmifCqpp3wqqax8KqnhfCqp5nwqqet8KqogfCqqJXwqqip8KqovfCqqZHwqqml8KqpufCqqo3wqqqh8KqqtfCqq4nwqqud8KqrsfCqrIXwqqyZ8KqsrfCqrYHwqq2V8KqtqfCqrb3wqq6R8KqupfCqrrnwqq+N8KqvofCqr7XwqrCJ8KqwnfCqsLHwqrGF8KqxmfCqsa3wqrKB8KqylfCqsqnwqrK98KqzkfCqs6XwqrO58Kq0jfCqtKHwqrS18Kq1ifCqtZ3wqrWx8Kq2hfCqtpnwqrat8Kq3gfCqt5Xwqrep8Kq3vfCquJHwqril8Kq4ufCquY3wqrmh8Kq5tfCquonwqrqd8Kq6sQ==" + "string" : "𪛕𪜉𪜝𪜱𪝅𪝙𪝭𪞁𪞕𪞩𪞽𪟑𪟥𪟹𪠍𪠡𪠵𪡉𪡝𪡱𪢅𪢙𪢭𪣁𪣕𪣩𪣽𪤑𪤥𪤹𪥍𪥡𪥵𪦉𪦝𪦱𪧅𪧙𪧭𪨁𪨕𪨩𪨽𪩑𪩥𪩹𪪍𪪡𪪵𪫉𪫝𪫱𪬅𪬙𪬭𪭁𪭕𪭩𪭽𪮑𪮥𪮹𪯍𪯡𪯵𪰉𪰝𪰱𪱅𪱙𪱭𪲁𪲕𪲩𪲽𪳑𪳥𪳹𪴍𪴡𪴵𪵉𪵝𪵱𪶅𪶙𪶭𪷁𪷕𪷩𪷽𪸑𪸥𪸹𪹍𪹡𪹵𪺉𪺝𪺱", + "encodedString" : "8KqblfCqnInwqpyd8KqcsfCqnYXwqp2Z8KqdrfCqnoHwqp6V8KqeqfCqnr3wqp+R8KqfpfCqn7nwqqCN8KqgofCqoLXwqqGJ8KqhnfCqobHwqqKF8KqimfCqoq3wqqOB8KqjlfCqo6nwqqO98KqkkfCqpKXwqqS58KqljfCqpaHwqqW18KqmifCqpp3wqqax8KqnhfCqp5nwqqet8KqogfCqqJXwqqip8KqovfCqqZHwqqml8KqpufCqqo3wqqqh8KqqtfCqq4nwqqud8KqrsfCqrIXwqqyZ8KqsrfCqrYHwqq2V8KqtqfCqrb3wqq6R8KqupfCqrrnwqq+N8KqvofCqr7XwqrCJ8KqwnfCqsLHwqrGF8KqxmfCqsa3wqrKB8KqylfCqsqnwqrK98KqzkfCqs6XwqrO58Kq0jfCqtKHwqrS18Kq1ifCqtZ3wqrWx8Kq2hfCqtpnwqrat8Kq3gfCqt5Xwqrep8Kq3vfCquJHwqril8Kq4ufCquY3wqrmh8Kq5tfCquonwqrqd8Kq6sQ==" }, { - "string": "𪻅𪻙𪻭𪼁𪼕𪼩𪼽𪽑𪽥𪽹𪾍𪾡𪾵𪿉𪿝𪿱𫀅𫀙𫀭𫁁𫁕𫁩𫁽𫂑𫂥𫂹𫃍𫃡𫃵𫄉𫄝𫄱𫅅𫅙𫅭𫆁𫆕𫆩𫆽𫇑𫇥𫇹𫈍𫈡𫈵𫉉𫉝𫉱𫊅𫊙𫊭𫋁𫋕𫋩𫋽𫌑𫌥𫌹𫍍𫍡𫍵𫎉𫎝𫎱𫏅𫏙𫏭𫐁𫐕𫐩𫐽𫑑𫑥𫑹𫒍𫒡𫒵𫓉𫓝𫓱𫔅𫔙𫔭𫕁𫕕𫕩𫕽𫖑𫖥𫖹𫗍𫗡𫗵𫘉𫘝𫘱𫙅𫙙𫙭𫚁", - "encodedString": "8Kq7hfCqu5nwqrut8Kq8gfCqvJXwqryp8Kq8vfCqvZHwqr2l8Kq9ufCqvo3wqr6h8Kq+tfCqv4nwqr+d8Kq/sfCrgIXwq4CZ8KuArfCrgYHwq4GV8KuBqfCrgb3wq4KR8KuCpfCrgrnwq4ON8KuDofCrg7Xwq4SJ8KuEnfCrhLHwq4WF8KuFmfCrha3wq4aB8KuGlfCrhqnwq4a98KuHkfCrh6Xwq4e58KuIjfCriKHwq4i18KuJifCriZ3wq4mx8KuKhfCripnwq4qt8KuLgfCri5Xwq4up8KuLvfCrjJHwq4yl8KuMufCrjY3wq42h8KuNtfCrjonwq46d8KuOsfCrj4Xwq4+Z8KuPrfCrkIHwq5CV8KuQqfCrkL3wq5GR8KuRpfCrkbnwq5KN8KuSofCrkrXwq5OJ8KuTnfCrk7Hwq5SF8KuUmfCrlK3wq5WB8KuVlfCrlanwq5W98KuWkfCrlqXwq5a58KuXjfCrl6Hwq5e18KuYifCrmJ3wq5ix8KuZhfCrmZnwq5mt8KuagQ==" + "string" : "𪻅𪻙𪻭𪼁𪼕𪼩𪼽𪽑𪽥𪽹𪾍𪾡𪾵𪿉𪿝𪿱𫀅𫀙𫀭𫁁𫁕𫁩𫁽𫂑𫂥𫂹𫃍𫃡𫃵𫄉𫄝𫄱𫅅𫅙𫅭𫆁𫆕𫆩𫆽𫇑𫇥𫇹𫈍𫈡𫈵𫉉𫉝𫉱𫊅𫊙𫊭𫋁𫋕𫋩𫋽𫌑𫌥𫌹𫍍𫍡𫍵𫎉𫎝𫎱𫏅𫏙𫏭𫐁𫐕𫐩𫐽𫑑𫑥𫑹𫒍𫒡𫒵𫓉𫓝𫓱𫔅𫔙𫔭𫕁𫕕𫕩𫕽𫖑𫖥𫖹𫗍𫗡𫗵𫘉𫘝𫘱𫙅𫙙𫙭𫚁", + "encodedString" : "8Kq7hfCqu5nwqrut8Kq8gfCqvJXwqryp8Kq8vfCqvZHwqr2l8Kq9ufCqvo3wqr6h8Kq+tfCqv4nwqr+d8Kq/sfCrgIXwq4CZ8KuArfCrgYHwq4GV8KuBqfCrgb3wq4KR8KuCpfCrgrnwq4ON8KuDofCrg7Xwq4SJ8KuEnfCrhLHwq4WF8KuFmfCrha3wq4aB8KuGlfCrhqnwq4a98KuHkfCrh6Xwq4e58KuIjfCriKHwq4i18KuJifCriZ3wq4mx8KuKhfCripnwq4qt8KuLgfCri5Xwq4up8KuLvfCrjJHwq4yl8KuMufCrjY3wq42h8KuNtfCrjonwq46d8KuOsfCrj4Xwq4+Z8KuPrfCrkIHwq5CV8KuQqfCrkL3wq5GR8KuRpfCrkbnwq5KN8KuSofCrkrXwq5OJ8KuTnfCrk7Hwq5SF8KuUmfCrlK3wq5WB8KuVlfCrlanwq5W98KuWkfCrlqXwq5a58KuXjfCrl6Hwq5e18KuYifCrmJ3wq5ix8KuZhfCrmZnwq5mt8KuagQ==" }, { - "string": "𫚕𫚩𫚽𫛑𫛥𫛹𫜍𫜡𫜵𫝏𫝣𫝷𫞋𫞟𫞳𫟇𫟛𫟯𫠃𫠗𫠭𫡁𫡕𫡩𫡽𫢑𫢥𫢹𫣍𫣡𫣵𫤉𫤝𫤱𫥅𫥙𫥭𫦁𫦕𫦩𫦽𫧑𫧥𫧹𫨍𫨡𫨵𫩉𫩝𫩱𫪅𫪙𫪭𫫁𫫕𫫩𫫽𫬑𫬥𫬹𫭍𫭡𫭵𫮉𫮝𫮱𫯅𫯙𫯭𫰁𫰕𫰩𫰽𫱑𫱥𫱹𫲍𫲡𫲵𫳉𫳝𫳱𫴅𫴙𫴭𫵁𫵕𫵩𫵽𫶑𫶥𫶹𫷍𫷡𫷵𫸉𫸝𫸱𫹅𫹙", - "encodedString": "8KualfCrmqnwq5q98KubkfCrm6Xwq5u58KucjfCrnKHwq5y18Kudj/CrnaPwq5238Kuei/Crnp/wq56z8Kufh/Crn5vwq5+v8Kugg/CroJfwq6Ct8KuhgfCroZXwq6Gp8KuhvfCropHwq6Kl8KuiufCro43wq6Oh8KujtfCrpInwq6Sd8KuksfCrpYXwq6WZ8KulrfCrpoHwq6aV8KumqfCrpr3wq6eR8KunpfCrp7nwq6iN8KuoofCrqLXwq6mJ8KupnfCrqbHwq6qF8KuqmfCrqq3wq6uB8KurlfCrq6nwq6u98KuskfCrrKXwq6y58KutjfCrraHwq6218KuuifCrrp3wq66x8KuvhfCrr5nwq6+t8KuwgfCrsJXwq7Cp8KuwvfCrsZHwq7Gl8KuxufCrso3wq7Kh8KuytfCrs4nwq7Od8KuzsfCrtIXwq7SZ8Ku0rfCrtYHwq7WV8Ku1qfCrtb3wq7aR8Ku2pfCrtrnwq7eN8Ku3ofCrt7Xwq7iJ8Ku4nfCruLHwq7mF8Ku5mQ==" + "string" : "𫚕𫚩𫚽𫛑𫛥𫛹𫜍𫜡𫜵𫝏𫝣𫝷𫞋𫞟𫞳𫟇𫟛𫟯𫠃𫠗𫠭𫡁𫡕𫡩𫡽𫢑𫢥𫢹𫣍𫣡𫣵𫤉𫤝𫤱𫥅𫥙𫥭𫦁𫦕𫦩𫦽𫧑𫧥𫧹𫨍𫨡𫨵𫩉𫩝𫩱𫪅𫪙𫪭𫫁𫫕𫫩𫫽𫬑𫬥𫬹𫭍𫭡𫭵𫮉𫮝𫮱𫯅𫯙𫯭𫰁𫰕𫰩𫰽𫱑𫱥𫱹𫲍𫲡𫲵𫳉𫳝𫳱𫴅𫴙𫴭𫵁𫵕𫵩𫵽𫶑𫶥𫶹𫷍𫷡𫷵𫸉𫸝𫸱𫹅𫹙", + "encodedString" : "8KualfCrmqnwq5q98KubkfCrm6Xwq5u58KucjfCrnKHwq5y18Kudj/CrnaPwq5238Kuei/Crnp/wq56z8Kufh/Crn5vwq5+v8Kugg/CroJfwq6Ct8KuhgfCroZXwq6Gp8KuhvfCropHwq6Kl8KuiufCro43wq6Oh8KujtfCrpInwq6Sd8KuksfCrpYXwq6WZ8KulrfCrpoHwq6aV8KumqfCrpr3wq6eR8KunpfCrp7nwq6iN8KuoofCrqLXwq6mJ8KupnfCrqbHwq6qF8KuqmfCrqq3wq6uB8KurlfCrq6nwq6u98KuskfCrrKXwq6y58KutjfCrraHwq6218KuuifCrrp3wq66x8KuvhfCrr5nwq6+t8KuwgfCrsJXwq7Cp8KuwvfCrsZHwq7Gl8KuxufCrso3wq7Kh8KuytfCrs4nwq7Od8KuzsfCrtIXwq7SZ8Ku0rfCrtYHwq7WV8Ku1qfCrtb3wq7aR8Ku2pfCrtrnwq7eN8Ku3ofCrt7Xwq7iJ8Ku4nfCruLHwq7mF8Ku5mQ==" }, { - "string": "𫹭𫺁𫺕𫺩𫺽𫻑𫻥𫻹𫼍𫼡𫼵𫽉𫽝𫽱𫾅𫾙𫾭𫿁𫿕𫿩𫿽𬀑𬀥𬀹𬁍𬁡𬁵𬂉𬂝𬂱𬃅𬃙𬃭𬄁𬄕𬄩𬄽𬅑𬅥𬅹𬆍𬆡𬆵𬇉𬇝𬇱𬈅𬈙𬈭𬉁𬉕𬉩𬉽𬊑𬊥𬊹𬋍𬋡𬋵𬌉𬌝𬌱𬍅𬍙𬍭𬎁𬎕𬎩𬎽𬏑𬏥𬏹𬐍𬐡𬐵𬑉𬑝𬑱𬒅𬒙𬒭𬓁𬓕𬓩𬓽𬔑𬔥𬔹𬕍𬕡𬕵𬖉𬖝𬖱𬗅𬗙𬗭𬘁𬘕𬘩", - "encodedString": "8Ku5rfCruoHwq7qV8Ku6qfCrur3wq7uR8Ku7pfCru7nwq7yN8Ku8ofCrvLXwq72J8Ku9nfCrvbHwq76F8Ku+mfCrvq3wq7+B8Ku/lfCrv6nwq7+98KyAkfCsgKXwrIC58KyBjfCsgaHwrIG18KyCifCsgp3wrIKx8KyDhfCsg5nwrIOt8KyEgfCshJXwrISp8KyEvfCshZHwrIWl8KyFufCsho3wrIah8KyGtfCsh4nwrIed8KyHsfCsiIXwrIiZ8KyIrfCsiYHwrImV8KyJqfCsib3wrIqR8KyKpfCsirnwrIuN8KyLofCsi7XwrIyJ8KyMnfCsjLHwrI2F8KyNmfCsja3wrI6B8KyOlfCsjqnwrI698KyPkfCsj6XwrI+58KyQjfCskKHwrJC18KyRifCskZ3wrJGx8KyShfCskpnwrJKt8KyTgfCsk5XwrJOp8KyTvfCslJHwrJSl8KyUufCslY3wrJWh8KyVtfCslonwrJad8KyWsfCsl4XwrJeZ8KyXrfCsmIHwrJiV8KyYqQ==" + "string" : "𫹭𫺁𫺕𫺩𫺽𫻑𫻥𫻹𫼍𫼡𫼵𫽉𫽝𫽱𫾅𫾙𫾭𫿁𫿕𫿩𫿽𬀑𬀥𬀹𬁍𬁡𬁵𬂉𬂝𬂱𬃅𬃙𬃭𬄁𬄕𬄩𬄽𬅑𬅥𬅹𬆍𬆡𬆵𬇉𬇝𬇱𬈅𬈙𬈭𬉁𬉕𬉩𬉽𬊑𬊥𬊹𬋍𬋡𬋵𬌉𬌝𬌱𬍅𬍙𬍭𬎁𬎕𬎩𬎽𬏑𬏥𬏹𬐍𬐡𬐵𬑉𬑝𬑱𬒅𬒙𬒭𬓁𬓕𬓩𬓽𬔑𬔥𬔹𬕍𬕡𬕵𬖉𬖝𬖱𬗅𬗙𬗭𬘁𬘕𬘩", + "encodedString" : "8Ku5rfCruoHwq7qV8Ku6qfCrur3wq7uR8Ku7pfCru7nwq7yN8Ku8ofCrvLXwq72J8Ku9nfCrvbHwq76F8Ku+mfCrvq3wq7+B8Ku/lfCrv6nwq7+98KyAkfCsgKXwrIC58KyBjfCsgaHwrIG18KyCifCsgp3wrIKx8KyDhfCsg5nwrIOt8KyEgfCshJXwrISp8KyEvfCshZHwrIWl8KyFufCsho3wrIah8KyGtfCsh4nwrIed8KyHsfCsiIXwrIiZ8KyIrfCsiYHwrImV8KyJqfCsib3wrIqR8KyKpfCsirnwrIuN8KyLofCsi7XwrIyJ8KyMnfCsjLHwrI2F8KyNmfCsja3wrI6B8KyOlfCsjqnwrI698KyPkfCsj6XwrI+58KyQjfCskKHwrJC18KyRifCskZ3wrJGx8KyShfCskpnwrJKt8KyTgfCsk5XwrJOp8KyTvfCslJHwrJSl8KyUufCslY3wrJWh8KyVtfCslonwrJad8KyWsfCsl4XwrJeZ8KyXrfCsmIHwrJiV8KyYqQ==" }, { - "string": "𬘽𬙑𬙥𬙹𬚍𬚡𬚵𬛉𬛝𬛱𬜅𬜙𬜭𬝁𬝕𬝩𬝽𬞑𬞥𬞹𬟍𬟡𬟵𬠉𬠝𬠱𬡅𬡙𬡭𬢁𬢕𬢩𬢽𬣑𬣥𬣹𬤍𬤡𬤵𬥉𬥝𬥱𬦅𬦙𬦭𬧁𬧕𬧩𬧽𬨑𬨥𬨹𬩍𬩡𬩵𬪉𬪝𬪱𬫅𬫙𬫭𬬁𬬕𬬩𬬽𬭑𬭥𬭹𬮍𬮡𬮵𬯉𬯝𬯱𬰅𬰙𬰭𬱁𬱕𬱩𬱽𬲑𬲥𬲹𬳍𬳡𬳵𬴉𬴝𬴱𬵅𬵙𬵭𬶁𬶕𬶩𬶽𬷑𬷥𬷹", - "encodedString": "8KyYvfCsmZHwrJml8KyZufCsmo3wrJqh8KyatfCsm4nwrJud8KybsfCsnIXwrJyZ8KycrfCsnYHwrJ2V8KydqfCsnb3wrJ6R8KyepfCsnrnwrJ+N8KyfofCsn7XwrKCJ8KygnfCsoLHwrKGF8KyhmfCsoa3wrKKB8KyilfCsoqnwrKK98KyjkfCso6XwrKO58KykjfCspKHwrKS18KylifCspZ3wrKWx8KymhfCsppnwrKat8KyngfCsp5XwrKep8KynvfCsqJHwrKil8KyoufCsqY3wrKmh8KyptfCsqonwrKqd8KyqsfCsq4XwrKuZ8KyrrfCsrIHwrKyV8KysqfCsrL3wrK2R8KytpfCsrbnwrK6N8KyuofCsrrXwrK+J8KyvnfCsr7HwrLCF8KywmfCssK3wrLGB8KyxlfCssanwrLG98KyykfCssqXwrLK58KyzjfCss6HwrLO18Ky0ifCstJ3wrLSx8Ky1hfCstZnwrLWt8Ky2gfCstpXwrLap8Ky2vfCst5HwrLel8Ky3uQ==" + "string" : "𬘽𬙑𬙥𬙹𬚍𬚡𬚵𬛉𬛝𬛱𬜅𬜙𬜭𬝁𬝕𬝩𬝽𬞑𬞥𬞹𬟍𬟡𬟵𬠉𬠝𬠱𬡅𬡙𬡭𬢁𬢕𬢩𬢽𬣑𬣥𬣹𬤍𬤡𬤵𬥉𬥝𬥱𬦅𬦙𬦭𬧁𬧕𬧩𬧽𬨑𬨥𬨹𬩍𬩡𬩵𬪉𬪝𬪱𬫅𬫙𬫭𬬁𬬕𬬩𬬽𬭑𬭥𬭹𬮍𬮡𬮵𬯉𬯝𬯱𬰅𬰙𬰭𬱁𬱕𬱩𬱽𬲑𬲥𬲹𬳍𬳡𬳵𬴉𬴝𬴱𬵅𬵙𬵭𬶁𬶕𬶩𬶽𬷑𬷥𬷹", + "encodedString" : "8KyYvfCsmZHwrJml8KyZufCsmo3wrJqh8KyatfCsm4nwrJud8KybsfCsnIXwrJyZ8KycrfCsnYHwrJ2V8KydqfCsnb3wrJ6R8KyepfCsnrnwrJ+N8KyfofCsn7XwrKCJ8KygnfCsoLHwrKGF8KyhmfCsoa3wrKKB8KyilfCsoqnwrKK98KyjkfCso6XwrKO58KykjfCspKHwrKS18KylifCspZ3wrKWx8KymhfCsppnwrKat8KyngfCsp5XwrKep8KynvfCsqJHwrKil8KyoufCsqY3wrKmh8KyptfCsqonwrKqd8KyqsfCsq4XwrKuZ8KyrrfCsrIHwrKyV8KysqfCsrL3wrK2R8KytpfCsrbnwrK6N8KyuofCsrrXwrK+J8KyvnfCsr7HwrLCF8KywmfCssK3wrLGB8KyxlfCssanwrLG98KyykfCssqXwrLK58KyzjfCss6HwrLO18Ky0ifCstJ3wrLSx8Ky1hfCstZnwrLWt8Ky2gfCstpXwrLap8Ky2vfCst5HwrLel8Ky3uQ==" }, { - "string": "𬸍𬸡𬸵𬹉𬹝𬹱𬺅𬺙𬺻𬻏𬻣𬻷𬼋𬼟𬼳𬽇𬽛𬽯𬾃𬾗𬾫𬾿𬿓𬿧𬿻𭀏𭀣𭀷𭁋𭁟𭁳𭂇𭂛𭂯𭃃𭃗𭃫𭃿𭄓𭄧𭄻𭅏𭅣𭅷𭆋𭆟𭆳𭇇𭇛𭇯𭈃𭈗𭈫𭈿𭉓𭉧𭉻𭊏𭊣𭊷𭋋𭋟𭋳𭌇𭌛𭌯𭍃𭍗𭍫𭍿𭎓𭎧𭎻𭏏𭏣𭏷𭐋𭐟𭐳𭑇𭑛𭑯𭒃𭒗𭒫𭒿𭓓𭓧𭓻𭔏𭔣𭔷𭕋𭕟𭕳𭖇𭖛𭖯𭗃𭗗", - "encodedString": "8Ky4jfCsuKHwrLi18Ky5ifCsuZ3wrLmx8Ky6hfCsupnwrLq78Ky7j/Csu6PwrLu38Ky8i/CsvJ/wrLyz8Ky9h/CsvZvwrL2v8Ky+g/CsvpfwrL6r8Ky+v/Csv5PwrL+n8Ky/u/CtgI/wrYCj8K2At/CtgYvwrYGf8K2Bs/CtgofwrYKb8K2Cr/Ctg4PwrYOX8K2Dq/Ctg7/wrYST8K2Ep/CthLvwrYWP8K2Fo/CthbfwrYaL8K2Gn/CthrPwrYeH8K2Hm/Cth6/wrYiD8K2Il/CtiKvwrYi/8K2Jk/CtiafwrYm78K2Kj/CtiqPwrYq38K2Li/Cti5/wrYuz8K2Mh/CtjJvwrYyv8K2Ng/CtjZfwrY2r8K2Nv/CtjpPwrY6n8K2Ou/Ctj4/wrY+j8K2Pt/CtkIvwrZCf8K2Qs/CtkYfwrZGb8K2Rr/CtkoPwrZKX8K2Sq/Ctkr/wrZOT8K2Tp/Ctk7vwrZSP8K2Uo/CtlLfwrZWL8K2Vn/CtlbPwrZaH8K2Wm/Ctlq/wrZeD8K2Xlw==" + "string" : "𬸍𬸡𬸵𬹉𬹝𬹱𬺅𬺙𬺻𬻏𬻣𬻷𬼋𬼟𬼳𬽇𬽛𬽯𬾃𬾗𬾫𬾿𬿓𬿧𬿻𭀏𭀣𭀷𭁋𭁟𭁳𭂇𭂛𭂯𭃃𭃗𭃫𭃿𭄓𭄧𭄻𭅏𭅣𭅷𭆋𭆟𭆳𭇇𭇛𭇯𭈃𭈗𭈫𭈿𭉓𭉧𭉻𭊏𭊣𭊷𭋋𭋟𭋳𭌇𭌛𭌯𭍃𭍗𭍫𭍿𭎓𭎧𭎻𭏏𭏣𭏷𭐋𭐟𭐳𭑇𭑛𭑯𭒃𭒗𭒫𭒿𭓓𭓧𭓻𭔏𭔣𭔷𭕋𭕟𭕳𭖇𭖛𭖯𭗃𭗗", + "encodedString" : "8Ky4jfCsuKHwrLi18Ky5ifCsuZ3wrLmx8Ky6hfCsupnwrLq78Ky7j/Csu6PwrLu38Ky8i/CsvJ/wrLyz8Ky9h/CsvZvwrL2v8Ky+g/CsvpfwrL6r8Ky+v/Csv5PwrL+n8Ky/u/CtgI/wrYCj8K2At/CtgYvwrYGf8K2Bs/CtgofwrYKb8K2Cr/Ctg4PwrYOX8K2Dq/Ctg7/wrYST8K2Ep/CthLvwrYWP8K2Fo/CthbfwrYaL8K2Gn/CthrPwrYeH8K2Hm/Cth6/wrYiD8K2Il/CtiKvwrYi/8K2Jk/CtiafwrYm78K2Kj/CtiqPwrYq38K2Li/Cti5/wrYuz8K2Mh/CtjJvwrYyv8K2Ng/CtjZfwrY2r8K2Nv/CtjpPwrY6n8K2Ou/Ctj4/wrY+j8K2Pt/CtkIvwrZCf8K2Qs/CtkYfwrZGb8K2Rr/CtkoPwrZKX8K2Sq/Ctkr/wrZOT8K2Tp/Ctk7vwrZSP8K2Uo/CtlLfwrZWL8K2Vn/CtlbPwrZaH8K2Wm/Ctlq/wrZeD8K2Xlw==" }, { - "string": "𭗫𭗿𭘓𭘧𭘻𭙏𭙣𭙷𭚋𭚟𭚳𭛇𭛛𭛯𭜃𭜗𭜫𭜿𭝓𭝧𭝻𭞏𭞣𭞷𭟋𭟟𭟳𭠇𭠛𭠯𭡃𭡗𭡫𭡿𭢓𭢧𭢻𭣏𭣣𭣷𭤋𭤟𭤳𭥇𭥛𭥯𭦃𭦗𭦫𭦿𭧓𭧧𭧻𭨏𭨣𭨷𭩋𭩟𭩳𭪇𭪛𭪯𭫃𭫗𭫫𭫿𭬓𭬧𭬻𭭏𭭣𭭷𭮋𭮟𭮳𭯇𭯛𭯯𭰃𭰗𭰫𭰿𭱓𭱧𭱻𭲏𭲣𭲷𭳋𭳟𭳳𭴇𭴛𭴯𭵃𭵗𭵫𭵿𭶓𭶧", - "encodedString": "8K2Xq/Ctl7/wrZiT8K2Yp/CtmLvwrZmP8K2Zo/CtmbfwrZqL8K2an/CtmrPwrZuH8K2bm/Ctm6/wrZyD8K2cl/CtnKvwrZy/8K2dk/CtnafwrZ278K2ej/CtnqPwrZ638K2fi/Ctn5/wrZ+z8K2gh/CtoJvwraCv8K2hg/CtoZfwraGr8K2hv/CtopPwraKn8K2iu/Cto4/wraOj8K2jt/CtpIvwraSf8K2ks/CtpYfwraWb8K2lr/CtpoPwraaX8K2mq/Ctpr/wraeT8K2np/Ctp7vwraiP8K2oo/CtqLfwramL8K2pn/CtqbPwraqH8K2qm/Ctqq/wrauD8K2rl/Ctq6vwrau/8K2sk/CtrKfwray78K2tj/CtraPwra238K2ui/Ctrp/wra6z8K2vh/Ctr5vwra+v8K2wg/CtsJfwrbCr8K2wv/CtsZPwrbGn8K2xu/Ctso/wrbKj8K2yt/Cts4vwrbOf8K2zs/CttIfwrbSb8K20r/CttYPwrbWX8K21q/Cttb/wrbaT8K22pw==" + "string" : "𭗫𭗿𭘓𭘧𭘻𭙏𭙣𭙷𭚋𭚟𭚳𭛇𭛛𭛯𭜃𭜗𭜫𭜿𭝓𭝧𭝻𭞏𭞣𭞷𭟋𭟟𭟳𭠇𭠛𭠯𭡃𭡗𭡫𭡿𭢓𭢧𭢻𭣏𭣣𭣷𭤋𭤟𭤳𭥇𭥛𭥯𭦃𭦗𭦫𭦿𭧓𭧧𭧻𭨏𭨣𭨷𭩋𭩟𭩳𭪇𭪛𭪯𭫃𭫗𭫫𭫿𭬓𭬧𭬻𭭏𭭣𭭷𭮋𭮟𭮳𭯇𭯛𭯯𭰃𭰗𭰫𭰿𭱓𭱧𭱻𭲏𭲣𭲷𭳋𭳟𭳳𭴇𭴛𭴯𭵃𭵗𭵫𭵿𭶓𭶧", + "encodedString" : "8K2Xq/Ctl7/wrZiT8K2Yp/CtmLvwrZmP8K2Zo/CtmbfwrZqL8K2an/CtmrPwrZuH8K2bm/Ctm6/wrZyD8K2cl/CtnKvwrZy/8K2dk/CtnafwrZ278K2ej/CtnqPwrZ638K2fi/Ctn5/wrZ+z8K2gh/CtoJvwraCv8K2hg/CtoZfwraGr8K2hv/CtopPwraKn8K2iu/Cto4/wraOj8K2jt/CtpIvwraSf8K2ks/CtpYfwraWb8K2lr/CtpoPwraaX8K2mq/Ctpr/wraeT8K2np/Ctp7vwraiP8K2oo/CtqLfwramL8K2pn/CtqbPwraqH8K2qm/Ctqq/wrauD8K2rl/Ctq6vwrau/8K2sk/CtrKfwray78K2tj/CtraPwra238K2ui/Ctrp/wra6z8K2vh/Ctr5vwra+v8K2wg/CtsJfwrbCr8K2wv/CtsZPwrbGn8K2xu/Ctso/wrbKj8K2yt/Cts4vwrbOf8K2zs/CttIfwrbSb8K20r/CttYPwrbWX8K21q/Cttb/wrbaT8K22pw==" }, { - "string": "𭶻𭷏𭷣𭷷𭸋𭸟𭸳𭹇𭹛𭹯𭺃𭺗𭺫𭺿𭻓𭻧𭻻𭼏𭼣𭼷𭽋𭽟𭽳𭾇𭾛𭾯𭿃𭿗𭿫𭿿𮀓𮀧𮀻𮁏𮁣𮁷𮂋𮂟𮂳𮃇𮃛𮃯𮄃𮄗𮄫𮄿𮅓𮅧𮅻𮆏𮆣𮆷𮇋𮇟𮇳𮈇𮈛𮈯𮉃𮉗𮉫𮉿𮊓𮊧𮊻𮋏𮋣𮋷𮌋𮌟𮌳𮍇𮍛𮍯𮎃𮎗𮎫𮎿𮏓𮏧𮏻𮐏𮐣𮐷𮑋𮑟𮑳𮒇𮒛𮒯𮓃𮓗𮓫𮓿𮔓𮔧𮔻𮕏𮕣𮕷", - "encodedString": "8K22u/Ctt4/wrbej8K23t/CtuIvwrbif8K24s/CtuYfwrbmb8K25r/CtuoPwrbqX8K26q/Ctur/wrbuT8K27p/Ctu7vwrbyP8K28o/CtvLfwrb2L8K29n/CtvbPwrb6H8K2+m/Ctvq/wrb+D8K2/l/Ctv6vwrb+/8K6Ak/CugKfwroC78K6Bj/CugaPwroG38K6Ci/Cugp/wroKz8K6Dh/Cug5vwroOv8K6Eg/CuhJfwroSr8K6Ev/CuhZPwroWn8K6Fu/Cuho/wroaj8K6Gt/Cuh4vwroef8K6Hs/CuiIfwroib8K6Ir/CuiYPwromX8K6Jq/Cuib/wroqT8K6Kp/CuirvwrouP8K6Lo/Cui7fwroyL8K6Mn/CujLPwro2H8K6Nm/Cuja/wro6D8K6Ol/Cujqvwro6/8K6Pk/Cuj6fwro+78K6Qj/CukKPwrpC38K6Ri/CukZ/wrpGz8K6Sh/CukpvwrpKv8K6Tg/Cuk5fwrpOr8K6Tv/CulJPwrpSn8K6Uu/CulY/wrpWj8K6Vtw==" + "string" : "𭶻𭷏𭷣𭷷𭸋𭸟𭸳𭹇𭹛𭹯𭺃𭺗𭺫𭺿𭻓𭻧𭻻𭼏𭼣𭼷𭽋𭽟𭽳𭾇𭾛𭾯𭿃𭿗𭿫𭿿𮀓𮀧𮀻𮁏𮁣𮁷𮂋𮂟𮂳𮃇𮃛𮃯𮄃𮄗𮄫𮄿𮅓𮅧𮅻𮆏𮆣𮆷𮇋𮇟𮇳𮈇𮈛𮈯𮉃𮉗𮉫𮉿𮊓𮊧𮊻𮋏𮋣𮋷𮌋𮌟𮌳𮍇𮍛𮍯𮎃𮎗𮎫𮎿𮏓𮏧𮏻𮐏𮐣𮐷𮑋𮑟𮑳𮒇𮒛𮒯𮓃𮓗𮓫𮓿𮔓𮔧𮔻𮕏𮕣𮕷", + "encodedString" : "8K22u/Ctt4/wrbej8K23t/CtuIvwrbif8K24s/CtuYfwrbmb8K25r/CtuoPwrbqX8K26q/Ctur/wrbuT8K27p/Ctu7vwrbyP8K28o/CtvLfwrb2L8K29n/CtvbPwrb6H8K2+m/Ctvq/wrb+D8K2/l/Ctv6vwrb+/8K6Ak/CugKfwroC78K6Bj/CugaPwroG38K6Ci/Cugp/wroKz8K6Dh/Cug5vwroOv8K6Eg/CuhJfwroSr8K6Ev/CuhZPwroWn8K6Fu/Cuho/wroaj8K6Gt/Cuh4vwroef8K6Hs/CuiIfwroib8K6Ir/CuiYPwromX8K6Jq/Cuib/wroqT8K6Kp/CuirvwrouP8K6Lo/Cui7fwroyL8K6Mn/CujLPwro2H8K6Nm/Cuja/wro6D8K6Ol/Cujqvwro6/8K6Pk/Cuj6fwro+78K6Qj/CukKPwrpC38K6Ri/CukZ/wrpGz8K6Sh/CukpvwrpKv8K6Tg/Cuk5fwrpOr8K6Tv/CulJPwrpSn8K6Uu/CulY/wrpWj8K6Vtw==" }, { - "string": "𮖋𮖟𮖳𮗇𮗛𮗯𮘃𮘗𮘫𮘿𮙓𮙧𮙻𮚏𮚣𮚷𮛋𮛟𮛳𮜇𮜛𮜯𮝃𮝗𮝫𮝿𮞓𮞧𮞻𮟏𮟣𮟷𮠋𮠟𮠳𮡇𮡛𮡯𮢃𮢗𮢫𮢿𮣓𮣧𮣻𮤏𮤣𮤷𮥋𮥟𮥳𮦇𮦛𮦯𮧃𮧗𮧫𮧿𮨓𮨧𮨻𮩏𮩣𮩷𮪋𮪟𮪳𮫇𮫛𮫯𮬃𮬗𮬫𮬿𮭓𮭧𮭻𮮏𮮣𮮷𮯋𮯟𠔜勉叱噑姬㞁㡼志成摷朡㰘流㶖㺬㿼𥘦糒", - "encodedString": "8K6Wi/Culp/wrpaz8K6Xh/Cul5vwrpev8K6Yg/CumJfwrpir8K6Yv/CumZPwrpmn8K6Zu/Cumo/wrpqj8K6at/Cum4vwrpuf8K6bs/CunIfwrpyb8K6cr/CunYPwrp2X8K6dq/Cunb/wrp6T8K6ep/Cunrvwrp+P8K6fo/Cun7fwrqCL8K6gn/CuoLPwrqGH8K6hm/Cuoa/wrqKD8K6il/CuoqvwrqK/8K6jk/Cuo6fwrqO78K6kj/CupKPwrqS38K6li/CupZ/wrqWz8K6mh/Cuppvwrqav8K6ng/Cup5fwrqer8K6nv/CuqJPwrqin8K6ou/CuqY/wrqmj8K6pt/Cuqovwrqqf8K6qs/Cuq4fwrqub8K6rr/CurIPwrqyX8K6sq/CurL/wrq2T8K6tp/Curbvwrq6P8K6uo/Currfwrq+L8K6vn/CvoJLwr6Cm8K+guvCvoY7wr6Gi8K+htvCvoorwr6Ke8K+isvCvo4bwr6Oa8K+jrvCvpILwr6SW8K+kqvCvpL7wr6WS8K+lpg==" + "string" : "𮖋𮖟𮖳𮗇𮗛𮗯𮘃𮘗𮘫𮘿𮙓𮙧𮙻𮚏𮚣𮚷𮛋𮛟𮛳𮜇𮜛𮜯𮝃𮝗𮝫𮝿𮞓𮞧𮞻𮟏𮟣𮟷𮠋𮠟𮠳𮡇𮡛𮡯𮢃𮢗𮢫𮢿𮣓𮣧𮣻𮤏𮤣𮤷𮥋𮥟𮥳𮦇𮦛𮦯𮧃𮧗𮧫𮧿𮨓𮨧𮨻𮩏𮩣𮩷𮪋𮪟𮪳𮫇𮫛𮫯𮬃𮬗𮬫𮬿𮭓𮭧𮭻𮮏𮮣𮮷𮯋𮯟𠔜勉叱噑姬㞁㡼志成摷朡㰘流㶖㺬㿼𥘦糒", + "encodedString" : "8K6Wi/Culp/wrpaz8K6Xh/Cul5vwrpev8K6Yg/CumJfwrpir8K6Yv/CumZPwrpmn8K6Zu/Cumo/wrpqj8K6at/Cum4vwrpuf8K6bs/CunIfwrpyb8K6cr/CunYPwrp2X8K6dq/Cunb/wrp6T8K6ep/Cunrvwrp+P8K6fo/Cun7fwrqCL8K6gn/CuoLPwrqGH8K6hm/Cuoa/wrqKD8K6il/CuoqvwrqK/8K6jk/Cuo6fwrqO78K6kj/CupKPwrqS38K6li/CupZ/wrqWz8K6mh/Cuppvwrqav8K6ng/Cup5fwrqer8K6nv/CuqJPwrqin8K6ou/CuqY/wrqmj8K6pt/Cuqovwrqqf8K6qs/Cuq4fwrqub8K6rr/CurIPwrqyX8K6sq/CurL/wrq2T8K6tp/Curbvwrq6P8K6uo/Currfwrq+L8K6vn/CvoJLwr6Cm8K+guvCvoY7wr6Gi8K+htvCvoorwr6Ke8K+isvCvo4bwr6Oa8K+jrvCvpILwr6SW8K+kqvCvpL7wr6WS8K+lpg==" }, { - "string": "者䑫菌虩㒻軔䧦駂鼏󠀯󠁃󠁗󠁫󠁿󠄓󠄧󠄻󠅏󠅣󠅷󠆋󠆟󠆳󠇇󠇛󠇯󰀓󰀧󰀻󰁏󰁣󰁷󰂋󰂟󰂳󰃇󰃛󰃯󰄃󰄗󰄫󰄿󰅓󰅧󰅻󰆏󰆣󰆷󰇋󰇟󰇳󰈇󰈛󰈯󰉃󰉗󰉫󰉿󰊓󰊧󰊻󰋏󰋣󰋷󰌋󰌟󰌳󰍇󰍛󰍯󰎃󰎗󰎫󰎿󰏓󰏧󰏻󰐏󰐣󰐷󰑋󰑟󰑳󰒇󰒛󰒯󰓃󰓗󰓫󰓿󰔓󰔧󰔻󰕏󰕣󰕷󰖋󰖟󰖳󰗇", - "encodedString": "8K+luvCvpo7wr6ai8K+mtvCvp4rwr6ee8K+nsvCvqIbwr6ia86CAr/OggYPzoIGX86CBq/Oggb/zoIST86CEp/OghLvzoIWP86CFo/OghbfzoIaL86CGn/OghrPzoIeH86CHm/Ogh6/zsICT87CAp/OwgLvzsIGP87CBo/OwgbfzsIKL87CCn/OwgrPzsIOH87CDm/Owg6/zsISD87CEl/OwhKvzsIS/87CFk/OwhafzsIW787CGj/OwhqPzsIa387CHi/Owh5/zsIez87CIh/OwiJvzsIiv87CJg/OwiZfzsImr87CJv/OwipPzsIqn87CKu/Owi4/zsIuj87CLt/OwjIvzsIyf87CMs/OwjYfzsI2b87CNr/OwjoPzsI6X87COq/Owjr/zsI+T87CPp/Owj7vzsJCP87CQo/OwkLfzsJGL87CRn/OwkbPzsJKH87CSm/Owkq/zsJOD87CTl/Owk6vzsJO/87CUk/OwlKfzsJS787CVj/OwlaPzsJW387CWi/Owlp/zsJaz87CXhw==" + "string" : "者䑫菌虩㒻軔䧦駂鼏󠀯󠁃󠁗󠁫󠁿󠄓󠄧󠄻󠅏󠅣󠅷󠆋󠆟󠆳󠇇󠇛󠇯󰀓󰀧󰀻󰁏󰁣󰁷󰂋󰂟󰂳󰃇󰃛󰃯󰄃󰄗󰄫󰄿󰅓󰅧󰅻󰆏󰆣󰆷󰇋󰇟󰇳󰈇󰈛󰈯󰉃󰉗󰉫󰉿󰊓󰊧󰊻󰋏󰋣󰋷󰌋󰌟󰌳󰍇󰍛󰍯󰎃󰎗󰎫󰎿󰏓󰏧󰏻󰐏󰐣󰐷󰑋󰑟󰑳󰒇󰒛󰒯󰓃󰓗󰓫󰓿󰔓󰔧󰔻󰕏󰕣󰕷󰖋󰖟󰖳󰗇", + "encodedString" : "8K+luvCvpo7wr6ai8K+mtvCvp4rwr6ee8K+nsvCvqIbwr6ia86CAr/OggYPzoIGX86CBq/Oggb/zoIST86CEp/OghLvzoIWP86CFo/OghbfzoIaL86CGn/OghrPzoIeH86CHm/Ogh6/zsICT87CAp/OwgLvzsIGP87CBo/OwgbfzsIKL87CCn/OwgrPzsIOH87CDm/Owg6/zsISD87CEl/OwhKvzsIS/87CFk/OwhafzsIW787CGj/OwhqPzsIa387CHi/Owh5/zsIez87CIh/OwiJvzsIiv87CJg/OwiZfzsImr87CJv/OwipPzsIqn87CKu/Owi4/zsIuj87CLt/OwjIvzsIyf87CMs/OwjYfzsI2b87CNr/OwjoPzsI6X87COq/Owjr/zsI+T87CPp/Owj7vzsJCP87CQo/OwkLfzsJGL87CRn/OwkbPzsJKH87CSm/Owkq/zsJOD87CTl/Owk6vzsJO/87CUk/OwlKfzsJS787CVj/OwlaPzsJW387CWi/Owlp/zsJaz87CXhw==" }, { - "string": "󰗛󰗯󰘃󰘗󰘫󰘿󰙓󰙧󰙻󰚏󰚣󰚷󰛋󰛟󰛳󰜇󰜛󰜯󰝃󰝗󰝫󰝿󰞓󰞧󰞻󰟏󰟣󰟷󰠋󰠟󰠳󰡇󰡛󰡯󰢃󰢗󰢫󰢿󰣓󰣧󰣻󰤏󰤣󰤷󰥋󰥟󰥳󰦇󰦛󰦯󰧃󰧗󰧫󰧿󰨓󰨧󰨻󰩏󰩣󰩷󰪋󰪟󰪳󰫇󰫛󰫯󰬃󰬗󰬫󰬿󰭓󰭧󰭻󰮏󰮣󰮷󰯋󰯟󰯳󰰇󰰛󰰯󰱃󰱗󰱫󰱿󰲓󰲧󰲻󰳏󰳣󰳷󰴋󰴟󰴳󰵇󰵛󰵯󰶃󰶗", - "encodedString": "87CXm/Owl6/zsJiD87CYl/OwmKvzsJi/87CZk/OwmafzsJm787Caj/OwmqPzsJq387Cbi/Owm5/zsJuz87Cch/OwnJvzsJyv87Cdg/OwnZfzsJ2r87Cdv/OwnpPzsJ6n87Ceu/Own4/zsJ+j87Cft/OwoIvzsKCf87Cgs/OwoYfzsKGb87Chr/OwooPzsKKX87Ciq/Owor/zsKOT87Cjp/Owo7vzsKSP87Cko/OwpLfzsKWL87Cln/OwpbPzsKaH87Cmm/Owpq/zsKeD87Cnl/Owp6vzsKe/87Cok/OwqKfzsKi787Cpj/OwqaPzsKm387Cqi/Owqp/zsKqz87Crh/Owq5vzsKuv87Csg/OwrJfzsKyr87Csv/OwrZPzsK2n87Ctu/Owro/zsK6j87Cut/Owr4vzsK+f87Cvs/OwsIfzsLCb87Cwr/OwsYPzsLGX87Cxq/Owsb/zsLKT87Cyp/OwsrvzsLOP87Czo/Ows7fzsLSL87C0n/OwtLPzsLWH87C1m/Owta/zsLaD87C2lw==" + "string" : "󰗛󰗯󰘃󰘗󰘫󰘿󰙓󰙧󰙻󰚏󰚣󰚷󰛋󰛟󰛳󰜇󰜛󰜯󰝃󰝗󰝫󰝿󰞓󰞧󰞻󰟏󰟣󰟷󰠋󰠟󰠳󰡇󰡛󰡯󰢃󰢗󰢫󰢿󰣓󰣧󰣻󰤏󰤣󰤷󰥋󰥟󰥳󰦇󰦛󰦯󰧃󰧗󰧫󰧿󰨓󰨧󰨻󰩏󰩣󰩷󰪋󰪟󰪳󰫇󰫛󰫯󰬃󰬗󰬫󰬿󰭓󰭧󰭻󰮏󰮣󰮷󰯋󰯟󰯳󰰇󰰛󰰯󰱃󰱗󰱫󰱿󰲓󰲧󰲻󰳏󰳣󰳷󰴋󰴟󰴳󰵇󰵛󰵯󰶃󰶗", + "encodedString" : "87CXm/Owl6/zsJiD87CYl/OwmKvzsJi/87CZk/OwmafzsJm787Caj/OwmqPzsJq387Cbi/Owm5/zsJuz87Cch/OwnJvzsJyv87Cdg/OwnZfzsJ2r87Cdv/OwnpPzsJ6n87Ceu/Own4/zsJ+j87Cft/OwoIvzsKCf87Cgs/OwoYfzsKGb87Chr/OwooPzsKKX87Ciq/Owor/zsKOT87Cjp/Owo7vzsKSP87Cko/OwpLfzsKWL87Cln/OwpbPzsKaH87Cmm/Owpq/zsKeD87Cnl/Owp6vzsKe/87Cok/OwqKfzsKi787Cpj/OwqaPzsKm387Cqi/Owqp/zsKqz87Crh/Owq5vzsKuv87Csg/OwrJfzsKyr87Csv/OwrZPzsK2n87Ctu/Owro/zsK6j87Cut/Owr4vzsK+f87Cvs/OwsIfzsLCb87Cwr/OwsYPzsLGX87Cxq/Owsb/zsLKT87Cyp/OwsrvzsLOP87Czo/Ows7fzsLSL87C0n/OwtLPzsLWH87C1m/Owta/zsLaD87C2lw==" }, { - "string": "󰶫󰶿󰷓󰷧󰷻󰸏󰸣󰸷󰹋󰹟󰹳󰺇󰺛󰺯󰻃󰻗󰻫󰻿󰼓󰼧󰼻󰽏󰽣󰽷󰾋󰾟󰾳󰿇󰿛󰿯󱀃󱀗󱀫󱀿󱁓󱁧󱁻󱂏󱂣󱂷󱃋󱃟󱃳󱄇󱄛󱄯󱅃󱅗󱅫󱅿󱆓󱆧󱆻󱇏󱇣󱇷󱈋󱈟󱈳󱉇󱉛󱉯󱊃󱊗󱊫󱊿󱋓󱋧󱋻󱌏󱌣󱌷󱍋󱍟󱍳󱎇󱎛󱎯󱏃󱏗󱏫󱏿󱐓󱐧󱐻󱑏󱑣󱑷󱒋󱒟󱒳󱓇󱓛󱓯󱔃󱔗󱔫󱔿󱕓󱕧", - "encodedString": "87C2q/Owtr/zsLeT87C3p/Owt7vzsLiP87C4o/OwuLfzsLmL87C5n/OwubPzsLqH87C6m/Owuq/zsLuD87C7l/Owu6vzsLu/87C8k/OwvKfzsLy787C9j/OwvaPzsL2387C+i/Owvp/zsL6z87C/h/Owv5vzsL+v87GAg/OxgJfzsYCr87GAv/OxgZPzsYGn87GBu/Oxgo/zsYKj87GCt/Oxg4vzsYOf87GDs/OxhIfzsYSb87GEr/OxhYPzsYWX87GFq/Oxhb/zsYaT87GGp/OxhrvzsYeP87GHo/Oxh7fzsYiL87GIn/OxiLPzsYmH87GJm/Oxia/zsYqD87GKl/OxiqvzsYq/87GLk/Oxi6fzsYu787GMj/OxjKPzsYy387GNi/OxjZ/zsY2z87GOh/OxjpvzsY6v87GPg/Oxj5fzsY+r87GPv/OxkJPzsZCn87GQu/OxkY/zsZGj87GRt/OxkovzsZKf87GSs/Oxk4fzsZOb87GTr/OxlIPzsZSX87GUq/OxlL/zsZWT87GVpw==" + "string" : "󰶫󰶿󰷓󰷧󰷻󰸏󰸣󰸷󰹋󰹟󰹳󰺇󰺛󰺯󰻃󰻗󰻫󰻿󰼓󰼧󰼻󰽏󰽣󰽷󰾋󰾟󰾳󰿇󰿛󰿯󱀃󱀗󱀫󱀿󱁓󱁧󱁻󱂏󱂣󱂷󱃋󱃟󱃳󱄇󱄛󱄯󱅃󱅗󱅫󱅿󱆓󱆧󱆻󱇏󱇣󱇷󱈋󱈟󱈳󱉇󱉛󱉯󱊃󱊗󱊫󱊿󱋓󱋧󱋻󱌏󱌣󱌷󱍋󱍟󱍳󱎇󱎛󱎯󱏃󱏗󱏫󱏿󱐓󱐧󱐻󱑏󱑣󱑷󱒋󱒟󱒳󱓇󱓛󱓯󱔃󱔗󱔫󱔿󱕓󱕧", + "encodedString" : "87C2q/Owtr/zsLeT87C3p/Owt7vzsLiP87C4o/OwuLfzsLmL87C5n/OwubPzsLqH87C6m/Owuq/zsLuD87C7l/Owu6vzsLu/87C8k/OwvKfzsLy787C9j/OwvaPzsL2387C+i/Owvp/zsL6z87C/h/Owv5vzsL+v87GAg/OxgJfzsYCr87GAv/OxgZPzsYGn87GBu/Oxgo/zsYKj87GCt/Oxg4vzsYOf87GDs/OxhIfzsYSb87GEr/OxhYPzsYWX87GFq/Oxhb/zsYaT87GGp/OxhrvzsYeP87GHo/Oxh7fzsYiL87GIn/OxiLPzsYmH87GJm/Oxia/zsYqD87GKl/OxiqvzsYq/87GLk/Oxi6fzsYu787GMj/OxjKPzsYy387GNi/OxjZ/zsY2z87GOh/OxjpvzsY6v87GPg/Oxj5fzsY+r87GPv/OxkJPzsZCn87GQu/OxkY/zsZGj87GRt/OxkovzsZKf87GSs/Oxk4fzsZOb87GTr/OxlIPzsZSX87GUq/OxlL/zsZWT87GVpw==" }, { - "string": "󱕻󱖏󱖣󱖷󱗋󱗟󱗳󱘇󱘛󱘯󱙃󱙗󱙫󱙿󱚓󱚧󱚻󱛏󱛣󱛷󱜋󱜟󱜳󱝇󱝛󱝯󱞃󱞗󱞫󱞿󱟓󱟧󱟻󱠏󱠣󱠷󱡋󱡟󱡳󱢇󱢛󱢯󱣃󱣗󱣫󱣿󱤓󱤧󱤻󱥏󱥣󱥷󱦋󱦟󱦳󱧇󱧛󱧯󱨃󱨗󱨫󱨿󱩓󱩧󱩻󱪏󱪣󱪷󱫋󱫟󱫳󱬇󱬛󱬯󱭃󱭗󱭫󱭿󱮓󱮧󱮻󱯏󱯣󱯷󱰋󱰟󱰳󱱇󱱛󱱯󱲃󱲗󱲫󱲿󱳓󱳧󱳻󱴏󱴣󱴷", - "encodedString": "87GVu/Oxlo/zsZaj87GWt/Oxl4vzsZef87GXs/OxmIfzsZib87GYr/OxmYPzsZmX87GZq/Oxmb/zsZqT87Gap/OxmrvzsZuP87Gbo/Oxm7fzsZyL87Gcn/OxnLPzsZ2H87Gdm/Oxna/zsZ6D87Gel/OxnqvzsZ6/87Gfk/Oxn6fzsZ+787Ggj/OxoKPzsaC387Ghi/OxoZ/zsaGz87Gih/OxopvzsaKv87Gjg/Oxo5fzsaOr87Gjv/OxpJPzsaSn87Gku/OxpY/zsaWj87Glt/Oxpovzsaaf87Gms/Oxp4fzsaeb87Gnr/OxqIPzsaiX87Goq/OxqL/zsamT87Gpp/OxqbvzsaqP87Gqo/OxqrfzsauL87Grn/Oxq7PzsayH87Gsm/OxrK/zsa2D87Gtl/Oxravzsa2/87Guk/Oxrqfzsa6787Gvj/Oxr6Pzsa+387Gwi/OxsJ/zsbCz87Gxh/OxsZvzsbGv87Gyg/OxspfzsbKr87Gyv/Oxs5PzsbOn87Gzu/OxtI/zsbSj87G0tw==" + "string" : "󱕻󱖏󱖣󱖷󱗋󱗟󱗳󱘇󱘛󱘯󱙃󱙗󱙫󱙿󱚓󱚧󱚻󱛏󱛣󱛷󱜋󱜟󱜳󱝇󱝛󱝯󱞃󱞗󱞫󱞿󱟓󱟧󱟻󱠏󱠣󱠷󱡋󱡟󱡳󱢇󱢛󱢯󱣃󱣗󱣫󱣿󱤓󱤧󱤻󱥏󱥣󱥷󱦋󱦟󱦳󱧇󱧛󱧯󱨃󱨗󱨫󱨿󱩓󱩧󱩻󱪏󱪣󱪷󱫋󱫟󱫳󱬇󱬛󱬯󱭃󱭗󱭫󱭿󱮓󱮧󱮻󱯏󱯣󱯷󱰋󱰟󱰳󱱇󱱛󱱯󱲃󱲗󱲫󱲿󱳓󱳧󱳻󱴏󱴣󱴷", + "encodedString" : "87GVu/Oxlo/zsZaj87GWt/Oxl4vzsZef87GXs/OxmIfzsZib87GYr/OxmYPzsZmX87GZq/Oxmb/zsZqT87Gap/OxmrvzsZuP87Gbo/Oxm7fzsZyL87Gcn/OxnLPzsZ2H87Gdm/Oxna/zsZ6D87Gel/OxnqvzsZ6/87Gfk/Oxn6fzsZ+787Ggj/OxoKPzsaC387Ghi/OxoZ/zsaGz87Gih/OxopvzsaKv87Gjg/Oxo5fzsaOr87Gjv/OxpJPzsaSn87Gku/OxpY/zsaWj87Glt/Oxpovzsaaf87Gms/Oxp4fzsaeb87Gnr/OxqIPzsaiX87Goq/OxqL/zsamT87Gpp/OxqbvzsaqP87Gqo/OxqrfzsauL87Grn/Oxq7PzsayH87Gsm/OxrK/zsa2D87Gtl/Oxravzsa2/87Guk/Oxrqfzsa6787Gvj/Oxr6Pzsa+387Gwi/OxsJ/zsbCz87Gxh/OxsZvzsbGv87Gyg/OxspfzsbKr87Gyv/Oxs5PzsbOn87Gzu/OxtI/zsbSj87G0tw==" }, { - "string": "󱵋󱵟󱵳󱶇󱶛󱶯󱷃󱷗󱷫󱷿󱸓󱸧󱸻󱹏󱹣󱹷󱺋󱺟󱺳󱻇󱻛󱻯󱼃󱼗󱼫󱼿󱽓󱽧󱽻󱾏󱾣󱾷󱿋󱿟󱿳󲀇󲀛󲀯󲁃󲁗󲁫󲁿󲂓󲂧󲂻󲃏󲃣󲃷󲄋󲄟󲄳󲅇󲅛󲅯󲆃󲆗󲆫󲆿󲇓󲇧󲇻󲈏󲈣󲈷󲉋󲉟󲉳󲊇󲊛󲊯󲋃󲋗󲋫󲋿󲌓󲌧󲌻󲍏󲍣󲍷󲎋󲎟󲎳󲏇󲏛󲏯󲐃󲐗󲐫󲐿󲑓󲑧󲑻󲒏󲒣󲒷󲓋󲓟󲓳󲔇", - "encodedString": "87G1i/OxtZ/zsbWz87G2h/Oxtpvzsbav87G3g/Oxt5fzsber87G3v/OxuJPzsbin87G4u/OxuY/zsbmj87G5t/Oxuovzsbqf87G6s/Oxu4fzsbub87G7r/OxvIPzsbyX87G8q/OxvL/zsb2T87G9p/Oxvbvzsb6P87G+o/Oxvrfzsb+L87G/n/Oxv7PzsoCH87KAm/OygK/zsoGD87KBl/OygavzsoG/87KCk/OygqfzsoK787KDj/Oyg6PzsoO387KEi/OyhJ/zsoSz87KFh/OyhZvzsoWv87KGg/Oyhpfzsoar87KGv/Oyh5Pzsoen87KHu/OyiI/zsoij87KIt/OyiYvzsomf87KJs/Oyiofzsoqb87KKr/Oyi4PzsouX87KLq/Oyi7/zsoyT87KMp/OyjLvzso2P87KNo/Oyjbfzso6L87KOn/OyjrPzso+H87KPm/Oyj6/zspCD87KQl/OykKvzspC/87KRk/OykafzspG787KSj/OykqPzspK387KTi/Oyk5/zspOz87KUhw==" + "string" : "󱵋󱵟󱵳󱶇󱶛󱶯󱷃󱷗󱷫󱷿󱸓󱸧󱸻󱹏󱹣󱹷󱺋󱺟󱺳󱻇󱻛󱻯󱼃󱼗󱼫󱼿󱽓󱽧󱽻󱾏󱾣󱾷󱿋󱿟󱿳󲀇󲀛󲀯󲁃󲁗󲁫󲁿󲂓󲂧󲂻󲃏󲃣󲃷󲄋󲄟󲄳󲅇󲅛󲅯󲆃󲆗󲆫󲆿󲇓󲇧󲇻󲈏󲈣󲈷󲉋󲉟󲉳󲊇󲊛󲊯󲋃󲋗󲋫󲋿󲌓󲌧󲌻󲍏󲍣󲍷󲎋󲎟󲎳󲏇󲏛󲏯󲐃󲐗󲐫󲐿󲑓󲑧󲑻󲒏󲒣󲒷󲓋󲓟󲓳󲔇", + "encodedString" : "87G1i/OxtZ/zsbWz87G2h/Oxtpvzsbav87G3g/Oxt5fzsber87G3v/OxuJPzsbin87G4u/OxuY/zsbmj87G5t/Oxuovzsbqf87G6s/Oxu4fzsbub87G7r/OxvIPzsbyX87G8q/OxvL/zsb2T87G9p/Oxvbvzsb6P87G+o/Oxvrfzsb+L87G/n/Oxv7PzsoCH87KAm/OygK/zsoGD87KBl/OygavzsoG/87KCk/OygqfzsoK787KDj/Oyg6PzsoO387KEi/OyhJ/zsoSz87KFh/OyhZvzsoWv87KGg/Oyhpfzsoar87KGv/Oyh5Pzsoen87KHu/OyiI/zsoij87KIt/OyiYvzsomf87KJs/Oyiofzsoqb87KKr/Oyi4PzsouX87KLq/Oyi7/zsoyT87KMp/OyjLvzso2P87KNo/Oyjbfzso6L87KOn/OyjrPzso+H87KPm/Oyj6/zspCD87KQl/OykKvzspC/87KRk/OykafzspG787KSj/OykqPzspK387KTi/Oyk5/zspOz87KUhw==" }, { - "string": "󲔛󲔯󲕃󲕗󲕫󲕿󲖓󲖧󲖻󲗏󲗣󲗷󲘋󲘟󲘳󲙇󲙛󲙯󲚃󲚗󲚫󲚿󲛓󲛧󲛻󲜏󲜣󲜷󲝋󲝟󲝳󲞇󲞛󲞯󲟃󲟗󲟫󲟿󲠓󲠧󲠻󲡏󲡣󲡷󲢋󲢟󲢳󲣇󲣛󲣯󲤃󲤗󲤫󲤿󲥓󲥧󲥻󲦏󲦣󲦷󲧋󲧟󲧳󲨇󲨛󲨯󲩃󲩗󲩫󲩿󲪓󲪧󲪻󲫏󲫣󲫷󲬋󲬟󲬳󲭇󲭛󲭯󲮃󲮗󲮫󲮿󲯓󲯧󲯻󲰏󲰣󲰷󲱋󲱟󲱳󲲇󲲛󲲯󲳃󲳗", - "encodedString": "87KUm/OylK/zspWD87KVl/OylavzspW/87KWk/Oylqfzspa787KXj/Oyl6Pzspe387KYi/OymJ/zspiz87KZh/OymZvzspmv87Kag/Oympfzspqr87Kav/Oym5Pzspun87Kbu/OynI/zspyj87Kct/OynYvzsp2f87Kds/Oynofzsp6b87Ker/Oyn4Pzsp+X87Kfq/Oyn7/zsqCT87Kgp/OyoLvzsqGP87Kho/OyobfzsqKL87Kin/OyorPzsqOH87Kjm/Oyo6/zsqSD87Kkl/OypKvzsqS/87Klk/OypafzsqW787Kmj/OypqPzsqa387Kni/Oyp5/zsqez87Koh/OyqJvzsqiv87Kpg/OyqZfzsqmr87Kpv/OyqpPzsqqn87Kqu/Oyq4/zsquj87Krt/OyrIvzsqyf87Kss/OyrYfzsq2b87Ktr/OyroPzsq6X87Kuq/Oyrr/zsq+T87Kvp/Oyr7vzsrCP87Kwo/OysLfzsrGL87Kxn/OysbPzsrKH87Kym/Oysq/zsrOD87Kzlw==" + "string" : "󲔛󲔯󲕃󲕗󲕫󲕿󲖓󲖧󲖻󲗏󲗣󲗷󲘋󲘟󲘳󲙇󲙛󲙯󲚃󲚗󲚫󲚿󲛓󲛧󲛻󲜏󲜣󲜷󲝋󲝟󲝳󲞇󲞛󲞯󲟃󲟗󲟫󲟿󲠓󲠧󲠻󲡏󲡣󲡷󲢋󲢟󲢳󲣇󲣛󲣯󲤃󲤗󲤫󲤿󲥓󲥧󲥻󲦏󲦣󲦷󲧋󲧟󲧳󲨇󲨛󲨯󲩃󲩗󲩫󲩿󲪓󲪧󲪻󲫏󲫣󲫷󲬋󲬟󲬳󲭇󲭛󲭯󲮃󲮗󲮫󲮿󲯓󲯧󲯻󲰏󲰣󲰷󲱋󲱟󲱳󲲇󲲛󲲯󲳃󲳗", + "encodedString" : "87KUm/OylK/zspWD87KVl/OylavzspW/87KWk/Oylqfzspa787KXj/Oyl6Pzspe387KYi/OymJ/zspiz87KZh/OymZvzspmv87Kag/Oympfzspqr87Kav/Oym5Pzspun87Kbu/OynI/zspyj87Kct/OynYvzsp2f87Kds/Oynofzsp6b87Ker/Oyn4Pzsp+X87Kfq/Oyn7/zsqCT87Kgp/OyoLvzsqGP87Kho/OyobfzsqKL87Kin/OyorPzsqOH87Kjm/Oyo6/zsqSD87Kkl/OypKvzsqS/87Klk/OypafzsqW787Kmj/OypqPzsqa387Kni/Oyp5/zsqez87Koh/OyqJvzsqiv87Kpg/OyqZfzsqmr87Kpv/OyqpPzsqqn87Kqu/Oyq4/zsquj87Krt/OyrIvzsqyf87Kss/OyrYfzsq2b87Ktr/OyroPzsq6X87Kuq/Oyrr/zsq+T87Kvp/Oyr7vzsrCP87Kwo/OysLfzsrGL87Kxn/OysbPzsrKH87Kym/Oysq/zsrOD87Kzlw==" }, { - "string": "󲳫󲳿󲴓󲴧󲴻󲵏󲵣󲵷󲶋󲶟󲶳󲷇󲷛󲷯󲸃󲸗󲸫󲸿󲹓󲹧󲹻󲺏󲺣󲺷󲻋󲻟󲻳󲼇󲼛󲼯󲽃󲽗󲽫󲽿󲾓󲾧󲾻󲿏󲿣󲿷󳀋󳀟󳀳󳁇󳁛󳁯󳂃󳂗󳂫󳂿󳃓󳃧󳃻󳄏󳄣󳄷󳅋󳅟󳅳󳆇󳆛󳆯󳇃󳇗󳇫󳇿󳈓󳈧󳈻󳉏󳉣󳉷󳊋󳊟󳊳󳋇󳋛󳋯󳌃󳌗󳌫󳌿󳍓󳍧󳍻󳎏󳎣󳎷󳏋󳏟󳏳󳐇󳐛󳐯󳑃󳑗󳑫󳑿󳒓󳒧", - "encodedString": "87Kzq/Oys7/zsrST87K0p/OytLvzsrWP87K1o/OytbfzsraL87K2n/OytrPzsreH87K3m/Oyt6/zsriD87K4l/OyuKvzsri/87K5k/Oyuafzsrm787K6j/OyuqPzsrq387K7i/Oyu5/zsruz87K8h/OyvJvzsryv87K9g/OyvZfzsr2r87K9v/OyvpPzsr6n87K+u/Oyv4/zsr+j87K/t/OzgIvzs4Cf87OAs/OzgYfzs4Gb87OBr/OzgoPzs4KX87OCq/Ozgr/zs4OT87ODp/Ozg7vzs4SP87OEo/OzhLfzs4WL87OFn/OzhbPzs4aH87OGm/Ozhq/zs4eD87OHl/Ozh6vzs4e/87OIk/OziKfzs4i787OJj/OziaPzs4m387OKi/Ozip/zs4qz87OLh/Ozi5vzs4uv87OMg/OzjJfzs4yr87OMv/OzjZPzs42n87ONu/Ozjo/zs46j87OOt/Ozj4vzs4+f87OPs/OzkIfzs5Cb87OQr/OzkYPzs5GX87ORq/Ozkb/zs5KT87OSpw==" + "string" : "󲳫󲳿󲴓󲴧󲴻󲵏󲵣󲵷󲶋󲶟󲶳󲷇󲷛󲷯󲸃󲸗󲸫󲸿󲹓󲹧󲹻󲺏󲺣󲺷󲻋󲻟󲻳󲼇󲼛󲼯󲽃󲽗󲽫󲽿󲾓󲾧󲾻󲿏󲿣󲿷󳀋󳀟󳀳󳁇󳁛󳁯󳂃󳂗󳂫󳂿󳃓󳃧󳃻󳄏󳄣󳄷󳅋󳅟󳅳󳆇󳆛󳆯󳇃󳇗󳇫󳇿󳈓󳈧󳈻󳉏󳉣󳉷󳊋󳊟󳊳󳋇󳋛󳋯󳌃󳌗󳌫󳌿󳍓󳍧󳍻󳎏󳎣󳎷󳏋󳏟󳏳󳐇󳐛󳐯󳑃󳑗󳑫󳑿󳒓󳒧", + "encodedString" : "87Kzq/Oys7/zsrST87K0p/OytLvzsrWP87K1o/OytbfzsraL87K2n/OytrPzsreH87K3m/Oyt6/zsriD87K4l/OyuKvzsri/87K5k/Oyuafzsrm787K6j/OyuqPzsrq387K7i/Oyu5/zsruz87K8h/OyvJvzsryv87K9g/OyvZfzsr2r87K9v/OyvpPzsr6n87K+u/Oyv4/zsr+j87K/t/OzgIvzs4Cf87OAs/OzgYfzs4Gb87OBr/OzgoPzs4KX87OCq/Ozgr/zs4OT87ODp/Ozg7vzs4SP87OEo/OzhLfzs4WL87OFn/OzhbPzs4aH87OGm/Ozhq/zs4eD87OHl/Ozh6vzs4e/87OIk/OziKfzs4i787OJj/OziaPzs4m387OKi/Ozip/zs4qz87OLh/Ozi5vzs4uv87OMg/OzjJfzs4yr87OMv/OzjZPzs42n87ONu/Ozjo/zs46j87OOt/Ozj4vzs4+f87OPs/OzkIfzs5Cb87OQr/OzkYPzs5GX87ORq/Ozkb/zs5KT87OSpw==" }, { - "string": "󳒻󳓏󳓣󳓷󳔋󳔟󳔳󳕇󳕛󳕯󳖃󳖗󳖫󳖿󳗓󳗧󳗻󳘏󳘣󳘷󳙋󳙟󳙳󳚇󳚛󳚯󳛃󳛗󳛫󳛿󳜓󳜧󳜻󳝏󳝣󳝷󳞋󳞟󳞳󳟇󳟛󳟯󳠃󳠗󳠫󳠿󳡓󳡧󳡻󳢏󳢣󳢷󳣋󳣟󳣳󳤇󳤛󳤯󳥃󳥗󳥫󳥿󳦓󳦧󳦻󳧏󳧣󳧷󳨋󳨟󳨳󳩇󳩛󳩯󳪃󳪗󳪫󳪿󳫓󳫧󳫻󳬏󳬣󳬷󳭋󳭟󳭳󳮇󳮛󳮯󳯃󳯗󳯫󳯿󳰓󳰧󳰻󳱏󳱣󳱷", - "encodedString": "87OSu/Ozk4/zs5Oj87OTt/OzlIvzs5Sf87OUs/OzlYfzs5Wb87OVr/OzloPzs5aX87OWq/Ozlr/zs5eT87OXp/Ozl7vzs5iP87OYo/OzmLfzs5mL87OZn/OzmbPzs5qH87Oam/Ozmq/zs5uD87Obl/Ozm6vzs5u/87Ock/OznKfzs5y787Odj/OznaPzs52387Oei/Oznp/zs56z87Ofh/Ozn5vzs5+v87Ogg/OzoJfzs6Cr87Ogv/OzoZPzs6Gn87Ohu/Ozoo/zs6Kj87Oit/Ozo4vzs6Of87Ojs/OzpIfzs6Sb87Okr/OzpYPzs6WX87Olq/Ozpb/zs6aT87Omp/Ozprvzs6eP87Ono/Ozp7fzs6iL87Oon/OzqLPzs6mH87Opm/Ozqa/zs6qD87Oql/Ozqqvzs6q/87Ork/Ozq6fzs6u787Osj/OzrKPzs6y387Oti/OzrZ/zs62z87Ouh/Ozrpvzs66v87Ovg/Ozr5fzs6+r87Ovv/OzsJPzs7Cn87Owu/OzsY/zs7Gj87Oxtw==" + "string" : "󳒻󳓏󳓣󳓷󳔋󳔟󳔳󳕇󳕛󳕯󳖃󳖗󳖫󳖿󳗓󳗧󳗻󳘏󳘣󳘷󳙋󳙟󳙳󳚇󳚛󳚯󳛃󳛗󳛫󳛿󳜓󳜧󳜻󳝏󳝣󳝷󳞋󳞟󳞳󳟇󳟛󳟯󳠃󳠗󳠫󳠿󳡓󳡧󳡻󳢏󳢣󳢷󳣋󳣟󳣳󳤇󳤛󳤯󳥃󳥗󳥫󳥿󳦓󳦧󳦻󳧏󳧣󳧷󳨋󳨟󳨳󳩇󳩛󳩯󳪃󳪗󳪫󳪿󳫓󳫧󳫻󳬏󳬣󳬷󳭋󳭟󳭳󳮇󳮛󳮯󳯃󳯗󳯫󳯿󳰓󳰧󳰻󳱏󳱣󳱷", + "encodedString" : "87OSu/Ozk4/zs5Oj87OTt/OzlIvzs5Sf87OUs/OzlYfzs5Wb87OVr/OzloPzs5aX87OWq/Ozlr/zs5eT87OXp/Ozl7vzs5iP87OYo/OzmLfzs5mL87OZn/OzmbPzs5qH87Oam/Ozmq/zs5uD87Obl/Ozm6vzs5u/87Ock/OznKfzs5y787Odj/OznaPzs52387Oei/Oznp/zs56z87Ofh/Ozn5vzs5+v87Ogg/OzoJfzs6Cr87Ogv/OzoZPzs6Gn87Ohu/Ozoo/zs6Kj87Oit/Ozo4vzs6Of87Ojs/OzpIfzs6Sb87Okr/OzpYPzs6WX87Olq/Ozpb/zs6aT87Omp/Ozprvzs6eP87Ono/Ozp7fzs6iL87Oon/OzqLPzs6mH87Opm/Ozqa/zs6qD87Oql/Ozqqvzs6q/87Ork/Ozq6fzs6u787Osj/OzrKPzs6y387Oti/OzrZ/zs62z87Ouh/Ozrpvzs66v87Ovg/Ozr5fzs6+r87Ovv/OzsJPzs7Cn87Owu/OzsY/zs7Gj87Oxtw==" }, { - "string": "󳲋󳲟󳲳󳳇󳳛󳳯󳴃󳴗󳴫󳴿󳵓󳵧󳵻󳶏󳶣󳶷󳷋󳷟󳷳󳸇󳸛󳸯󳹃󳹗󳹫󳹿󳺓󳺧󳺻󳻏󳻣󳻷󳼋󳼟󳼳󳽇󳽛󳽯󳾃󳾗󳾫󳾿󳿓󳿧󳿻󴀏󴀣󴀷󴁋󴁟󴁳󴂇󴂛󴂯󴃃󴃗󴃫󴃿󴄓󴄧󴄻󴅏󴅣󴅷󴆋󴆟󴆳󴇇󴇛󴇯󴈃󴈗󴈫󴈿󴉓󴉧󴉻󴊏󴊣󴊷󴋋󴋟󴋳󴌇󴌛󴌯󴍃󴍗󴍫󴍿󴎓󴎧󴎻󴏏󴏣󴏷󴐋󴐟󴐳󴑇", - "encodedString": "87Oyi/Ozsp/zs7Kz87Ozh/Ozs5vzs7Ov87O0g/OztJfzs7Sr87O0v/OztZPzs7Wn87O1u/Ozto/zs7aj87O2t/Ozt4vzs7ef87O3s/OzuIfzs7ib87O4r/OzuYPzs7mX87O5q/Ozub/zs7qT87O6p/Ozurvzs7uP87O7o/Ozu7fzs7yL87O8n/OzvLPzs72H87O9m/Ozva/zs76D87O+l/Ozvqvzs76/87O/k/Ozv6fzs7+787SAj/O0gKPztIC387SBi/O0gZ/ztIGz87SCh/O0gpvztIKv87SDg/O0g5fztIOr87SDv/O0hJPztISn87SEu/O0hY/ztIWj87SFt/O0hovztIaf87SGs/O0h4fztIeb87SHr/O0iIPztIiX87SIq/O0iL/ztImT87SJp/O0ibvztIqP87SKo/O0irfztIuL87SLn/O0i7PztIyH87SMm/O0jK/ztI2D87SNl/O0javztI2/87SOk/O0jqfztI6787SPj/O0j6PztI+387SQi/O0kJ/ztJCz87SRhw==" + "string" : "󳲋󳲟󳲳󳳇󳳛󳳯󳴃󳴗󳴫󳴿󳵓󳵧󳵻󳶏󳶣󳶷󳷋󳷟󳷳󳸇󳸛󳸯󳹃󳹗󳹫󳹿󳺓󳺧󳺻󳻏󳻣󳻷󳼋󳼟󳼳󳽇󳽛󳽯󳾃󳾗󳾫󳾿󳿓󳿧󳿻󴀏󴀣󴀷󴁋󴁟󴁳󴂇󴂛󴂯󴃃󴃗󴃫󴃿󴄓󴄧󴄻󴅏󴅣󴅷󴆋󴆟󴆳󴇇󴇛󴇯󴈃󴈗󴈫󴈿󴉓󴉧󴉻󴊏󴊣󴊷󴋋󴋟󴋳󴌇󴌛󴌯󴍃󴍗󴍫󴍿󴎓󴎧󴎻󴏏󴏣󴏷󴐋󴐟󴐳󴑇", + "encodedString" : "87Oyi/Ozsp/zs7Kz87Ozh/Ozs5vzs7Ov87O0g/OztJfzs7Sr87O0v/OztZPzs7Wn87O1u/Ozto/zs7aj87O2t/Ozt4vzs7ef87O3s/OzuIfzs7ib87O4r/OzuYPzs7mX87O5q/Ozub/zs7qT87O6p/Ozurvzs7uP87O7o/Ozu7fzs7yL87O8n/OzvLPzs72H87O9m/Ozva/zs76D87O+l/Ozvqvzs76/87O/k/Ozv6fzs7+787SAj/O0gKPztIC387SBi/O0gZ/ztIGz87SCh/O0gpvztIKv87SDg/O0g5fztIOr87SDv/O0hJPztISn87SEu/O0hY/ztIWj87SFt/O0hovztIaf87SGs/O0h4fztIeb87SHr/O0iIPztIiX87SIq/O0iL/ztImT87SJp/O0ibvztIqP87SKo/O0irfztIuL87SLn/O0i7PztIyH87SMm/O0jK/ztI2D87SNl/O0javztI2/87SOk/O0jqfztI6787SPj/O0j6PztI+387SQi/O0kJ/ztJCz87SRhw==" }, { - "string": "󴑛󴑯󴒃󴒗󴒫󴒿󴓓󴓧󴓻󴔏󴔣󴔷󴕋󴕟󴕳󴖇󴖛󴖯󴗃󴗗󴗫󴗿󴘓󴘧󴘻󴙏󴙣󴙷󴚋󴚟󴚳󴛇󴛛󴛯󴜃󴜗󴜫󴜿󴝓󴝧󴝻󴞏󴞣󴞷󴟋󴟟󴟳󴠇󴠛󴠯󴡃󴡗󴡫󴡿󴢓󴢧󴢻󴣏󴣣󴣷󴤋󴤟󴤳󴥇󴥛󴥯󴦃󴦗󴦫󴦿󴧓󴧧󴧻󴨏󴨣󴨷󴩋󴩟󴩳󴪇󴪛󴪯󴫃󴫗󴫫󴫿󴬓󴬧󴬻󴭏󴭣󴭷󴮋󴮟󴮳󴯇󴯛󴯯󴰃󴰗", - "encodedString": "87SRm/O0ka/ztJKD87SSl/O0kqvztJK/87STk/O0k6fztJO787SUj/O0lKPztJS387SVi/O0lZ/ztJWz87SWh/O0lpvztJav87SXg/O0l5fztJer87SXv/O0mJPztJin87SYu/O0mY/ztJmj87SZt/O0movztJqf87Sas/O0m4fztJub87Sbr/O0nIPztJyX87Scq/O0nL/ztJ2T87Sdp/O0nbvztJ6P87Seo/O0nrfztJ+L87Sfn/O0n7PztKCH87Sgm/O0oK/ztKGD87Shl/O0oavztKG/87Sik/O0oqfztKK787Sjj/O0o6PztKO387Ski/O0pJ/ztKSz87Slh/O0pZvztKWv87Smg/O0ppfztKar87Smv/O0p5PztKen87Snu/O0qI/ztKij87Sot/O0qYvztKmf87Sps/O0qofztKqb87Sqr/O0q4PztKuX87Srq/O0q7/ztKyT87Ssp/O0rLvztK2P87Sto/O0rbfztK6L87Sun/O0rrPztK+H87Svm/O0r6/ztLCD87Swlw==" + "string" : "󴑛󴑯󴒃󴒗󴒫󴒿󴓓󴓧󴓻󴔏󴔣󴔷󴕋󴕟󴕳󴖇󴖛󴖯󴗃󴗗󴗫󴗿󴘓󴘧󴘻󴙏󴙣󴙷󴚋󴚟󴚳󴛇󴛛󴛯󴜃󴜗󴜫󴜿󴝓󴝧󴝻󴞏󴞣󴞷󴟋󴟟󴟳󴠇󴠛󴠯󴡃󴡗󴡫󴡿󴢓󴢧󴢻󴣏󴣣󴣷󴤋󴤟󴤳󴥇󴥛󴥯󴦃󴦗󴦫󴦿󴧓󴧧󴧻󴨏󴨣󴨷󴩋󴩟󴩳󴪇󴪛󴪯󴫃󴫗󴫫󴫿󴬓󴬧󴬻󴭏󴭣󴭷󴮋󴮟󴮳󴯇󴯛󴯯󴰃󴰗", + "encodedString" : "87SRm/O0ka/ztJKD87SSl/O0kqvztJK/87STk/O0k6fztJO787SUj/O0lKPztJS387SVi/O0lZ/ztJWz87SWh/O0lpvztJav87SXg/O0l5fztJer87SXv/O0mJPztJin87SYu/O0mY/ztJmj87SZt/O0movztJqf87Sas/O0m4fztJub87Sbr/O0nIPztJyX87Scq/O0nL/ztJ2T87Sdp/O0nbvztJ6P87Seo/O0nrfztJ+L87Sfn/O0n7PztKCH87Sgm/O0oK/ztKGD87Shl/O0oavztKG/87Sik/O0oqfztKK787Sjj/O0o6PztKO387Ski/O0pJ/ztKSz87Slh/O0pZvztKWv87Smg/O0ppfztKar87Smv/O0p5PztKen87Snu/O0qI/ztKij87Sot/O0qYvztKmf87Sps/O0qofztKqb87Sqr/O0q4PztKuX87Srq/O0q7/ztKyT87Ssp/O0rLvztK2P87Sto/O0rbfztK6L87Sun/O0rrPztK+H87Svm/O0r6/ztLCD87Swlw==" }, { - "string": "󴰫󴰿󴱓󴱧󴱻󴲏󴲣󴲷󴳋󴳟󴳳󴴇󴴛󴴯󴵃󴵗󴵫󴵿󴶓󴶧󴶻󴷏󴷣󴷷󴸋󴸟󴸳󴹇󴹛󴹯󴺃󴺗󴺫󴺿󴻓󴻧󴻻󴼏󴼣󴼷󴽋󴽟󴽳󴾇󴾛󴾯󴿃󴿗󴿫󴿿󵀓󵀧󵀻󵁏󵁣󵁷󵂋󵂟󵂳󵃇󵃛󵃯󵄃󵄗󵄫󵄿󵅓󵅧󵅻󵆏󵆣󵆷󵇋󵇟󵇳󵈇󵈛󵈯󵉃󵉗󵉫󵉿󵊓󵊧󵊻󵋏󵋣󵋷󵌋󵌟󵌳󵍇󵍛󵍯󵎃󵎗󵎫󵎿󵏓󵏧", - "encodedString": "87Swq/O0sL/ztLGT87Sxp/O0sbvztLKP87Syo/O0srfztLOL87Szn/O0s7PztLSH87S0m/O0tK/ztLWD87S1l/O0tavztLW/87S2k/O0tqfztLa787S3j/O0t6PztLe387S4i/O0uJ/ztLiz87S5h/O0uZvztLmv87S6g/O0upfztLqr87S6v/O0u5PztLun87S7u/O0vI/ztLyj87S8t/O0vYvztL2f87S9s/O0vofztL6b87S+r/O0v4PztL+X87S/q/O0v7/ztYCT87WAp/O1gLvztYGP87WBo/O1gbfztYKL87WCn/O1grPztYOH87WDm/O1g6/ztYSD87WEl/O1hKvztYS/87WFk/O1hafztYW787WGj/O1hqPztYa387WHi/O1h5/ztYez87WIh/O1iJvztYiv87WJg/O1iZfztYmr87WJv/O1ipPztYqn87WKu/O1i4/ztYuj87WLt/O1jIvztYyf87WMs/O1jYfztY2b87WNr/O1joPztY6X87WOq/O1jr/ztY+T87WPpw==" + "string" : "󴰫󴰿󴱓󴱧󴱻󴲏󴲣󴲷󴳋󴳟󴳳󴴇󴴛󴴯󴵃󴵗󴵫󴵿󴶓󴶧󴶻󴷏󴷣󴷷󴸋󴸟󴸳󴹇󴹛󴹯󴺃󴺗󴺫󴺿󴻓󴻧󴻻󴼏󴼣󴼷󴽋󴽟󴽳󴾇󴾛󴾯󴿃󴿗󴿫󴿿󵀓󵀧󵀻󵁏󵁣󵁷󵂋󵂟󵂳󵃇󵃛󵃯󵄃󵄗󵄫󵄿󵅓󵅧󵅻󵆏󵆣󵆷󵇋󵇟󵇳󵈇󵈛󵈯󵉃󵉗󵉫󵉿󵊓󵊧󵊻󵋏󵋣󵋷󵌋󵌟󵌳󵍇󵍛󵍯󵎃󵎗󵎫󵎿󵏓󵏧", + "encodedString" : "87Swq/O0sL/ztLGT87Sxp/O0sbvztLKP87Syo/O0srfztLOL87Szn/O0s7PztLSH87S0m/O0tK/ztLWD87S1l/O0tavztLW/87S2k/O0tqfztLa787S3j/O0t6PztLe387S4i/O0uJ/ztLiz87S5h/O0uZvztLmv87S6g/O0upfztLqr87S6v/O0u5PztLun87S7u/O0vI/ztLyj87S8t/O0vYvztL2f87S9s/O0vofztL6b87S+r/O0v4PztL+X87S/q/O0v7/ztYCT87WAp/O1gLvztYGP87WBo/O1gbfztYKL87WCn/O1grPztYOH87WDm/O1g6/ztYSD87WEl/O1hKvztYS/87WFk/O1hafztYW787WGj/O1hqPztYa387WHi/O1h5/ztYez87WIh/O1iJvztYiv87WJg/O1iZfztYmr87WJv/O1ipPztYqn87WKu/O1i4/ztYuj87WLt/O1jIvztYyf87WMs/O1jYfztY2b87WNr/O1joPztY6X87WOq/O1jr/ztY+T87WPpw==" }, { - "string": "󵏻󵐏󵐣󵐷󵑋󵑟󵑳󵒇󵒛󵒯󵓃󵓗󵓫󵓿󵔓󵔧󵔻󵕏󵕣󵕷󵖋󵖟󵖳󵗇󵗛󵗯󵘃󵘗󵘫󵘿󵙓󵙧󵙻󵚏󵚣󵚷󵛋󵛟󵛳󵜇󵜛󵜯󵝃󵝗󵝫󵝿󵞓󵞧󵞻󵟏󵟣󵟷󵠋󵠟󵠳󵡇󵡛󵡯󵢃󵢗󵢫󵢿󵣓󵣧󵣻󵤏󵤣󵤷󵥋󵥟󵥳󵦇󵦛󵦯󵧃󵧗󵧫󵧿󵨓󵨧󵨻󵩏󵩣󵩷󵪋󵪟󵪳󵫇󵫛󵫯󵬃󵬗󵬫󵬿󵭓󵭧󵭻󵮏󵮣󵮷", - "encodedString": "87WPu/O1kI/ztZCj87WQt/O1kYvztZGf87WRs/O1kofztZKb87WSr/O1k4PztZOX87WTq/O1k7/ztZST87WUp/O1lLvztZWP87WVo/O1lbfztZaL87WWn/O1lrPztZeH87WXm/O1l6/ztZiD87WYl/O1mKvztZi/87WZk/O1mafztZm787Waj/O1mqPztZq387Wbi/O1m5/ztZuz87Wch/O1nJvztZyv87Wdg/O1nZfztZ2r87Wdv/O1npPztZ6n87Weu/O1n4/ztZ+j87Wft/O1oIvztaCf87Wgs/O1oYfztaGb87Whr/O1ooPztaKX87Wiq/O1or/ztaOT87Wjp/O1o7vztaSP87Wko/O1pLfztaWL87Wln/O1pbPztaaH87Wmm/O1pq/ztaeD87Wnl/O1p6vztae/87Wok/O1qKfztai787Wpj/O1qaPztam387Wqi/O1qp/ztaqz87Wrh/O1q5vztauv87Wsg/O1rJfztayr87Wsv/O1rZPzta2n87Wtu/O1ro/zta6j87Wutw==" + "string" : "󵏻󵐏󵐣󵐷󵑋󵑟󵑳󵒇󵒛󵒯󵓃󵓗󵓫󵓿󵔓󵔧󵔻󵕏󵕣󵕷󵖋󵖟󵖳󵗇󵗛󵗯󵘃󵘗󵘫󵘿󵙓󵙧󵙻󵚏󵚣󵚷󵛋󵛟󵛳󵜇󵜛󵜯󵝃󵝗󵝫󵝿󵞓󵞧󵞻󵟏󵟣󵟷󵠋󵠟󵠳󵡇󵡛󵡯󵢃󵢗󵢫󵢿󵣓󵣧󵣻󵤏󵤣󵤷󵥋󵥟󵥳󵦇󵦛󵦯󵧃󵧗󵧫󵧿󵨓󵨧󵨻󵩏󵩣󵩷󵪋󵪟󵪳󵫇󵫛󵫯󵬃󵬗󵬫󵬿󵭓󵭧󵭻󵮏󵮣󵮷", + "encodedString" : "87WPu/O1kI/ztZCj87WQt/O1kYvztZGf87WRs/O1kofztZKb87WSr/O1k4PztZOX87WTq/O1k7/ztZST87WUp/O1lLvztZWP87WVo/O1lbfztZaL87WWn/O1lrPztZeH87WXm/O1l6/ztZiD87WYl/O1mKvztZi/87WZk/O1mafztZm787Waj/O1mqPztZq387Wbi/O1m5/ztZuz87Wch/O1nJvztZyv87Wdg/O1nZfztZ2r87Wdv/O1npPztZ6n87Weu/O1n4/ztZ+j87Wft/O1oIvztaCf87Wgs/O1oYfztaGb87Whr/O1ooPztaKX87Wiq/O1or/ztaOT87Wjp/O1o7vztaSP87Wko/O1pLfztaWL87Wln/O1pbPztaaH87Wmm/O1pq/ztaeD87Wnl/O1p6vztae/87Wok/O1qKfztai787Wpj/O1qaPztam387Wqi/O1qp/ztaqz87Wrh/O1q5vztauv87Wsg/O1rJfztayr87Wsv/O1rZPzta2n87Wtu/O1ro/zta6j87Wutw==" }, { - "string": "󵯋󵯟󵯳󵰇󵰛󵰯󵱃󵱗󵱫󵱿󵲓󵲧󵲻󵳏󵳣󵳷󵴋󵴟󵴳󵵇󵵛󵵯󵶃󵶗󵶫󵶿󵷓󵷧󵷻󵸏󵸣󵸷󵹋󵹟󵹳󵺇󵺛󵺯󵻃󵻗󵻫󵻿󵼓󵼧󵼻󵽏󵽣󵽷󵾋󵾟󵾳󵿇󵿛󵿯󶀃󶀗󶀫󶀿󶁓󶁧󶁻󶂏󶂣󶂷󶃋󶃟󶃳󶄇󶄛󶄯󶅃󶅗󶅫󶅿󶆓󶆧󶆻󶇏󶇣󶇷󶈋󶈟󶈳󶉇󶉛󶉯󶊃󶊗󶊫󶊿󶋓󶋧󶋻󶌏󶌣󶌷󶍋󶍟󶍳󶎇", - "encodedString": "87Wvi/O1r5/zta+z87Wwh/O1sJvztbCv87Wxg/O1sZfztbGr87Wxv/O1spPztbKn87Wyu/O1s4/ztbOj87Wzt/O1tIvztbSf87W0s/O1tYfztbWb87W1r/O1toPztbaX87W2q/O1tr/ztbeT87W3p/O1t7vztbiP87W4o/O1uLfztbmL87W5n/O1ubPztbqH87W6m/O1uq/ztbuD87W7l/O1u6vztbu/87W8k/O1vKfztby787W9j/O1vaPztb2387W+i/O1vp/ztb6z87W/h/O1v5vztb+v87aAg/O2gJfztoCr87aAv/O2gZPztoGn87aBu/O2go/ztoKj87aCt/O2g4vztoOf87aDs/O2hIfztoSb87aEr/O2hYPztoWX87aFq/O2hb/ztoaT87aGp/O2hrvztoeP87aHo/O2h7fztoiL87aIn/O2iLPztomH87aJm/O2ia/ztoqD87aKl/O2iqvztoq/87aLk/O2i6fztou787aMj/O2jKPztoy387aNi/O2jZ/zto2z87aOhw==" + "string" : "󵯋󵯟󵯳󵰇󵰛󵰯󵱃󵱗󵱫󵱿󵲓󵲧󵲻󵳏󵳣󵳷󵴋󵴟󵴳󵵇󵵛󵵯󵶃󵶗󵶫󵶿󵷓󵷧󵷻󵸏󵸣󵸷󵹋󵹟󵹳󵺇󵺛󵺯󵻃󵻗󵻫󵻿󵼓󵼧󵼻󵽏󵽣󵽷󵾋󵾟󵾳󵿇󵿛󵿯󶀃󶀗󶀫󶀿󶁓󶁧󶁻󶂏󶂣󶂷󶃋󶃟󶃳󶄇󶄛󶄯󶅃󶅗󶅫󶅿󶆓󶆧󶆻󶇏󶇣󶇷󶈋󶈟󶈳󶉇󶉛󶉯󶊃󶊗󶊫󶊿󶋓󶋧󶋻󶌏󶌣󶌷󶍋󶍟󶍳󶎇", + "encodedString" : "87Wvi/O1r5/zta+z87Wwh/O1sJvztbCv87Wxg/O1sZfztbGr87Wxv/O1spPztbKn87Wyu/O1s4/ztbOj87Wzt/O1tIvztbSf87W0s/O1tYfztbWb87W1r/O1toPztbaX87W2q/O1tr/ztbeT87W3p/O1t7vztbiP87W4o/O1uLfztbmL87W5n/O1ubPztbqH87W6m/O1uq/ztbuD87W7l/O1u6vztbu/87W8k/O1vKfztby787W9j/O1vaPztb2387W+i/O1vp/ztb6z87W/h/O1v5vztb+v87aAg/O2gJfztoCr87aAv/O2gZPztoGn87aBu/O2go/ztoKj87aCt/O2g4vztoOf87aDs/O2hIfztoSb87aEr/O2hYPztoWX87aFq/O2hb/ztoaT87aGp/O2hrvztoeP87aHo/O2h7fztoiL87aIn/O2iLPztomH87aJm/O2ia/ztoqD87aKl/O2iqvztoq/87aLk/O2i6fztou787aMj/O2jKPztoy387aNi/O2jZ/zto2z87aOhw==" }, { - "string": "󶎛󶎯󶏃󶏗󶏫󶏿󶐓󶐧󶐻󶑏󶑣󶑷󶒋󶒟󶒳󶓇󶓛󶓯󶔃󶔗󶔫󶔿󶕓󶕧󶕻󶖏󶖣󶖷󶗋󶗟󶗳󶘇󶘛󶘯󶙃󶙗󶙫󶙿󶚓󶚧󶚻󶛏󶛣󶛷󶜋󶜟󶜳󶝇󶝛󶝯󶞃󶞗󶞫󶞿󶟓󶟧󶟻󶠏󶠣󶠷󶡋󶡟󶡳󶢇󶢛󶢯󶣃󶣗󶣫󶣿󶤓󶤧󶤻󶥏󶥣󶥷󶦋󶦟󶦳󶧇󶧛󶧯󶨃󶨗󶨫󶨿󶩓󶩧󶩻󶪏󶪣󶪷󶫋󶫟󶫳󶬇󶬛󶬯󶭃󶭗", - "encodedString": "87aOm/O2jq/zto+D87aPl/O2j6vzto+/87aQk/O2kKfztpC787aRj/O2kaPztpG387aSi/O2kp/ztpKz87aTh/O2k5vztpOv87aUg/O2lJfztpSr87aUv/O2lZPztpWn87aVu/O2lo/ztpaj87aWt/O2l4vztpef87aXs/O2mIfztpib87aYr/O2mYPztpmX87aZq/O2mb/ztpqT87aap/O2mrvztpuP87abo/O2m7fztpyL87acn/O2nLPztp2H87adm/O2na/ztp6D87ael/O2nqvztp6/87afk/O2n6fztp+787agj/O2oKPztqC387ahi/O2oZ/ztqGz87aih/O2opvztqKv87ajg/O2o5fztqOr87ajv/O2pJPztqSn87aku/O2pY/ztqWj87alt/O2povztqaf87ams/O2p4fztqeb87anr/O2qIPztqiX87aoq/O2qL/ztqmT87app/O2qbvztqqP87aqo/O2qrfztquL87arn/O2q7PztqyH87asm/O2rK/ztq2D87atlw==" + "string" : "󶎛󶎯󶏃󶏗󶏫󶏿󶐓󶐧󶐻󶑏󶑣󶑷󶒋󶒟󶒳󶓇󶓛󶓯󶔃󶔗󶔫󶔿󶕓󶕧󶕻󶖏󶖣󶖷󶗋󶗟󶗳󶘇󶘛󶘯󶙃󶙗󶙫󶙿󶚓󶚧󶚻󶛏󶛣󶛷󶜋󶜟󶜳󶝇󶝛󶝯󶞃󶞗󶞫󶞿󶟓󶟧󶟻󶠏󶠣󶠷󶡋󶡟󶡳󶢇󶢛󶢯󶣃󶣗󶣫󶣿󶤓󶤧󶤻󶥏󶥣󶥷󶦋󶦟󶦳󶧇󶧛󶧯󶨃󶨗󶨫󶨿󶩓󶩧󶩻󶪏󶪣󶪷󶫋󶫟󶫳󶬇󶬛󶬯󶭃󶭗", + "encodedString" : "87aOm/O2jq/zto+D87aPl/O2j6vzto+/87aQk/O2kKfztpC787aRj/O2kaPztpG387aSi/O2kp/ztpKz87aTh/O2k5vztpOv87aUg/O2lJfztpSr87aUv/O2lZPztpWn87aVu/O2lo/ztpaj87aWt/O2l4vztpef87aXs/O2mIfztpib87aYr/O2mYPztpmX87aZq/O2mb/ztpqT87aap/O2mrvztpuP87abo/O2m7fztpyL87acn/O2nLPztp2H87adm/O2na/ztp6D87ael/O2nqvztp6/87afk/O2n6fztp+787agj/O2oKPztqC387ahi/O2oZ/ztqGz87aih/O2opvztqKv87ajg/O2o5fztqOr87ajv/O2pJPztqSn87aku/O2pY/ztqWj87alt/O2povztqaf87ams/O2p4fztqeb87anr/O2qIPztqiX87aoq/O2qL/ztqmT87app/O2qbvztqqP87aqo/O2qrfztquL87arn/O2q7PztqyH87asm/O2rK/ztq2D87atlw==" }, { - "string": "󶭫󶭿󶮓󶮧󶮻󶯏󶯣󶯷󶰋󶰟󶰳󶱇󶱛󶱯󶲃󶲗󶲫󶲿󶳓󶳧󶳻󶴏󶴣󶴷󶵋󶵟󶵳󶶇󶶛󶶯󶷃󶷗󶷫󶷿󶸓󶸧󶸻󶹏󶹣󶹷󶺋󶺟󶺳󶻇󶻛󶻯󶼃󶼗󶼫󶼿󶽓󶽧󶽻󶾏󶾣󶾷󶿋󶿟󶿳󷀇󷀛󷀯󷁃󷁗󷁫󷁿󷂓󷂧󷂻󷃏󷃣󷃷󷄋󷄟󷄳󷅇󷅛󷅯󷆃󷆗󷆫󷆿󷇓󷇧󷇻󷈏󷈣󷈷󷉋󷉟󷉳󷊇󷊛󷊯󷋃󷋗󷋫󷋿󷌓󷌧", - "encodedString": "87atq/O2rb/ztq6T87aup/O2rrvztq+P87avo/O2r7fztrCL87awn/O2sLPztrGH87axm/O2sa/ztrKD87ayl/O2sqvztrK/87azk/O2s6fztrO787a0j/O2tKPztrS387a1i/O2tZ/ztrWz87a2h/O2tpvztrav87a3g/O2t5fztrer87a3v/O2uJPztrin87a4u/O2uY/ztrmj87a5t/O2uovztrqf87a6s/O2u4fztrub87a7r/O2vIPztryX87a8q/O2vL/ztr2T87a9p/O2vbvztr6P87a+o/O2vrfztr+L87a/n/O2v7Pzt4CH87eAm/O3gK/zt4GD87eBl/O3gavzt4G/87eCk/O3gqfzt4K787eDj/O3g6Pzt4O387eEi/O3hJ/zt4Sz87eFh/O3hZvzt4Wv87eGg/O3hpfzt4ar87eGv/O3h5Pzt4en87eHu/O3iI/zt4ij87eIt/O3iYvzt4mf87eJs/O3iofzt4qb87eKr/O3i4Pzt4uX87eLq/O3i7/zt4yT87eMpw==" + "string" : "󶭫󶭿󶮓󶮧󶮻󶯏󶯣󶯷󶰋󶰟󶰳󶱇󶱛󶱯󶲃󶲗󶲫󶲿󶳓󶳧󶳻󶴏󶴣󶴷󶵋󶵟󶵳󶶇󶶛󶶯󶷃󶷗󶷫󶷿󶸓󶸧󶸻󶹏󶹣󶹷󶺋󶺟󶺳󶻇󶻛󶻯󶼃󶼗󶼫󶼿󶽓󶽧󶽻󶾏󶾣󶾷󶿋󶿟󶿳󷀇󷀛󷀯󷁃󷁗󷁫󷁿󷂓󷂧󷂻󷃏󷃣󷃷󷄋󷄟󷄳󷅇󷅛󷅯󷆃󷆗󷆫󷆿󷇓󷇧󷇻󷈏󷈣󷈷󷉋󷉟󷉳󷊇󷊛󷊯󷋃󷋗󷋫󷋿󷌓󷌧", + "encodedString" : "87atq/O2rb/ztq6T87aup/O2rrvztq+P87avo/O2r7fztrCL87awn/O2sLPztrGH87axm/O2sa/ztrKD87ayl/O2sqvztrK/87azk/O2s6fztrO787a0j/O2tKPztrS387a1i/O2tZ/ztrWz87a2h/O2tpvztrav87a3g/O2t5fztrer87a3v/O2uJPztrin87a4u/O2uY/ztrmj87a5t/O2uovztrqf87a6s/O2u4fztrub87a7r/O2vIPztryX87a8q/O2vL/ztr2T87a9p/O2vbvztr6P87a+o/O2vrfztr+L87a/n/O2v7Pzt4CH87eAm/O3gK/zt4GD87eBl/O3gavzt4G/87eCk/O3gqfzt4K787eDj/O3g6Pzt4O387eEi/O3hJ/zt4Sz87eFh/O3hZvzt4Wv87eGg/O3hpfzt4ar87eGv/O3h5Pzt4en87eHu/O3iI/zt4ij87eIt/O3iYvzt4mf87eJs/O3iofzt4qb87eKr/O3i4Pzt4uX87eLq/O3i7/zt4yT87eMpw==" }, { - "string": "󷌻󷍏󷍣󷍷󷎋󷎟󷎳󷏇󷏛󷏯󷐃󷐗󷐫󷐿󷑓󷑧󷑻󷒏󷒣󷒷󷓋󷓟󷓳󷔇󷔛󷔯󷕃󷕗󷕫󷕿󷖓󷖧󷖻󷗏󷗣󷗷󷘋󷘟󷘳󷙇󷙛󷙯󷚃󷚗󷚫󷚿󷛓󷛧󷛻󷜏󷜣󷜷󷝋󷝟󷝳󷞇󷞛󷞯󷟃󷟗󷟫󷟿󷠓󷠧󷠻󷡏󷡣󷡷󷢋󷢟󷢳󷣇󷣛󷣯󷤃󷤗󷤫󷤿󷥓󷥧󷥻󷦏󷦣󷦷󷧋󷧟󷧳󷨇󷨛󷨯󷩃󷩗󷩫󷩿󷪓󷪧󷪻󷫏󷫣󷫷", - "encodedString": "87eMu/O3jY/zt42j87eNt/O3jovzt46f87eOs/O3j4fzt4+b87ePr/O3kIPzt5CX87eQq/O3kL/zt5GT87eRp/O3kbvzt5KP87eSo/O3krfzt5OL87eTn/O3k7Pzt5SH87eUm/O3lK/zt5WD87eVl/O3lavzt5W/87eWk/O3lqfzt5a787eXj/O3l6Pzt5e387eYi/O3mJ/zt5iz87eZh/O3mZvzt5mv87eag/O3mpfzt5qr87eav/O3m5Pzt5un87ebu/O3nI/zt5yj87ect/O3nYvzt52f87eds/O3nofzt56b87eer/O3n4Pzt5+X87efq/O3n7/zt6CT87egp/O3oLvzt6GP87eho/O3obfzt6KL87ein/O3orPzt6OH87ejm/O3o6/zt6SD87ekl/O3pKvzt6S/87elk/O3pafzt6W787emj/O3pqPzt6a387eni/O3p5/zt6ez87eoh/O3qJvzt6iv87epg/O3qZfzt6mr87epv/O3qpPzt6qn87equ/O3q4/zt6uj87ertw==" + "string" : "󷌻󷍏󷍣󷍷󷎋󷎟󷎳󷏇󷏛󷏯󷐃󷐗󷐫󷐿󷑓󷑧󷑻󷒏󷒣󷒷󷓋󷓟󷓳󷔇󷔛󷔯󷕃󷕗󷕫󷕿󷖓󷖧󷖻󷗏󷗣󷗷󷘋󷘟󷘳󷙇󷙛󷙯󷚃󷚗󷚫󷚿󷛓󷛧󷛻󷜏󷜣󷜷󷝋󷝟󷝳󷞇󷞛󷞯󷟃󷟗󷟫󷟿󷠓󷠧󷠻󷡏󷡣󷡷󷢋󷢟󷢳󷣇󷣛󷣯󷤃󷤗󷤫󷤿󷥓󷥧󷥻󷦏󷦣󷦷󷧋󷧟󷧳󷨇󷨛󷨯󷩃󷩗󷩫󷩿󷪓󷪧󷪻󷫏󷫣󷫷", + "encodedString" : "87eMu/O3jY/zt42j87eNt/O3jovzt46f87eOs/O3j4fzt4+b87ePr/O3kIPzt5CX87eQq/O3kL/zt5GT87eRp/O3kbvzt5KP87eSo/O3krfzt5OL87eTn/O3k7Pzt5SH87eUm/O3lK/zt5WD87eVl/O3lavzt5W/87eWk/O3lqfzt5a787eXj/O3l6Pzt5e387eYi/O3mJ/zt5iz87eZh/O3mZvzt5mv87eag/O3mpfzt5qr87eav/O3m5Pzt5un87ebu/O3nI/zt5yj87ect/O3nYvzt52f87eds/O3nofzt56b87eer/O3n4Pzt5+X87efq/O3n7/zt6CT87egp/O3oLvzt6GP87eho/O3obfzt6KL87ein/O3orPzt6OH87ejm/O3o6/zt6SD87ekl/O3pKvzt6S/87elk/O3pafzt6W787emj/O3pqPzt6a387eni/O3p5/zt6ez87eoh/O3qJvzt6iv87epg/O3qZfzt6mr87epv/O3qpPzt6qn87equ/O3q4/zt6uj87ertw==" }, { - "string": "󷬋󷬟󷬳󷭇󷭛󷭯󷮃󷮗󷮫󷮿󷯓󷯧󷯻󷰏󷰣󷰷󷱋󷱟󷱳󷲇󷲛󷲯󷳃󷳗󷳫󷳿󷴓󷴧󷴻󷵏󷵣󷵷󷶋󷶟󷶳󷷇󷷛󷷯󷸃󷸗󷸫󷸿󷹓󷹧󷹻󷺏󷺣󷺷󷻋󷻟󷻳󷼇󷼛󷼯󷽃󷽗󷽫󷽿󷾓󷾧󷾻󷿏󷿣󷿷󸀋󸀟󸀳󸁇󸁛󸁯󸂃󸂗󸂫󸂿󸃓󸃧󸃻󸄏󸄣󸄷󸅋󸅟󸅳󸆇󸆛󸆯󸇃󸇗󸇫󸇿󸈓󸈧󸈻󸉏󸉣󸉷󸊋󸊟󸊳󸋇", - "encodedString": "87esi/O3rJ/zt6yz87eth/O3rZvzt62v87eug/O3rpfzt66r87euv/O3r5Pzt6+n87evu/O3sI/zt7Cj87ewt/O3sYvzt7Gf87exs/O3sofzt7Kb87eyr/O3s4Pzt7OX87ezq/O3s7/zt7ST87e0p/O3tLvzt7WP87e1o/O3tbfzt7aL87e2n/O3trPzt7eH87e3m/O3t6/zt7iD87e4l/O3uKvzt7i/87e5k/O3uafzt7m787e6j/O3uqPzt7q387e7i/O3u5/zt7uz87e8h/O3vJvzt7yv87e9g/O3vZfzt72r87e9v/O3vpPzt76n87e+u/O3v4/zt7+j87e/t/O4gIvzuICf87iAs/O4gYfzuIGb87iBr/O4goPzuIKX87iCq/O4gr/zuIOT87iDp/O4g7vzuISP87iEo/O4hLfzuIWL87iFn/O4hbPzuIaH87iGm/O4hq/zuIeD87iHl/O4h6vzuIe/87iIk/O4iKfzuIi787iJj/O4iaPzuIm387iKi/O4ip/zuIqz87iLhw==" + "string" : "󷬋󷬟󷬳󷭇󷭛󷭯󷮃󷮗󷮫󷮿󷯓󷯧󷯻󷰏󷰣󷰷󷱋󷱟󷱳󷲇󷲛󷲯󷳃󷳗󷳫󷳿󷴓󷴧󷴻󷵏󷵣󷵷󷶋󷶟󷶳󷷇󷷛󷷯󷸃󷸗󷸫󷸿󷹓󷹧󷹻󷺏󷺣󷺷󷻋󷻟󷻳󷼇󷼛󷼯󷽃󷽗󷽫󷽿󷾓󷾧󷾻󷿏󷿣󷿷󸀋󸀟󸀳󸁇󸁛󸁯󸂃󸂗󸂫󸂿󸃓󸃧󸃻󸄏󸄣󸄷󸅋󸅟󸅳󸆇󸆛󸆯󸇃󸇗󸇫󸇿󸈓󸈧󸈻󸉏󸉣󸉷󸊋󸊟󸊳󸋇", + "encodedString" : "87esi/O3rJ/zt6yz87eth/O3rZvzt62v87eug/O3rpfzt66r87euv/O3r5Pzt6+n87evu/O3sI/zt7Cj87ewt/O3sYvzt7Gf87exs/O3sofzt7Kb87eyr/O3s4Pzt7OX87ezq/O3s7/zt7ST87e0p/O3tLvzt7WP87e1o/O3tbfzt7aL87e2n/O3trPzt7eH87e3m/O3t6/zt7iD87e4l/O3uKvzt7i/87e5k/O3uafzt7m787e6j/O3uqPzt7q387e7i/O3u5/zt7uz87e8h/O3vJvzt7yv87e9g/O3vZfzt72r87e9v/O3vpPzt76n87e+u/O3v4/zt7+j87e/t/O4gIvzuICf87iAs/O4gYfzuIGb87iBr/O4goPzuIKX87iCq/O4gr/zuIOT87iDp/O4g7vzuISP87iEo/O4hLfzuIWL87iFn/O4hbPzuIaH87iGm/O4hq/zuIeD87iHl/O4h6vzuIe/87iIk/O4iKfzuIi787iJj/O4iaPzuIm387iKi/O4ip/zuIqz87iLhw==" }, { - "string": "󸋛󸋯󸌃󸌗󸌫󸌿󸍓󸍧󸍻󸎏󸎣󸎷󸏋󸏟󸏳󸐇󸐛󸐯󸑃󸑗󸑫󸑿󸒓󸒧󸒻󸓏󸓣󸓷󸔋󸔟󸔳󸕇󸕛󸕯󸖃󸖗󸖫󸖿󸗓󸗧󸗻󸘏󸘣󸘷󸙋󸙟󸙳󸚇󸚛󸚯󸛃󸛗󸛫󸛿󸜓󸜧󸜻󸝏󸝣󸝷󸞋󸞟󸞳󸟇󸟛󸟯󸠃󸠗󸠫󸠿󸡓󸡧󸡻󸢏󸢣󸢷󸣋󸣟󸣳󸤇󸤛󸤯󸥃󸥗󸥫󸥿󸦓󸦧󸦻󸧏󸧣󸧷󸨋󸨟󸨳󸩇󸩛󸩯󸪃󸪗", - "encodedString": "87iLm/O4i6/zuIyD87iMl/O4jKvzuIy/87iNk/O4jafzuI2787iOj/O4jqPzuI6387iPi/O4j5/zuI+z87iQh/O4kJvzuJCv87iRg/O4kZfzuJGr87iRv/O4kpPzuJKn87iSu/O4k4/zuJOj87iTt/O4lIvzuJSf87iUs/O4lYfzuJWb87iVr/O4loPzuJaX87iWq/O4lr/zuJeT87iXp/O4l7vzuJiP87iYo/O4mLfzuJmL87iZn/O4mbPzuJqH87iam/O4mq/zuJuD87ibl/O4m6vzuJu/87ick/O4nKfzuJy787idj/O4naPzuJ2387iei/O4np/zuJ6z87ifh/O4n5vzuJ+v87igg/O4oJfzuKCr87igv/O4oZPzuKGn87ihu/O4oo/zuKKj87iit/O4o4vzuKOf87ijs/O4pIfzuKSb87ikr/O4pYPzuKWX87ilq/O4pb/zuKaT87imp/O4prvzuKeP87ino/O4p7fzuKiL87ion/O4qLPzuKmH87ipm/O4qa/zuKqD87iqlw==" + "string" : "󸋛󸋯󸌃󸌗󸌫󸌿󸍓󸍧󸍻󸎏󸎣󸎷󸏋󸏟󸏳󸐇󸐛󸐯󸑃󸑗󸑫󸑿󸒓󸒧󸒻󸓏󸓣󸓷󸔋󸔟󸔳󸕇󸕛󸕯󸖃󸖗󸖫󸖿󸗓󸗧󸗻󸘏󸘣󸘷󸙋󸙟󸙳󸚇󸚛󸚯󸛃󸛗󸛫󸛿󸜓󸜧󸜻󸝏󸝣󸝷󸞋󸞟󸞳󸟇󸟛󸟯󸠃󸠗󸠫󸠿󸡓󸡧󸡻󸢏󸢣󸢷󸣋󸣟󸣳󸤇󸤛󸤯󸥃󸥗󸥫󸥿󸦓󸦧󸦻󸧏󸧣󸧷󸨋󸨟󸨳󸩇󸩛󸩯󸪃󸪗", + "encodedString" : "87iLm/O4i6/zuIyD87iMl/O4jKvzuIy/87iNk/O4jafzuI2787iOj/O4jqPzuI6387iPi/O4j5/zuI+z87iQh/O4kJvzuJCv87iRg/O4kZfzuJGr87iRv/O4kpPzuJKn87iSu/O4k4/zuJOj87iTt/O4lIvzuJSf87iUs/O4lYfzuJWb87iVr/O4loPzuJaX87iWq/O4lr/zuJeT87iXp/O4l7vzuJiP87iYo/O4mLfzuJmL87iZn/O4mbPzuJqH87iam/O4mq/zuJuD87ibl/O4m6vzuJu/87ick/O4nKfzuJy787idj/O4naPzuJ2387iei/O4np/zuJ6z87ifh/O4n5vzuJ+v87igg/O4oJfzuKCr87igv/O4oZPzuKGn87ihu/O4oo/zuKKj87iit/O4o4vzuKOf87ijs/O4pIfzuKSb87ikr/O4pYPzuKWX87ilq/O4pb/zuKaT87imp/O4prvzuKeP87ino/O4p7fzuKiL87ion/O4qLPzuKmH87ipm/O4qa/zuKqD87iqlw==" }, { - "string": "󸪫󸪿󸫓󸫧󸫻󸬏󸬣󸬷󸭋󸭟󸭳󸮇󸮛󸮯󸯃󸯗󸯫󸯿󸰓󸰧󸰻󸱏󸱣󸱷󸲋󸲟󸲳󸳇󸳛󸳯󸴃󸴗󸴫󸴿󸵓󸵧󸵻󸶏󸶣󸶷󸷋󸷟󸷳󸸇󸸛󸸯󸹃󸹗󸹫󸹿󸺓󸺧󸺻󸻏󸻣󸻷󸼋󸼟󸼳󸽇󸽛󸽯󸾃󸾗󸾫󸾿󸿓󸿧󸿻󹀏󹀣󹀷󹁋󹁟󹁳󹂇󹂛󹂯󹃃󹃗󹃫󹃿󹄓󹄧󹄻󹅏󹅣󹅷󹆋󹆟󹆳󹇇󹇛󹇯󹈃󹈗󹈫󹈿󹉓󹉧", - "encodedString": "87iqq/O4qr/zuKuT87irp/O4q7vzuKyP87iso/O4rLfzuK2L87itn/O4rbPzuK6H87ium/O4rq/zuK+D87ivl/O4r6vzuK+/87iwk/O4sKfzuLC787ixj/O4saPzuLG387iyi/O4sp/zuLKz87izh/O4s5vzuLOv87i0g/O4tJfzuLSr87i0v/O4tZPzuLWn87i1u/O4to/zuLaj87i2t/O4t4vzuLef87i3s/O4uIfzuLib87i4r/O4uYPzuLmX87i5q/O4ub/zuLqT87i6p/O4urvzuLuP87i7o/O4u7fzuLyL87i8n/O4vLPzuL2H87i9m/O4va/zuL6D87i+l/O4vqvzuL6/87i/k/O4v6fzuL+787mAj/O5gKPzuYC387mBi/O5gZ/zuYGz87mCh/O5gpvzuYKv87mDg/O5g5fzuYOr87mDv/O5hJPzuYSn87mEu/O5hY/zuYWj87mFt/O5hovzuYaf87mGs/O5h4fzuYeb87mHr/O5iIPzuYiX87mIq/O5iL/zuYmT87mJpw==" + "string" : "󸪫󸪿󸫓󸫧󸫻󸬏󸬣󸬷󸭋󸭟󸭳󸮇󸮛󸮯󸯃󸯗󸯫󸯿󸰓󸰧󸰻󸱏󸱣󸱷󸲋󸲟󸲳󸳇󸳛󸳯󸴃󸴗󸴫󸴿󸵓󸵧󸵻󸶏󸶣󸶷󸷋󸷟󸷳󸸇󸸛󸸯󸹃󸹗󸹫󸹿󸺓󸺧󸺻󸻏󸻣󸻷󸼋󸼟󸼳󸽇󸽛󸽯󸾃󸾗󸾫󸾿󸿓󸿧󸿻󹀏󹀣󹀷󹁋󹁟󹁳󹂇󹂛󹂯󹃃󹃗󹃫󹃿󹄓󹄧󹄻󹅏󹅣󹅷󹆋󹆟󹆳󹇇󹇛󹇯󹈃󹈗󹈫󹈿󹉓󹉧", + "encodedString" : "87iqq/O4qr/zuKuT87irp/O4q7vzuKyP87iso/O4rLfzuK2L87itn/O4rbPzuK6H87ium/O4rq/zuK+D87ivl/O4r6vzuK+/87iwk/O4sKfzuLC787ixj/O4saPzuLG387iyi/O4sp/zuLKz87izh/O4s5vzuLOv87i0g/O4tJfzuLSr87i0v/O4tZPzuLWn87i1u/O4to/zuLaj87i2t/O4t4vzuLef87i3s/O4uIfzuLib87i4r/O4uYPzuLmX87i5q/O4ub/zuLqT87i6p/O4urvzuLuP87i7o/O4u7fzuLyL87i8n/O4vLPzuL2H87i9m/O4va/zuL6D87i+l/O4vqvzuL6/87i/k/O4v6fzuL+787mAj/O5gKPzuYC387mBi/O5gZ/zuYGz87mCh/O5gpvzuYKv87mDg/O5g5fzuYOr87mDv/O5hJPzuYSn87mEu/O5hY/zuYWj87mFt/O5hovzuYaf87mGs/O5h4fzuYeb87mHr/O5iIPzuYiX87mIq/O5iL/zuYmT87mJpw==" }, { - "string": "󹉻󹊏󹊣󹊷󹋋󹋟󹋳󹌇󹌛󹌯󹍃󹍗󹍫󹍿󹎓󹎧󹎻󹏏󹏣󹏷󹐋󹐟󹐳󹑇󹑛󹑯󹒃󹒗󹒫󹒿󹓓󹓧󹓻󹔏󹔣󹔷󹕋󹕟󹕳󹖇󹖛󹖯󹗃󹗗󹗫󹗿󹘓󹘧󹘻󹙏󹙣󹙷󹚋󹚟󹚳󹛇󹛛󹛯󹜃󹜗󹜫󹜿󹝓󹝧󹝻󹞏󹞣󹞷󹟋󹟟󹟳󹠇󹠛󹠯󹡃󹡗󹡫󹡿󹢓󹢧󹢻󹣏󹣣󹣷󹤋󹤟󹤳󹥇󹥛󹥯󹦃󹦗󹦫󹦿󹧓󹧧󹧻󹨏󹨣󹨷", - "encodedString": "87mJu/O5io/zuYqj87mKt/O5i4vzuYuf87mLs/O5jIfzuYyb87mMr/O5jYPzuY2X87mNq/O5jb/zuY6T87mOp/O5jrvzuY+P87mPo/O5j7fzuZCL87mQn/O5kLPzuZGH87mRm/O5ka/zuZKD87mSl/O5kqvzuZK/87mTk/O5k6fzuZO787mUj/O5lKPzuZS387mVi/O5lZ/zuZWz87mWh/O5lpvzuZav87mXg/O5l5fzuZer87mXv/O5mJPzuZin87mYu/O5mY/zuZmj87mZt/O5movzuZqf87mas/O5m4fzuZub87mbr/O5nIPzuZyX87mcq/O5nL/zuZ2T87mdp/O5nbvzuZ6P87meo/O5nrfzuZ+L87mfn/O5n7PzuaCH87mgm/O5oK/zuaGD87mhl/O5oavzuaG/87mik/O5oqfzuaK787mjj/O5o6PzuaO387mki/O5pJ/zuaSz87mlh/O5pZvzuaWv87mmg/O5ppfzuaar87mmv/O5p5Pzuaen87mnu/O5qI/zuaij87motw==" + "string" : "󹉻󹊏󹊣󹊷󹋋󹋟󹋳󹌇󹌛󹌯󹍃󹍗󹍫󹍿󹎓󹎧󹎻󹏏󹏣󹏷󹐋󹐟󹐳󹑇󹑛󹑯󹒃󹒗󹒫󹒿󹓓󹓧󹓻󹔏󹔣󹔷󹕋󹕟󹕳󹖇󹖛󹖯󹗃󹗗󹗫󹗿󹘓󹘧󹘻󹙏󹙣󹙷󹚋󹚟󹚳󹛇󹛛󹛯󹜃󹜗󹜫󹜿󹝓󹝧󹝻󹞏󹞣󹞷󹟋󹟟󹟳󹠇󹠛󹠯󹡃󹡗󹡫󹡿󹢓󹢧󹢻󹣏󹣣󹣷󹤋󹤟󹤳󹥇󹥛󹥯󹦃󹦗󹦫󹦿󹧓󹧧󹧻󹨏󹨣󹨷", + "encodedString" : "87mJu/O5io/zuYqj87mKt/O5i4vzuYuf87mLs/O5jIfzuYyb87mMr/O5jYPzuY2X87mNq/O5jb/zuY6T87mOp/O5jrvzuY+P87mPo/O5j7fzuZCL87mQn/O5kLPzuZGH87mRm/O5ka/zuZKD87mSl/O5kqvzuZK/87mTk/O5k6fzuZO787mUj/O5lKPzuZS387mVi/O5lZ/zuZWz87mWh/O5lpvzuZav87mXg/O5l5fzuZer87mXv/O5mJPzuZin87mYu/O5mY/zuZmj87mZt/O5movzuZqf87mas/O5m4fzuZub87mbr/O5nIPzuZyX87mcq/O5nL/zuZ2T87mdp/O5nbvzuZ6P87meo/O5nrfzuZ+L87mfn/O5n7PzuaCH87mgm/O5oK/zuaGD87mhl/O5oavzuaG/87mik/O5oqfzuaK787mjj/O5o6PzuaO387mki/O5pJ/zuaSz87mlh/O5pZvzuaWv87mmg/O5ppfzuaar87mmv/O5p5Pzuaen87mnu/O5qI/zuaij87motw==" }, { - "string": "󹩋󹩟󹩳󹪇󹪛󹪯󹫃󹫗󹫫󹫿󹬓󹬧󹬻󹭏󹭣󹭷󹮋󹮟󹮳󹯇󹯛󹯯󹰃󹰗󹰫󹰿󹱓󹱧󹱻󹲏󹲣󹲷󹳋󹳟󹳳󹴇󹴛󹴯󹵃󹵗󹵫󹵿󹶓󹶧󹶻󹷏󹷣󹷷󹸋󹸟󹸳󹹇󹹛󹹯󹺃󹺗󹺫󹺿󹻓󹻧󹻻󹼏󹼣󹼷󹽋󹽟󹽳󹾇󹾛󹾯󹿃󹿗󹿫󹿿󺀓󺀧󺀻󺁏󺁣󺁷󺂋󺂟󺂳󺃇󺃛󺃯󺄃󺄗󺄫󺄿󺅓󺅧󺅻󺆏󺆣󺆷󺇋󺇟󺇳󺈇", - "encodedString": "87mpi/O5qZ/zuamz87mqh/O5qpvzuaqv87mrg/O5q5fzuaur87mrv/O5rJPzuayn87msu/O5rY/zua2j87mtt/O5rovzua6f87mus/O5r4fzua+b87mvr/O5sIPzubCX87mwq/O5sL/zubGT87mxp/O5sbvzubKP87myo/O5srfzubOL87mzn/O5s7PzubSH87m0m/O5tK/zubWD87m1l/O5tavzubW/87m2k/O5tqfzuba787m3j/O5t6Pzube387m4i/O5uJ/zubiz87m5h/O5uZvzubmv87m6g/O5upfzubqr87m6v/O5u5Pzubun87m7u/O5vI/zubyj87m8t/O5vYvzub2f87m9s/O5vofzub6b87m+r/O5v4Pzub+X87m/q/O5v7/zuoCT87qAp/O6gLvzuoGP87qBo/O6gbfzuoKL87qCn/O6grPzuoOH87qDm/O6g6/zuoSD87qEl/O6hKvzuoS/87qFk/O6hafzuoW787qGj/O6hqPzuoa387qHi/O6h5/zuoez87qIhw==" + "string" : "󹩋󹩟󹩳󹪇󹪛󹪯󹫃󹫗󹫫󹫿󹬓󹬧󹬻󹭏󹭣󹭷󹮋󹮟󹮳󹯇󹯛󹯯󹰃󹰗󹰫󹰿󹱓󹱧󹱻󹲏󹲣󹲷󹳋󹳟󹳳󹴇󹴛󹴯󹵃󹵗󹵫󹵿󹶓󹶧󹶻󹷏󹷣󹷷󹸋󹸟󹸳󹹇󹹛󹹯󹺃󹺗󹺫󹺿󹻓󹻧󹻻󹼏󹼣󹼷󹽋󹽟󹽳󹾇󹾛󹾯󹿃󹿗󹿫󹿿󺀓󺀧󺀻󺁏󺁣󺁷󺂋󺂟󺂳󺃇󺃛󺃯󺄃󺄗󺄫󺄿󺅓󺅧󺅻󺆏󺆣󺆷󺇋󺇟󺇳󺈇", + "encodedString" : "87mpi/O5qZ/zuamz87mqh/O5qpvzuaqv87mrg/O5q5fzuaur87mrv/O5rJPzuayn87msu/O5rY/zua2j87mtt/O5rovzua6f87mus/O5r4fzua+b87mvr/O5sIPzubCX87mwq/O5sL/zubGT87mxp/O5sbvzubKP87myo/O5srfzubOL87mzn/O5s7PzubSH87m0m/O5tK/zubWD87m1l/O5tavzubW/87m2k/O5tqfzuba787m3j/O5t6Pzube387m4i/O5uJ/zubiz87m5h/O5uZvzubmv87m6g/O5upfzubqr87m6v/O5u5Pzubun87m7u/O5vI/zubyj87m8t/O5vYvzub2f87m9s/O5vofzub6b87m+r/O5v4Pzub+X87m/q/O5v7/zuoCT87qAp/O6gLvzuoGP87qBo/O6gbfzuoKL87qCn/O6grPzuoOH87qDm/O6g6/zuoSD87qEl/O6hKvzuoS/87qFk/O6hafzuoW787qGj/O6hqPzuoa387qHi/O6h5/zuoez87qIhw==" }, { - "string": "󺈛󺈯󺉃󺉗󺉫󺉿󺊓󺊧󺊻󺋏󺋣󺋷󺌋󺌟󺌳󺍇󺍛󺍯󺎃󺎗󺎫󺎿󺏓󺏧󺏻󺐏󺐣󺐷󺑋󺑟󺑳󺒇󺒛󺒯󺓃󺓗󺓫󺓿󺔓󺔧󺔻󺕏󺕣󺕷󺖋󺖟󺖳󺗇󺗛󺗯󺘃󺘗󺘫󺘿󺙓󺙧󺙻󺚏󺚣󺚷󺛋󺛟󺛳󺜇󺜛󺜯󺝃󺝗󺝫󺝿󺞓󺞧󺞻󺟏󺟣󺟷󺠋󺠟󺠳󺡇󺡛󺡯󺢃󺢗󺢫󺢿󺣓󺣧󺣻󺤏󺤣󺤷󺥋󺥟󺥳󺦇󺦛󺦯󺧃󺧗", - "encodedString": "87qIm/O6iK/zuomD87qJl/O6iavzuom/87qKk/O6iqfzuoq787qLj/O6i6Pzuou387qMi/O6jJ/zuoyz87qNh/O6jZvzuo2v87qOg/O6jpfzuo6r87qOv/O6j5Pzuo+n87qPu/O6kI/zupCj87qQt/O6kYvzupGf87qRs/O6kofzupKb87qSr/O6k4PzupOX87qTq/O6k7/zupST87qUp/O6lLvzupWP87qVo/O6lbfzupaL87qWn/O6lrPzupeH87qXm/O6l6/zupiD87qYl/O6mKvzupi/87qZk/O6mafzupm787qaj/O6mqPzupq387qbi/O6m5/zupuz87qch/O6nJvzupyv87qdg/O6nZfzup2r87qdv/O6npPzup6n87qeu/O6n4/zup+j87qft/O6oIvzuqCf87qgs/O6oYfzuqGb87qhr/O6ooPzuqKX87qiq/O6or/zuqOT87qjp/O6o7vzuqSP87qko/O6pLfzuqWL87qln/O6pbPzuqaH87qmm/O6pq/zuqeD87qnlw==" + "string" : "󺈛󺈯󺉃󺉗󺉫󺉿󺊓󺊧󺊻󺋏󺋣󺋷󺌋󺌟󺌳󺍇󺍛󺍯󺎃󺎗󺎫󺎿󺏓󺏧󺏻󺐏󺐣󺐷󺑋󺑟󺑳󺒇󺒛󺒯󺓃󺓗󺓫󺓿󺔓󺔧󺔻󺕏󺕣󺕷󺖋󺖟󺖳󺗇󺗛󺗯󺘃󺘗󺘫󺘿󺙓󺙧󺙻󺚏󺚣󺚷󺛋󺛟󺛳󺜇󺜛󺜯󺝃󺝗󺝫󺝿󺞓󺞧󺞻󺟏󺟣󺟷󺠋󺠟󺠳󺡇󺡛󺡯󺢃󺢗󺢫󺢿󺣓󺣧󺣻󺤏󺤣󺤷󺥋󺥟󺥳󺦇󺦛󺦯󺧃󺧗", + "encodedString" : "87qIm/O6iK/zuomD87qJl/O6iavzuom/87qKk/O6iqfzuoq787qLj/O6i6Pzuou387qMi/O6jJ/zuoyz87qNh/O6jZvzuo2v87qOg/O6jpfzuo6r87qOv/O6j5Pzuo+n87qPu/O6kI/zupCj87qQt/O6kYvzupGf87qRs/O6kofzupKb87qSr/O6k4PzupOX87qTq/O6k7/zupST87qUp/O6lLvzupWP87qVo/O6lbfzupaL87qWn/O6lrPzupeH87qXm/O6l6/zupiD87qYl/O6mKvzupi/87qZk/O6mafzupm787qaj/O6mqPzupq387qbi/O6m5/zupuz87qch/O6nJvzupyv87qdg/O6nZfzup2r87qdv/O6npPzup6n87qeu/O6n4/zup+j87qft/O6oIvzuqCf87qgs/O6oYfzuqGb87qhr/O6ooPzuqKX87qiq/O6or/zuqOT87qjp/O6o7vzuqSP87qko/O6pLfzuqWL87qln/O6pbPzuqaH87qmm/O6pq/zuqeD87qnlw==" }, { - "string": "󺧫󺧿󺨓󺨧󺨻󺩏󺩣󺩷󺪋󺪟󺪳󺫇󺫛󺫯󺬃󺬗󺬫󺬿󺭓󺭧󺭻󺮏󺮣󺮷󺯋󺯟󺯳󺰇󺰛󺰯󺱃󺱗󺱫󺱿󺲓󺲧󺲻󺳏󺳣󺳷󺴋󺴟󺴳󺵇󺵛󺵯󺶃󺶗󺶫󺶿󺷓󺷧󺷻󺸏󺸣󺸷󺹋󺹟󺹳󺺇󺺛󺺯󺻃󺻗󺻫󺻿󺼓󺼧󺼻󺽏󺽣󺽷󺾋󺾟󺾳󺿇󺿛󺿯󻀃󻀗󻀫󻀿󻁓󻁧󻁻󻂏󻂣󻂷󻃋󻃟󻃳󻄇󻄛󻄯󻅃󻅗󻅫󻅿󻆓󻆧", - "encodedString": "87qnq/O6p7/zuqiT87qop/O6qLvzuqmP87qpo/O6qbfzuqqL87qqn/O6qrPzuquH87qrm/O6q6/zuqyD87qsl/O6rKvzuqy/87qtk/O6rafzuq2787quj/O6rqPzuq6387qvi/O6r5/zuq+z87qwh/O6sJvzurCv87qxg/O6sZfzurGr87qxv/O6spPzurKn87qyu/O6s4/zurOj87qzt/O6tIvzurSf87q0s/O6tYfzurWb87q1r/O6toPzuraX87q2q/O6tr/zureT87q3p/O6t7vzuriP87q4o/O6uLfzurmL87q5n/O6ubPzurqH87q6m/O6uq/zuruD87q7l/O6u6vzuru/87q8k/O6vKfzury787q9j/O6vaPzur2387q+i/O6vp/zur6z87q/h/O6v5vzur+v87uAg/O7gJfzu4Cr87uAv/O7gZPzu4Gn87uBu/O7go/zu4Kj87uCt/O7g4vzu4Of87uDs/O7hIfzu4Sb87uEr/O7hYPzu4WX87uFq/O7hb/zu4aT87uGpw==" + "string" : "󺧫󺧿󺨓󺨧󺨻󺩏󺩣󺩷󺪋󺪟󺪳󺫇󺫛󺫯󺬃󺬗󺬫󺬿󺭓󺭧󺭻󺮏󺮣󺮷󺯋󺯟󺯳󺰇󺰛󺰯󺱃󺱗󺱫󺱿󺲓󺲧󺲻󺳏󺳣󺳷󺴋󺴟󺴳󺵇󺵛󺵯󺶃󺶗󺶫󺶿󺷓󺷧󺷻󺸏󺸣󺸷󺹋󺹟󺹳󺺇󺺛󺺯󺻃󺻗󺻫󺻿󺼓󺼧󺼻󺽏󺽣󺽷󺾋󺾟󺾳󺿇󺿛󺿯󻀃󻀗󻀫󻀿󻁓󻁧󻁻󻂏󻂣󻂷󻃋󻃟󻃳󻄇󻄛󻄯󻅃󻅗󻅫󻅿󻆓󻆧", + "encodedString" : "87qnq/O6p7/zuqiT87qop/O6qLvzuqmP87qpo/O6qbfzuqqL87qqn/O6qrPzuquH87qrm/O6q6/zuqyD87qsl/O6rKvzuqy/87qtk/O6rafzuq2787quj/O6rqPzuq6387qvi/O6r5/zuq+z87qwh/O6sJvzurCv87qxg/O6sZfzurGr87qxv/O6spPzurKn87qyu/O6s4/zurOj87qzt/O6tIvzurSf87q0s/O6tYfzurWb87q1r/O6toPzuraX87q2q/O6tr/zureT87q3p/O6t7vzuriP87q4o/O6uLfzurmL87q5n/O6ubPzurqH87q6m/O6uq/zuruD87q7l/O6u6vzuru/87q8k/O6vKfzury787q9j/O6vaPzur2387q+i/O6vp/zur6z87q/h/O6v5vzur+v87uAg/O7gJfzu4Cr87uAv/O7gZPzu4Gn87uBu/O7go/zu4Kj87uCt/O7g4vzu4Of87uDs/O7hIfzu4Sb87uEr/O7hYPzu4WX87uFq/O7hb/zu4aT87uGpw==" }, { - "string": "󻆻󻇏󻇣󻇷󻈋󻈟󻈳󻉇󻉛󻉯󻊃󻊗󻊫󻊿󻋓󻋧󻋻󻌏󻌣󻌷󻍋󻍟󻍳󻎇󻎛󻎯󻏃󻏗󻏫󻏿󻐓󻐧󻐻󻑏󻑣󻑷󻒋󻒟󻒳󻓇󻓛󻓯󻔃󻔗󻔫󻔿󻕓󻕧󻕻󻖏󻖣󻖷󻗋󻗟󻗳󻘇󻘛󻘯󻙃󻙗󻙫󻙿󻚓󻚧󻚻󻛏󻛣󻛷󻜋󻜟󻜳󻝇󻝛󻝯󻞃󻞗󻞫󻞿󻟓󻟧󻟻󻠏󻠣󻠷󻡋󻡟󻡳󻢇󻢛󻢯󻣃󻣗󻣫󻣿󻤓󻤧󻤻󻥏󻥣󻥷", - "encodedString": "87uGu/O7h4/zu4ej87uHt/O7iIvzu4if87uIs/O7iYfzu4mb87uJr/O7ioPzu4qX87uKq/O7ir/zu4uT87uLp/O7i7vzu4yP87uMo/O7jLfzu42L87uNn/O7jbPzu46H87uOm/O7jq/zu4+D87uPl/O7j6vzu4+/87uQk/O7kKfzu5C787uRj/O7kaPzu5G387uSi/O7kp/zu5Kz87uTh/O7k5vzu5Ov87uUg/O7lJfzu5Sr87uUv/O7lZPzu5Wn87uVu/O7lo/zu5aj87uWt/O7l4vzu5ef87uXs/O7mIfzu5ib87uYr/O7mYPzu5mX87uZq/O7mb/zu5qT87uap/O7mrvzu5uP87ubo/O7m7fzu5yL87ucn/O7nLPzu52H87udm/O7na/zu56D87uel/O7nqvzu56/87ufk/O7n6fzu5+787ugj/O7oKPzu6C387uhi/O7oZ/zu6Gz87uih/O7opvzu6Kv87ujg/O7o5fzu6Or87ujv/O7pJPzu6Sn87uku/O7pY/zu6Wj87ultw==" + "string" : "󻆻󻇏󻇣󻇷󻈋󻈟󻈳󻉇󻉛󻉯󻊃󻊗󻊫󻊿󻋓󻋧󻋻󻌏󻌣󻌷󻍋󻍟󻍳󻎇󻎛󻎯󻏃󻏗󻏫󻏿󻐓󻐧󻐻󻑏󻑣󻑷󻒋󻒟󻒳󻓇󻓛󻓯󻔃󻔗󻔫󻔿󻕓󻕧󻕻󻖏󻖣󻖷󻗋󻗟󻗳󻘇󻘛󻘯󻙃󻙗󻙫󻙿󻚓󻚧󻚻󻛏󻛣󻛷󻜋󻜟󻜳󻝇󻝛󻝯󻞃󻞗󻞫󻞿󻟓󻟧󻟻󻠏󻠣󻠷󻡋󻡟󻡳󻢇󻢛󻢯󻣃󻣗󻣫󻣿󻤓󻤧󻤻󻥏󻥣󻥷", + "encodedString" : "87uGu/O7h4/zu4ej87uHt/O7iIvzu4if87uIs/O7iYfzu4mb87uJr/O7ioPzu4qX87uKq/O7ir/zu4uT87uLp/O7i7vzu4yP87uMo/O7jLfzu42L87uNn/O7jbPzu46H87uOm/O7jq/zu4+D87uPl/O7j6vzu4+/87uQk/O7kKfzu5C787uRj/O7kaPzu5G387uSi/O7kp/zu5Kz87uTh/O7k5vzu5Ov87uUg/O7lJfzu5Sr87uUv/O7lZPzu5Wn87uVu/O7lo/zu5aj87uWt/O7l4vzu5ef87uXs/O7mIfzu5ib87uYr/O7mYPzu5mX87uZq/O7mb/zu5qT87uap/O7mrvzu5uP87ubo/O7m7fzu5yL87ucn/O7nLPzu52H87udm/O7na/zu56D87uel/O7nqvzu56/87ufk/O7n6fzu5+787ugj/O7oKPzu6C387uhi/O7oZ/zu6Gz87uih/O7opvzu6Kv87ujg/O7o5fzu6Or87ujv/O7pJPzu6Sn87uku/O7pY/zu6Wj87ultw==" }, { - "string": "󻦋󻦟󻦳󻧇󻧛󻧯󻨃󻨗󻨫󻨿󻩓󻩧󻩻󻪏󻪣󻪷󻫋󻫟󻫳󻬇󻬛󻬯󻭃󻭗󻭫󻭿󻮓󻮧󻮻󻯏󻯣󻯷󻰋󻰟󻰳󻱇󻱛󻱯󻲃󻲗󻲫󻲿󻳓󻳧󻳻󻴏󻴣󻴷󻵋󻵟󻵳󻶇󻶛󻶯󻷃󻷗󻷫󻷿󻸓󻸧󻸻󻹏󻹣󻹷󻺋󻺟󻺳󻻇󻻛󻻯󻼃󻼗󻼫󻼿󻽓󻽧󻽻󻾏󻾣󻾷󻿋󻿟󻿳󼀇󼀛󼀯󼁃󼁗󼁫󼁿󼂓󼂧󼂻󼃏󼃣󼃷󼄋󼄟󼄳󼅇", - "encodedString": "87umi/O7pp/zu6az87unh/O7p5vzu6ev87uog/O7qJfzu6ir87uov/O7qZPzu6mn87upu/O7qo/zu6qj87uqt/O7q4vzu6uf87urs/O7rIfzu6yb87usr/O7rYPzu62X87utq/O7rb/zu66T87uup/O7rrvzu6+P87uvo/O7r7fzu7CL87uwn/O7sLPzu7GH87uxm/O7sa/zu7KD87uyl/O7sqvzu7K/87uzk/O7s6fzu7O787u0j/O7tKPzu7S387u1i/O7tZ/zu7Wz87u2h/O7tpvzu7av87u3g/O7t5fzu7er87u3v/O7uJPzu7in87u4u/O7uY/zu7mj87u5t/O7uovzu7qf87u6s/O7u4fzu7ub87u7r/O7vIPzu7yX87u8q/O7vL/zu72T87u9p/O7vbvzu76P87u+o/O7vrfzu7+L87u/n/O7v7PzvICH87yAm/O8gK/zvIGD87yBl/O8gavzvIG/87yCk/O8gqfzvIK787yDj/O8g6PzvIO387yEi/O8hJ/zvISz87yFhw==" + "string" : "󻦋󻦟󻦳󻧇󻧛󻧯󻨃󻨗󻨫󻨿󻩓󻩧󻩻󻪏󻪣󻪷󻫋󻫟󻫳󻬇󻬛󻬯󻭃󻭗󻭫󻭿󻮓󻮧󻮻󻯏󻯣󻯷󻰋󻰟󻰳󻱇󻱛󻱯󻲃󻲗󻲫󻲿󻳓󻳧󻳻󻴏󻴣󻴷󻵋󻵟󻵳󻶇󻶛󻶯󻷃󻷗󻷫󻷿󻸓󻸧󻸻󻹏󻹣󻹷󻺋󻺟󻺳󻻇󻻛󻻯󻼃󻼗󻼫󻼿󻽓󻽧󻽻󻾏󻾣󻾷󻿋󻿟󻿳󼀇󼀛󼀯󼁃󼁗󼁫󼁿󼂓󼂧󼂻󼃏󼃣󼃷󼄋󼄟󼄳󼅇", + "encodedString" : "87umi/O7pp/zu6az87unh/O7p5vzu6ev87uog/O7qJfzu6ir87uov/O7qZPzu6mn87upu/O7qo/zu6qj87uqt/O7q4vzu6uf87urs/O7rIfzu6yb87usr/O7rYPzu62X87utq/O7rb/zu66T87uup/O7rrvzu6+P87uvo/O7r7fzu7CL87uwn/O7sLPzu7GH87uxm/O7sa/zu7KD87uyl/O7sqvzu7K/87uzk/O7s6fzu7O787u0j/O7tKPzu7S387u1i/O7tZ/zu7Wz87u2h/O7tpvzu7av87u3g/O7t5fzu7er87u3v/O7uJPzu7in87u4u/O7uY/zu7mj87u5t/O7uovzu7qf87u6s/O7u4fzu7ub87u7r/O7vIPzu7yX87u8q/O7vL/zu72T87u9p/O7vbvzu76P87u+o/O7vrfzu7+L87u/n/O7v7PzvICH87yAm/O8gK/zvIGD87yBl/O8gavzvIG/87yCk/O8gqfzvIK787yDj/O8g6PzvIO387yEi/O8hJ/zvISz87yFhw==" }, { - "string": "󼅛󼅯󼆃󼆗󼆫󼆿󼇓󼇧󼇻󼈏󼈣󼈷󼉋󼉟󼉳󼊇󼊛󼊯󼋃󼋗󼋫󼋿󼌓󼌧󼌻󼍏󼍣󼍷󼎋󼎟󼎳󼏇󼏛󼏯󼐃󼐗󼐫󼐿󼑓󼑧󼑻󼒏󼒣󼒷󼓋󼓟󼓳󼔇󼔛󼔯󼕃󼕗󼕫󼕿󼖓󼖧󼖻󼗏󼗣󼗷󼘋󼘟󼘳󼙇󼙛󼙯󼚃󼚗󼚫󼚿󼛓󼛧󼛻󼜏󼜣󼜷󼝋󼝟󼝳󼞇󼞛󼞯󼟃󼟗󼟫󼟿󼠓󼠧󼠻󼡏󼡣󼡷󼢋󼢟󼢳󼣇󼣛󼣯󼤃󼤗", - "encodedString": "87yFm/O8ha/zvIaD87yGl/O8hqvzvIa/87yHk/O8h6fzvIe787yIj/O8iKPzvIi387yJi/O8iZ/zvImz87yKh/O8ipvzvIqv87yLg/O8i5fzvIur87yLv/O8jJPzvIyn87yMu/O8jY/zvI2j87yNt/O8jovzvI6f87yOs/O8j4fzvI+b87yPr/O8kIPzvJCX87yQq/O8kL/zvJGT87yRp/O8kbvzvJKP87ySo/O8krfzvJOL87yTn/O8k7PzvJSH87yUm/O8lK/zvJWD87yVl/O8lavzvJW/87yWk/O8lqfzvJa787yXj/O8l6PzvJe387yYi/O8mJ/zvJiz87yZh/O8mZvzvJmv87yag/O8mpfzvJqr87yav/O8m5PzvJun87ybu/O8nI/zvJyj87yct/O8nYvzvJ2f87yds/O8nofzvJ6b87yer/O8n4PzvJ+X87yfq/O8n7/zvKCT87ygp/O8oLvzvKGP87yho/O8obfzvKKL87yin/O8orPzvKOH87yjm/O8o6/zvKSD87yklw==" + "string" : "󼅛󼅯󼆃󼆗󼆫󼆿󼇓󼇧󼇻󼈏󼈣󼈷󼉋󼉟󼉳󼊇󼊛󼊯󼋃󼋗󼋫󼋿󼌓󼌧󼌻󼍏󼍣󼍷󼎋󼎟󼎳󼏇󼏛󼏯󼐃󼐗󼐫󼐿󼑓󼑧󼑻󼒏󼒣󼒷󼓋󼓟󼓳󼔇󼔛󼔯󼕃󼕗󼕫󼕿󼖓󼖧󼖻󼗏󼗣󼗷󼘋󼘟󼘳󼙇󼙛󼙯󼚃󼚗󼚫󼚿󼛓󼛧󼛻󼜏󼜣󼜷󼝋󼝟󼝳󼞇󼞛󼞯󼟃󼟗󼟫󼟿󼠓󼠧󼠻󼡏󼡣󼡷󼢋󼢟󼢳󼣇󼣛󼣯󼤃󼤗", + "encodedString" : "87yFm/O8ha/zvIaD87yGl/O8hqvzvIa/87yHk/O8h6fzvIe787yIj/O8iKPzvIi387yJi/O8iZ/zvImz87yKh/O8ipvzvIqv87yLg/O8i5fzvIur87yLv/O8jJPzvIyn87yMu/O8jY/zvI2j87yNt/O8jovzvI6f87yOs/O8j4fzvI+b87yPr/O8kIPzvJCX87yQq/O8kL/zvJGT87yRp/O8kbvzvJKP87ySo/O8krfzvJOL87yTn/O8k7PzvJSH87yUm/O8lK/zvJWD87yVl/O8lavzvJW/87yWk/O8lqfzvJa787yXj/O8l6PzvJe387yYi/O8mJ/zvJiz87yZh/O8mZvzvJmv87yag/O8mpfzvJqr87yav/O8m5PzvJun87ybu/O8nI/zvJyj87yct/O8nYvzvJ2f87yds/O8nofzvJ6b87yer/O8n4PzvJ+X87yfq/O8n7/zvKCT87ygp/O8oLvzvKGP87yho/O8obfzvKKL87yin/O8orPzvKOH87yjm/O8o6/zvKSD87yklw==" }, { - "string": "󼤫󼤿󼥓󼥧󼥻󼦏󼦣󼦷󼧋󼧟󼧳󼨇󼨛󼨯󼩃󼩗󼩫󼩿󼪓󼪧󼪻󼫏󼫣󼫷󼬋󼬟󼬳󼭇󼭛󼭯󼮃󼮗󼮫󼮿󼯓󼯧󼯻󼰏󼰣󼰷󼱋󼱟󼱳󼲇󼲛󼲯󼳃󼳗󼳫󼳿󼴓󼴧󼴻󼵏󼵣󼵷󼶋󼶟󼶳󼷇󼷛󼷯󼸃󼸗󼸫󼸿󼹓󼹧󼹻󼺏󼺣󼺷󼻋󼻟󼻳󼼇󼼛󼼯󼽃󼽗󼽫󼽿󼾓󼾧󼾻󼿏󼿣󼿷󽀋󽀟󽀳󽁇󽁛󽁯󽂃󽂗󽂫󽂿󽃓󽃧", - "encodedString": "87ykq/O8pL/zvKWT87ylp/O8pbvzvKaP87ymo/O8prfzvKeL87ynn/O8p7PzvKiH87yom/O8qK/zvKmD87ypl/O8qavzvKm/87yqk/O8qqfzvKq787yrj/O8q6PzvKu387ysi/O8rJ/zvKyz87yth/O8rZvzvK2v87yug/O8rpfzvK6r87yuv/O8r5PzvK+n87yvu/O8sI/zvLCj87ywt/O8sYvzvLGf87yxs/O8sofzvLKb87yyr/O8s4PzvLOX87yzq/O8s7/zvLST87y0p/O8tLvzvLWP87y1o/O8tbfzvLaL87y2n/O8trPzvLeH87y3m/O8t6/zvLiD87y4l/O8uKvzvLi/87y5k/O8uafzvLm787y6j/O8uqPzvLq387y7i/O8u5/zvLuz87y8h/O8vJvzvLyv87y9g/O8vZfzvL2r87y9v/O8vpPzvL6n87y+u/O8v4/zvL+j87y/t/O9gIvzvYCf872As/O9gYfzvYGb872Br/O9goPzvYKX872Cq/O9gr/zvYOT872Dpw==" + "string" : "󼤫󼤿󼥓󼥧󼥻󼦏󼦣󼦷󼧋󼧟󼧳󼨇󼨛󼨯󼩃󼩗󼩫󼩿󼪓󼪧󼪻󼫏󼫣󼫷󼬋󼬟󼬳󼭇󼭛󼭯󼮃󼮗󼮫󼮿󼯓󼯧󼯻󼰏󼰣󼰷󼱋󼱟󼱳󼲇󼲛󼲯󼳃󼳗󼳫󼳿󼴓󼴧󼴻󼵏󼵣󼵷󼶋󼶟󼶳󼷇󼷛󼷯󼸃󼸗󼸫󼸿󼹓󼹧󼹻󼺏󼺣󼺷󼻋󼻟󼻳󼼇󼼛󼼯󼽃󼽗󼽫󼽿󼾓󼾧󼾻󼿏󼿣󼿷󽀋󽀟󽀳󽁇󽁛󽁯󽂃󽂗󽂫󽂿󽃓󽃧", + "encodedString" : "87ykq/O8pL/zvKWT87ylp/O8pbvzvKaP87ymo/O8prfzvKeL87ynn/O8p7PzvKiH87yom/O8qK/zvKmD87ypl/O8qavzvKm/87yqk/O8qqfzvKq787yrj/O8q6PzvKu387ysi/O8rJ/zvKyz87yth/O8rZvzvK2v87yug/O8rpfzvK6r87yuv/O8r5PzvK+n87yvu/O8sI/zvLCj87ywt/O8sYvzvLGf87yxs/O8sofzvLKb87yyr/O8s4PzvLOX87yzq/O8s7/zvLST87y0p/O8tLvzvLWP87y1o/O8tbfzvLaL87y2n/O8trPzvLeH87y3m/O8t6/zvLiD87y4l/O8uKvzvLi/87y5k/O8uafzvLm787y6j/O8uqPzvLq387y7i/O8u5/zvLuz87y8h/O8vJvzvLyv87y9g/O8vZfzvL2r87y9v/O8vpPzvL6n87y+u/O8v4/zvL+j87y/t/O9gIvzvYCf872As/O9gYfzvYGb872Br/O9goPzvYKX872Cq/O9gr/zvYOT872Dpw==" }, { - "string": "󽃻󽄏󽄣󽄷󽅋󽅟󽅳󽆇󽆛󽆯󽇃󽇗󽇫󽇿󽈓󽈧󽈻󽉏󽉣󽉷󽊋󽊟󽊳󽋇󽋛󽋯󽌃󽌗󽌫󽌿󽍓󽍧󽍻󽎏󽎣󽎷󽏋󽏟󽏳󽐇󽐛󽐯󽑃󽑗󽑫󽑿󽒓󽒧󽒻󽓏󽓣󽓷󽔋󽔟󽔳󽕇󽕛󽕯󽖃󽖗󽖫󽖿󽗓󽗧󽗻󽘏󽘣󽘷󽙋󽙟󽙳󽚇󽚛󽚯󽛃󽛗󽛫󽛿󽜓󽜧󽜻󽝏󽝣󽝷󽞋󽞟󽞳󽟇󽟛󽟯󽠃󽠗󽠫󽠿󽡓󽡧󽡻󽢏󽢣󽢷", - "encodedString": "872Du/O9hI/zvYSj872Et/O9hYvzvYWf872Fs/O9hofzvYab872Gr/O9h4PzvYeX872Hq/O9h7/zvYiT872Ip/O9iLvzvYmP872Jo/O9ibfzvYqL872Kn/O9irPzvYuH872Lm/O9i6/zvYyD872Ml/O9jKvzvYy/872Nk/O9jafzvY27872Oj/O9jqPzvY63872Pi/O9j5/zvY+z872Qh/O9kJvzvZCv872Rg/O9kZfzvZGr872Rv/O9kpPzvZKn872Su/O9k4/zvZOj872Tt/O9lIvzvZSf872Us/O9lYfzvZWb872Vr/O9loPzvZaX872Wq/O9lr/zvZeT872Xp/O9l7vzvZiP872Yo/O9mLfzvZmL872Zn/O9mbPzvZqH872am/O9mq/zvZuD872bl/O9m6vzvZu/872ck/O9nKfzvZy7872dj/O9naPzvZ23872ei/O9np/zvZ6z872fh/O9n5vzvZ+v872gg/O9oJfzvaCr872gv/O9oZPzvaGn872hu/O9oo/zvaKj872itw==" + "string" : "󽃻󽄏󽄣󽄷󽅋󽅟󽅳󽆇󽆛󽆯󽇃󽇗󽇫󽇿󽈓󽈧󽈻󽉏󽉣󽉷󽊋󽊟󽊳󽋇󽋛󽋯󽌃󽌗󽌫󽌿󽍓󽍧󽍻󽎏󽎣󽎷󽏋󽏟󽏳󽐇󽐛󽐯󽑃󽑗󽑫󽑿󽒓󽒧󽒻󽓏󽓣󽓷󽔋󽔟󽔳󽕇󽕛󽕯󽖃󽖗󽖫󽖿󽗓󽗧󽗻󽘏󽘣󽘷󽙋󽙟󽙳󽚇󽚛󽚯󽛃󽛗󽛫󽛿󽜓󽜧󽜻󽝏󽝣󽝷󽞋󽞟󽞳󽟇󽟛󽟯󽠃󽠗󽠫󽠿󽡓󽡧󽡻󽢏󽢣󽢷", + "encodedString" : "872Du/O9hI/zvYSj872Et/O9hYvzvYWf872Fs/O9hofzvYab872Gr/O9h4PzvYeX872Hq/O9h7/zvYiT872Ip/O9iLvzvYmP872Jo/O9ibfzvYqL872Kn/O9irPzvYuH872Lm/O9i6/zvYyD872Ml/O9jKvzvYy/872Nk/O9jafzvY27872Oj/O9jqPzvY63872Pi/O9j5/zvY+z872Qh/O9kJvzvZCv872Rg/O9kZfzvZGr872Rv/O9kpPzvZKn872Su/O9k4/zvZOj872Tt/O9lIvzvZSf872Us/O9lYfzvZWb872Vr/O9loPzvZaX872Wq/O9lr/zvZeT872Xp/O9l7vzvZiP872Yo/O9mLfzvZmL872Zn/O9mbPzvZqH872am/O9mq/zvZuD872bl/O9m6vzvZu/872ck/O9nKfzvZy7872dj/O9naPzvZ23872ei/O9np/zvZ6z872fh/O9n5vzvZ+v872gg/O9oJfzvaCr872gv/O9oZPzvaGn872hu/O9oo/zvaKj872itw==" }, { - "string": "󽣋󽣟󽣳󽤇󽤛󽤯󽥃󽥗󽥫󽥿󽦓󽦧󽦻󽧏󽧣󽧷󽨋󽨟󽨳󽩇󽩛󽩯󽪃󽪗󽪫󽪿󽫓󽫧󽫻󽬏󽬣󽬷󽭋󽭟󽭳󽮇󽮛󽮯󽯃󽯗󽯫󽯿󽰓󽰧󽰻󽱏󽱣󽱷󽲋󽲟󽲳󽳇󽳛󽳯󽴃󽴗󽴫󽴿󽵓󽵧󽵻󽶏󽶣󽶷󽷋󽷟󽷳󽸇󽸛󽸯󽹃󽹗󽹫󽹿󽺓󽺧󽺻󽻏󽻣󽻷󽼋󽼟󽼳󽽇󽽛󽽯󽾃󽾗󽾫󽾿󽿓󽿧󽿻󾀏󾀣󾀷󾁋󾁟󾁳󾂇", - "encodedString": "872ji/O9o5/zvaOz872kh/O9pJvzvaSv872lg/O9pZfzvaWr872lv/O9ppPzvaan872mu/O9p4/zvaej872nt/O9qIvzvaif872os/O9qYfzvamb872pr/O9qoPzvaqX872qq/O9qr/zvauT872rp/O9q7vzvayP872so/O9rLfzva2L872tn/O9rbPzva6H872um/O9rq/zva+D872vl/O9r6vzva+/872wk/O9sKfzvbC7872xj/O9saPzvbG3872yi/O9sp/zvbKz872zh/O9s5vzvbOv8720g/O9tJfzvbSr8720v/O9tZPzvbWn8721u/O9to/zvbaj8722t/O9t4vzvbef8723s/O9uIfzvbib8724r/O9uYPzvbmX8725q/O9ub/zvbqT8726p/O9urvzvbuP8727o/O9u7fzvbyL8728n/O9vLPzvb2H8729m/O9va/zvb6D872+l/O9vqvzvb6/872/k/O9v6fzvb+7876Aj/O+gKPzvoC3876Bi/O+gZ/zvoGz876Chw==" + "string" : "󽣋󽣟󽣳󽤇󽤛󽤯󽥃󽥗󽥫󽥿󽦓󽦧󽦻󽧏󽧣󽧷󽨋󽨟󽨳󽩇󽩛󽩯󽪃󽪗󽪫󽪿󽫓󽫧󽫻󽬏󽬣󽬷󽭋󽭟󽭳󽮇󽮛󽮯󽯃󽯗󽯫󽯿󽰓󽰧󽰻󽱏󽱣󽱷󽲋󽲟󽲳󽳇󽳛󽳯󽴃󽴗󽴫󽴿󽵓󽵧󽵻󽶏󽶣󽶷󽷋󽷟󽷳󽸇󽸛󽸯󽹃󽹗󽹫󽹿󽺓󽺧󽺻󽻏󽻣󽻷󽼋󽼟󽼳󽽇󽽛󽽯󽾃󽾗󽾫󽾿󽿓󽿧󽿻󾀏󾀣󾀷󾁋󾁟󾁳󾂇", + "encodedString" : "872ji/O9o5/zvaOz872kh/O9pJvzvaSv872lg/O9pZfzvaWr872lv/O9ppPzvaan872mu/O9p4/zvaej872nt/O9qIvzvaif872os/O9qYfzvamb872pr/O9qoPzvaqX872qq/O9qr/zvauT872rp/O9q7vzvayP872so/O9rLfzva2L872tn/O9rbPzva6H872um/O9rq/zva+D872vl/O9r6vzva+/872wk/O9sKfzvbC7872xj/O9saPzvbG3872yi/O9sp/zvbKz872zh/O9s5vzvbOv8720g/O9tJfzvbSr8720v/O9tZPzvbWn8721u/O9to/zvbaj8722t/O9t4vzvbef8723s/O9uIfzvbib8724r/O9uYPzvbmX8725q/O9ub/zvbqT8726p/O9urvzvbuP8727o/O9u7fzvbyL8728n/O9vLPzvb2H8729m/O9va/zvb6D872+l/O9vqvzvb6/872/k/O9v6fzvb+7876Aj/O+gKPzvoC3876Bi/O+gZ/zvoGz876Chw==" }, { - "string": "󾂛󾂯󾃃󾃗󾃫󾃿󾄓󾄧󾄻󾅏󾅣󾅷󾆋󾆟󾆳󾇇󾇛󾇯󾈃󾈗󾈫󾈿󾉓󾉧󾉻󾊏󾊣󾊷󾋋󾋟󾋳󾌇󾌛󾌯󾍃󾍗󾍫󾍿󾎓󾎧󾎻󾏏󾏣󾏷󾐋󾐟󾐳󾑇󾑛󾑯󾒃󾒗󾒫󾒿󾓓󾓧󾓻󾔏󾔣󾔷󾕋󾕟󾕳󾖇󾖛󾖯󾗃󾗗󾗫󾗿󾘓󾘧󾘻󾙏󾙣󾙷󾚋󾚟󾚳󾛇󾛛󾛯󾜃󾜗󾜫󾜿󾝓󾝧󾝻󾞏󾞣󾞷󾟋󾟟󾟳󾠇󾠛󾠯󾡃󾡗", - "encodedString": "876Cm/O+gq/zvoOD876Dl/O+g6vzvoO/876Ek/O+hKfzvoS7876Fj/O+haPzvoW3876Gi/O+hp/zvoaz876Hh/O+h5vzvoev876Ig/O+iJfzvoir876Iv/O+iZPzvomn876Ju/O+io/zvoqj876Kt/O+i4vzvouf876Ls/O+jIfzvoyb876Mr/O+jYPzvo2X876Nq/O+jb/zvo6T876Op/O+jrvzvo+P876Po/O+j7fzvpCL876Qn/O+kLPzvpGH876Rm/O+ka/zvpKD876Sl/O+kqvzvpK/876Tk/O+k6fzvpO7876Uj/O+lKPzvpS3876Vi/O+lZ/zvpWz876Wh/O+lpvzvpav876Xg/O+l5fzvper876Xv/O+mJPzvpin876Yu/O+mY/zvpmj876Zt/O+movzvpqf876as/O+m4fzvpub876br/O+nIPzvpyX876cq/O+nL/zvp2T876dp/O+nbvzvp6P876eo/O+nrfzvp+L876fn/O+n7PzvqCH876gm/O+oK/zvqGD876hlw==" + "string" : "󾂛󾂯󾃃󾃗󾃫󾃿󾄓󾄧󾄻󾅏󾅣󾅷󾆋󾆟󾆳󾇇󾇛󾇯󾈃󾈗󾈫󾈿󾉓󾉧󾉻󾊏󾊣󾊷󾋋󾋟󾋳󾌇󾌛󾌯󾍃󾍗󾍫󾍿󾎓󾎧󾎻󾏏󾏣󾏷󾐋󾐟󾐳󾑇󾑛󾑯󾒃󾒗󾒫󾒿󾓓󾓧󾓻󾔏󾔣󾔷󾕋󾕟󾕳󾖇󾖛󾖯󾗃󾗗󾗫󾗿󾘓󾘧󾘻󾙏󾙣󾙷󾚋󾚟󾚳󾛇󾛛󾛯󾜃󾜗󾜫󾜿󾝓󾝧󾝻󾞏󾞣󾞷󾟋󾟟󾟳󾠇󾠛󾠯󾡃󾡗", + "encodedString" : "876Cm/O+gq/zvoOD876Dl/O+g6vzvoO/876Ek/O+hKfzvoS7876Fj/O+haPzvoW3876Gi/O+hp/zvoaz876Hh/O+h5vzvoev876Ig/O+iJfzvoir876Iv/O+iZPzvomn876Ju/O+io/zvoqj876Kt/O+i4vzvouf876Ls/O+jIfzvoyb876Mr/O+jYPzvo2X876Nq/O+jb/zvo6T876Op/O+jrvzvo+P876Po/O+j7fzvpCL876Qn/O+kLPzvpGH876Rm/O+ka/zvpKD876Sl/O+kqvzvpK/876Tk/O+k6fzvpO7876Uj/O+lKPzvpS3876Vi/O+lZ/zvpWz876Wh/O+lpvzvpav876Xg/O+l5fzvper876Xv/O+mJPzvpin876Yu/O+mY/zvpmj876Zt/O+movzvpqf876as/O+m4fzvpub876br/O+nIPzvpyX876cq/O+nL/zvp2T876dp/O+nbvzvp6P876eo/O+nrfzvp+L876fn/O+n7PzvqCH876gm/O+oK/zvqGD876hlw==" }, { - "string": "󾡫󾡿󾢓󾢧󾢻󾣏󾣣󾣷󾤋󾤟󾤳󾥇󾥛󾥯󾦃󾦗󾦫󾦿󾧓󾧧󾧻󾨏󾨣󾨷󾩋󾩟󾩳󾪇󾪛󾪯󾫃󾫗󾫫󾫿󾬓󾬧󾬻󾭏󾭣󾭷󾮋󾮟󾮳󾯇󾯛󾯯󾰃󾰗󾰫󾰿󾱓󾱧󾱻󾲏󾲣󾲷󾳋󾳟󾳳󾴇󾴛󾴯󾵃󾵗󾵫󾵿󾶓󾶧󾶻󾷏󾷣󾷷󾸋󾸟󾸳󾹇󾹛󾹯󾺃󾺗󾺫󾺿󾻓󾻧󾻻󾼏󾼣󾼷󾽋󾽟󾽳󾾇󾾛󾾯󾿃󾿗󾿫󾿿󿀓󿀧", - "encodedString": "876hq/O+ob/zvqKT876ip/O+orvzvqOP876jo/O+o7fzvqSL876kn/O+pLPzvqWH876lm/O+pa/zvqaD876ml/O+pqvzvqa/876nk/O+p6fzvqe7876oj/O+qKPzvqi3876pi/O+qZ/zvqmz876qh/O+qpvzvqqv876rg/O+q5fzvqur876rv/O+rJPzvqyn876su/O+rY/zvq2j876tt/O+rovzvq6f876us/O+r4fzvq+b876vr/O+sIPzvrCX876wq/O+sL/zvrGT876xp/O+sbvzvrKP876yo/O+srfzvrOL876zn/O+s7PzvrSH8760m/O+tK/zvrWD8761l/O+tavzvrW/8762k/O+tqfzvra78763j/O+t6Pzvre38764i/O+uJ/zvriz8765h/O+uZvzvrmv8766g/O+upfzvrqr8766v/O+u5Pzvrun8767u/O+vI/zvryj8768t/O+vYvzvr2f8769s/O+vofzvr6b876+r/O+v4Pzvr+X876/q/O+v7/zv4CT87+Apw==" + "string" : "󾡫󾡿󾢓󾢧󾢻󾣏󾣣󾣷󾤋󾤟󾤳󾥇󾥛󾥯󾦃󾦗󾦫󾦿󾧓󾧧󾧻󾨏󾨣󾨷󾩋󾩟󾩳󾪇󾪛󾪯󾫃󾫗󾫫󾫿󾬓󾬧󾬻󾭏󾭣󾭷󾮋󾮟󾮳󾯇󾯛󾯯󾰃󾰗󾰫󾰿󾱓󾱧󾱻󾲏󾲣󾲷󾳋󾳟󾳳󾴇󾴛󾴯󾵃󾵗󾵫󾵿󾶓󾶧󾶻󾷏󾷣󾷷󾸋󾸟󾸳󾹇󾹛󾹯󾺃󾺗󾺫󾺿󾻓󾻧󾻻󾼏󾼣󾼷󾽋󾽟󾽳󾾇󾾛󾾯󾿃󾿗󾿫󾿿󿀓󿀧", + "encodedString" : "876hq/O+ob/zvqKT876ip/O+orvzvqOP876jo/O+o7fzvqSL876kn/O+pLPzvqWH876lm/O+pa/zvqaD876ml/O+pqvzvqa/876nk/O+p6fzvqe7876oj/O+qKPzvqi3876pi/O+qZ/zvqmz876qh/O+qpvzvqqv876rg/O+q5fzvqur876rv/O+rJPzvqyn876su/O+rY/zvq2j876tt/O+rovzvq6f876us/O+r4fzvq+b876vr/O+sIPzvrCX876wq/O+sL/zvrGT876xp/O+sbvzvrKP876yo/O+srfzvrOL876zn/O+s7PzvrSH8760m/O+tK/zvrWD8761l/O+tavzvrW/8762k/O+tqfzvra78763j/O+t6Pzvre38764i/O+uJ/zvriz8765h/O+uZvzvrmv8766g/O+upfzvrqr8766v/O+u5Pzvrun8767u/O+vI/zvryj8768t/O+vYvzvr2f8769s/O+vofzvr6b876+r/O+v4Pzvr+X876/q/O+v7/zv4CT87+Apw==" }, { - "string": "󿀻󿁏󿁣󿁷󿂋󿂟󿂳󿃇󿃛󿃯󿄃󿄗󿄫󿄿󿅓󿅧󿅻󿆏󿆣󿆷󿇋󿇟󿇳󿈇󿈛󿈯󿉃󿉗󿉫󿉿󿊓󿊧󿊻󿋏󿋣󿋷󿌋󿌟󿌳󿍇󿍛󿍯󿎃󿎗󿎫󿎿󿏓󿏧󿏻󿐏󿐣󿐷󿑋󿑟󿑳󿒇󿒛󿒯󿓃󿓗󿓫󿓿󿔓󿔧󿔻󿕏󿕣󿕷󿖋󿖟󿖳󿗇󿗛󿗯󿘃󿘗󿘫󿘿󿙓󿙧󿙻󿚏󿚣󿚷󿛋󿛟󿛳󿜇󿜛󿜯󿝃󿝗󿝫󿝿󿞓󿞧󿞻󿟏󿟣󿟷", - "encodedString": "87+Au/O/gY/zv4Gj87+Bt/O/govzv4Kf87+Cs/O/g4fzv4Ob87+Dr/O/hIPzv4SX87+Eq/O/hL/zv4WT87+Fp/O/hbvzv4aP87+Go/O/hrfzv4eL87+Hn/O/h7Pzv4iH87+Im/O/iK/zv4mD87+Jl/O/iavzv4m/87+Kk/O/iqfzv4q787+Lj/O/i6Pzv4u387+Mi/O/jJ/zv4yz87+Nh/O/jZvzv42v87+Og/O/jpfzv46r87+Ov/O/j5Pzv4+n87+Pu/O/kI/zv5Cj87+Qt/O/kYvzv5Gf87+Rs/O/kofzv5Kb87+Sr/O/k4Pzv5OX87+Tq/O/k7/zv5ST87+Up/O/lLvzv5WP87+Vo/O/lbfzv5aL87+Wn/O/lrPzv5eH87+Xm/O/l6/zv5iD87+Yl/O/mKvzv5i/87+Zk/O/mafzv5m787+aj/O/mqPzv5q387+bi/O/m5/zv5uz87+ch/O/nJvzv5yv87+dg/O/nZfzv52r87+dv/O/npPzv56n87+eu/O/n4/zv5+j87+ftw==" + "string" : "󿀻󿁏󿁣󿁷󿂋󿂟󿂳󿃇󿃛󿃯󿄃󿄗󿄫󿄿󿅓󿅧󿅻󿆏󿆣󿆷󿇋󿇟󿇳󿈇󿈛󿈯󿉃󿉗󿉫󿉿󿊓󿊧󿊻󿋏󿋣󿋷󿌋󿌟󿌳󿍇󿍛󿍯󿎃󿎗󿎫󿎿󿏓󿏧󿏻󿐏󿐣󿐷󿑋󿑟󿑳󿒇󿒛󿒯󿓃󿓗󿓫󿓿󿔓󿔧󿔻󿕏󿕣󿕷󿖋󿖟󿖳󿗇󿗛󿗯󿘃󿘗󿘫󿘿󿙓󿙧󿙻󿚏󿚣󿚷󿛋󿛟󿛳󿜇󿜛󿜯󿝃󿝗󿝫󿝿󿞓󿞧󿞻󿟏󿟣󿟷", + "encodedString" : "87+Au/O/gY/zv4Gj87+Bt/O/govzv4Kf87+Cs/O/g4fzv4Ob87+Dr/O/hIPzv4SX87+Eq/O/hL/zv4WT87+Fp/O/hbvzv4aP87+Go/O/hrfzv4eL87+Hn/O/h7Pzv4iH87+Im/O/iK/zv4mD87+Jl/O/iavzv4m/87+Kk/O/iqfzv4q787+Lj/O/i6Pzv4u387+Mi/O/jJ/zv4yz87+Nh/O/jZvzv42v87+Og/O/jpfzv46r87+Ov/O/j5Pzv4+n87+Pu/O/kI/zv5Cj87+Qt/O/kYvzv5Gf87+Rs/O/kofzv5Kb87+Sr/O/k4Pzv5OX87+Tq/O/k7/zv5ST87+Up/O/lLvzv5WP87+Vo/O/lbfzv5aL87+Wn/O/lrPzv5eH87+Xm/O/l6/zv5iD87+Yl/O/mKvzv5i/87+Zk/O/mafzv5m787+aj/O/mqPzv5q387+bi/O/m5/zv5uz87+ch/O/nJvzv5yv87+dg/O/nZfzv52r87+dv/O/npPzv56n87+eu/O/n4/zv5+j87+ftw==" }, { - "string": "󿠋󿠟󿠳󿡇󿡛󿡯󿢃󿢗󿢫󿢿󿣓󿣧󿣻󿤏󿤣󿤷󿥋󿥟󿥳󿦇󿦛󿦯󿧃󿧗󿧫󿧿󿨓󿨧󿨻󿩏󿩣󿩷󿪋󿪟󿪳󿫇󿫛󿫯󿬃󿬗󿬫󿬿󿭓󿭧󿭻󿮏󿮣󿮷󿯋󿯟󿯳󿰇󿰛󿰯󿱃󿱗󿱫󿱿󿲓󿲧󿲻󿳏󿳣󿳷󿴋󿴟󿴳󿵇󿵛󿵯󿶃󿶗󿶫󿶿󿷓󿷧󿷻󿸏󿸣󿸷󿹋󿹟󿹳󿺇󿺛󿺯󿻃󿻗󿻫󿻿󿼓󿼧󿼻󿽏󿽣󿽷󿾋󿾟󿾳󿿇", - "encodedString": "87+gi/O/oJ/zv6Cz87+hh/O/oZvzv6Gv87+ig/O/opfzv6Kr87+iv/O/o5Pzv6On87+ju/O/pI/zv6Sj87+kt/O/pYvzv6Wf87+ls/O/pofzv6ab87+mr/O/p4Pzv6eX87+nq/O/p7/zv6iT87+op/O/qLvzv6mP87+po/O/qbfzv6qL87+qn/O/qrPzv6uH87+rm/O/q6/zv6yD87+sl/O/rKvzv6y/87+tk/O/rafzv62787+uj/O/rqPzv66387+vi/O/r5/zv6+z87+wh/O/sJvzv7Cv87+xg/O/sZfzv7Gr87+xv/O/spPzv7Kn87+yu/O/s4/zv7Oj87+zt/O/tIvzv7Sf87+0s/O/tYfzv7Wb87+1r/O/toPzv7aX87+2q/O/tr/zv7eT87+3p/O/t7vzv7iP87+4o/O/uLfzv7mL87+5n/O/ubPzv7qH87+6m/O/uq/zv7uD87+7l/O/u6vzv7u/87+8k/O/vKfzv7y787+9j/O/vaPzv72387++i/O/vp/zv76z87+/hw==" + "string" : "󿠋󿠟󿠳󿡇󿡛󿡯󿢃󿢗󿢫󿢿󿣓󿣧󿣻󿤏󿤣󿤷󿥋󿥟󿥳󿦇󿦛󿦯󿧃󿧗󿧫󿧿󿨓󿨧󿨻󿩏󿩣󿩷󿪋󿪟󿪳󿫇󿫛󿫯󿬃󿬗󿬫󿬿󿭓󿭧󿭻󿮏󿮣󿮷󿯋󿯟󿯳󿰇󿰛󿰯󿱃󿱗󿱫󿱿󿲓󿲧󿲻󿳏󿳣󿳷󿴋󿴟󿴳󿵇󿵛󿵯󿶃󿶗󿶫󿶿󿷓󿷧󿷻󿸏󿸣󿸷󿹋󿹟󿹳󿺇󿺛󿺯󿻃󿻗󿻫󿻿󿼓󿼧󿼻󿽏󿽣󿽷󿾋󿾟󿾳󿿇", + "encodedString" : "87+gi/O/oJ/zv6Cz87+hh/O/oZvzv6Gv87+ig/O/opfzv6Kr87+iv/O/o5Pzv6On87+ju/O/pI/zv6Sj87+kt/O/pYvzv6Wf87+ls/O/pofzv6ab87+mr/O/p4Pzv6eX87+nq/O/p7/zv6iT87+op/O/qLvzv6mP87+po/O/qbfzv6qL87+qn/O/qrPzv6uH87+rm/O/q6/zv6yD87+sl/O/rKvzv6y/87+tk/O/rafzv62787+uj/O/rqPzv66387+vi/O/r5/zv6+z87+wh/O/sJvzv7Cv87+xg/O/sZfzv7Gr87+xv/O/spPzv7Kn87+yu/O/s4/zv7Oj87+zt/O/tIvzv7Sf87+0s/O/tYfzv7Wb87+1r/O/toPzv7aX87+2q/O/tr/zv7eT87+3p/O/t7vzv7iP87+4o/O/uLfzv7mL87+5n/O/ubPzv7qH87+6m/O/uq/zv7uD87+7l/O/u6vzv7u/87+8k/O/vKfzv7y787+9j/O/vaPzv72387++i/O/vp/zv76z87+/hw==" }, { - "string": "󿿛󿿯􀀅􀀙􀀭􀁁􀁕􀁩􀁽􀂑􀂥􀂹􀃍􀃡􀃵􀄉􀄝􀄱􀅅􀅙􀅭􀆁􀆕􀆩􀆽􀇑􀇥􀇹􀈍􀈡􀈵􀉉􀉝􀉱􀊅􀊙􀊭􀋁􀋕􀋩􀋽􀌑􀌥􀌹􀍍􀍡􀍵􀎉􀎝􀎱􀏅􀏙􀏭􀐁􀐕􀐩􀐽􀑑􀑥􀑹􀒍􀒡􀒵􀓉􀓝􀓱􀔅􀔙􀔭􀕁􀕕􀕩􀕽􀖑􀖥􀖹􀗍􀗡􀗵􀘉􀘝􀘱􀙅􀙙􀙭􀚁􀚕􀚩􀚽􀛑􀛥􀛹􀜍􀜡􀜵􀝉􀝝􀝱􀞅􀞙", - "encodedString": "87+/m/O/v6/0gICF9ICAmfSAgK30gIGB9ICBlfSAgan0gIG99ICCkfSAgqX0gIK59ICDjfSAg6H0gIO19ICEifSAhJ30gISx9ICFhfSAhZn0gIWt9ICGgfSAhpX0gIap9ICGvfSAh5H0gIel9ICHufSAiI30gIih9ICItfSAiYn0gImd9ICJsfSAioX0gIqZ9ICKrfSAi4H0gIuV9ICLqfSAi730gIyR9ICMpfSAjLn0gI2N9ICNofSAjbX0gI6J9ICOnfSAjrH0gI+F9ICPmfSAj630gJCB9ICQlfSAkKn0gJC99ICRkfSAkaX0gJG59ICSjfSAkqH0gJK19ICTifSAk530gJOx9ICUhfSAlJn0gJSt9ICVgfSAlZX0gJWp9ICVvfSAlpH0gJal9ICWufSAl430gJeh9ICXtfSAmIn0gJid9ICYsfSAmYX0gJmZ9ICZrfSAmoH0gJqV9ICaqfSAmr30gJuR9ICbpfSAm7n0gJyN9ICcofSAnLX0gJ2J9ICdnfSAnbH0gJ6F9ICemQ==" + "string" : "󿿛󿿯􀀅􀀙􀀭􀁁􀁕􀁩􀁽􀂑􀂥􀂹􀃍􀃡􀃵􀄉􀄝􀄱􀅅􀅙􀅭􀆁􀆕􀆩􀆽􀇑􀇥􀇹􀈍􀈡􀈵􀉉􀉝􀉱􀊅􀊙􀊭􀋁􀋕􀋩􀋽􀌑􀌥􀌹􀍍􀍡􀍵􀎉􀎝􀎱􀏅􀏙􀏭􀐁􀐕􀐩􀐽􀑑􀑥􀑹􀒍􀒡􀒵􀓉􀓝􀓱􀔅􀔙􀔭􀕁􀕕􀕩􀕽􀖑􀖥􀖹􀗍􀗡􀗵􀘉􀘝􀘱􀙅􀙙􀙭􀚁􀚕􀚩􀚽􀛑􀛥􀛹􀜍􀜡􀜵􀝉􀝝􀝱􀞅􀞙", + "encodedString" : "87+/m/O/v6/0gICF9ICAmfSAgK30gIGB9ICBlfSAgan0gIG99ICCkfSAgqX0gIK59ICDjfSAg6H0gIO19ICEifSAhJ30gISx9ICFhfSAhZn0gIWt9ICGgfSAhpX0gIap9ICGvfSAh5H0gIel9ICHufSAiI30gIih9ICItfSAiYn0gImd9ICJsfSAioX0gIqZ9ICKrfSAi4H0gIuV9ICLqfSAi730gIyR9ICMpfSAjLn0gI2N9ICNofSAjbX0gI6J9ICOnfSAjrH0gI+F9ICPmfSAj630gJCB9ICQlfSAkKn0gJC99ICRkfSAkaX0gJG59ICSjfSAkqH0gJK19ICTifSAk530gJOx9ICUhfSAlJn0gJSt9ICVgfSAlZX0gJWp9ICVvfSAlpH0gJal9ICWufSAl430gJeh9ICXtfSAmIn0gJid9ICYsfSAmYX0gJmZ9ICZrfSAmoH0gJqV9ICaqfSAmr30gJuR9ICbpfSAm7n0gJyN9ICcofSAnLX0gJ2J9ICdnfSAnbH0gJ6F9ICemQ==" }, { - "string": "􀞭􀟁􀟕􀟩􀟽􀠑􀠥􀠹􀡍􀡡􀡵􀢉􀢝􀢱􀣅􀣙􀣭􀤁􀤕􀤩􀤽􀥑􀥥􀥹􀦍􀦡􀦵􀧉􀧝􀧱􀨅􀨙􀨭􀩁􀩕􀩩􀩽􀪑􀪥􀪹􀫍􀫡􀫵􀬉􀬝􀬱􀭅􀭙􀭭􀮁􀮕􀮩􀮽􀯑􀯥􀯹􀰍􀰡􀰵􀱉􀱝􀱱􀲅􀲙􀲭􀳁􀳕􀳩􀳽􀴑􀴥􀴹􀵍􀵡􀵵􀶉􀶝􀶱􀷅􀷙􀷭􀸁􀸕􀸩􀸽􀹑􀹥􀹹􀺍􀺡􀺵􀻉􀻝􀻱􀼅􀼙􀼭􀽁􀽕􀽩", - "encodedString": "9ICerfSAn4H0gJ+V9ICfqfSAn730gKCR9ICgpfSAoLn0gKGN9IChofSAobX0gKKJ9ICinfSAorH0gKOF9ICjmfSAo630gKSB9ICklfSApKn0gKS99IClkfSApaX0gKW59ICmjfSApqH0gKa19ICnifSAp530gKex9ICohfSAqJn0gKit9ICpgfSAqZX0gKmp9ICpvfSAqpH0gKql9ICqufSAq430gKuh9ICrtfSArIn0gKyd9ICssfSArYX0gK2Z9ICtrfSAroH0gK6V9ICuqfSArr30gK+R9ICvpfSAr7n0gLCN9ICwofSAsLX0gLGJ9ICxnfSAsbH0gLKF9ICymfSAsq30gLOB9ICzlfSAs6n0gLO99IC0kfSAtKX0gLS59IC1jfSAtaH0gLW19IC2ifSAtp30gLax9IC3hfSAt5n0gLet9IC4gfSAuJX0gLip9IC4vfSAuZH0gLml9IC5ufSAuo30gLqh9IC6tfSAu4n0gLud9IC7sfSAvIX0gLyZ9IC8rfSAvYH0gL2V9IC9qQ==" + "string" : "􀞭􀟁􀟕􀟩􀟽􀠑􀠥􀠹􀡍􀡡􀡵􀢉􀢝􀢱􀣅􀣙􀣭􀤁􀤕􀤩􀤽􀥑􀥥􀥹􀦍􀦡􀦵􀧉􀧝􀧱􀨅􀨙􀨭􀩁􀩕􀩩􀩽􀪑􀪥􀪹􀫍􀫡􀫵􀬉􀬝􀬱􀭅􀭙􀭭􀮁􀮕􀮩􀮽􀯑􀯥􀯹􀰍􀰡􀰵􀱉􀱝􀱱􀲅􀲙􀲭􀳁􀳕􀳩􀳽􀴑􀴥􀴹􀵍􀵡􀵵􀶉􀶝􀶱􀷅􀷙􀷭􀸁􀸕􀸩􀸽􀹑􀹥􀹹􀺍􀺡􀺵􀻉􀻝􀻱􀼅􀼙􀼭􀽁􀽕􀽩", + "encodedString" : "9ICerfSAn4H0gJ+V9ICfqfSAn730gKCR9ICgpfSAoLn0gKGN9IChofSAobX0gKKJ9ICinfSAorH0gKOF9ICjmfSAo630gKSB9ICklfSApKn0gKS99IClkfSApaX0gKW59ICmjfSApqH0gKa19ICnifSAp530gKex9ICohfSAqJn0gKit9ICpgfSAqZX0gKmp9ICpvfSAqpH0gKql9ICqufSAq430gKuh9ICrtfSArIn0gKyd9ICssfSArYX0gK2Z9ICtrfSAroH0gK6V9ICuqfSArr30gK+R9ICvpfSAr7n0gLCN9ICwofSAsLX0gLGJ9ICxnfSAsbH0gLKF9ICymfSAsq30gLOB9ICzlfSAs6n0gLO99IC0kfSAtKX0gLS59IC1jfSAtaH0gLW19IC2ifSAtp30gLax9IC3hfSAt5n0gLet9IC4gfSAuJX0gLip9IC4vfSAuZH0gLml9IC5ufSAuo30gLqh9IC6tfSAu4n0gLud9IC7sfSAvIX0gLyZ9IC8rfSAvYH0gL2V9IC9qQ==" }, { - "string": "􀽽􀾑􀾥􀾹􀿍􀿡􀿵􁀉􁀝􁀱􁁅􁁙􁁭􁂁􁂕􁂩􁂽􁃑􁃥􁃹􁄍􁄡􁄵􁅉􁅝􁅱􁆅􁆙􁆭􁇁􁇕􁇩􁇽􁈑􁈥􁈹􁉍􁉡􁉵􁊉􁊝􁊱􁋅􁋙􁋭􁌁􁌕􁌩􁌽􁍑􁍥􁍹􁎍􁎡􁎵􁏉􁏝􁏱􁐅􁐙􁐭􁑁􁑕􁑩􁑽􁒑􁒥􁒹􁓍􁓡􁓵􁔉􁔝􁔱􁕅􁕙􁕭􁖁􁖕􁖩􁖽􁗑􁗥􁗹􁘍􁘡􁘵􁙉􁙝􁙱􁚅􁚙􁚭􁛁􁛕􁛩􁛽􁜑􁜥􁜹", - "encodedString": "9IC9vfSAvpH0gL6l9IC+ufSAv430gL+h9IC/tfSBgIn0gYCd9IGAsfSBgYX0gYGZ9IGBrfSBgoH0gYKV9IGCqfSBgr30gYOR9IGDpfSBg7n0gYSN9IGEofSBhLX0gYWJ9IGFnfSBhbH0gYaF9IGGmfSBhq30gYeB9IGHlfSBh6n0gYe99IGIkfSBiKX0gYi59IGJjfSBiaH0gYm19IGKifSBip30gYqx9IGLhfSBi5n0gYut9IGMgfSBjJX0gYyp9IGMvfSBjZH0gY2l9IGNufSBjo30gY6h9IGOtfSBj4n0gY+d9IGPsfSBkIX0gZCZ9IGQrfSBkYH0gZGV9IGRqfSBkb30gZKR9IGSpfSBkrn0gZON9IGTofSBk7X0gZSJ9IGUnfSBlLH0gZWF9IGVmfSBla30gZaB9IGWlfSBlqn0gZa99IGXkfSBl6X0gZe59IGYjfSBmKH0gZi19IGZifSBmZ30gZmx9IGahfSBmpn0gZqt9IGbgfSBm5X0gZup9IGbvfSBnJH0gZyl9IGcuQ==" + "string" : "􀽽􀾑􀾥􀾹􀿍􀿡􀿵􁀉􁀝􁀱􁁅􁁙􁁭􁂁􁂕􁂩􁂽􁃑􁃥􁃹􁄍􁄡􁄵􁅉􁅝􁅱􁆅􁆙􁆭􁇁􁇕􁇩􁇽􁈑􁈥􁈹􁉍􁉡􁉵􁊉􁊝􁊱􁋅􁋙􁋭􁌁􁌕􁌩􁌽􁍑􁍥􁍹􁎍􁎡􁎵􁏉􁏝􁏱􁐅􁐙􁐭􁑁􁑕􁑩􁑽􁒑􁒥􁒹􁓍􁓡􁓵􁔉􁔝􁔱􁕅􁕙􁕭􁖁􁖕􁖩􁖽􁗑􁗥􁗹􁘍􁘡􁘵􁙉􁙝􁙱􁚅􁚙􁚭􁛁􁛕􁛩􁛽􁜑􁜥􁜹", + "encodedString" : "9IC9vfSAvpH0gL6l9IC+ufSAv430gL+h9IC/tfSBgIn0gYCd9IGAsfSBgYX0gYGZ9IGBrfSBgoH0gYKV9IGCqfSBgr30gYOR9IGDpfSBg7n0gYSN9IGEofSBhLX0gYWJ9IGFnfSBhbH0gYaF9IGGmfSBhq30gYeB9IGHlfSBh6n0gYe99IGIkfSBiKX0gYi59IGJjfSBiaH0gYm19IGKifSBip30gYqx9IGLhfSBi5n0gYut9IGMgfSBjJX0gYyp9IGMvfSBjZH0gY2l9IGNufSBjo30gY6h9IGOtfSBj4n0gY+d9IGPsfSBkIX0gZCZ9IGQrfSBkYH0gZGV9IGRqfSBkb30gZKR9IGSpfSBkrn0gZON9IGTofSBk7X0gZSJ9IGUnfSBlLH0gZWF9IGVmfSBla30gZaB9IGWlfSBlqn0gZa99IGXkfSBl6X0gZe59IGYjfSBmKH0gZi19IGZifSBmZ30gZmx9IGahfSBmpn0gZqt9IGbgfSBm5X0gZup9IGbvfSBnJH0gZyl9IGcuQ==" }, { - "string": "􁝍􁝡􁝵􁞉􁞝􁞱􁟅􁟙􁟭􁠁􁠕􁠩􁠽􁡑􁡥􁡹􁢍􁢡􁢵􁣉􁣝􁣱􁤅􁤙􁤭􁥁􁥕􁥩􁥽􁦑􁦥􁦹􁧍􁧡􁧵􁨉􁨝􁨱􁩅􁩙􁩭􁪁􁪕􁪩􁪽􁫑􁫥􁫹􁬍􁬡􁬵􁭉􁭝􁭱􁮅􁮙􁮭􁯁􁯕􁯩􁯽􁰑􁰥􁰹􁱍􁱡􁱵􁲉􁲝􁲱􁳅􁳙􁳭􁴁􁴕􁴩􁴽􁵑􁵥􁵹􁶍􁶡􁶵􁷉􁷝􁷱􁸅􁸙􁸭􁹁􁹕􁹩􁹽􁺑􁺥􁺹􁻍􁻡􁻵􁼉", - "encodedString": "9IGdjfSBnaH0gZ219IGeifSBnp30gZ6x9IGfhfSBn5n0gZ+t9IGggfSBoJX0gaCp9IGgvfSBoZH0gaGl9IGhufSBoo30gaKh9IGitfSBo4n0gaOd9IGjsfSBpIX0gaSZ9IGkrfSBpYH0gaWV9IGlqfSBpb30gaaR9IGmpfSBprn0gaeN9IGnofSBp7X0gaiJ9IGonfSBqLH0gamF9IGpmfSBqa30gaqB9IGqlfSBqqn0gaq99IGrkfSBq6X0gau59IGsjfSBrKH0gay19IGtifSBrZ30ga2x9IGuhfSBrpn0ga6t9IGvgfSBr5X0ga+p9IGvvfSBsJH0gbCl9IGwufSBsY30gbGh9IGxtfSBson0gbKd9IGysfSBs4X0gbOZ9IGzrfSBtIH0gbSV9IG0qfSBtL30gbWR9IG1pfSBtbn0gbaN9IG2ofSBtrX0gbeJ9IG3nfSBt7H0gbiF9IG4mfSBuK30gbmB9IG5lfSBuan0gbm99IG6kfSBuqX0gbq59IG7jfSBu6H0gbu19IG8iQ==" + "string" : "􁝍􁝡􁝵􁞉􁞝􁞱􁟅􁟙􁟭􁠁􁠕􁠩􁠽􁡑􁡥􁡹􁢍􁢡􁢵􁣉􁣝􁣱􁤅􁤙􁤭􁥁􁥕􁥩􁥽􁦑􁦥􁦹􁧍􁧡􁧵􁨉􁨝􁨱􁩅􁩙􁩭􁪁􁪕􁪩􁪽􁫑􁫥􁫹􁬍􁬡􁬵􁭉􁭝􁭱􁮅􁮙􁮭􁯁􁯕􁯩􁯽􁰑􁰥􁰹􁱍􁱡􁱵􁲉􁲝􁲱􁳅􁳙􁳭􁴁􁴕􁴩􁴽􁵑􁵥􁵹􁶍􁶡􁶵􁷉􁷝􁷱􁸅􁸙􁸭􁹁􁹕􁹩􁹽􁺑􁺥􁺹􁻍􁻡􁻵􁼉", + "encodedString" : "9IGdjfSBnaH0gZ219IGeifSBnp30gZ6x9IGfhfSBn5n0gZ+t9IGggfSBoJX0gaCp9IGgvfSBoZH0gaGl9IGhufSBoo30gaKh9IGitfSBo4n0gaOd9IGjsfSBpIX0gaSZ9IGkrfSBpYH0gaWV9IGlqfSBpb30gaaR9IGmpfSBprn0gaeN9IGnofSBp7X0gaiJ9IGonfSBqLH0gamF9IGpmfSBqa30gaqB9IGqlfSBqqn0gaq99IGrkfSBq6X0gau59IGsjfSBrKH0gay19IGtifSBrZ30ga2x9IGuhfSBrpn0ga6t9IGvgfSBr5X0ga+p9IGvvfSBsJH0gbCl9IGwufSBsY30gbGh9IGxtfSBson0gbKd9IGysfSBs4X0gbOZ9IGzrfSBtIH0gbSV9IG0qfSBtL30gbWR9IG1pfSBtbn0gbaN9IG2ofSBtrX0gbeJ9IG3nfSBt7H0gbiF9IG4mfSBuK30gbmB9IG5lfSBuan0gbm99IG6kfSBuqX0gbq59IG7jfSBu6H0gbu19IG8iQ==" }, { - "string": "􁼝􁼱􁽅􁽙􁽭􁾁􁾕􁾩􁾽􁿑􁿥􁿹􂀍􂀡􂀵􂁉􂁝􂁱􂂅􂂙􂂭􂃁􂃕􂃩􂃽􂄑􂄥􂄹􂅍􂅡􂅵􂆉􂆝􂆱􂇅􂇙􂇭􂈁􂈕􂈩􂈽􂉑􂉥􂉹􂊍􂊡􂊵􂋉􂋝􂋱􂌅􂌙􂌭􂍁􂍕􂍩􂍽􂎑􂎥􂎹􂏍􂏡􂏵􂐉􂐝􂐱􂑅􂑙􂑭􂒁􂒕􂒩􂒽􂓑􂓥􂓹􂔍􂔡􂔵􂕉􂕝􂕱􂖅􂖙􂖭􂗁􂗕􂗩􂗽􂘑􂘥􂘹􂙍􂙡􂙵􂚉􂚝􂚱􂛅􂛙", - "encodedString": "9IG8nfSBvLH0gb2F9IG9mfSBva30gb6B9IG+lfSBvqn0gb699IG/kfSBv6X0gb+59IKAjfSCgKH0goC19IKBifSCgZ30goGx9IKChfSCgpn0goKt9IKDgfSCg5X0goOp9IKDvfSChJH0goSl9IKEufSChY30goWh9IKFtfSChon0goad9IKGsfSCh4X0goeZ9IKHrfSCiIH0goiV9IKIqfSCiL30gomR9IKJpfSCibn0goqN9IKKofSCirX0gouJ9IKLnfSCi7H0goyF9IKMmfSCjK30go2B9IKNlfSCjan0go299IKOkfSCjqX0go659IKPjfSCj6H0go+19IKQifSCkJ30gpCx9IKRhfSCkZn0gpGt9IKSgfSCkpX0gpKp9IKSvfSCk5H0gpOl9IKTufSClI30gpSh9IKUtfSClYn0gpWd9IKVsfSCloX0gpaZ9IKWrfSCl4H0gpeV9IKXqfSCl730gpiR9IKYpfSCmLn0gpmN9IKZofSCmbX0gpqJ9IKanfSCmrH0gpuF9IKbmQ==" + "string" : "􁼝􁼱􁽅􁽙􁽭􁾁􁾕􁾩􁾽􁿑􁿥􁿹􂀍􂀡􂀵􂁉􂁝􂁱􂂅􂂙􂂭􂃁􂃕􂃩􂃽􂄑􂄥􂄹􂅍􂅡􂅵􂆉􂆝􂆱􂇅􂇙􂇭􂈁􂈕􂈩􂈽􂉑􂉥􂉹􂊍􂊡􂊵􂋉􂋝􂋱􂌅􂌙􂌭􂍁􂍕􂍩􂍽􂎑􂎥􂎹􂏍􂏡􂏵􂐉􂐝􂐱􂑅􂑙􂑭􂒁􂒕􂒩􂒽􂓑􂓥􂓹􂔍􂔡􂔵􂕉􂕝􂕱􂖅􂖙􂖭􂗁􂗕􂗩􂗽􂘑􂘥􂘹􂙍􂙡􂙵􂚉􂚝􂚱􂛅􂛙", + "encodedString" : "9IG8nfSBvLH0gb2F9IG9mfSBva30gb6B9IG+lfSBvqn0gb699IG/kfSBv6X0gb+59IKAjfSCgKH0goC19IKBifSCgZ30goGx9IKChfSCgpn0goKt9IKDgfSCg5X0goOp9IKDvfSChJH0goSl9IKEufSChY30goWh9IKFtfSChon0goad9IKGsfSCh4X0goeZ9IKHrfSCiIH0goiV9IKIqfSCiL30gomR9IKJpfSCibn0goqN9IKKofSCirX0gouJ9IKLnfSCi7H0goyF9IKMmfSCjK30go2B9IKNlfSCjan0go299IKOkfSCjqX0go659IKPjfSCj6H0go+19IKQifSCkJ30gpCx9IKRhfSCkZn0gpGt9IKSgfSCkpX0gpKp9IKSvfSCk5H0gpOl9IKTufSClI30gpSh9IKUtfSClYn0gpWd9IKVsfSCloX0gpaZ9IKWrfSCl4H0gpeV9IKXqfSCl730gpiR9IKYpfSCmLn0gpmN9IKZofSCmbX0gpqJ9IKanfSCmrH0gpuF9IKbmQ==" }, { - "string": "􂛭􂜁􂜕􂜩􂜽􂝑􂝥􂝹􂞍􂞡􂞵􂟉􂟝􂟱􂠅􂠙􂠭􂡁􂡕􂡩􂡽􂢑􂢥􂢹􂣍􂣡􂣵􂤉􂤝􂤱􂥅􂥙􂥭􂦁􂦕􂦩􂦽􂧑􂧥􂧹􂨍􂨡􂨵􂩉􂩝􂩱􂪅􂪙􂪭􂫁􂫕􂫩􂫽􂬑􂬥􂬹􂭍􂭡􂭵􂮉􂮝􂮱􂯅􂯙􂯭􂰁􂰕􂰩􂰽􂱑􂱥􂱹􂲍􂲡􂲵􂳉􂳝􂳱􂴅􂴙􂴭􂵁􂵕􂵩􂵽􂶑􂶥􂶹􂷍􂷡􂷵􂸉􂸝􂸱􂹅􂹙􂹭􂺁􂺕􂺩", - "encodedString": "9IKbrfSCnIH0gpyV9IKcqfSCnL30gp2R9IKdpfSCnbn0gp6N9IKeofSCnrX0gp+J9IKfnfSCn7H0gqCF9IKgmfSCoK30gqGB9IKhlfSCoan0gqG99IKikfSCoqX0gqK59IKjjfSCo6H0gqO19IKkifSCpJ30gqSx9IKlhfSCpZn0gqWt9IKmgfSCppX0gqap9IKmvfSCp5H0gqel9IKnufSCqI30gqih9IKotfSCqYn0gqmd9IKpsfSCqoX0gqqZ9IKqrfSCq4H0gquV9IKrqfSCq730gqyR9IKspfSCrLn0gq2N9IKtofSCrbX0gq6J9IKunfSCrrH0gq+F9IKvmfSCr630grCB9IKwlfSCsKn0grC99IKxkfSCsaX0grG59IKyjfSCsqH0grK19IKzifSCs530grOx9IK0hfSCtJn0grSt9IK1gfSCtZX0grWp9IK1vfSCtpH0gral9IK2ufSCt430greh9IK3tfSCuIn0grid9IK4sfSCuYX0grmZ9IK5rfSCuoH0grqV9IK6qQ==" + "string" : "􂛭􂜁􂜕􂜩􂜽􂝑􂝥􂝹􂞍􂞡􂞵􂟉􂟝􂟱􂠅􂠙􂠭􂡁􂡕􂡩􂡽􂢑􂢥􂢹􂣍􂣡􂣵􂤉􂤝􂤱􂥅􂥙􂥭􂦁􂦕􂦩􂦽􂧑􂧥􂧹􂨍􂨡􂨵􂩉􂩝􂩱􂪅􂪙􂪭􂫁􂫕􂫩􂫽􂬑􂬥􂬹􂭍􂭡􂭵􂮉􂮝􂮱􂯅􂯙􂯭􂰁􂰕􂰩􂰽􂱑􂱥􂱹􂲍􂲡􂲵􂳉􂳝􂳱􂴅􂴙􂴭􂵁􂵕􂵩􂵽􂶑􂶥􂶹􂷍􂷡􂷵􂸉􂸝􂸱􂹅􂹙􂹭􂺁􂺕􂺩", + "encodedString" : "9IKbrfSCnIH0gpyV9IKcqfSCnL30gp2R9IKdpfSCnbn0gp6N9IKeofSCnrX0gp+J9IKfnfSCn7H0gqCF9IKgmfSCoK30gqGB9IKhlfSCoan0gqG99IKikfSCoqX0gqK59IKjjfSCo6H0gqO19IKkifSCpJ30gqSx9IKlhfSCpZn0gqWt9IKmgfSCppX0gqap9IKmvfSCp5H0gqel9IKnufSCqI30gqih9IKotfSCqYn0gqmd9IKpsfSCqoX0gqqZ9IKqrfSCq4H0gquV9IKrqfSCq730gqyR9IKspfSCrLn0gq2N9IKtofSCrbX0gq6J9IKunfSCrrH0gq+F9IKvmfSCr630grCB9IKwlfSCsKn0grC99IKxkfSCsaX0grG59IKyjfSCsqH0grK19IKzifSCs530grOx9IK0hfSCtJn0grSt9IK1gfSCtZX0grWp9IK1vfSCtpH0gral9IK2ufSCt430greh9IK3tfSCuIn0grid9IK4sfSCuYX0grmZ9IK5rfSCuoH0grqV9IK6qQ==" }, { - "string": "􂺽􂻑􂻥􂻹􂼍􂼡􂼵􂽉􂽝􂽱􂾅􂾙􂾭􂿁􂿕􂿩􂿽􃀑􃀥􃀹􃁍􃁡􃁵􃂉􃂝􃂱􃃅􃃙􃃭􃄁􃄕􃄩􃄽􃅑􃅥􃅹􃆍􃆡􃆵􃇉􃇝􃇱􃈅􃈙􃈭􃉁􃉕􃉩􃉽􃊑􃊥􃊹􃋍􃋡􃋵􃌉􃌝􃌱􃍅􃍙􃍭􃎁􃎕􃎩􃎽􃏑􃏥􃏹􃐍􃐡􃐵􃑉􃑝􃑱􃒅􃒙􃒭􃓁􃓕􃓩􃓽􃔑􃔥􃔹􃕍􃕡􃕵􃖉􃖝􃖱􃗅􃗙􃗭􃘁􃘕􃘩􃘽􃙑􃙥􃙹", - "encodedString": "9IK6vfSCu5H0grul9IK7ufSCvI30gryh9IK8tfSCvYn0gr2d9IK9sfSCvoX0gr6Z9IK+rfSCv4H0gr+V9IK/qfSCv730g4CR9IOApfSDgLn0g4GN9IOBofSDgbX0g4KJ9IOCnfSDgrH0g4OF9IODmfSDg630g4SB9IOElfSDhKn0g4S99IOFkfSDhaX0g4W59IOGjfSDhqH0g4a19IOHifSDh530g4ex9IOIhfSDiJn0g4it9IOJgfSDiZX0g4mp9IOJvfSDipH0g4ql9IOKufSDi430g4uh9IOLtfSDjIn0g4yd9IOMsfSDjYX0g42Z9IONrfSDjoH0g46V9IOOqfSDjr30g4+R9IOPpfSDj7n0g5CN9IOQofSDkLX0g5GJ9IORnfSDkbH0g5KF9IOSmfSDkq30g5OB9IOTlfSDk6n0g5O99IOUkfSDlKX0g5S59IOVjfSDlaH0g5W19IOWifSDlp30g5ax9IOXhfSDl5n0g5et9IOYgfSDmJX0g5ip9IOYvfSDmZH0g5ml9IOZuQ==" + "string" : "􂺽􂻑􂻥􂻹􂼍􂼡􂼵􂽉􂽝􂽱􂾅􂾙􂾭􂿁􂿕􂿩􂿽􃀑􃀥􃀹􃁍􃁡􃁵􃂉􃂝􃂱􃃅􃃙􃃭􃄁􃄕􃄩􃄽􃅑􃅥􃅹􃆍􃆡􃆵􃇉􃇝􃇱􃈅􃈙􃈭􃉁􃉕􃉩􃉽􃊑􃊥􃊹􃋍􃋡􃋵􃌉􃌝􃌱􃍅􃍙􃍭􃎁􃎕􃎩􃎽􃏑􃏥􃏹􃐍􃐡􃐵􃑉􃑝􃑱􃒅􃒙􃒭􃓁􃓕􃓩􃓽􃔑􃔥􃔹􃕍􃕡􃕵􃖉􃖝􃖱􃗅􃗙􃗭􃘁􃘕􃘩􃘽􃙑􃙥􃙹", + "encodedString" : "9IK6vfSCu5H0grul9IK7ufSCvI30gryh9IK8tfSCvYn0gr2d9IK9sfSCvoX0gr6Z9IK+rfSCv4H0gr+V9IK/qfSCv730g4CR9IOApfSDgLn0g4GN9IOBofSDgbX0g4KJ9IOCnfSDgrH0g4OF9IODmfSDg630g4SB9IOElfSDhKn0g4S99IOFkfSDhaX0g4W59IOGjfSDhqH0g4a19IOHifSDh530g4ex9IOIhfSDiJn0g4it9IOJgfSDiZX0g4mp9IOJvfSDipH0g4ql9IOKufSDi430g4uh9IOLtfSDjIn0g4yd9IOMsfSDjYX0g42Z9IONrfSDjoH0g46V9IOOqfSDjr30g4+R9IOPpfSDj7n0g5CN9IOQofSDkLX0g5GJ9IORnfSDkbH0g5KF9IOSmfSDkq30g5OB9IOTlfSDk6n0g5O99IOUkfSDlKX0g5S59IOVjfSDlaH0g5W19IOWifSDlp30g5ax9IOXhfSDl5n0g5et9IOYgfSDmJX0g5ip9IOYvfSDmZH0g5ml9IOZuQ==" }, { - "string": "􃚍􃚡􃚵􃛉􃛝􃛱􃜅􃜙􃜭􃝁􃝕􃝩􃝽􃞑􃞥􃞹􃟍􃟡􃟵􃠉􃠝􃠱􃡅􃡙􃡭􃢁􃢕􃢩􃢽􃣑􃣥􃣹􃤍􃤡􃤵􃥉􃥝􃥱􃦅􃦙􃦭􃧁􃧕􃧩􃧽􃨑􃨥􃨹􃩍􃩡􃩵􃪉􃪝􃪱􃫅􃫙􃫭􃬁􃬕􃬩􃬽􃭑􃭥􃭹􃮍􃮡􃮵􃯉􃯝􃯱􃰅􃰙􃰭􃱁􃱕􃱩􃱽􃲑􃲥􃲹􃳍􃳡􃳵􃴉􃴝􃴱􃵅􃵙􃵭􃶁􃶕􃶩􃶽􃷑􃷥􃷹􃸍􃸡􃸵􃹉", - "encodedString": "9IOajfSDmqH0g5q19IObifSDm530g5ux9IOchfSDnJn0g5yt9IOdgfSDnZX0g52p9IOdvfSDnpH0g56l9IOeufSDn430g5+h9IOftfSDoIn0g6Cd9IOgsfSDoYX0g6GZ9IOhrfSDooH0g6KV9IOiqfSDor30g6OR9IOjpfSDo7n0g6SN9IOkofSDpLX0g6WJ9IOlnfSDpbH0g6aF9IOmmfSDpq30g6eB9IOnlfSDp6n0g6e99IOokfSDqKX0g6i59IOpjfSDqaH0g6m19IOqifSDqp30g6qx9IOrhfSDq5n0g6ut9IOsgfSDrJX0g6yp9IOsvfSDrZH0g62l9IOtufSDro30g66h9IOutfSDr4n0g6+d9IOvsfSDsIX0g7CZ9IOwrfSDsYH0g7GV9IOxqfSDsb30g7KR9IOypfSDsrn0g7ON9IOzofSDs7X0g7SJ9IO0nfSDtLH0g7WF9IO1mfSDta30g7aB9IO2lfSDtqn0g7a99IO3kfSDt6X0g7e59IO4jfSDuKH0g7i19IO5iQ==" + "string" : "􃚍􃚡􃚵􃛉􃛝􃛱􃜅􃜙􃜭􃝁􃝕􃝩􃝽􃞑􃞥􃞹􃟍􃟡􃟵􃠉􃠝􃠱􃡅􃡙􃡭􃢁􃢕􃢩􃢽􃣑􃣥􃣹􃤍􃤡􃤵􃥉􃥝􃥱􃦅􃦙􃦭􃧁􃧕􃧩􃧽􃨑􃨥􃨹􃩍􃩡􃩵􃪉􃪝􃪱􃫅􃫙􃫭􃬁􃬕􃬩􃬽􃭑􃭥􃭹􃮍􃮡􃮵􃯉􃯝􃯱􃰅􃰙􃰭􃱁􃱕􃱩􃱽􃲑􃲥􃲹􃳍􃳡􃳵􃴉􃴝􃴱􃵅􃵙􃵭􃶁􃶕􃶩􃶽􃷑􃷥􃷹􃸍􃸡􃸵􃹉", + "encodedString" : "9IOajfSDmqH0g5q19IObifSDm530g5ux9IOchfSDnJn0g5yt9IOdgfSDnZX0g52p9IOdvfSDnpH0g56l9IOeufSDn430g5+h9IOftfSDoIn0g6Cd9IOgsfSDoYX0g6GZ9IOhrfSDooH0g6KV9IOiqfSDor30g6OR9IOjpfSDo7n0g6SN9IOkofSDpLX0g6WJ9IOlnfSDpbH0g6aF9IOmmfSDpq30g6eB9IOnlfSDp6n0g6e99IOokfSDqKX0g6i59IOpjfSDqaH0g6m19IOqifSDqp30g6qx9IOrhfSDq5n0g6ut9IOsgfSDrJX0g6yp9IOsvfSDrZH0g62l9IOtufSDro30g66h9IOutfSDr4n0g6+d9IOvsfSDsIX0g7CZ9IOwrfSDsYH0g7GV9IOxqfSDsb30g7KR9IOypfSDsrn0g7ON9IOzofSDs7X0g7SJ9IO0nfSDtLH0g7WF9IO1mfSDta30g7aB9IO2lfSDtqn0g7a99IO3kfSDt6X0g7e59IO4jfSDuKH0g7i19IO5iQ==" }, { - "string": "􃹝􃹱􃺅􃺙􃺭􃻁􃻕􃻩􃻽􃼑􃼥􃼹􃽍􃽡􃽵􃾉􃾝􃾱􃿅􃿙􃿭􄀁􄀕􄀩􄀽􄁑􄁥􄁹􄂍􄂡􄂵􄃉􄃝􄃱􄄅􄄙􄄭􄅁􄅕􄅩􄅽􄆑􄆥􄆹􄇍􄇡􄇵􄈉􄈝􄈱􄉅􄉙􄉭􄊁􄊕􄊩􄊽􄋑􄋥􄋹􄌍􄌡􄌵􄍉􄍝􄍱􄎅􄎙􄎭􄏁􄏕􄏩􄏽􄐑􄐥􄐹􄑍􄑡􄑵􄒉􄒝􄒱􄓅􄓙􄓭􄔁􄔕􄔩􄔽􄕑􄕥􄕹􄖍􄖡􄖵􄗉􄗝􄗱􄘅􄘙", - "encodedString": "9IO5nfSDubH0g7qF9IO6mfSDuq30g7uB9IO7lfSDu6n0g7u99IO8kfSDvKX0g7y59IO9jfSDvaH0g7219IO+ifSDvp30g76x9IO/hfSDv5n0g7+t9ISAgfSEgJX0hICp9ISAvfSEgZH0hIGl9ISBufSEgo30hIKh9ISCtfSEg4n0hIOd9ISDsfSEhIX0hISZ9ISErfSEhYH0hIWV9ISFqfSEhb30hIaR9ISGpfSEhrn0hIeN9ISHofSEh7X0hIiJ9ISInfSEiLH0hImF9ISJmfSEia30hIqB9ISKlfSEiqn0hIq99ISLkfSEi6X0hIu59ISMjfSEjKH0hIy19ISNifSEjZ30hI2x9ISOhfSEjpn0hI6t9ISPgfSEj5X0hI+p9ISPvfSEkJH0hJCl9ISQufSEkY30hJGh9ISRtfSEkon0hJKd9ISSsfSEk4X0hJOZ9ISTrfSElIH0hJSV9ISUqfSElL30hJWR9ISVpfSElbn0hJaN9ISWofSElrX0hJeJ9ISXnfSEl7H0hJiF9ISYmQ==" + "string" : "􃹝􃹱􃺅􃺙􃺭􃻁􃻕􃻩􃻽􃼑􃼥􃼹􃽍􃽡􃽵􃾉􃾝􃾱􃿅􃿙􃿭􄀁􄀕􄀩􄀽􄁑􄁥􄁹􄂍􄂡􄂵􄃉􄃝􄃱􄄅􄄙􄄭􄅁􄅕􄅩􄅽􄆑􄆥􄆹􄇍􄇡􄇵􄈉􄈝􄈱􄉅􄉙􄉭􄊁􄊕􄊩􄊽􄋑􄋥􄋹􄌍􄌡􄌵􄍉􄍝􄍱􄎅􄎙􄎭􄏁􄏕􄏩􄏽􄐑􄐥􄐹􄑍􄑡􄑵􄒉􄒝􄒱􄓅􄓙􄓭􄔁􄔕􄔩􄔽􄕑􄕥􄕹􄖍􄖡􄖵􄗉􄗝􄗱􄘅􄘙", + "encodedString" : "9IO5nfSDubH0g7qF9IO6mfSDuq30g7uB9IO7lfSDu6n0g7u99IO8kfSDvKX0g7y59IO9jfSDvaH0g7219IO+ifSDvp30g76x9IO/hfSDv5n0g7+t9ISAgfSEgJX0hICp9ISAvfSEgZH0hIGl9ISBufSEgo30hIKh9ISCtfSEg4n0hIOd9ISDsfSEhIX0hISZ9ISErfSEhYH0hIWV9ISFqfSEhb30hIaR9ISGpfSEhrn0hIeN9ISHofSEh7X0hIiJ9ISInfSEiLH0hImF9ISJmfSEia30hIqB9ISKlfSEiqn0hIq99ISLkfSEi6X0hIu59ISMjfSEjKH0hIy19ISNifSEjZ30hI2x9ISOhfSEjpn0hI6t9ISPgfSEj5X0hI+p9ISPvfSEkJH0hJCl9ISQufSEkY30hJGh9ISRtfSEkon0hJKd9ISSsfSEk4X0hJOZ9ISTrfSElIH0hJSV9ISUqfSElL30hJWR9ISVpfSElbn0hJaN9ISWofSElrX0hJeJ9ISXnfSEl7H0hJiF9ISYmQ==" }, { - "string": "􄘭􄙁􄙕􄙩􄙽􄚑􄚥􄚹􄛍􄛡􄛵􄜉􄜝􄜱􄝅􄝙􄝭􄞁􄞕􄞩􄞽􄟑􄟥􄟹􄠍􄠡􄠵􄡉􄡝􄡱􄢅􄢙􄢭􄣁􄣕􄣩􄣽􄤑􄤥􄤹􄥍􄥡􄥵􄦉􄦝􄦱􄧅􄧙􄧭􄨁􄨕􄨩􄨽􄩑􄩥􄩹􄪍􄪡􄪵􄫉􄫝􄫱􄬅􄬙􄬭􄭁􄭕􄭩􄭽􄮑􄮥􄮹􄯍􄯡􄯵􄰉􄰝􄰱􄱅􄱙􄱭􄲁􄲕􄲩􄲽􄳑􄳥􄳹􄴍􄴡􄴵􄵉􄵝􄵱􄶅􄶙􄶭􄷁􄷕􄷩", - "encodedString": "9ISYrfSEmYH0hJmV9ISZqfSEmb30hJqR9ISapfSEmrn0hJuN9ISbofSEm7X0hJyJ9IScnfSEnLH0hJ2F9ISdmfSEna30hJ6B9ISelfSEnqn0hJ699ISfkfSEn6X0hJ+59ISgjfSEoKH0hKC19IShifSEoZ30hKGx9ISihfSEopn0hKKt9ISjgfSEo5X0hKOp9ISjvfSEpJH0hKSl9ISkufSEpY30hKWh9ISltfSEpon0hKad9ISmsfSEp4X0hKeZ9ISnrfSEqIH0hKiV9ISoqfSEqL30hKmR9ISppfSEqbn0hKqN9ISqofSEqrX0hKuJ9ISrnfSEq7H0hKyF9ISsmfSErK30hK2B9IStlfSEran0hK299ISukfSErqX0hK659ISvjfSEr6H0hK+19ISwifSEsJ30hLCx9ISxhfSEsZn0hLGt9ISygfSEspX0hLKp9ISyvfSEs5H0hLOl9ISzufSEtI30hLSh9IS0tfSEtYn0hLWd9IS1sfSEtoX0hLaZ9IS2rfSEt4H0hLeV9IS3qQ==" + "string" : "􄘭􄙁􄙕􄙩􄙽􄚑􄚥􄚹􄛍􄛡􄛵􄜉􄜝􄜱􄝅􄝙􄝭􄞁􄞕􄞩􄞽􄟑􄟥􄟹􄠍􄠡􄠵􄡉􄡝􄡱􄢅􄢙􄢭􄣁􄣕􄣩􄣽􄤑􄤥􄤹􄥍􄥡􄥵􄦉􄦝􄦱􄧅􄧙􄧭􄨁􄨕􄨩􄨽􄩑􄩥􄩹􄪍􄪡􄪵􄫉􄫝􄫱􄬅􄬙􄬭􄭁􄭕􄭩􄭽􄮑􄮥􄮹􄯍􄯡􄯵􄰉􄰝􄰱􄱅􄱙􄱭􄲁􄲕􄲩􄲽􄳑􄳥􄳹􄴍􄴡􄴵􄵉􄵝􄵱􄶅􄶙􄶭􄷁􄷕􄷩", + "encodedString" : "9ISYrfSEmYH0hJmV9ISZqfSEmb30hJqR9ISapfSEmrn0hJuN9ISbofSEm7X0hJyJ9IScnfSEnLH0hJ2F9ISdmfSEna30hJ6B9ISelfSEnqn0hJ699ISfkfSEn6X0hJ+59ISgjfSEoKH0hKC19IShifSEoZ30hKGx9ISihfSEopn0hKKt9ISjgfSEo5X0hKOp9ISjvfSEpJH0hKSl9ISkufSEpY30hKWh9ISltfSEpon0hKad9ISmsfSEp4X0hKeZ9ISnrfSEqIH0hKiV9ISoqfSEqL30hKmR9ISppfSEqbn0hKqN9ISqofSEqrX0hKuJ9ISrnfSEq7H0hKyF9ISsmfSErK30hK2B9IStlfSEran0hK299ISukfSErqX0hK659ISvjfSEr6H0hK+19ISwifSEsJ30hLCx9ISxhfSEsZn0hLGt9ISygfSEspX0hLKp9ISyvfSEs5H0hLOl9ISzufSEtI30hLSh9IS0tfSEtYn0hLWd9IS1sfSEtoX0hLaZ9IS2rfSEt4H0hLeV9IS3qQ==" }, { - "string": "􄷽􄸑􄸥􄸹􄹍􄹡􄹵􄺉􄺝􄺱􄻅􄻙􄻭􄼁􄼕􄼩􄼽􄽑􄽥􄽹􄾍􄾡􄾵􄿉􄿝􄿱􅀅􅀙􅀭􅁁􅁕􅁩􅁽􅂑􅂥􅂹􅃍􅃡􅃵􅄉􅄝􅄱􅅅􅅙􅅭􅆁􅆕􅆩􅆽􅇑􅇥􅇹􅈍􅈡􅈵􅉉􅉝􅉱􅊅􅊙􅊭􅋁􅋕􅋩􅋽􅌑􅌥􅌹􅍍􅍡􅍵􅎉􅎝􅎱􅏅􅏙􅏭􅐁􅐕􅐩􅐽􅑑􅑥􅑹􅒍􅒡􅒵􅓉􅓝􅓱􅔅􅔙􅔭􅕁􅕕􅕩􅕽􅖑􅖥􅖹", - "encodedString": "9IS3vfSEuJH0hLil9IS4ufSEuY30hLmh9IS5tfSEuon0hLqd9IS6sfSEu4X0hLuZ9IS7rfSEvIH0hLyV9IS8qfSEvL30hL2R9IS9pfSEvbn0hL6N9IS+ofSEvrX0hL+J9IS/nfSEv7H0hYCF9IWAmfSFgK30hYGB9IWBlfSFgan0hYG99IWCkfSFgqX0hYK59IWDjfSFg6H0hYO19IWEifSFhJ30hYSx9IWFhfSFhZn0hYWt9IWGgfSFhpX0hYap9IWGvfSFh5H0hYel9IWHufSFiI30hYih9IWItfSFiYn0hYmd9IWJsfSFioX0hYqZ9IWKrfSFi4H0hYuV9IWLqfSFi730hYyR9IWMpfSFjLn0hY2N9IWNofSFjbX0hY6J9IWOnfSFjrH0hY+F9IWPmfSFj630hZCB9IWQlfSFkKn0hZC99IWRkfSFkaX0hZG59IWSjfSFkqH0hZK19IWTifSFk530hZOx9IWUhfSFlJn0hZSt9IWVgfSFlZX0hZWp9IWVvfSFlpH0hZal9IWWuQ==" + "string" : "􄷽􄸑􄸥􄸹􄹍􄹡􄹵􄺉􄺝􄺱􄻅􄻙􄻭􄼁􄼕􄼩􄼽􄽑􄽥􄽹􄾍􄾡􄾵􄿉􄿝􄿱􅀅􅀙􅀭􅁁􅁕􅁩􅁽􅂑􅂥􅂹􅃍􅃡􅃵􅄉􅄝􅄱􅅅􅅙􅅭􅆁􅆕􅆩􅆽􅇑􅇥􅇹􅈍􅈡􅈵􅉉􅉝􅉱􅊅􅊙􅊭􅋁􅋕􅋩􅋽􅌑􅌥􅌹􅍍􅍡􅍵􅎉􅎝􅎱􅏅􅏙􅏭􅐁􅐕􅐩􅐽􅑑􅑥􅑹􅒍􅒡􅒵􅓉􅓝􅓱􅔅􅔙􅔭􅕁􅕕􅕩􅕽􅖑􅖥􅖹", + "encodedString" : "9IS3vfSEuJH0hLil9IS4ufSEuY30hLmh9IS5tfSEuon0hLqd9IS6sfSEu4X0hLuZ9IS7rfSEvIH0hLyV9IS8qfSEvL30hL2R9IS9pfSEvbn0hL6N9IS+ofSEvrX0hL+J9IS/nfSEv7H0hYCF9IWAmfSFgK30hYGB9IWBlfSFgan0hYG99IWCkfSFgqX0hYK59IWDjfSFg6H0hYO19IWEifSFhJ30hYSx9IWFhfSFhZn0hYWt9IWGgfSFhpX0hYap9IWGvfSFh5H0hYel9IWHufSFiI30hYih9IWItfSFiYn0hYmd9IWJsfSFioX0hYqZ9IWKrfSFi4H0hYuV9IWLqfSFi730hYyR9IWMpfSFjLn0hY2N9IWNofSFjbX0hY6J9IWOnfSFjrH0hY+F9IWPmfSFj630hZCB9IWQlfSFkKn0hZC99IWRkfSFkaX0hZG59IWSjfSFkqH0hZK19IWTifSFk530hZOx9IWUhfSFlJn0hZSt9IWVgfSFlZX0hZWp9IWVvfSFlpH0hZal9IWWuQ==" }, { - "string": "􅗍􅗡􅗵􅘉􅘝􅘱􅙅􅙙􅙭􅚁􅚕􅚩􅚽􅛑􅛥􅛹􅜍􅜡􅜵􅝉􅝝􅝱􅞅􅞙􅞭􅟁􅟕􅟩􅟽􅠑􅠥􅠹􅡍􅡡􅡵􅢉􅢝􅢱􅣅􅣙􅣭􅤁􅤕􅤩􅤽􅥑􅥥􅥹􅦍􅦡􅦵􅧉􅧝􅧱􅨅􅨙􅨭􅩁􅩕􅩩􅩽􅪑􅪥􅪹􅫍􅫡􅫵􅬉􅬝􅬱􅭅􅭙􅭭􅮁􅮕􅮩􅮽􅯑􅯥􅯹􅰍􅰡􅰵􅱉􅱝􅱱􅲅􅲙􅲭􅳁􅳕􅳩􅳽􅴑􅴥􅴹􅵍􅵡􅵵􅶉", - "encodedString": "9IWXjfSFl6H0hZe19IWYifSFmJ30hZix9IWZhfSFmZn0hZmt9IWagfSFmpX0hZqp9IWavfSFm5H0hZul9IWbufSFnI30hZyh9IWctfSFnYn0hZ2d9IWdsfSFnoX0hZ6Z9IWerfSFn4H0hZ+V9IWfqfSFn730haCR9IWgpfSFoLn0haGN9IWhofSFobX0haKJ9IWinfSForH0haOF9IWjmfSFo630haSB9IWklfSFpKn0haS99IWlkfSFpaX0haW59IWmjfSFpqH0haa19IWnifSFp530haex9IWohfSFqJn0hait9IWpgfSFqZX0hamp9IWpvfSFqpH0haql9IWqufSFq430hauh9IWrtfSFrIn0hayd9IWssfSFrYX0ha2Z9IWtrfSFroH0ha6V9IWuqfSFrr30ha+R9IWvpfSFr7n0hbCN9IWwofSFsLX0hbGJ9IWxnfSFsbH0hbKF9IWymfSFsq30hbOB9IWzlfSFs6n0hbO99IW0kfSFtKX0hbS59IW1jfSFtaH0hbW19IW2iQ==" + "string" : "􅗍􅗡􅗵􅘉􅘝􅘱􅙅􅙙􅙭􅚁􅚕􅚩􅚽􅛑􅛥􅛹􅜍􅜡􅜵􅝉􅝝􅝱􅞅􅞙􅞭􅟁􅟕􅟩􅟽􅠑􅠥􅠹􅡍􅡡􅡵􅢉􅢝􅢱􅣅􅣙􅣭􅤁􅤕􅤩􅤽􅥑􅥥􅥹􅦍􅦡􅦵􅧉􅧝􅧱􅨅􅨙􅨭􅩁􅩕􅩩􅩽􅪑􅪥􅪹􅫍􅫡􅫵􅬉􅬝􅬱􅭅􅭙􅭭􅮁􅮕􅮩􅮽􅯑􅯥􅯹􅰍􅰡􅰵􅱉􅱝􅱱􅲅􅲙􅲭􅳁􅳕􅳩􅳽􅴑􅴥􅴹􅵍􅵡􅵵􅶉", + "encodedString" : "9IWXjfSFl6H0hZe19IWYifSFmJ30hZix9IWZhfSFmZn0hZmt9IWagfSFmpX0hZqp9IWavfSFm5H0hZul9IWbufSFnI30hZyh9IWctfSFnYn0hZ2d9IWdsfSFnoX0hZ6Z9IWerfSFn4H0hZ+V9IWfqfSFn730haCR9IWgpfSFoLn0haGN9IWhofSFobX0haKJ9IWinfSForH0haOF9IWjmfSFo630haSB9IWklfSFpKn0haS99IWlkfSFpaX0haW59IWmjfSFpqH0haa19IWnifSFp530haex9IWohfSFqJn0hait9IWpgfSFqZX0hamp9IWpvfSFqpH0haql9IWqufSFq430hauh9IWrtfSFrIn0hayd9IWssfSFrYX0ha2Z9IWtrfSFroH0ha6V9IWuqfSFrr30ha+R9IWvpfSFr7n0hbCN9IWwofSFsLX0hbGJ9IWxnfSFsbH0hbKF9IWymfSFsq30hbOB9IWzlfSFs6n0hbO99IW0kfSFtKX0hbS59IW1jfSFtaH0hbW19IW2iQ==" }, { - "string": "􅶝􅶱􅷅􅷙􅷭􅸁􅸕􅸩􅸽􅹑􅹥􅹹􅺍􅺡􅺵􅻉􅻝􅻱􅼅􅼙􅼭􅽁􅽕􅽩􅽽􅾑􅾥􅾹􅿍􅿡􅿵􆀉􆀝􆀱􆁅􆁙􆁭􆂁􆂕􆂩􆂽􆃑􆃥􆃹􆄍􆄡􆄵􆅉􆅝􆅱􆆅􆆙􆆭􆇁􆇕􆇩􆇽􆈑􆈥􆈹􆉍􆉡􆉵􆊉􆊝􆊱􆋅􆋙􆋭􆌁􆌕􆌩􆌽􆍑􆍥􆍹􆎍􆎡􆎵􆏉􆏝􆏱􆐅􆐙􆐭􆑁􆑕􆑩􆑽􆒑􆒥􆒹􆓍􆓡􆓵􆔉􆔝􆔱􆕅􆕙", - "encodedString": "9IW2nfSFtrH0hbeF9IW3mfSFt630hbiB9IW4lfSFuKn0hbi99IW5kfSFuaX0hbm59IW6jfSFuqH0hbq19IW7ifSFu530hbux9IW8hfSFvJn0hbyt9IW9gfSFvZX0hb2p9IW9vfSFvpH0hb6l9IW+ufSFv430hb+h9IW/tfSGgIn0hoCd9IaAsfSGgYX0hoGZ9IaBrfSGgoH0hoKV9IaCqfSGgr30hoOR9IaDpfSGg7n0hoSN9IaEofSGhLX0hoWJ9IaFnfSGhbH0hoaF9IaGmfSGhq30hoeB9IaHlfSGh6n0hoe99IaIkfSGiKX0hoi59IaJjfSGiaH0hom19IaKifSGip30hoqx9IaLhfSGi5n0hout9IaMgfSGjJX0hoyp9IaMvfSGjZH0ho2l9IaNufSGjo30ho6h9IaOtfSGj4n0ho+d9IaPsfSGkIX0hpCZ9IaQrfSGkYH0hpGV9IaRqfSGkb30hpKR9IaSpfSGkrn0hpON9IaTofSGk7X0hpSJ9IaUnfSGlLH0hpWF9IaVmQ==" + "string" : "􅶝􅶱􅷅􅷙􅷭􅸁􅸕􅸩􅸽􅹑􅹥􅹹􅺍􅺡􅺵􅻉􅻝􅻱􅼅􅼙􅼭􅽁􅽕􅽩􅽽􅾑􅾥􅾹􅿍􅿡􅿵􆀉􆀝􆀱􆁅􆁙􆁭􆂁􆂕􆂩􆂽􆃑􆃥􆃹􆄍􆄡􆄵􆅉􆅝􆅱􆆅􆆙􆆭􆇁􆇕􆇩􆇽􆈑􆈥􆈹􆉍􆉡􆉵􆊉􆊝􆊱􆋅􆋙􆋭􆌁􆌕􆌩􆌽􆍑􆍥􆍹􆎍􆎡􆎵􆏉􆏝􆏱􆐅􆐙􆐭􆑁􆑕􆑩􆑽􆒑􆒥􆒹􆓍􆓡􆓵􆔉􆔝􆔱􆕅􆕙", + "encodedString" : "9IW2nfSFtrH0hbeF9IW3mfSFt630hbiB9IW4lfSFuKn0hbi99IW5kfSFuaX0hbm59IW6jfSFuqH0hbq19IW7ifSFu530hbux9IW8hfSFvJn0hbyt9IW9gfSFvZX0hb2p9IW9vfSFvpH0hb6l9IW+ufSFv430hb+h9IW/tfSGgIn0hoCd9IaAsfSGgYX0hoGZ9IaBrfSGgoH0hoKV9IaCqfSGgr30hoOR9IaDpfSGg7n0hoSN9IaEofSGhLX0hoWJ9IaFnfSGhbH0hoaF9IaGmfSGhq30hoeB9IaHlfSGh6n0hoe99IaIkfSGiKX0hoi59IaJjfSGiaH0hom19IaKifSGip30hoqx9IaLhfSGi5n0hout9IaMgfSGjJX0hoyp9IaMvfSGjZH0ho2l9IaNufSGjo30ho6h9IaOtfSGj4n0ho+d9IaPsfSGkIX0hpCZ9IaQrfSGkYH0hpGV9IaRqfSGkb30hpKR9IaSpfSGkrn0hpON9IaTofSGk7X0hpSJ9IaUnfSGlLH0hpWF9IaVmQ==" }, { - "string": "􆕭􆖁􆖕􆖩􆖽􆗑􆗥􆗹􆘍􆘡􆘵􆙉􆙝􆙱􆚅􆚙􆚭􆛁􆛕􆛩􆛽􆜑􆜥􆜹􆝍􆝡􆝵􆞉􆞝􆞱􆟅􆟙􆟭􆠁􆠕􆠩􆠽􆡑􆡥􆡹􆢍􆢡􆢵􆣉􆣝􆣱􆤅􆤙􆤭􆥁􆥕􆥩􆥽􆦑􆦥􆦹􆧍􆧡􆧵􆨉􆨝􆨱􆩅􆩙􆩭􆪁􆪕􆪩􆪽􆫑􆫥􆫹􆬍􆬡􆬵􆭉􆭝􆭱􆮅􆮙􆮭􆯁􆯕􆯩􆯽􆰑􆰥􆰹􆱍􆱡􆱵􆲉􆲝􆲱􆳅􆳙􆳭􆴁􆴕􆴩", - "encodedString": "9IaVrfSGloH0hpaV9IaWqfSGlr30hpeR9IaXpfSGl7n0hpiN9IaYofSGmLX0hpmJ9IaZnfSGmbH0hpqF9IaamfSGmq30hpuB9IablfSGm6n0hpu99IackfSGnKX0hpy59IadjfSGnaH0hp219IaeifSGnp30hp6x9IafhfSGn5n0hp+t9IaggfSGoJX0hqCp9IagvfSGoZH0hqGl9IahufSGoo30hqKh9IaitfSGo4n0hqOd9IajsfSGpIX0hqSZ9IakrfSGpYH0hqWV9IalqfSGpb30hqaR9IampfSGprn0hqeN9IanofSGp7X0hqiJ9IaonfSGqLH0hqmF9IapmfSGqa30hqqB9IaqlfSGqqn0hqq99IarkfSGq6X0hqu59IasjfSGrKH0hqy19IatifSGrZ30hq2x9IauhfSGrpn0hq6t9IavgfSGr5X0hq+p9IavvfSGsJH0hrCl9IawufSGsY30hrGh9IaxtfSGson0hrKd9IaysfSGs4X0hrOZ9IazrfSGtIH0hrSV9Ia0qQ==" + "string" : "􆕭􆖁􆖕􆖩􆖽􆗑􆗥􆗹􆘍􆘡􆘵􆙉􆙝􆙱􆚅􆚙􆚭􆛁􆛕􆛩􆛽􆜑􆜥􆜹􆝍􆝡􆝵􆞉􆞝􆞱􆟅􆟙􆟭􆠁􆠕􆠩􆠽􆡑􆡥􆡹􆢍􆢡􆢵􆣉􆣝􆣱􆤅􆤙􆤭􆥁􆥕􆥩􆥽􆦑􆦥􆦹􆧍􆧡􆧵􆨉􆨝􆨱􆩅􆩙􆩭􆪁􆪕􆪩􆪽􆫑􆫥􆫹􆬍􆬡􆬵􆭉􆭝􆭱􆮅􆮙􆮭􆯁􆯕􆯩􆯽􆰑􆰥􆰹􆱍􆱡􆱵􆲉􆲝􆲱􆳅􆳙􆳭􆴁􆴕􆴩", + "encodedString" : "9IaVrfSGloH0hpaV9IaWqfSGlr30hpeR9IaXpfSGl7n0hpiN9IaYofSGmLX0hpmJ9IaZnfSGmbH0hpqF9IaamfSGmq30hpuB9IablfSGm6n0hpu99IackfSGnKX0hpy59IadjfSGnaH0hp219IaeifSGnp30hp6x9IafhfSGn5n0hp+t9IaggfSGoJX0hqCp9IagvfSGoZH0hqGl9IahufSGoo30hqKh9IaitfSGo4n0hqOd9IajsfSGpIX0hqSZ9IakrfSGpYH0hqWV9IalqfSGpb30hqaR9IampfSGprn0hqeN9IanofSGp7X0hqiJ9IaonfSGqLH0hqmF9IapmfSGqa30hqqB9IaqlfSGqqn0hqq99IarkfSGq6X0hqu59IasjfSGrKH0hqy19IatifSGrZ30hq2x9IauhfSGrpn0hq6t9IavgfSGr5X0hq+p9IavvfSGsJH0hrCl9IawufSGsY30hrGh9IaxtfSGson0hrKd9IaysfSGs4X0hrOZ9IazrfSGtIH0hrSV9Ia0qQ==" }, { - "string": "􆴽􆵑􆵥􆵹􆶍􆶡􆶵􆷉􆷝􆷱􆸅􆸙􆸭􆹁􆹕􆹩􆹽􆺑􆺥􆺹􆻍􆻡􆻵􆼉􆼝􆼱􆽅􆽙􆽭􆾁􆾕􆾩􆾽􆿑􆿥􆿹􇀍􇀡􇀵􇁉􇁝􇁱􇂅􇂙􇂭􇃁􇃕􇃩􇃽􇄑􇄥􇄹􇅍􇅡􇅵􇆉􇆝􇆱􇇅􇇙􇇭􇈁􇈕􇈩􇈽􇉑􇉥􇉹􇊍􇊡􇊵􇋉􇋝􇋱􇌅􇌙􇌭􇍁􇍕􇍩􇍽􇎑􇎥􇎹􇏍􇏡􇏵􇐉􇐝􇐱􇑅􇑙􇑭􇒁􇒕􇒩􇒽􇓑􇓥􇓹", - "encodedString": "9Ia0vfSGtZH0hrWl9Ia1ufSGto30hrah9Ia2tfSGt4n0hred9Ia3sfSGuIX0hriZ9Ia4rfSGuYH0hrmV9Ia5qfSGub30hrqR9Ia6pfSGurn0hruN9Ia7ofSGu7X0hryJ9Ia8nfSGvLH0hr2F9Ia9mfSGva30hr6B9Ia+lfSGvqn0hr699Ia/kfSGv6X0hr+59IeAjfSHgKH0h4C19IeBifSHgZ30h4Gx9IeChfSHgpn0h4Kt9IeDgfSHg5X0h4Op9IeDvfSHhJH0h4Sl9IeEufSHhY30h4Wh9IeFtfSHhon0h4ad9IeGsfSHh4X0h4eZ9IeHrfSHiIH0h4iV9IeIqfSHiL30h4mR9IeJpfSHibn0h4qN9IeKofSHirX0h4uJ9IeLnfSHi7H0h4yF9IeMmfSHjK30h42B9IeNlfSHjan0h4299IeOkfSHjqX0h4659IePjfSHj6H0h4+19IeQifSHkJ30h5Cx9IeRhfSHkZn0h5Gt9IeSgfSHkpX0h5Kp9IeSvfSHk5H0h5Ol9IeTuQ==" + "string" : "􆴽􆵑􆵥􆵹􆶍􆶡􆶵􆷉􆷝􆷱􆸅􆸙􆸭􆹁􆹕􆹩􆹽􆺑􆺥􆺹􆻍􆻡􆻵􆼉􆼝􆼱􆽅􆽙􆽭􆾁􆾕􆾩􆾽􆿑􆿥􆿹􇀍􇀡􇀵􇁉􇁝􇁱􇂅􇂙􇂭􇃁􇃕􇃩􇃽􇄑􇄥􇄹􇅍􇅡􇅵􇆉􇆝􇆱􇇅􇇙􇇭􇈁􇈕􇈩􇈽􇉑􇉥􇉹􇊍􇊡􇊵􇋉􇋝􇋱􇌅􇌙􇌭􇍁􇍕􇍩􇍽􇎑􇎥􇎹􇏍􇏡􇏵􇐉􇐝􇐱􇑅􇑙􇑭􇒁􇒕􇒩􇒽􇓑􇓥􇓹", + "encodedString" : "9Ia0vfSGtZH0hrWl9Ia1ufSGto30hrah9Ia2tfSGt4n0hred9Ia3sfSGuIX0hriZ9Ia4rfSGuYH0hrmV9Ia5qfSGub30hrqR9Ia6pfSGurn0hruN9Ia7ofSGu7X0hryJ9Ia8nfSGvLH0hr2F9Ia9mfSGva30hr6B9Ia+lfSGvqn0hr699Ia/kfSGv6X0hr+59IeAjfSHgKH0h4C19IeBifSHgZ30h4Gx9IeChfSHgpn0h4Kt9IeDgfSHg5X0h4Op9IeDvfSHhJH0h4Sl9IeEufSHhY30h4Wh9IeFtfSHhon0h4ad9IeGsfSHh4X0h4eZ9IeHrfSHiIH0h4iV9IeIqfSHiL30h4mR9IeJpfSHibn0h4qN9IeKofSHirX0h4uJ9IeLnfSHi7H0h4yF9IeMmfSHjK30h42B9IeNlfSHjan0h4299IeOkfSHjqX0h4659IePjfSHj6H0h4+19IeQifSHkJ30h5Cx9IeRhfSHkZn0h5Gt9IeSgfSHkpX0h5Kp9IeSvfSHk5H0h5Ol9IeTuQ==" }, { - "string": "􇔍􇔡􇔵􇕉􇕝􇕱􇖅􇖙􇖭􇗁􇗕􇗩􇗽􇘑􇘥􇘹􇙍􇙡􇙵􇚉􇚝􇚱􇛅􇛙􇛭􇜁􇜕􇜩􇜽􇝑􇝥􇝹􇞍􇞡􇞵􇟉􇟝􇟱􇠅􇠙􇠭􇡁􇡕􇡩􇡽􇢑􇢥􇢹􇣍􇣡􇣵􇤉􇤝􇤱􇥅􇥙􇥭􇦁􇦕􇦩􇦽􇧑􇧥􇧹􇨍􇨡􇨵􇩉􇩝􇩱􇪅􇪙􇪭􇫁􇫕􇫩􇫽􇬑􇬥􇬹􇭍􇭡􇭵􇮉􇮝􇮱􇯅􇯙􇯭􇰁􇰕􇰩􇰽􇱑􇱥􇱹􇲍􇲡􇲵􇳉", - "encodedString": "9IeUjfSHlKH0h5S19IeVifSHlZ30h5Wx9IeWhfSHlpn0h5at9IeXgfSHl5X0h5ep9IeXvfSHmJH0h5il9IeYufSHmY30h5mh9IeZtfSHmon0h5qd9IeasfSHm4X0h5uZ9IebrfSHnIH0h5yV9IecqfSHnL30h52R9IedpfSHnbn0h56N9IeeofSHnrX0h5+J9IefnfSHn7H0h6CF9IegmfSHoK30h6GB9IehlfSHoan0h6G99IeikfSHoqX0h6K59IejjfSHo6H0h6O19IekifSHpJ30h6Sx9IelhfSHpZn0h6Wt9IemgfSHppX0h6ap9IemvfSHp5H0h6el9IenufSHqI30h6ih9IeotfSHqYn0h6md9IepsfSHqoX0h6qZ9IeqrfSHq4H0h6uV9IerqfSHq730h6yR9IespfSHrLn0h62N9IetofSHrbX0h66J9IeunfSHrrH0h6+F9IevmfSHr630h7CB9IewlfSHsKn0h7C99IexkfSHsaX0h7G59IeyjfSHsqH0h7K19IeziQ==" + "string" : "􇔍􇔡􇔵􇕉􇕝􇕱􇖅􇖙􇖭􇗁􇗕􇗩􇗽􇘑􇘥􇘹􇙍􇙡􇙵􇚉􇚝􇚱􇛅􇛙􇛭􇜁􇜕􇜩􇜽􇝑􇝥􇝹􇞍􇞡􇞵􇟉􇟝􇟱􇠅􇠙􇠭􇡁􇡕􇡩􇡽􇢑􇢥􇢹􇣍􇣡􇣵􇤉􇤝􇤱􇥅􇥙􇥭􇦁􇦕􇦩􇦽􇧑􇧥􇧹􇨍􇨡􇨵􇩉􇩝􇩱􇪅􇪙􇪭􇫁􇫕􇫩􇫽􇬑􇬥􇬹􇭍􇭡􇭵􇮉􇮝􇮱􇯅􇯙􇯭􇰁􇰕􇰩􇰽􇱑􇱥􇱹􇲍􇲡􇲵􇳉", + "encodedString" : "9IeUjfSHlKH0h5S19IeVifSHlZ30h5Wx9IeWhfSHlpn0h5at9IeXgfSHl5X0h5ep9IeXvfSHmJH0h5il9IeYufSHmY30h5mh9IeZtfSHmon0h5qd9IeasfSHm4X0h5uZ9IebrfSHnIH0h5yV9IecqfSHnL30h52R9IedpfSHnbn0h56N9IeeofSHnrX0h5+J9IefnfSHn7H0h6CF9IegmfSHoK30h6GB9IehlfSHoan0h6G99IeikfSHoqX0h6K59IejjfSHo6H0h6O19IekifSHpJ30h6Sx9IelhfSHpZn0h6Wt9IemgfSHppX0h6ap9IemvfSHp5H0h6el9IenufSHqI30h6ih9IeotfSHqYn0h6md9IepsfSHqoX0h6qZ9IeqrfSHq4H0h6uV9IerqfSHq730h6yR9IespfSHrLn0h62N9IetofSHrbX0h66J9IeunfSHrrH0h6+F9IevmfSHr630h7CB9IewlfSHsKn0h7C99IexkfSHsaX0h7G59IeyjfSHsqH0h7K19IeziQ==" }, { - "string": "􇳝􇳱􇴅􇴙􇴭􇵁􇵕􇵩􇵽􇶑􇶥􇶹􇷍􇷡􇷵􇸉􇸝􇸱􇹅􇹙􇹭􇺁􇺕􇺩􇺽􇻑􇻥􇻹􇼍􇼡􇼵􇽉􇽝􇽱􇾅􇾙􇾭􇿁􇿕􇿩􇿽􈀑􈀥􈀹􈁍􈁡􈁵􈂉􈂝􈂱􈃅􈃙􈃭􈄁􈄕􈄩􈄽􈅑􈅥􈅹􈆍􈆡􈆵􈇉􈇝􈇱􈈅􈈙􈈭􈉁􈉕􈉩􈉽􈊑􈊥􈊹􈋍􈋡􈋵􈌉􈌝􈌱􈍅􈍙􈍭􈎁􈎕􈎩􈎽􈏑􈏥􈏹􈐍􈐡􈐵􈑉􈑝􈑱􈒅􈒙", - "encodedString": "9IeznfSHs7H0h7SF9Ie0mfSHtK30h7WB9Ie1lfSHtan0h7W99Ie2kfSHtqX0h7a59Ie3jfSHt6H0h7e19Ie4ifSHuJ30h7ix9Ie5hfSHuZn0h7mt9Ie6gfSHupX0h7qp9Ie6vfSHu5H0h7ul9Ie7ufSHvI30h7yh9Ie8tfSHvYn0h72d9Ie9sfSHvoX0h76Z9Ie+rfSHv4H0h7+V9Ie/qfSHv730iICR9IiApfSIgLn0iIGN9IiBofSIgbX0iIKJ9IiCnfSIgrH0iIOF9IiDmfSIg630iISB9IiElfSIhKn0iIS99IiFkfSIhaX0iIW59IiGjfSIhqH0iIa19IiHifSIh530iIex9IiIhfSIiJn0iIit9IiJgfSIiZX0iImp9IiJvfSIipH0iIql9IiKufSIi430iIuh9IiLtfSIjIn0iIyd9IiMsfSIjYX0iI2Z9IiNrfSIjoH0iI6V9IiOqfSIjr30iI+R9IiPpfSIj7n0iJCN9IiQofSIkLX0iJGJ9IiRnfSIkbH0iJKF9IiSmQ==" + "string" : "􇳝􇳱􇴅􇴙􇴭􇵁􇵕􇵩􇵽􇶑􇶥􇶹􇷍􇷡􇷵􇸉􇸝􇸱􇹅􇹙􇹭􇺁􇺕􇺩􇺽􇻑􇻥􇻹􇼍􇼡􇼵􇽉􇽝􇽱􇾅􇾙􇾭􇿁􇿕􇿩􇿽􈀑􈀥􈀹􈁍􈁡􈁵􈂉􈂝􈂱􈃅􈃙􈃭􈄁􈄕􈄩􈄽􈅑􈅥􈅹􈆍􈆡􈆵􈇉􈇝􈇱􈈅􈈙􈈭􈉁􈉕􈉩􈉽􈊑􈊥􈊹􈋍􈋡􈋵􈌉􈌝􈌱􈍅􈍙􈍭􈎁􈎕􈎩􈎽􈏑􈏥􈏹􈐍􈐡􈐵􈑉􈑝􈑱􈒅􈒙", + "encodedString" : "9IeznfSHs7H0h7SF9Ie0mfSHtK30h7WB9Ie1lfSHtan0h7W99Ie2kfSHtqX0h7a59Ie3jfSHt6H0h7e19Ie4ifSHuJ30h7ix9Ie5hfSHuZn0h7mt9Ie6gfSHupX0h7qp9Ie6vfSHu5H0h7ul9Ie7ufSHvI30h7yh9Ie8tfSHvYn0h72d9Ie9sfSHvoX0h76Z9Ie+rfSHv4H0h7+V9Ie/qfSHv730iICR9IiApfSIgLn0iIGN9IiBofSIgbX0iIKJ9IiCnfSIgrH0iIOF9IiDmfSIg630iISB9IiElfSIhKn0iIS99IiFkfSIhaX0iIW59IiGjfSIhqH0iIa19IiHifSIh530iIex9IiIhfSIiJn0iIit9IiJgfSIiZX0iImp9IiJvfSIipH0iIql9IiKufSIi430iIuh9IiLtfSIjIn0iIyd9IiMsfSIjYX0iI2Z9IiNrfSIjoH0iI6V9IiOqfSIjr30iI+R9IiPpfSIj7n0iJCN9IiQofSIkLX0iJGJ9IiRnfSIkbH0iJKF9IiSmQ==" }, { - "string": "􈒭􈓁􈓕􈓩􈓽􈔑􈔥􈔹􈕍􈕡􈕵􈖉􈖝􈖱􈗅􈗙􈗭􈘁􈘕􈘩􈘽􈙑􈙥􈙹􈚍􈚡􈚵􈛉􈛝􈛱􈜅􈜙􈜭􈝁􈝕􈝩􈝽􈞑􈞥􈞹􈟍􈟡􈟵􈠉􈠝􈠱􈡅􈡙􈡭􈢁􈢕􈢩􈢽􈣑􈣥􈣹􈤍􈤡􈤵􈥉􈥝􈥱􈦅􈦙􈦭􈧁􈧕􈧩􈧽􈨑􈨥􈨹􈩍􈩡􈩵􈪉􈪝􈪱􈫅􈫙􈫭􈬁􈬕􈬩􈬽􈭑􈭥􈭹􈮍􈮡􈮵􈯉􈯝􈯱􈰅􈰙􈰭􈱁􈱕􈱩", - "encodedString": "9IiSrfSIk4H0iJOV9IiTqfSIk730iJSR9IiUpfSIlLn0iJWN9IiVofSIlbX0iJaJ9IiWnfSIlrH0iJeF9IiXmfSIl630iJiB9IiYlfSImKn0iJi99IiZkfSImaX0iJm59IiajfSImqH0iJq19IibifSIm530iJux9IichfSInJn0iJyt9IidgfSInZX0iJ2p9IidvfSInpH0iJ6l9IieufSIn430iJ+h9IiftfSIoIn0iKCd9IigsfSIoYX0iKGZ9IihrfSIooH0iKKV9IiiqfSIor30iKOR9IijpfSIo7n0iKSN9IikofSIpLX0iKWJ9IilnfSIpbH0iKaF9IimmfSIpq30iKeB9IinlfSIp6n0iKe99IiokfSIqKX0iKi59IipjfSIqaH0iKm19IiqifSIqp30iKqx9IirhfSIq5n0iKut9IisgfSIrJX0iKyp9IisvfSIrZH0iK2l9IitufSIro30iK6h9IiutfSIr4n0iK+d9IivsfSIsIX0iLCZ9IiwrfSIsYH0iLGV9IixqQ==" + "string" : "􈒭􈓁􈓕􈓩􈓽􈔑􈔥􈔹􈕍􈕡􈕵􈖉􈖝􈖱􈗅􈗙􈗭􈘁􈘕􈘩􈘽􈙑􈙥􈙹􈚍􈚡􈚵􈛉􈛝􈛱􈜅􈜙􈜭􈝁􈝕􈝩􈝽􈞑􈞥􈞹􈟍􈟡􈟵􈠉􈠝􈠱􈡅􈡙􈡭􈢁􈢕􈢩􈢽􈣑􈣥􈣹􈤍􈤡􈤵􈥉􈥝􈥱􈦅􈦙􈦭􈧁􈧕􈧩􈧽􈨑􈨥􈨹􈩍􈩡􈩵􈪉􈪝􈪱􈫅􈫙􈫭􈬁􈬕􈬩􈬽􈭑􈭥􈭹􈮍􈮡􈮵􈯉􈯝􈯱􈰅􈰙􈰭􈱁􈱕􈱩", + "encodedString" : "9IiSrfSIk4H0iJOV9IiTqfSIk730iJSR9IiUpfSIlLn0iJWN9IiVofSIlbX0iJaJ9IiWnfSIlrH0iJeF9IiXmfSIl630iJiB9IiYlfSImKn0iJi99IiZkfSImaX0iJm59IiajfSImqH0iJq19IibifSIm530iJux9IichfSInJn0iJyt9IidgfSInZX0iJ2p9IidvfSInpH0iJ6l9IieufSIn430iJ+h9IiftfSIoIn0iKCd9IigsfSIoYX0iKGZ9IihrfSIooH0iKKV9IiiqfSIor30iKOR9IijpfSIo7n0iKSN9IikofSIpLX0iKWJ9IilnfSIpbH0iKaF9IimmfSIpq30iKeB9IinlfSIp6n0iKe99IiokfSIqKX0iKi59IipjfSIqaH0iKm19IiqifSIqp30iKqx9IirhfSIq5n0iKut9IisgfSIrJX0iKyp9IisvfSIrZH0iK2l9IitufSIro30iK6h9IiutfSIr4n0iK+d9IivsfSIsIX0iLCZ9IiwrfSIsYH0iLGV9IixqQ==" }, { - "string": "􈱽􈲑􈲥􈲹􈳍􈳡􈳵􈴉􈴝􈴱􈵅􈵙􈵭􈶁􈶕􈶩􈶽􈷑􈷥􈷹􈸍􈸡􈸵􈹉􈹝􈹱􈺅􈺙􈺭􈻁􈻕􈻩􈻽􈼑􈼥􈼹􈽍􈽡􈽵􈾉􈾝􈾱􈿅􈿙􈿭􉀁􉀕􉀩􉀽􉁑􉁥􉁹􉂍􉂡􉂵􉃉􉃝􉃱􉄅􉄙􉄭􉅁􉅕􉅩􉅽􉆑􉆥􉆹􉇍􉇡􉇵􉈉􉈝􉈱􉉅􉉙􉉭􉊁􉊕􉊩􉊽􉋑􉋥􉋹􉌍􉌡􉌵􉍉􉍝􉍱􉎅􉎙􉎭􉏁􉏕􉏩􉏽􉐑􉐥􉐹", - "encodedString": "9IixvfSIspH0iLKl9IiyufSIs430iLOh9IiztfSItIn0iLSd9Ii0sfSItYX0iLWZ9Ii1rfSItoH0iLaV9Ii2qfSItr30iLeR9Ii3pfSIt7n0iLiN9Ii4ofSIuLX0iLmJ9Ii5nfSIubH0iLqF9Ii6mfSIuq30iLuB9Ii7lfSIu6n0iLu99Ii8kfSIvKX0iLy59Ii9jfSIvaH0iL219Ii+ifSIvp30iL6x9Ii/hfSIv5n0iL+t9ImAgfSJgJX0iYCp9ImAvfSJgZH0iYGl9ImBufSJgo30iYKh9ImCtfSJg4n0iYOd9ImDsfSJhIX0iYSZ9ImErfSJhYH0iYWV9ImFqfSJhb30iYaR9ImGpfSJhrn0iYeN9ImHofSJh7X0iYiJ9ImInfSJiLH0iYmF9ImJmfSJia30iYqB9ImKlfSJiqn0iYq99ImLkfSJi6X0iYu59ImMjfSJjKH0iYy19ImNifSJjZ30iY2x9ImOhfSJjpn0iY6t9ImPgfSJj5X0iY+p9ImPvfSJkJH0iZCl9ImQuQ==" + "string" : "􈱽􈲑􈲥􈲹􈳍􈳡􈳵􈴉􈴝􈴱􈵅􈵙􈵭􈶁􈶕􈶩􈶽􈷑􈷥􈷹􈸍􈸡􈸵􈹉􈹝􈹱􈺅􈺙􈺭􈻁􈻕􈻩􈻽􈼑􈼥􈼹􈽍􈽡􈽵􈾉􈾝􈾱􈿅􈿙􈿭􉀁􉀕􉀩􉀽􉁑􉁥􉁹􉂍􉂡􉂵􉃉􉃝􉃱􉄅􉄙􉄭􉅁􉅕􉅩􉅽􉆑􉆥􉆹􉇍􉇡􉇵􉈉􉈝􉈱􉉅􉉙􉉭􉊁􉊕􉊩􉊽􉋑􉋥􉋹􉌍􉌡􉌵􉍉􉍝􉍱􉎅􉎙􉎭􉏁􉏕􉏩􉏽􉐑􉐥􉐹", + "encodedString" : "9IixvfSIspH0iLKl9IiyufSIs430iLOh9IiztfSItIn0iLSd9Ii0sfSItYX0iLWZ9Ii1rfSItoH0iLaV9Ii2qfSItr30iLeR9Ii3pfSIt7n0iLiN9Ii4ofSIuLX0iLmJ9Ii5nfSIubH0iLqF9Ii6mfSIuq30iLuB9Ii7lfSIu6n0iLu99Ii8kfSIvKX0iLy59Ii9jfSIvaH0iL219Ii+ifSIvp30iL6x9Ii/hfSIv5n0iL+t9ImAgfSJgJX0iYCp9ImAvfSJgZH0iYGl9ImBufSJgo30iYKh9ImCtfSJg4n0iYOd9ImDsfSJhIX0iYSZ9ImErfSJhYH0iYWV9ImFqfSJhb30iYaR9ImGpfSJhrn0iYeN9ImHofSJh7X0iYiJ9ImInfSJiLH0iYmF9ImJmfSJia30iYqB9ImKlfSJiqn0iYq99ImLkfSJi6X0iYu59ImMjfSJjKH0iYy19ImNifSJjZ30iY2x9ImOhfSJjpn0iY6t9ImPgfSJj5X0iY+p9ImPvfSJkJH0iZCl9ImQuQ==" }, { - "string": "􉑍􉑡􉑵􉒉􉒝􉒱􉓅􉓙􉓭􉔁􉔕􉔩􉔽􉕑􉕥􉕹􉖍􉖡􉖵􉗉􉗝􉗱􉘅􉘙􉘭􉙁􉙕􉙩􉙽􉚑􉚥􉚹􉛍􉛡􉛵􉜉􉜝􉜱􉝅􉝙􉝭􉞁􉞕􉞩􉞽􉟑􉟥􉟹􉠍􉠡􉠵􉡉􉡝􉡱􉢅􉢙􉢭􉣁􉣕􉣩􉣽􉤑􉤥􉤹􉥍􉥡􉥵􉦉􉦝􉦱􉧅􉧙􉧭􉨁􉨕􉨩􉨽􉩑􉩥􉩹􉪍􉪡􉪵􉫉􉫝􉫱􉬅􉬙􉬭􉭁􉭕􉭩􉭽􉮑􉮥􉮹􉯍􉯡􉯵􉰉", - "encodedString": "9ImRjfSJkaH0iZG19ImSifSJkp30iZKx9ImThfSJk5n0iZOt9ImUgfSJlJX0iZSp9ImUvfSJlZH0iZWl9ImVufSJlo30iZah9ImWtfSJl4n0iZed9ImXsfSJmIX0iZiZ9ImYrfSJmYH0iZmV9ImZqfSJmb30iZqR9ImapfSJmrn0iZuN9ImbofSJm7X0iZyJ9ImcnfSJnLH0iZ2F9ImdmfSJna30iZ6B9ImelfSJnqn0iZ699ImfkfSJn6X0iZ+59ImgjfSJoKH0iaC19ImhifSJoZ30iaGx9ImihfSJopn0iaKt9ImjgfSJo5X0iaOp9ImjvfSJpJH0iaSl9ImkufSJpY30iaWh9ImltfSJpon0iaad9ImmsfSJp4X0iaeZ9ImnrfSJqIH0iaiV9ImoqfSJqL30iamR9ImppfSJqbn0iaqN9ImqofSJqrX0iauJ9ImrnfSJq7H0iayF9ImsmfSJrK30ia2B9ImtlfSJran0ia299ImukfSJrqX0ia659ImvjfSJr6H0ia+19ImwiQ==" + "string" : "􉑍􉑡􉑵􉒉􉒝􉒱􉓅􉓙􉓭􉔁􉔕􉔩􉔽􉕑􉕥􉕹􉖍􉖡􉖵􉗉􉗝􉗱􉘅􉘙􉘭􉙁􉙕􉙩􉙽􉚑􉚥􉚹􉛍􉛡􉛵􉜉􉜝􉜱􉝅􉝙􉝭􉞁􉞕􉞩􉞽􉟑􉟥􉟹􉠍􉠡􉠵􉡉􉡝􉡱􉢅􉢙􉢭􉣁􉣕􉣩􉣽􉤑􉤥􉤹􉥍􉥡􉥵􉦉􉦝􉦱􉧅􉧙􉧭􉨁􉨕􉨩􉨽􉩑􉩥􉩹􉪍􉪡􉪵􉫉􉫝􉫱􉬅􉬙􉬭􉭁􉭕􉭩􉭽􉮑􉮥􉮹􉯍􉯡􉯵􉰉", + "encodedString" : "9ImRjfSJkaH0iZG19ImSifSJkp30iZKx9ImThfSJk5n0iZOt9ImUgfSJlJX0iZSp9ImUvfSJlZH0iZWl9ImVufSJlo30iZah9ImWtfSJl4n0iZed9ImXsfSJmIX0iZiZ9ImYrfSJmYH0iZmV9ImZqfSJmb30iZqR9ImapfSJmrn0iZuN9ImbofSJm7X0iZyJ9ImcnfSJnLH0iZ2F9ImdmfSJna30iZ6B9ImelfSJnqn0iZ699ImfkfSJn6X0iZ+59ImgjfSJoKH0iaC19ImhifSJoZ30iaGx9ImihfSJopn0iaKt9ImjgfSJo5X0iaOp9ImjvfSJpJH0iaSl9ImkufSJpY30iaWh9ImltfSJpon0iaad9ImmsfSJp4X0iaeZ9ImnrfSJqIH0iaiV9ImoqfSJqL30iamR9ImppfSJqbn0iaqN9ImqofSJqrX0iauJ9ImrnfSJq7H0iayF9ImsmfSJrK30ia2B9ImtlfSJran0ia299ImukfSJrqX0ia659ImvjfSJr6H0ia+19ImwiQ==" }, { - "string": "􉰝􉰱􉱅􉱙􉱭􉲁􉲕􉲩􉲽􉳑􉳥􉳹􉴍􉴡􉴵􉵉􉵝􉵱􉶅􉶙􉶭􉷁􉷕􉷩􉷽􉸑􉸥􉸹􉹍􉹡􉹵􉺉􉺝􉺱􉻅􉻙􉻭􉼁􉼕􉼩􉼽􉽑􉽥􉽹􉾍􉾡􉾵􉿉􉿝􉿱􊀅􊀙􊀭􊁁􊁕􊁩􊁽􊂑􊂥􊂹􊃍􊃡􊃵􊄉􊄝􊄱􊅅􊅙􊅭􊆁􊆕􊆩􊆽􊇑􊇥􊇹􊈍􊈡􊈵􊉉􊉝􊉱􊊅􊊙􊊭􊋁􊋕􊋩􊋽􊌑􊌥􊌹􊍍􊍡􊍵􊎉􊎝􊎱􊏅􊏙", - "encodedString": "9ImwnfSJsLH0ibGF9ImxmfSJsa30ibKB9ImylfSJsqn0ibK99ImzkfSJs6X0ibO59Im0jfSJtKH0ibS19Im1ifSJtZ30ibWx9Im2hfSJtpn0ibat9Im3gfSJt5X0ibep9Im3vfSJuJH0ibil9Im4ufSJuY30ibmh9Im5tfSJuon0ibqd9Im6sfSJu4X0ibuZ9Im7rfSJvIH0ibyV9Im8qfSJvL30ib2R9Im9pfSJvbn0ib6N9Im+ofSJvrX0ib+J9Im/nfSJv7H0ioCF9IqAmfSKgK30ioGB9IqBlfSKgan0ioG99IqCkfSKgqX0ioK59IqDjfSKg6H0ioO19IqEifSKhJ30ioSx9IqFhfSKhZn0ioWt9IqGgfSKhpX0ioap9IqGvfSKh5H0ioel9IqHufSKiI30ioih9IqItfSKiYn0iomd9IqJsfSKioX0ioqZ9IqKrfSKi4H0iouV9IqLqfSKi730ioyR9IqMpfSKjLn0io2N9IqNofSKjbX0io6J9IqOnfSKjrH0io+F9IqPmQ==" + "string" : "􉰝􉰱􉱅􉱙􉱭􉲁􉲕􉲩􉲽􉳑􉳥􉳹􉴍􉴡􉴵􉵉􉵝􉵱􉶅􉶙􉶭􉷁􉷕􉷩􉷽􉸑􉸥􉸹􉹍􉹡􉹵􉺉􉺝􉺱􉻅􉻙􉻭􉼁􉼕􉼩􉼽􉽑􉽥􉽹􉾍􉾡􉾵􉿉􉿝􉿱􊀅􊀙􊀭􊁁􊁕􊁩􊁽􊂑􊂥􊂹􊃍􊃡􊃵􊄉􊄝􊄱􊅅􊅙􊅭􊆁􊆕􊆩􊆽􊇑􊇥􊇹􊈍􊈡􊈵􊉉􊉝􊉱􊊅􊊙􊊭􊋁􊋕􊋩􊋽􊌑􊌥􊌹􊍍􊍡􊍵􊎉􊎝􊎱􊏅􊏙", + "encodedString" : "9ImwnfSJsLH0ibGF9ImxmfSJsa30ibKB9ImylfSJsqn0ibK99ImzkfSJs6X0ibO59Im0jfSJtKH0ibS19Im1ifSJtZ30ibWx9Im2hfSJtpn0ibat9Im3gfSJt5X0ibep9Im3vfSJuJH0ibil9Im4ufSJuY30ibmh9Im5tfSJuon0ibqd9Im6sfSJu4X0ibuZ9Im7rfSJvIH0ibyV9Im8qfSJvL30ib2R9Im9pfSJvbn0ib6N9Im+ofSJvrX0ib+J9Im/nfSJv7H0ioCF9IqAmfSKgK30ioGB9IqBlfSKgan0ioG99IqCkfSKgqX0ioK59IqDjfSKg6H0ioO19IqEifSKhJ30ioSx9IqFhfSKhZn0ioWt9IqGgfSKhpX0ioap9IqGvfSKh5H0ioel9IqHufSKiI30ioih9IqItfSKiYn0iomd9IqJsfSKioX0ioqZ9IqKrfSKi4H0iouV9IqLqfSKi730ioyR9IqMpfSKjLn0io2N9IqNofSKjbX0io6J9IqOnfSKjrH0io+F9IqPmQ==" }, { - "string": "􊏭􊐁􊐕􊐩􊐽􊑑􊑥􊑹􊒍􊒡􊒵􊓉􊓝􊓱􊔅􊔙􊔭􊕁􊕕􊕩􊕽􊖑􊖥􊖹􊗍􊗡􊗵􊘉􊘝􊘱􊙅􊙙􊙭􊚁􊚕􊚩􊚽􊛑􊛥􊛹􊜍􊜡􊜵􊝉􊝝􊝱􊞅􊞙􊞭􊟁􊟕􊟩􊟽􊠑􊠥􊠹􊡍􊡡􊡵􊢉􊢝􊢱􊣅􊣙􊣭􊤁􊤕􊤩􊤽􊥑􊥥􊥹􊦍􊦡􊦵􊧉􊧝􊧱􊨅􊨙􊨭􊩁􊩕􊩩􊩽􊪑􊪥􊪹􊫍􊫡􊫵􊬉􊬝􊬱􊭅􊭙􊭭􊮁􊮕􊮩", - "encodedString": "9IqPrfSKkIH0ipCV9IqQqfSKkL30ipGR9IqRpfSKkbn0ipKN9IqSofSKkrX0ipOJ9IqTnfSKk7H0ipSF9IqUmfSKlK30ipWB9IqVlfSKlan0ipW99IqWkfSKlqX0ipa59IqXjfSKl6H0ipe19IqYifSKmJ30ipix9IqZhfSKmZn0ipmt9IqagfSKmpX0ipqp9IqavfSKm5H0ipul9IqbufSKnI30ipyh9IqctfSKnYn0ip2d9IqdsfSKnoX0ip6Z9IqerfSKn4H0ip+V9IqfqfSKn730iqCR9IqgpfSKoLn0iqGN9IqhofSKobX0iqKJ9IqinfSKorH0iqOF9IqjmfSKo630iqSB9IqklfSKpKn0iqS99IqlkfSKpaX0iqW59IqmjfSKpqH0iqa19IqnifSKp530iqex9IqohfSKqJn0iqit9IqpgfSKqZX0iqmp9IqpvfSKqpH0iqql9IqqufSKq430iquh9IqrtfSKrIn0iqyd9IqssfSKrYX0iq2Z9IqtrfSKroH0iq6V9IquqQ==" + "string" : "􊏭􊐁􊐕􊐩􊐽􊑑􊑥􊑹􊒍􊒡􊒵􊓉􊓝􊓱􊔅􊔙􊔭􊕁􊕕􊕩􊕽􊖑􊖥􊖹􊗍􊗡􊗵􊘉􊘝􊘱􊙅􊙙􊙭􊚁􊚕􊚩􊚽􊛑􊛥􊛹􊜍􊜡􊜵􊝉􊝝􊝱􊞅􊞙􊞭􊟁􊟕􊟩􊟽􊠑􊠥􊠹􊡍􊡡􊡵􊢉􊢝􊢱􊣅􊣙􊣭􊤁􊤕􊤩􊤽􊥑􊥥􊥹􊦍􊦡􊦵􊧉􊧝􊧱􊨅􊨙􊨭􊩁􊩕􊩩􊩽􊪑􊪥􊪹􊫍􊫡􊫵􊬉􊬝􊬱􊭅􊭙􊭭􊮁􊮕􊮩", + "encodedString" : "9IqPrfSKkIH0ipCV9IqQqfSKkL30ipGR9IqRpfSKkbn0ipKN9IqSofSKkrX0ipOJ9IqTnfSKk7H0ipSF9IqUmfSKlK30ipWB9IqVlfSKlan0ipW99IqWkfSKlqX0ipa59IqXjfSKl6H0ipe19IqYifSKmJ30ipix9IqZhfSKmZn0ipmt9IqagfSKmpX0ipqp9IqavfSKm5H0ipul9IqbufSKnI30ipyh9IqctfSKnYn0ip2d9IqdsfSKnoX0ip6Z9IqerfSKn4H0ip+V9IqfqfSKn730iqCR9IqgpfSKoLn0iqGN9IqhofSKobX0iqKJ9IqinfSKorH0iqOF9IqjmfSKo630iqSB9IqklfSKpKn0iqS99IqlkfSKpaX0iqW59IqmjfSKpqH0iqa19IqnifSKp530iqex9IqohfSKqJn0iqit9IqpgfSKqZX0iqmp9IqpvfSKqpH0iqql9IqqufSKq430iquh9IqrtfSKrIn0iqyd9IqssfSKrYX0iq2Z9IqtrfSKroH0iq6V9IquqQ==" }, { - "string": "􊮽􊯑􊯥􊯹􊰍􊰡􊰵􊱉􊱝􊱱􊲅􊲙􊲭􊳁􊳕􊳩􊳽􊴑􊴥􊴹􊵍􊵡􊵵􊶉􊶝􊶱􊷅􊷙􊷭􊸁􊸕􊸩􊸽􊹑􊹥􊹹􊺍􊺡􊺵􊻉􊻝􊻱􊼅􊼙􊼭􊽁􊽕􊽩􊽽􊾑􊾥􊾹􊿍􊿡􊿵􋀉􋀝􋀱􋁅􋁙􋁭􋂁􋂕􋂩􋂽􋃑􋃥􋃹􋄍􋄡􋄵􋅉􋅝􋅱􋆅􋆙􋆭􋇁􋇕􋇩􋇽􋈑􋈥􋈹􋉍􋉡􋉵􋊉􋊝􋊱􋋅􋋙􋋭􋌁􋌕􋌩􋌽􋍑􋍥􋍹", - "encodedString": "9IquvfSKr5H0iq+l9IqvufSKsI30irCh9IqwtfSKsYn0irGd9IqxsfSKsoX0irKZ9IqyrfSKs4H0irOV9IqzqfSKs730irSR9Iq0pfSKtLn0irWN9Iq1ofSKtbX0iraJ9Iq2nfSKtrH0ireF9Iq3mfSKt630iriB9Iq4lfSKuKn0iri99Iq5kfSKuaX0irm59Iq6jfSKuqH0irq19Iq7ifSKu530irux9Iq8hfSKvJn0iryt9Iq9gfSKvZX0ir2p9Iq9vfSKvpH0ir6l9Iq+ufSKv430ir+h9Iq/tfSLgIn0i4Cd9IuAsfSLgYX0i4GZ9IuBrfSLgoH0i4KV9IuCqfSLgr30i4OR9IuDpfSLg7n0i4SN9IuEofSLhLX0i4WJ9IuFnfSLhbH0i4aF9IuGmfSLhq30i4eB9IuHlfSLh6n0i4e99IuIkfSLiKX0i4i59IuJjfSLiaH0i4m19IuKifSLip30i4qx9IuLhfSLi5n0i4ut9IuMgfSLjJX0i4yp9IuMvfSLjZH0i42l9IuNuQ==" + "string" : "􊮽􊯑􊯥􊯹􊰍􊰡􊰵􊱉􊱝􊱱􊲅􊲙􊲭􊳁􊳕􊳩􊳽􊴑􊴥􊴹􊵍􊵡􊵵􊶉􊶝􊶱􊷅􊷙􊷭􊸁􊸕􊸩􊸽􊹑􊹥􊹹􊺍􊺡􊺵􊻉􊻝􊻱􊼅􊼙􊼭􊽁􊽕􊽩􊽽􊾑􊾥􊾹􊿍􊿡􊿵􋀉􋀝􋀱􋁅􋁙􋁭􋂁􋂕􋂩􋂽􋃑􋃥􋃹􋄍􋄡􋄵􋅉􋅝􋅱􋆅􋆙􋆭􋇁􋇕􋇩􋇽􋈑􋈥􋈹􋉍􋉡􋉵􋊉􋊝􋊱􋋅􋋙􋋭􋌁􋌕􋌩􋌽􋍑􋍥􋍹", + "encodedString" : "9IquvfSKr5H0iq+l9IqvufSKsI30irCh9IqwtfSKsYn0irGd9IqxsfSKsoX0irKZ9IqyrfSKs4H0irOV9IqzqfSKs730irSR9Iq0pfSKtLn0irWN9Iq1ofSKtbX0iraJ9Iq2nfSKtrH0ireF9Iq3mfSKt630iriB9Iq4lfSKuKn0iri99Iq5kfSKuaX0irm59Iq6jfSKuqH0irq19Iq7ifSKu530irux9Iq8hfSKvJn0iryt9Iq9gfSKvZX0ir2p9Iq9vfSKvpH0ir6l9Iq+ufSKv430ir+h9Iq/tfSLgIn0i4Cd9IuAsfSLgYX0i4GZ9IuBrfSLgoH0i4KV9IuCqfSLgr30i4OR9IuDpfSLg7n0i4SN9IuEofSLhLX0i4WJ9IuFnfSLhbH0i4aF9IuGmfSLhq30i4eB9IuHlfSLh6n0i4e99IuIkfSLiKX0i4i59IuJjfSLiaH0i4m19IuKifSLip30i4qx9IuLhfSLi5n0i4ut9IuMgfSLjJX0i4yp9IuMvfSLjZH0i42l9IuNuQ==" }, { - "string": "􋎍􋎡􋎵􋏉􋏝􋏱􋐅􋐙􋐭􋑁􋑕􋑩􋑽􋒑􋒥􋒹􋓍􋓡􋓵􋔉􋔝􋔱􋕅􋕙􋕭􋖁􋖕􋖩􋖽􋗑􋗥􋗹􋘍􋘡􋘵􋙉􋙝􋙱􋚅􋚙􋚭􋛁􋛕􋛩􋛽􋜑􋜥􋜹􋝍􋝡􋝵􋞉􋞝􋞱􋟅􋟙􋟭􋠁􋠕􋠩􋠽􋡑􋡥􋡹􋢍􋢡􋢵􋣉􋣝􋣱􋤅􋤙􋤭􋥁􋥕􋥩􋥽􋦑􋦥􋦹􋧍􋧡􋧵􋨉􋨝􋨱􋩅􋩙􋩭􋪁􋪕􋪩􋪽􋫑􋫥􋫹􋬍􋬡􋬵􋭉", - "encodedString": "9IuOjfSLjqH0i4619IuPifSLj530i4+x9IuQhfSLkJn0i5Ct9IuRgfSLkZX0i5Gp9IuRvfSLkpH0i5Kl9IuSufSLk430i5Oh9IuTtfSLlIn0i5Sd9IuUsfSLlYX0i5WZ9IuVrfSLloH0i5aV9IuWqfSLlr30i5eR9IuXpfSLl7n0i5iN9IuYofSLmLX0i5mJ9IuZnfSLmbH0i5qF9IuamfSLmq30i5uB9IublfSLm6n0i5u99IuckfSLnKX0i5y59IudjfSLnaH0i5219IueifSLnp30i56x9IufhfSLn5n0i5+t9IuggfSLoJX0i6Cp9IugvfSLoZH0i6Gl9IuhufSLoo30i6Kh9IuitfSLo4n0i6Od9IujsfSLpIX0i6SZ9IukrfSLpYH0i6WV9IulqfSLpb30i6aR9IumpfSLprn0i6eN9IunofSLp7X0i6iJ9IuonfSLqLH0i6mF9IupmfSLqa30i6qB9IuqlfSLqqn0i6q99IurkfSLq6X0i6u59IusjfSLrKH0i6y19IutiQ==" + "string" : "􋎍􋎡􋎵􋏉􋏝􋏱􋐅􋐙􋐭􋑁􋑕􋑩􋑽􋒑􋒥􋒹􋓍􋓡􋓵􋔉􋔝􋔱􋕅􋕙􋕭􋖁􋖕􋖩􋖽􋗑􋗥􋗹􋘍􋘡􋘵􋙉􋙝􋙱􋚅􋚙􋚭􋛁􋛕􋛩􋛽􋜑􋜥􋜹􋝍􋝡􋝵􋞉􋞝􋞱􋟅􋟙􋟭􋠁􋠕􋠩􋠽􋡑􋡥􋡹􋢍􋢡􋢵􋣉􋣝􋣱􋤅􋤙􋤭􋥁􋥕􋥩􋥽􋦑􋦥􋦹􋧍􋧡􋧵􋨉􋨝􋨱􋩅􋩙􋩭􋪁􋪕􋪩􋪽􋫑􋫥􋫹􋬍􋬡􋬵􋭉", + "encodedString" : "9IuOjfSLjqH0i4619IuPifSLj530i4+x9IuQhfSLkJn0i5Ct9IuRgfSLkZX0i5Gp9IuRvfSLkpH0i5Kl9IuSufSLk430i5Oh9IuTtfSLlIn0i5Sd9IuUsfSLlYX0i5WZ9IuVrfSLloH0i5aV9IuWqfSLlr30i5eR9IuXpfSLl7n0i5iN9IuYofSLmLX0i5mJ9IuZnfSLmbH0i5qF9IuamfSLmq30i5uB9IublfSLm6n0i5u99IuckfSLnKX0i5y59IudjfSLnaH0i5219IueifSLnp30i56x9IufhfSLn5n0i5+t9IuggfSLoJX0i6Cp9IugvfSLoZH0i6Gl9IuhufSLoo30i6Kh9IuitfSLo4n0i6Od9IujsfSLpIX0i6SZ9IukrfSLpYH0i6WV9IulqfSLpb30i6aR9IumpfSLprn0i6eN9IunofSLp7X0i6iJ9IuonfSLqLH0i6mF9IupmfSLqa30i6qB9IuqlfSLqqn0i6q99IurkfSLq6X0i6u59IusjfSLrKH0i6y19IutiQ==" }, { - "string": "􋭝􋭱􋮅􋮙􋮭􋯁􋯕􋯩􋯽􋰑􋰥􋰹􋱍􋱡􋱵􋲉􋲝􋲱􋳅􋳙􋳭􋴁􋴕􋴩􋴽􋵑􋵥􋵹􋶍􋶡􋶵􋷉􋷝􋷱􋸅􋸙􋸭􋹁􋹕􋹩􋹽􋺑􋺥􋺹􋻍􋻡􋻵􋼉􋼝􋼱􋽅􋽙􋽭􋾁􋾕􋾩􋾽􋿑􋿥􋿹􌀍􌀡􌀵􌁉􌁝􌁱􌂅􌂙􌂭􌃁􌃕􌃩􌃽􌄑􌄥􌄹􌅍􌅡􌅵􌆉􌆝􌆱􌇅􌇙􌇭􌈁􌈕􌈩􌈽􌉑􌉥􌉹􌊍􌊡􌊵􌋉􌋝􌋱􌌅􌌙", - "encodedString": "9IutnfSLrbH0i66F9IuumfSLrq30i6+B9IuvlfSLr6n0i6+99IuwkfSLsKX0i7C59IuxjfSLsaH0i7G19IuyifSLsp30i7Kx9IuzhfSLs5n0i7Ot9Iu0gfSLtJX0i7Sp9Iu0vfSLtZH0i7Wl9Iu1ufSLto30i7ah9Iu2tfSLt4n0i7ed9Iu3sfSLuIX0i7iZ9Iu4rfSLuYH0i7mV9Iu5qfSLub30i7qR9Iu6pfSLurn0i7uN9Iu7ofSLu7X0i7yJ9Iu8nfSLvLH0i72F9Iu9mfSLva30i76B9Iu+lfSLvqn0i7699Iu/kfSLv6X0i7+59IyAjfSMgKH0jIC19IyBifSMgZ30jIGx9IyChfSMgpn0jIKt9IyDgfSMg5X0jIOp9IyDvfSMhJH0jISl9IyEufSMhY30jIWh9IyFtfSMhon0jIad9IyGsfSMh4X0jIeZ9IyHrfSMiIH0jIiV9IyIqfSMiL30jImR9IyJpfSMibn0jIqN9IyKofSMirX0jIuJ9IyLnfSMi7H0jIyF9IyMmQ==" + "string" : "􋭝􋭱􋮅􋮙􋮭􋯁􋯕􋯩􋯽􋰑􋰥􋰹􋱍􋱡􋱵􋲉􋲝􋲱􋳅􋳙􋳭􋴁􋴕􋴩􋴽􋵑􋵥􋵹􋶍􋶡􋶵􋷉􋷝􋷱􋸅􋸙􋸭􋹁􋹕􋹩􋹽􋺑􋺥􋺹􋻍􋻡􋻵􋼉􋼝􋼱􋽅􋽙􋽭􋾁􋾕􋾩􋾽􋿑􋿥􋿹􌀍􌀡􌀵􌁉􌁝􌁱􌂅􌂙􌂭􌃁􌃕􌃩􌃽􌄑􌄥􌄹􌅍􌅡􌅵􌆉􌆝􌆱􌇅􌇙􌇭􌈁􌈕􌈩􌈽􌉑􌉥􌉹􌊍􌊡􌊵􌋉􌋝􌋱􌌅􌌙", + "encodedString" : "9IutnfSLrbH0i66F9IuumfSLrq30i6+B9IuvlfSLr6n0i6+99IuwkfSLsKX0i7C59IuxjfSLsaH0i7G19IuyifSLsp30i7Kx9IuzhfSLs5n0i7Ot9Iu0gfSLtJX0i7Sp9Iu0vfSLtZH0i7Wl9Iu1ufSLto30i7ah9Iu2tfSLt4n0i7ed9Iu3sfSLuIX0i7iZ9Iu4rfSLuYH0i7mV9Iu5qfSLub30i7qR9Iu6pfSLurn0i7uN9Iu7ofSLu7X0i7yJ9Iu8nfSLvLH0i72F9Iu9mfSLva30i76B9Iu+lfSLvqn0i7699Iu/kfSLv6X0i7+59IyAjfSMgKH0jIC19IyBifSMgZ30jIGx9IyChfSMgpn0jIKt9IyDgfSMg5X0jIOp9IyDvfSMhJH0jISl9IyEufSMhY30jIWh9IyFtfSMhon0jIad9IyGsfSMh4X0jIeZ9IyHrfSMiIH0jIiV9IyIqfSMiL30jImR9IyJpfSMibn0jIqN9IyKofSMirX0jIuJ9IyLnfSMi7H0jIyF9IyMmQ==" }, { - "string": "􌌭􌍁􌍕􌍩􌍽􌎑􌎥􌎹􌏍􌏡􌏵􌐉􌐝􌐱􌑅􌑙􌑭􌒁􌒕􌒩􌒽􌓑􌓥􌓹􌔍􌔡􌔵􌕉􌕝􌕱􌖅􌖙􌖭􌗁􌗕􌗩􌗽􌘑􌘥􌘹􌙍􌙡􌙵􌚉􌚝􌚱􌛅􌛙􌛭􌜁􌜕􌜩􌜽􌝑􌝥􌝹􌞍􌞡􌞵􌟉􌟝􌟱􌠅􌠙􌠭􌡁􌡕􌡩􌡽􌢑􌢥􌢹􌣍􌣡􌣵􌤉􌤝􌤱􌥅􌥙􌥭􌦁􌦕􌦩􌦽􌧑􌧥􌧹􌨍􌨡􌨵􌩉􌩝􌩱􌪅􌪙􌪭􌫁􌫕􌫩", - "encodedString": "9IyMrfSMjYH0jI2V9IyNqfSMjb30jI6R9IyOpfSMjrn0jI+N9IyPofSMj7X0jJCJ9IyQnfSMkLH0jJGF9IyRmfSMka30jJKB9IySlfSMkqn0jJK99IyTkfSMk6X0jJO59IyUjfSMlKH0jJS19IyVifSMlZ30jJWx9IyWhfSMlpn0jJat9IyXgfSMl5X0jJep9IyXvfSMmJH0jJil9IyYufSMmY30jJmh9IyZtfSMmon0jJqd9IyasfSMm4X0jJuZ9IybrfSMnIH0jJyV9IycqfSMnL30jJ2R9IydpfSMnbn0jJ6N9IyeofSMnrX0jJ+J9IyfnfSMn7H0jKCF9IygmfSMoK30jKGB9IyhlfSMoan0jKG99IyikfSMoqX0jKK59IyjjfSMo6H0jKO19IykifSMpJ30jKSx9IylhfSMpZn0jKWt9IymgfSMppX0jKap9IymvfSMp5H0jKel9IynufSMqI30jKih9IyotfSMqYn0jKmd9IypsfSMqoX0jKqZ9IyqrfSMq4H0jKuV9IyrqQ==" + "string" : "􌌭􌍁􌍕􌍩􌍽􌎑􌎥􌎹􌏍􌏡􌏵􌐉􌐝􌐱􌑅􌑙􌑭􌒁􌒕􌒩􌒽􌓑􌓥􌓹􌔍􌔡􌔵􌕉􌕝􌕱􌖅􌖙􌖭􌗁􌗕􌗩􌗽􌘑􌘥􌘹􌙍􌙡􌙵􌚉􌚝􌚱􌛅􌛙􌛭􌜁􌜕􌜩􌜽􌝑􌝥􌝹􌞍􌞡􌞵􌟉􌟝􌟱􌠅􌠙􌠭􌡁􌡕􌡩􌡽􌢑􌢥􌢹􌣍􌣡􌣵􌤉􌤝􌤱􌥅􌥙􌥭􌦁􌦕􌦩􌦽􌧑􌧥􌧹􌨍􌨡􌨵􌩉􌩝􌩱􌪅􌪙􌪭􌫁􌫕􌫩", + "encodedString" : "9IyMrfSMjYH0jI2V9IyNqfSMjb30jI6R9IyOpfSMjrn0jI+N9IyPofSMj7X0jJCJ9IyQnfSMkLH0jJGF9IyRmfSMka30jJKB9IySlfSMkqn0jJK99IyTkfSMk6X0jJO59IyUjfSMlKH0jJS19IyVifSMlZ30jJWx9IyWhfSMlpn0jJat9IyXgfSMl5X0jJep9IyXvfSMmJH0jJil9IyYufSMmY30jJmh9IyZtfSMmon0jJqd9IyasfSMm4X0jJuZ9IybrfSMnIH0jJyV9IycqfSMnL30jJ2R9IydpfSMnbn0jJ6N9IyeofSMnrX0jJ+J9IyfnfSMn7H0jKCF9IygmfSMoK30jKGB9IyhlfSMoan0jKG99IyikfSMoqX0jKK59IyjjfSMo6H0jKO19IykifSMpJ30jKSx9IylhfSMpZn0jKWt9IymgfSMppX0jKap9IymvfSMp5H0jKel9IynufSMqI30jKih9IyotfSMqYn0jKmd9IypsfSMqoX0jKqZ9IyqrfSMq4H0jKuV9IyrqQ==" }, { - "string": "􌫽􌬑􌬥􌬹􌭍􌭡􌭵􌮉􌮝􌮱􌯅􌯙􌯭􌰁􌰕􌰩􌰽􌱑􌱥􌱹􌲍􌲡􌲵􌳉􌳝􌳱􌴅􌴙􌴭􌵁􌵕􌵩􌵽􌶑􌶥􌶹􌷍􌷡􌷵􌸉􌸝􌸱􌹅􌹙􌹭􌺁􌺕􌺩􌺽􌻑􌻥􌻹􌼍􌼡􌼵􌽉􌽝􌽱􌾅􌾙􌾭􌿁􌿕􌿩􌿽􍀑􍀥􍀹􍁍􍁡􍁵􍂉􍂝􍂱􍃅􍃙􍃭􍄁􍄕􍄩􍄽􍅑􍅥􍅹􍆍􍆡􍆵􍇉􍇝􍇱􍈅􍈙􍈭􍉁􍉕􍉩􍉽􍊑􍊥􍊹", - "encodedString": "9IyrvfSMrJH0jKyl9IysufSMrY30jK2h9IyttfSMron0jK6d9IyusfSMr4X0jK+Z9IyvrfSMsIH0jLCV9IywqfSMsL30jLGR9IyxpfSMsbn0jLKN9IyyofSMsrX0jLOJ9IyznfSMs7H0jLSF9Iy0mfSMtK30jLWB9Iy1lfSMtan0jLW99Iy2kfSMtqX0jLa59Iy3jfSMt6H0jLe19Iy4ifSMuJ30jLix9Iy5hfSMuZn0jLmt9Iy6gfSMupX0jLqp9Iy6vfSMu5H0jLul9Iy7ufSMvI30jLyh9Iy8tfSMvYn0jL2d9Iy9sfSMvoX0jL6Z9Iy+rfSMv4H0jL+V9Iy/qfSMv730jYCR9I2ApfSNgLn0jYGN9I2BofSNgbX0jYKJ9I2CnfSNgrH0jYOF9I2DmfSNg630jYSB9I2ElfSNhKn0jYS99I2FkfSNhaX0jYW59I2GjfSNhqH0jYa19I2HifSNh530jYex9I2IhfSNiJn0jYit9I2JgfSNiZX0jYmp9I2JvfSNipH0jYql9I2KuQ==" + "string" : "􌫽􌬑􌬥􌬹􌭍􌭡􌭵􌮉􌮝􌮱􌯅􌯙􌯭􌰁􌰕􌰩􌰽􌱑􌱥􌱹􌲍􌲡􌲵􌳉􌳝􌳱􌴅􌴙􌴭􌵁􌵕􌵩􌵽􌶑􌶥􌶹􌷍􌷡􌷵􌸉􌸝􌸱􌹅􌹙􌹭􌺁􌺕􌺩􌺽􌻑􌻥􌻹􌼍􌼡􌼵􌽉􌽝􌽱􌾅􌾙􌾭􌿁􌿕􌿩􌿽􍀑􍀥􍀹􍁍􍁡􍁵􍂉􍂝􍂱􍃅􍃙􍃭􍄁􍄕􍄩􍄽􍅑􍅥􍅹􍆍􍆡􍆵􍇉􍇝􍇱􍈅􍈙􍈭􍉁􍉕􍉩􍉽􍊑􍊥􍊹", + "encodedString" : "9IyrvfSMrJH0jKyl9IysufSMrY30jK2h9IyttfSMron0jK6d9IyusfSMr4X0jK+Z9IyvrfSMsIH0jLCV9IywqfSMsL30jLGR9IyxpfSMsbn0jLKN9IyyofSMsrX0jLOJ9IyznfSMs7H0jLSF9Iy0mfSMtK30jLWB9Iy1lfSMtan0jLW99Iy2kfSMtqX0jLa59Iy3jfSMt6H0jLe19Iy4ifSMuJ30jLix9Iy5hfSMuZn0jLmt9Iy6gfSMupX0jLqp9Iy6vfSMu5H0jLul9Iy7ufSMvI30jLyh9Iy8tfSMvYn0jL2d9Iy9sfSMvoX0jL6Z9Iy+rfSMv4H0jL+V9Iy/qfSMv730jYCR9I2ApfSNgLn0jYGN9I2BofSNgbX0jYKJ9I2CnfSNgrH0jYOF9I2DmfSNg630jYSB9I2ElfSNhKn0jYS99I2FkfSNhaX0jYW59I2GjfSNhqH0jYa19I2HifSNh530jYex9I2IhfSNiJn0jYit9I2JgfSNiZX0jYmp9I2JvfSNipH0jYql9I2KuQ==" }, { - "string": "􍋍􍋡􍋵􍌉􍌝􍌱􍍅􍍙􍍭􍎁􍎕􍎩􍎽􍏑􍏥􍏹􍐍􍐡􍐵􍑉􍑝􍑱􍒅􍒙􍒭􍓁􍓕􍓩􍓽􍔑􍔥􍔹􍕍􍕡􍕵􍖉􍖝􍖱􍗅􍗙􍗭􍘁􍘕􍘩􍘽􍙑􍙥􍙹􍚍􍚡􍚵􍛉􍛝􍛱􍜅􍜙􍜭􍝁􍝕􍝩􍝽􍞑􍞥􍞹􍟍􍟡􍟵􍠉􍠝􍠱􍡅􍡙􍡭􍢁􍢕􍢩􍢽􍣑􍣥􍣹􍤍􍤡􍤵􍥉􍥝􍥱􍦅􍦙􍦭􍧁􍧕􍧩􍧽􍨑􍨥􍨹􍩍􍩡􍩵􍪉", - "encodedString": "9I2LjfSNi6H0jYu19I2MifSNjJ30jYyx9I2NhfSNjZn0jY2t9I2OgfSNjpX0jY6p9I2OvfSNj5H0jY+l9I2PufSNkI30jZCh9I2QtfSNkYn0jZGd9I2RsfSNkoX0jZKZ9I2SrfSNk4H0jZOV9I2TqfSNk730jZSR9I2UpfSNlLn0jZWN9I2VofSNlbX0jZaJ9I2WnfSNlrH0jZeF9I2XmfSNl630jZiB9I2YlfSNmKn0jZi99I2ZkfSNmaX0jZm59I2ajfSNmqH0jZq19I2bifSNm530jZux9I2chfSNnJn0jZyt9I2dgfSNnZX0jZ2p9I2dvfSNnpH0jZ6l9I2eufSNn430jZ+h9I2ftfSNoIn0jaCd9I2gsfSNoYX0jaGZ9I2hrfSNooH0jaKV9I2iqfSNor30jaOR9I2jpfSNo7n0jaSN9I2kofSNpLX0jaWJ9I2lnfSNpbH0jaaF9I2mmfSNpq30jaeB9I2nlfSNp6n0jae99I2okfSNqKX0jai59I2pjfSNqaH0jam19I2qiQ==" + "string" : "􍋍􍋡􍋵􍌉􍌝􍌱􍍅􍍙􍍭􍎁􍎕􍎩􍎽􍏑􍏥􍏹􍐍􍐡􍐵􍑉􍑝􍑱􍒅􍒙􍒭􍓁􍓕􍓩􍓽􍔑􍔥􍔹􍕍􍕡􍕵􍖉􍖝􍖱􍗅􍗙􍗭􍘁􍘕􍘩􍘽􍙑􍙥􍙹􍚍􍚡􍚵􍛉􍛝􍛱􍜅􍜙􍜭􍝁􍝕􍝩􍝽􍞑􍞥􍞹􍟍􍟡􍟵􍠉􍠝􍠱􍡅􍡙􍡭􍢁􍢕􍢩􍢽􍣑􍣥􍣹􍤍􍤡􍤵􍥉􍥝􍥱􍦅􍦙􍦭􍧁􍧕􍧩􍧽􍨑􍨥􍨹􍩍􍩡􍩵􍪉", + "encodedString" : "9I2LjfSNi6H0jYu19I2MifSNjJ30jYyx9I2NhfSNjZn0jY2t9I2OgfSNjpX0jY6p9I2OvfSNj5H0jY+l9I2PufSNkI30jZCh9I2QtfSNkYn0jZGd9I2RsfSNkoX0jZKZ9I2SrfSNk4H0jZOV9I2TqfSNk730jZSR9I2UpfSNlLn0jZWN9I2VofSNlbX0jZaJ9I2WnfSNlrH0jZeF9I2XmfSNl630jZiB9I2YlfSNmKn0jZi99I2ZkfSNmaX0jZm59I2ajfSNmqH0jZq19I2bifSNm530jZux9I2chfSNnJn0jZyt9I2dgfSNnZX0jZ2p9I2dvfSNnpH0jZ6l9I2eufSNn430jZ+h9I2ftfSNoIn0jaCd9I2gsfSNoYX0jaGZ9I2hrfSNooH0jaKV9I2iqfSNor30jaOR9I2jpfSNo7n0jaSN9I2kofSNpLX0jaWJ9I2lnfSNpbH0jaaF9I2mmfSNpq30jaeB9I2nlfSNp6n0jae99I2okfSNqKX0jai59I2pjfSNqaH0jam19I2qiQ==" }, { - "string": "􍪝􍪱􍫅􍫙􍫭􍬁􍬕􍬩􍬽􍭑􍭥􍭹􍮍􍮡􍮵􍯉􍯝􍯱􍰅􍰙􍰭􍱁􍱕􍱩􍱽􍲑􍲥􍲹􍳍􍳡􍳵􍴉􍴝􍴱􍵅􍵙􍵭􍶁􍶕􍶩􍶽􍷑􍷥􍷹􍸍􍸡􍸵􍹉􍹝􍹱􍺅􍺙􍺭􍻁􍻕􍻩􍻽􍼑􍼥􍼹􍽍􍽡􍽵􍾉􍾝􍾱􍿅􍿙􍿭􎀁􎀕􎀩􎀽􎁑􎁥􎁹􎂍􎂡􎂵􎃉􎃝􎃱􎄅􎄙􎄭􎅁􎅕􎅩􎅽􎆑􎆥􎆹􎇍􎇡􎇵􎈉􎈝􎈱􎉅􎉙", - "encodedString": "9I2qnfSNqrH0jauF9I2rmfSNq630jayB9I2slfSNrKn0jay99I2tkfSNraX0ja259I2ujfSNrqH0ja619I2vifSNr530ja+x9I2whfSNsJn0jbCt9I2xgfSNsZX0jbGp9I2xvfSNspH0jbKl9I2yufSNs430jbOh9I2ztfSNtIn0jbSd9I20sfSNtYX0jbWZ9I21rfSNtoH0jbaV9I22qfSNtr30jbeR9I23pfSNt7n0jbiN9I24ofSNuLX0jbmJ9I25nfSNubH0jbqF9I26mfSNuq30jbuB9I27lfSNu6n0jbu99I28kfSNvKX0jby59I29jfSNvaH0jb219I2+ifSNvp30jb6x9I2/hfSNv5n0jb+t9I6AgfSOgJX0joCp9I6AvfSOgZH0joGl9I6BufSOgo30joKh9I6CtfSOg4n0joOd9I6DsfSOhIX0joSZ9I6ErfSOhYH0joWV9I6FqfSOhb30joaR9I6GpfSOhrn0joeN9I6HofSOh7X0joiJ9I6InfSOiLH0jomF9I6JmQ==" + "string" : "􍪝􍪱􍫅􍫙􍫭􍬁􍬕􍬩􍬽􍭑􍭥􍭹􍮍􍮡􍮵􍯉􍯝􍯱􍰅􍰙􍰭􍱁􍱕􍱩􍱽􍲑􍲥􍲹􍳍􍳡􍳵􍴉􍴝􍴱􍵅􍵙􍵭􍶁􍶕􍶩􍶽􍷑􍷥􍷹􍸍􍸡􍸵􍹉􍹝􍹱􍺅􍺙􍺭􍻁􍻕􍻩􍻽􍼑􍼥􍼹􍽍􍽡􍽵􍾉􍾝􍾱􍿅􍿙􍿭􎀁􎀕􎀩􎀽􎁑􎁥􎁹􎂍􎂡􎂵􎃉􎃝􎃱􎄅􎄙􎄭􎅁􎅕􎅩􎅽􎆑􎆥􎆹􎇍􎇡􎇵􎈉􎈝􎈱􎉅􎉙", + "encodedString" : "9I2qnfSNqrH0jauF9I2rmfSNq630jayB9I2slfSNrKn0jay99I2tkfSNraX0ja259I2ujfSNrqH0ja619I2vifSNr530ja+x9I2whfSNsJn0jbCt9I2xgfSNsZX0jbGp9I2xvfSNspH0jbKl9I2yufSNs430jbOh9I2ztfSNtIn0jbSd9I20sfSNtYX0jbWZ9I21rfSNtoH0jbaV9I22qfSNtr30jbeR9I23pfSNt7n0jbiN9I24ofSNuLX0jbmJ9I25nfSNubH0jbqF9I26mfSNuq30jbuB9I27lfSNu6n0jbu99I28kfSNvKX0jby59I29jfSNvaH0jb219I2+ifSNvp30jb6x9I2/hfSNv5n0jb+t9I6AgfSOgJX0joCp9I6AvfSOgZH0joGl9I6BufSOgo30joKh9I6CtfSOg4n0joOd9I6DsfSOhIX0joSZ9I6ErfSOhYH0joWV9I6FqfSOhb30joaR9I6GpfSOhrn0joeN9I6HofSOh7X0joiJ9I6InfSOiLH0jomF9I6JmQ==" }, { - "string": "􎉭􎊁􎊕􎊩􎊽􎋑􎋥􎋹􎌍􎌡􎌵􎍉􎍝􎍱􎎅􎎙􎎭􎏁􎏕􎏩􎏽􎐑􎐥􎐹􎑍􎑡􎑵􎒉􎒝􎒱􎓅􎓙􎓭􎔁􎔕􎔩􎔽􎕑􎕥􎕹􎖍􎖡􎖵􎗉􎗝􎗱􎘅􎘙􎘭􎙁􎙕􎙩􎙽􎚑􎚥􎚹􎛍􎛡􎛵􎜉􎜝􎜱􎝅􎝙􎝭􎞁􎞕􎞩􎞽􎟑􎟥􎟹􎠍􎠡􎠵􎡉􎡝􎡱􎢅􎢙􎢭􎣁􎣕􎣩􎣽􎤑􎤥􎤹􎥍􎥡􎥵􎦉􎦝􎦱􎧅􎧙􎧭􎨁􎨕􎨩", - "encodedString": "9I6JrfSOioH0joqV9I6KqfSOir30jouR9I6LpfSOi7n0joyN9I6MofSOjLX0jo2J9I6NnfSOjbH0jo6F9I6OmfSOjq30jo+B9I6PlfSOj6n0jo+99I6QkfSOkKX0jpC59I6RjfSOkaH0jpG19I6SifSOkp30jpKx9I6ThfSOk5n0jpOt9I6UgfSOlJX0jpSp9I6UvfSOlZH0jpWl9I6VufSOlo30jpah9I6WtfSOl4n0jped9I6XsfSOmIX0jpiZ9I6YrfSOmYH0jpmV9I6ZqfSOmb30jpqR9I6apfSOmrn0jpuN9I6bofSOm7X0jpyJ9I6cnfSOnLH0jp2F9I6dmfSOna30jp6B9I6elfSOnqn0jp699I6fkfSOn6X0jp+59I6gjfSOoKH0jqC19I6hifSOoZ30jqGx9I6ihfSOopn0jqKt9I6jgfSOo5X0jqOp9I6jvfSOpJH0jqSl9I6kufSOpY30jqWh9I6ltfSOpon0jqad9I6msfSOp4X0jqeZ9I6nrfSOqIH0jqiV9I6oqQ==" + "string" : "􎉭􎊁􎊕􎊩􎊽􎋑􎋥􎋹􎌍􎌡􎌵􎍉􎍝􎍱􎎅􎎙􎎭􎏁􎏕􎏩􎏽􎐑􎐥􎐹􎑍􎑡􎑵􎒉􎒝􎒱􎓅􎓙􎓭􎔁􎔕􎔩􎔽􎕑􎕥􎕹􎖍􎖡􎖵􎗉􎗝􎗱􎘅􎘙􎘭􎙁􎙕􎙩􎙽􎚑􎚥􎚹􎛍􎛡􎛵􎜉􎜝􎜱􎝅􎝙􎝭􎞁􎞕􎞩􎞽􎟑􎟥􎟹􎠍􎠡􎠵􎡉􎡝􎡱􎢅􎢙􎢭􎣁􎣕􎣩􎣽􎤑􎤥􎤹􎥍􎥡􎥵􎦉􎦝􎦱􎧅􎧙􎧭􎨁􎨕􎨩", + "encodedString" : "9I6JrfSOioH0joqV9I6KqfSOir30jouR9I6LpfSOi7n0joyN9I6MofSOjLX0jo2J9I6NnfSOjbH0jo6F9I6OmfSOjq30jo+B9I6PlfSOj6n0jo+99I6QkfSOkKX0jpC59I6RjfSOkaH0jpG19I6SifSOkp30jpKx9I6ThfSOk5n0jpOt9I6UgfSOlJX0jpSp9I6UvfSOlZH0jpWl9I6VufSOlo30jpah9I6WtfSOl4n0jped9I6XsfSOmIX0jpiZ9I6YrfSOmYH0jpmV9I6ZqfSOmb30jpqR9I6apfSOmrn0jpuN9I6bofSOm7X0jpyJ9I6cnfSOnLH0jp2F9I6dmfSOna30jp6B9I6elfSOnqn0jp699I6fkfSOn6X0jp+59I6gjfSOoKH0jqC19I6hifSOoZ30jqGx9I6ihfSOopn0jqKt9I6jgfSOo5X0jqOp9I6jvfSOpJH0jqSl9I6kufSOpY30jqWh9I6ltfSOpon0jqad9I6msfSOp4X0jqeZ9I6nrfSOqIH0jqiV9I6oqQ==" }, { - "string": "􎨽􎩑􎩥􎩹􎪍􎪡􎪵􎫉􎫝􎫱􎬅􎬙􎬭􎭁􎭕􎭩􎭽􎮑􎮥􎮹􎯍􎯡􎯵􎰉􎰝􎰱􎱅􎱙􎱭􎲁􎲕􎲩􎲽􎳑􎳥􎳹􎴍􎴡􎴵􎵉􎵝􎵱􎶅􎶙􎶭􎷁􎷕􎷩􎷽􎸑􎸥􎸹􎹍􎹡􎹵􎺉􎺝􎺱􎻅􎻙􎻭􎼁􎼕􎼩􎼽􎽑􎽥􎽹􎾍􎾡􎾵􎿉􎿝􎿱􏀅􏀙􏀭􏁁􏁕􏁩􏁽􏂑􏂥􏂹􏃍􏃡􏃵􏄉􏄝􏄱􏅅􏅙􏅭􏆁􏆕􏆩􏆽􏇑􏇥􏇹", - "encodedString": "9I6ovfSOqZH0jqml9I6pufSOqo30jqqh9I6qtfSOq4n0jqud9I6rsfSOrIX0jqyZ9I6srfSOrYH0jq2V9I6tqfSOrb30jq6R9I6upfSOrrn0jq+N9I6vofSOr7X0jrCJ9I6wnfSOsLH0jrGF9I6xmfSOsa30jrKB9I6ylfSOsqn0jrK99I6zkfSOs6X0jrO59I60jfSOtKH0jrS19I61ifSOtZ30jrWx9I62hfSOtpn0jrat9I63gfSOt5X0jrep9I63vfSOuJH0jril9I64ufSOuY30jrmh9I65tfSOuon0jrqd9I66sfSOu4X0jruZ9I67rfSOvIH0jryV9I68qfSOvL30jr2R9I69pfSOvbn0jr6N9I6+ofSOvrX0jr+J9I6/nfSOv7H0j4CF9I+AmfSPgK30j4GB9I+BlfSPgan0j4G99I+CkfSPgqX0j4K59I+DjfSPg6H0j4O19I+EifSPhJ30j4Sx9I+FhfSPhZn0j4Wt9I+GgfSPhpX0j4ap9I+GvfSPh5H0j4el9I+HuQ==" + "string" : "􎨽􎩑􎩥􎩹􎪍􎪡􎪵􎫉􎫝􎫱􎬅􎬙􎬭􎭁􎭕􎭩􎭽􎮑􎮥􎮹􎯍􎯡􎯵􎰉􎰝􎰱􎱅􎱙􎱭􎲁􎲕􎲩􎲽􎳑􎳥􎳹􎴍􎴡􎴵􎵉􎵝􎵱􎶅􎶙􎶭􎷁􎷕􎷩􎷽􎸑􎸥􎸹􎹍􎹡􎹵􎺉􎺝􎺱􎻅􎻙􎻭􎼁􎼕􎼩􎼽􎽑􎽥􎽹􎾍􎾡􎾵􎿉􎿝􎿱􏀅􏀙􏀭􏁁􏁕􏁩􏁽􏂑􏂥􏂹􏃍􏃡􏃵􏄉􏄝􏄱􏅅􏅙􏅭􏆁􏆕􏆩􏆽􏇑􏇥􏇹", + "encodedString" : "9I6ovfSOqZH0jqml9I6pufSOqo30jqqh9I6qtfSOq4n0jqud9I6rsfSOrIX0jqyZ9I6srfSOrYH0jq2V9I6tqfSOrb30jq6R9I6upfSOrrn0jq+N9I6vofSOr7X0jrCJ9I6wnfSOsLH0jrGF9I6xmfSOsa30jrKB9I6ylfSOsqn0jrK99I6zkfSOs6X0jrO59I60jfSOtKH0jrS19I61ifSOtZ30jrWx9I62hfSOtpn0jrat9I63gfSOt5X0jrep9I63vfSOuJH0jril9I64ufSOuY30jrmh9I65tfSOuon0jrqd9I66sfSOu4X0jruZ9I67rfSOvIH0jryV9I68qfSOvL30jr2R9I69pfSOvbn0jr6N9I6+ofSOvrX0jr+J9I6/nfSOv7H0j4CF9I+AmfSPgK30j4GB9I+BlfSPgan0j4G99I+CkfSPgqX0j4K59I+DjfSPg6H0j4O19I+EifSPhJ30j4Sx9I+FhfSPhZn0j4Wt9I+GgfSPhpX0j4ap9I+GvfSPh5H0j4el9I+HuQ==" }, { - "string": "􏈍􏈡􏈵􏉉􏉝􏉱􏊅􏊙􏊭􏋁􏋕􏋩􏋽􏌑􏌥􏌹􏍍􏍡􏍵􏎉􏎝􏎱􏏅􏏙􏏭􏐁􏐕􏐩􏐽􏑑􏑥􏑹􏒍􏒡􏒵􏓉􏓝􏓱􏔅􏔙􏔭􏕁􏕕􏕩􏕽􏖑􏖥􏖹􏗍􏗡􏗵􏘉􏘝􏘱􏙅􏙙􏙭􏚁􏚕􏚩􏚽􏛑􏛥􏛹􏜍􏜡􏜵􏝉􏝝􏝱􏞅􏞙􏞭􏟁􏟕􏟩􏟽􏠑􏠥􏠹􏡍􏡡􏡵􏢉􏢝􏢱􏣅􏣙􏣭􏤁􏤕􏤩􏤽􏥑􏥥􏥹􏦍􏦡􏦵􏧉", - "encodedString": "9I+IjfSPiKH0j4i19I+JifSPiZ30j4mx9I+KhfSPipn0j4qt9I+LgfSPi5X0j4up9I+LvfSPjJH0j4yl9I+MufSPjY30j42h9I+NtfSPjon0j46d9I+OsfSPj4X0j4+Z9I+PrfSPkIH0j5CV9I+QqfSPkL30j5GR9I+RpfSPkbn0j5KN9I+SofSPkrX0j5OJ9I+TnfSPk7H0j5SF9I+UmfSPlK30j5WB9I+VlfSPlan0j5W99I+WkfSPlqX0j5a59I+XjfSPl6H0j5e19I+YifSPmJ30j5ix9I+ZhfSPmZn0j5mt9I+agfSPmpX0j5qp9I+avfSPm5H0j5ul9I+bufSPnI30j5yh9I+ctfSPnYn0j52d9I+dsfSPnoX0j56Z9I+erfSPn4H0j5+V9I+fqfSPn730j6CR9I+gpfSPoLn0j6GN9I+hofSPobX0j6KJ9I+infSPorH0j6OF9I+jmfSPo630j6SB9I+klfSPpKn0j6S99I+lkfSPpaX0j6W59I+mjfSPpqH0j6a19I+niQ==" + "string" : "􏈍􏈡􏈵􏉉􏉝􏉱􏊅􏊙􏊭􏋁􏋕􏋩􏋽􏌑􏌥􏌹􏍍􏍡􏍵􏎉􏎝􏎱􏏅􏏙􏏭􏐁􏐕􏐩􏐽􏑑􏑥􏑹􏒍􏒡􏒵􏓉􏓝􏓱􏔅􏔙􏔭􏕁􏕕􏕩􏕽􏖑􏖥􏖹􏗍􏗡􏗵􏘉􏘝􏘱􏙅􏙙􏙭􏚁􏚕􏚩􏚽􏛑􏛥􏛹􏜍􏜡􏜵􏝉􏝝􏝱􏞅􏞙􏞭􏟁􏟕􏟩􏟽􏠑􏠥􏠹􏡍􏡡􏡵􏢉􏢝􏢱􏣅􏣙􏣭􏤁􏤕􏤩􏤽􏥑􏥥􏥹􏦍􏦡􏦵􏧉", + "encodedString" : "9I+IjfSPiKH0j4i19I+JifSPiZ30j4mx9I+KhfSPipn0j4qt9I+LgfSPi5X0j4up9I+LvfSPjJH0j4yl9I+MufSPjY30j42h9I+NtfSPjon0j46d9I+OsfSPj4X0j4+Z9I+PrfSPkIH0j5CV9I+QqfSPkL30j5GR9I+RpfSPkbn0j5KN9I+SofSPkrX0j5OJ9I+TnfSPk7H0j5SF9I+UmfSPlK30j5WB9I+VlfSPlan0j5W99I+WkfSPlqX0j5a59I+XjfSPl6H0j5e19I+YifSPmJ30j5ix9I+ZhfSPmZn0j5mt9I+agfSPmpX0j5qp9I+avfSPm5H0j5ul9I+bufSPnI30j5yh9I+ctfSPnYn0j52d9I+dsfSPnoX0j56Z9I+erfSPn4H0j5+V9I+fqfSPn730j6CR9I+gpfSPoLn0j6GN9I+hofSPobX0j6KJ9I+infSPorH0j6OF9I+jmfSPo630j6SB9I+klfSPpKn0j6S99I+lkfSPpaX0j6W59I+mjfSPpqH0j6a19I+niQ==" } ], - "bcrypt128Tests": [ + "bcrypt128Tests" : [ { - "password": "?", - "keyHex": "949b7f8b6812bf546f7834020751375f", - "saltHex": "ad41468d8c8f9ca44565a56fb9d891bb" + "password" : "?", + "keyHex" : "949b7f8b6812bf546f7834020751375f", + "saltHex" : "ad41468d8c8f9ca44565a56fb9d891bb" }, { - "password": "%", - "keyHex": "95d95fded601d25fbe3e2d04d8e36788", - "saltHex": "ad41468d8c8f9ca44565a56fb9d891bb" + "password" : "%", + "keyHex" : "95d95fded601d25fbe3e2d04d8e36788", + "saltHex" : "ad41468d8c8f9ca44565a56fb9d891bb" }, { - "password": "€uropa", - "keyHex": "b3cdce96b7a58bd75b2e2b9f815403dc", - "saltHex": "ad41468d8c8f9ca44565a56fb9d891bb" + "password" : "€uropa", + "keyHex" : "b3cdce96b7a58bd75b2e2b9f815403dc", + "saltHex" : "ad41468d8c8f9ca44565a56fb9d891bb" }, { - "password": "?uropa", - "keyHex": "d16ee66f89294560414426b1b0eed976", - "saltHex": "ad41468d8c8f9ca44565a56fb9d891bb" + "password" : "?uropa", + "keyHex" : "d16ee66f89294560414426b1b0eed976", + "saltHex" : "ad41468d8c8f9ca44565a56fb9d891bb" }, { - "password": "This passphrase is relatively long, I hope I won't forget it", - "keyHex": "031c269aba8abfdbc8e71ffff639fad6", - "saltHex": "ad41468d8c8f9ca44565a56fb9d891bb" + "password" : "This passphrase is relatively long, I hope I won't forget it", + "keyHex" : "031c269aba8abfdbc8e71ffff639fad6", + "saltHex" : "ad41468d8c8f9ca44565a56fb9d891bb" }, { - "password": "This passphrase is relatively long, I hope I won't forget it!", - "keyHex": "7421a14497854b2fbaeb1dcec0e488e0", - "saltHex": "ad41468d8c8f9ca44565a56fb9d891bb" + "password" : "This passphrase is relatively long, I hope I won't forget it!", + "keyHex" : "7421a14497854b2fbaeb1dcec0e488e0", + "saltHex" : "ad41468d8c8f9ca44565a56fb9d891bb" } ], - "bcrypt256Tests": [ + "bcrypt256Tests" : [ { - "password": "?", - "keyHex": "bcfa50122893e8621d07339d98cafed33b87b8785c2642cd48892dfce878f9b0", - "saltHex": "ab53764e24204e9b3f9742a84a9b5990" + "password" : "?", + "keyHex" : "bcfa50122893e8621d07339d98cafed33b87b8785c2642cd48892dfce878f9b0", + "saltHex" : "ab53764e24204e9b3f9742a84a9b5990" }, { - "password": "%", - "keyHex": "82872c352a7aa843f84100c19be7c816068d31c3ab1a9662797133724b7f628c", - "saltHex": "ab53764e24204e9b3f9742a84a9b5990" + "password" : "%", + "keyHex" : "82872c352a7aa843f84100c19be7c816068d31c3ab1a9662797133724b7f628c", + "saltHex" : "ab53764e24204e9b3f9742a84a9b5990" }, { - "password": "€uropa", - "keyHex": "87c4b314435dc925b5e88f2af92e7b0f3f8ad0d6cb0447054bb8b30d793de0d3", - "saltHex": "ab53764e24204e9b3f9742a84a9b5990" + "password" : "€uropa", + "keyHex" : "87c4b314435dc925b5e88f2af92e7b0f3f8ad0d6cb0447054bb8b30d793de0d3", + "saltHex" : "ab53764e24204e9b3f9742a84a9b5990" }, { - "password": "?uropa", - "keyHex": "009a71b178de5feb2bcf0b60e5423b2b9f782712de2da4b5fd16a9d404a69fc1", - "saltHex": "ab53764e24204e9b3f9742a84a9b5990" + "password" : "?uropa", + "keyHex" : "009a71b178de5feb2bcf0b60e5423b2b9f782712de2da4b5fd16a9d404a69fc1", + "saltHex" : "ab53764e24204e9b3f9742a84a9b5990" }, { - "password": "This passphrase is relatively long, I hope I won't forget it", - "keyHex": "8f5921a4480c8faa75f37d50a33a5d43de0440adf3965a603f699abcc5353a4b", - "saltHex": "ab53764e24204e9b3f9742a84a9b5990" + "password" : "This passphrase is relatively long, I hope I won't forget it", + "keyHex" : "8f5921a4480c8faa75f37d50a33a5d43de0440adf3965a603f699abcc5353a4b", + "saltHex" : "ab53764e24204e9b3f9742a84a9b5990" }, { - "password": "This passphrase is relatively long, I hope I won't forget it!", - "keyHex": "aead79c798aab946357c1ac601ad265f9794a2db7298ff19aca3156c3c62de44", - "saltHex": "ab53764e24204e9b3f9742a84a9b5990" + "password" : "This passphrase is relatively long, I hope I won't forget it!", + "keyHex" : "aead79c798aab946357c1ac601ad265f9794a2db7298ff19aca3156c3c62de44", + "saltHex" : "ab53764e24204e9b3f9742a84a9b5990" } ], - "argon2idTests": [ + "argon2idTests" : [ { - "password": "?", - "keyHex": "d653a5ae1c20b062d1306002f7e5c551f9b64b09fd04996cb6af2b5c2a8cf411", - "saltHex": "31af40375b7a29d478a1c38a78c6eda2" + "password" : "?", + "keyHex" : "d653a5ae1c20b062d1306002f7e5c551f9b64b09fd04996cb6af2b5c2a8cf411", + "saltHex" : "31af40375b7a29d478a1c38a78c6eda2" }, { - "password": "%", - "keyHex": "725f4456240c7ce778d38b5676cd6b87219555d10aaab81dda3d47ce514cacb3", - "saltHex": "31af40375b7a29d478a1c38a78c6eda2" + "password" : "%", + "keyHex" : "725f4456240c7ce778d38b5676cd6b87219555d10aaab81dda3d47ce514cacb3", + "saltHex" : "31af40375b7a29d478a1c38a78c6eda2" }, { - "password": "€uropa", - "keyHex": "67f2bfcf8db387cf053a4150f987d5868e5e75e2aef6dd17eb1b6e003451f305", - "saltHex": "31af40375b7a29d478a1c38a78c6eda2" + "password" : "€uropa", + "keyHex" : "67f2bfcf8db387cf053a4150f987d5868e5e75e2aef6dd17eb1b6e003451f305", + "saltHex" : "31af40375b7a29d478a1c38a78c6eda2" }, { - "password": "?uropa", - "keyHex": "e7e4b37507234121cb6cb97ebb44fb65d8648cd77916af9256032ba6f88885a8", - "saltHex": "31af40375b7a29d478a1c38a78c6eda2" + "password" : "?uropa", + "keyHex" : "e7e4b37507234121cb6cb97ebb44fb65d8648cd77916af9256032ba6f88885a8", + "saltHex" : "31af40375b7a29d478a1c38a78c6eda2" }, { - "password": "This passphrase is relatively long, I hope I won't forget it", - "keyHex": "a48e4b3de194c5688db559ee6048a827b5bfd9102825c3636dcaf3f6431a228a", - "saltHex": "31af40375b7a29d478a1c38a78c6eda2" + "password" : "This passphrase is relatively long, I hope I won't forget it", + "keyHex" : "a48e4b3de194c5688db559ee6048a827b5bfd9102825c3636dcaf3f6431a228a", + "saltHex" : "31af40375b7a29d478a1c38a78c6eda2" }, { - "password": "This passphrase is relatively long, I hope I won't forget it!", - "keyHex": "8e98620579731716faee44f9c226b6d6a7830d7ed0d9d64a9dfc75b23d27d72b", - "saltHex": "31af40375b7a29d478a1c38a78c6eda2" + "password" : "This passphrase is relatively long, I hope I won't forget it!", + "keyHex" : "8e98620579731716faee44f9c226b6d6a7830d7ed0d9d64a9dfc75b23d27d72b", + "saltHex" : "31af40375b7a29d478a1c38a78c6eda2" } ], - "compressionTests": [ + "compressionTests" : [ { - "uncompressedText": "", - "compressedBase64TextJava": "", - "compressedBase64TextJavaScript": "", - "compressedBase64TextRust": "" + "uncompressedText" : "", + "compressedBase64TextJava" : "", + "compressedBase64TextJavaScript" : "", + "compressedBase64TextRust" : "" }, { - "uncompressedText": "a", - "compressedBase64TextJava": "EGE=", - "compressedBase64TextJavaScript": "EGE=", - "compressedBase64TextRust": "EGE=" + "uncompressedText" : "a", + "compressedBase64TextJava" : "EGE=", + "compressedBase64TextJavaScript" : "EGE=", + "compressedBase64TextRust" : "EGE=" }, { - "uncompressedText": "ab", - "compressedBase64TextJava": "IGFi", - "compressedBase64TextJavaScript": "IGFi", - "compressedBase64TextRust": "IGFi" + "uncompressedText" : "ab", + "compressedBase64TextJava" : "IGFi", + "compressedBase64TextJavaScript" : "IGFi", + "compressedBase64TextRust" : "IGFi" }, { - "uncompressedText": "aba", - "compressedBase64TextJava": "MGFiYQ==", - "compressedBase64TextJavaScript": "MGFiYQ==", - "compressedBase64TextRust": "MGFiYQ==" + "uncompressedText" : "aba", + "compressedBase64TextJava" : "MGFiYQ==", + "compressedBase64TextJavaScript" : "MGFiYQ==", + "compressedBase64TextRust" : "MGFiYQ==" }, { - "uncompressedText": "abab", - "compressedBase64TextJava": "QGFiYWI=", - "compressedBase64TextJavaScript": "QGFiYWI=", - "compressedBase64TextRust": "QGFiYWI=" + "uncompressedText" : "abab", + "compressedBase64TextJava" : "QGFiYWI=", + "compressedBase64TextJavaScript" : "QGFiYWI=", + "compressedBase64TextRust" : "QGFiYWI=" }, { - "uncompressedText": "ababa", - "compressedBase64TextJava": "UGFiYWJh", - "compressedBase64TextJavaScript": "UGFiYWJh", - "compressedBase64TextRust": "UGFiYWJh" + "uncompressedText" : "ababa", + "compressedBase64TextJava" : "UGFiYWJh", + "compressedBase64TextJavaScript" : "UGFiYWJh", + "compressedBase64TextRust" : "UGFiYWJh" }, { - "uncompressedText": "ababab", - "compressedBase64TextJava": "YGFiYWJhYg==", - "compressedBase64TextJavaScript": "YGFiYWJhYg==", - "compressedBase64TextRust": "YGFiYWJhYg==" + "uncompressedText" : "ababab", + "compressedBase64TextJava" : "YGFiYWJhYg==", + "compressedBase64TextJavaScript" : "YGFiYWJhYg==", + "compressedBase64TextRust" : "YGFiYWJhYg==" }, { - "uncompressedText": "abababa", - "compressedBase64TextJava": "cGFiYWJhYmE=", - "compressedBase64TextJavaScript": "cGFiYWJhYmE=", - "compressedBase64TextRust": "cGFiYWJhYmE=" + "uncompressedText" : "abababa", + "compressedBase64TextJava" : "cGFiYWJhYmE=", + "compressedBase64TextJavaScript" : "cGFiYWJhYmE=", + "compressedBase64TextRust" : "cGFiYWJhYmE=" }, { - "uncompressedText": "abababab", - "compressedBase64TextJava": "gGFiYWJhYmFi", - "compressedBase64TextJavaScript": "gGFiYWJhYmFi", - "compressedBase64TextRust": "gGFiYWJhYmFi" + "uncompressedText" : "abababab", + "compressedBase64TextJava" : "gGFiYWJhYmFi", + "compressedBase64TextJavaScript" : "gGFiYWJhYmFi", + "compressedBase64TextRust" : "gGFiYWJhYmFi" }, { - "uncompressedText": "ababababa", - "compressedBase64TextJava": "kGFiYWJhYmFiYQ==", - "compressedBase64TextJavaScript": "kGFiYWJhYmFiYQ==", - "compressedBase64TextRust": "kGFiYWJhYmFiYQ==" + "uncompressedText" : "ababababa", + "compressedBase64TextJava" : "kGFiYWJhYmFiYQ==", + "compressedBase64TextJavaScript" : "kGFiYWJhYmFiYQ==", + "compressedBase64TextRust" : "kGFiYWJhYmFiYQ==" }, { - "uncompressedText": "ababababab", - "compressedBase64TextJava": "oGFiYWJhYmFiYWI=", - "compressedBase64TextJavaScript": "oGFiYWJhYmFiYWI=", - "compressedBase64TextRust": "oGFiYWJhYmFiYWI=" + "uncompressedText" : "ababababab", + "compressedBase64TextJava" : "oGFiYWJhYmFiYWI=", + "compressedBase64TextJavaScript" : "oGFiYWJhYmFiYWI=", + "compressedBase64TextRust" : "oGFiYWJhYmFiYWI=" }, { - "uncompressedText": "abababababa", - "compressedBase64TextJava": "sGFiYWJhYmFiYWJh", - "compressedBase64TextJavaScript": "sGFiYWJhYmFiYWJh", - "compressedBase64TextRust": "sGFiYWJhYmFiYWJh" + "uncompressedText" : "abababababa", + "compressedBase64TextJava" : "sGFiYWJhYmFiYWJh", + "compressedBase64TextJavaScript" : "sGFiYWJhYmFiYWJh", + "compressedBase64TextRust" : "sGFiYWJhYmFiYWJh" }, { - "uncompressedText": "abababababab", - "compressedBase64TextJava": "wGFiYWJhYmFiYWJhYg==", - "compressedBase64TextJavaScript": "wGFiYWJhYmFiYWJhYg==", - "compressedBase64TextRust": "wGFiYWJhYmFiYWJhYg==" + "uncompressedText" : "abababababab", + "compressedBase64TextJava" : "wGFiYWJhYmFiYWJhYg==", + "compressedBase64TextJavaScript" : "wGFiYWJhYmFiYWJhYg==", + "compressedBase64TextRust" : "wGFiYWJhYmFiYWJhYg==" }, { - "uncompressedText": "ababababababa", - "compressedBase64TextJava": "0GFiYWJhYmFiYWJhYmE=", - "compressedBase64TextJavaScript": "0GFiYWJhYmFiYWJhYmE=", - "compressedBase64TextRust": "0GFiYWJhYmFiYWJhYmE=" + "uncompressedText" : "ababababababa", + "compressedBase64TextJava" : "0GFiYWJhYmFiYWJhYmE=", + "compressedBase64TextJavaScript" : "0GFiYWJhYmFiYWJhYmE=", + "compressedBase64TextRust" : "0GFiYWJhYmFiYWJhYmE=" }, { - "uncompressedText": "ababababababab", - "compressedBase64TextJava": "4GFiYWJhYmFiYWJhYmFi", - "compressedBase64TextJavaScript": "4GFiYWJhYmFiYWJhYmFi", - "compressedBase64TextRust": "ImFiAgBgYWJhYmFi" + "uncompressedText" : "ababababababab", + "compressedBase64TextJava" : "4GFiYWJhYmFiYWJhYmFi", + "compressedBase64TextJavaScript" : "4GFiYWJhYmFiYWJhYmFi", + "compressedBase64TextRust" : "ImFiAgBgYWJhYmFi" }, { - "uncompressedText": "abababababababa", - "compressedBase64TextJava": "JGFiAgBQYWJhYmE=", - "compressedBase64TextJavaScript": "8ABhYmFiYWJhYmFiYWJhYmE=", - "compressedBase64TextRust": "I2FiAgBgYmFiYWJh" + "uncompressedText" : "abababababababa", + "compressedBase64TextJava" : "JGFiAgBQYWJhYmE=", + "compressedBase64TextJavaScript" : "8ABhYmFiYWJhYmFiYWJhYmE=", + "compressedBase64TextRust" : "I2FiAgBgYmFiYWJh" }, { - "uncompressedText": "abababababababab", - "compressedBase64TextJava": "JWFiAgBQYmFiYWI=", - "compressedBase64TextJavaScript": "8AFhYmFiYWJhYmFiYWJhYmFi", - "compressedBase64TextRust": "JGFiAgBgYWJhYmFi" + "uncompressedText" : "abababababababab", + "compressedBase64TextJava" : "JWFiAgBQYmFiYWI=", + "compressedBase64TextJavaScript" : "8AFhYmFiYWJhYmFiYWJhYmFi", + "compressedBase64TextRust" : "JGFiAgBgYWJhYmFi" }, { - "uncompressedText": "ababababababababa", - "compressedBase64TextJava": "JmFiAgBQYWJhYmE=", - "compressedBase64TextJavaScript": "8AJhYmFiYWJhYmFiYWJhYmFiYQ==", - "compressedBase64TextRust": "JWFiAgBgYmFiYWJh" + "uncompressedText" : "ababababababababa", + "compressedBase64TextJava" : "JmFiAgBQYWJhYmE=", + "compressedBase64TextJavaScript" : "8AJhYmFiYWJhYmFiYWJhYmFiYQ==", + "compressedBase64TextRust" : "JWFiAgBgYmFiYWJh" }, { - "uncompressedText": "ababababababababab", - "compressedBase64TextJava": "J2FiAgBQYmFiYWI=", - "compressedBase64TextJavaScript": "8ANhYmFiYWJhYmFiYWJhYmFiYWI=", - "compressedBase64TextRust": "JmFiAgBgYWJhYmFi" + "uncompressedText" : "ababababababababab", + "compressedBase64TextJava" : "J2FiAgBQYmFiYWI=", + "compressedBase64TextJavaScript" : "8ANhYmFiYWJhYmFiYWJhYmFiYWI=", + "compressedBase64TextRust" : "JmFiAgBgYWJhYmFi" }, { - "uncompressedText": "abababababababababa", - "compressedBase64TextJava": "KGFiAgBQYWJhYmE=", - "compressedBase64TextJavaScript": "IWFiAgDAYmFiYWJhYmFiYWJh", - "compressedBase64TextRust": "J2FiAgBgYmFiYWJh" + "uncompressedText" : "abababababababababa", + "compressedBase64TextJava" : "KGFiAgBQYWJhYmE=", + "compressedBase64TextJavaScript" : "IWFiAgDAYmFiYWJhYmFiYWJh", + "compressedBase64TextRust" : "J2FiAgBgYmFiYWJh" }, { - "uncompressedText": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Tempor orci eu lobortis elementum nibh. Nibh tellus molestie nunc non blandit. Varius quam quisque id diam vel quam. Sit amet aliquam id diam maecenas ultricies mi eget. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. Suspendisse ultrices gravida dictum fusce ut placerat orci nulla. Et malesuada fames ac turpis egestas integer eget aliquet nibh. Vitae purus faucibus ornare suspendisse. Ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Volutpat maecenas volutpat blandit aliquam. Cursus turpis massa tincidunt dui ut ornare. A diam maecenas sed enim ut sem viverra.\n\nSit amet nisl suscipit adipiscing bibendum est ultricies integer. Pretium vulputate sapien nec sagittis aliquam malesuada. Convallis aenean et tortor at risus viverra adipiscing at in. Euismod lacinia at quis risus sed. Dis parturient montes nascetur ridiculus mus mauris vitae ultricies. Varius duis at consectetur lorem donec. Urna nunc id cursus metus. Sed faucibus turpis in eu mi bibendum neque egestas congue. Gravida in fermentum et sollicitudin ac orci. Sed sed risus pretium quam. Nunc scelerisque viverra mauris in aliquam sem fringilla. Lectus vestibulum mattis ullamcorper velit sed. Amet commodo nulla facilisi nullam vehicula ipsum. Iaculis eu non diam phasellus vestibulum lorem. Felis bibendum ut tristique et egestas. Lobortis mattis aliquam faucibus purus in massa. Nisi vitae suscipit tellus mauris a diam maecenas sed. Velit sed ullamcorper morbi tincidunt ornare massa.\n\nUt pharetra sit amet aliquam id diam maecenas ultricies mi. Dolor sit amet consectetur adipiscing elit pellentesque habitant morbi tristique. Consectetur adipiscing elit pellentesque habitant. Vel orci porta non pulvinar. Gravida cum sociis natoque penatibus et magnis. Eget egestas purus viverra accumsan in nisl nisi scelerisque. Erat nam at lectus urna duis convallis. Bibendum est ultricies integer quis auctor. Enim ut tellus elementum sagittis vitae et leo duis. Tellus elementum sagittis vitae et leo duis. Sem fringilla ut morbi tincidunt.\n\nEgestas diam in arcu cursus euismod quis viverra. Amet luctus venenatis lectus magna fringilla urna porttitor. Egestas sed sed risus pretium quam. Turpis massa tincidunt dui ut ornare. Convallis tellus id interdum velit laoreet id donec ultrices. Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Rhoncus urna neque viverra justo nec ultrices. Sapien pellentesque habitant morbi tristique senectus et. Phasellus vestibulum lorem sed risus ultricies tristique nulla aliquet. Odio ut enim blandit volutpat maecenas volutpat blandit. Vulputate eu scelerisque felis imperdiet proin fermentum leo vel. Vitae ultricies leo integer malesuada nunc vel risus. Auctor elit sed vulputate mi sit amet mauris commodo quis.\n\nTurpis in eu mi bibendum neque egestas congue quisque egestas. Tincidunt praesent semper feugiat nibh. Ante in nibh mauris cursus mattis molestie a. Urna porttitor rhoncus dolor purus. Feugiat in fermentum posuere urna nec tincidunt. Pellentesque massa placerat duis ultricies lacus sed turpis tincidunt. Amet dictum sit amet justo donec enim diam vulputate ut. Egestas purus viverra accumsan in. Elementum sagittis vitae et leo. Euismod quis viverra nibh cras pulvinar mattis nunc. Ultricies mi eget mauris pharetra et ultrices. Mauris vitae ultricies leo integer malesuada nunc vel. Justo laoreet sit amet cursus sit. Vestibulum lectus mauris ultrices eros in cursus. Nunc congue nisi vitae suscipit tellus mauris a.", - "compressedBase64TextJava": "8ldMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXRbAPICZSBtYWduYSBhbGlxdWEuIFQ0APNgb3JjaSBldSBsb2JvcnRpcyBlbGVtZW50dW0gbmliaC4gTmliaCB0ZWxsdXMgbW9sZXN0aWUgbnVuYyBub24gYmxhbmRpdC4gVmFyaXVzIHF1YW0gcXVpc3F1ZSBpZCBkaWFtIHZlbCBxdWFtLiBT3wADhgAVbSMA8RptYWVjZW5hcyB1bHRyaWNpZXMgbWkgZWdldC4gRXJhdCBwZWxsZW50ZVkABxABUGNvbW1vCwEQbDoBkHQgaW1wZXJkafYA8wl1aSBhY2N1bXNhbi4gU3VzcGVuZGlzc2VkAOBlcyBncmF2aWRhIGRpY/EA4GZ1c2NlIHV0IHBsYWNldgABHgHwEm51bGxhLiBFdCBtYWxlc3VhZGEgZmFtZXMgYWMgdHVycDYB4Gdlc3RhcyBpbnRlZ2VyEAAD5QAjZXRJAfYOVml0YWUgcHVydXMgZmF1Y2lidXMgb3JuYXJlIHOeALQuIFVsbGFtY29ycEgAAYEAwCBmYWNpbGlzaSBldFUBgGRpZ25pc3NpCgADdAHgIGVuaW0uIFZvbHV0cGGvAANVARR2EgADrwECmgCkYW0uIEN1cnN1c8YAcW1hc3NhIHRIAgBGAjBkdWkPAQKlADIuIEHPAQVXAACGAgBzAAAkAOVzZW0gdml2ZXJyYS4KCugBQG5pc2zeADBjaXB3AAbIAsNiaWJlbmR1bSBlc3SRAQD1AQNAAfAVLiBQcmV0aXVtIHZ1bHB1dGF0ZSBzYXBpZW4gbmVjIHNhZ2l0rQICzQIAkwADmQHwDS4gQ29udmFsbGlzIGFlbmVhbiBldCB0b3J0b3IfAiByae8AA6kACJAAoWF0IGluLiBFdWlSA3BsYWNpbmlhMwABWgECOADwB3NlZC4gRGlzIHBhcnR1cmllbnQgbW+WAlEgbmFzY6wDYXJpZGljdS4DADIDQGF1cmlxAAD8AQXcAgUvAyBkdagAGXTtAxFsFQSyZG9uZWMuIFVybmFuA0JpZCBjrQGmbWV0dXMuIFNlZEgCA4cCIGluzAMmbWlfASBuZTEDBJ8Ck2Nvbmd1ZS4gR/kCY2luIGZlcvAD8ABldCBzb2xsaWNpdHVkaW7eAgAAAwJqAADsAQIFARNwmgECQQIQTgoEYnNjZWxlcvUDBFwBA/oAAEgAAXIEEW0jAmFmcmluZ2lQA4BMZWN0dXMgdlIEQGJ1bHXGAQHVAQBvAwQAAxB28AQA7wRQLiBBbWUpAQLvAwsTAwEPAFBtIHZlaHwBEmFTBWAuIElhY3UKAiFlda0EASkDYHBoYXNlbKABB3oAAXQBQC4gRmUuAAU8AZF1dCB0cmlzdGlDARB01QMA5QM0LiBMLQUDsgAEhwIF1wMC5gMiaW5SAzAuIE64AwIFAgUNAwRUBQIoAQCFBBBhAwEDswMBawIUVv4ACRQBV21vcmJppgMCnwMDawDVCgpVdCBwaGFyZXRyYU8GBYQBD3AFCjkuIESFBgmXAgd0BQGWAAmRBWFoYWJpdGEOAwGcAAQ2AQGPAw/HBgUK1AUEQwAB9gABeQJhIHBvcnRhugGGcHVsdmluYXK6AvAAY3VtIHNvY2lpcyBuYXRvogFAcGVuYUsCEHOsAQDtBlBpcy4gRYkFBP8CApcBBKICBB0GMiBpbqgEEG6mAQfMAgN7BjBuYW2kAxJssAIQdZIDAbgDFGNqBD8uIELOBAoCnQWTYXVjdG9yLiBFMgUDAAIGcAcF1gQCKQIQZXMAEG/HBhBzrgcBswIPLQATGFNpAwCdBQOWAQTYBUIuCgpFywIC0QUApAM0cmN1YAQTZQQFAfkEAy0BA38DI2x1tAMRbmwBFHMVAQBuARZh3QMCJQEAvwEidGn0AANvAABGBAAEAA9KBAESVEoHATIDBqwAAAABAMMAAuUCAVACA98FA0ABIWlkdQcQckwGAi4EcWxhb3JlZXTsAgBGBQNfBgB3BQT3AACEAAAEAA6IAAdxBgZiBwmfB1RSaG9uYwkCAl8FAyUBYSBqdXN0b6IGAusFAHMAElO3Bg8vAxJCIHNlbmYCX2V0LiBQqgQGABEFA7wAAmkAADsHBqsEAQ4FAvMDAEgAQE9kaW9DARBleQIEAggFEwgFcgQFEgADIwA1LiBWfAcoZXUYAyEgZigFBmsJOXByb0oGALgCNHZlbPQIBqQAABkAA+MHB00JEG5EBgAlCgHTADEuIEEqAwLTCQCmAQYECCZtadMEA2EGBBIGAK4CMy4KCkYCDwkHEwGZAwA7BAMhBDQuIFQkA2AgcHJhZXPhByBzZVMKcCBmZXVnaWHSCAAWC0JBbnRlOAQkYmjDBQSfBwLGBgUsCxNhxgcFDwMjIHJCAgLzCwGVBAB8BgJgAAlJAXJwb3N1ZXJlUAMA+ggFnAk4LiBQEgsCNgMFuAoBoAQHdwEQYbECAEsBAygIB0cAAVcHAwELBH4MA8kCAYQIAVUKAigEBogBEHWXCwPUAwHAAAT8CQVyCwJOCQVMDA/cBAIGbwkAvQEFQwABVAEhY3JbAAL3BQRUAQApAgAgCwsjDASBAQX3BidldPQDEk1hBwJVBQcUAQ+LAgoxLiBKzAMETAQFGgED5QERcyADBrsIBQgFAe8JAmYAYWVzIGVyb4wCAjYAAy4JAoUJAHMGDxQICVBpcyBhLg==", - "compressedBase64TextJavaScript": "8VhMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgWwDyAmUgbWFnbmEgYWxpcXVhLiBUNADzYG9yY2kgZXUgbG9ib3J0aXMgZWxlbWVudHVtIG5pYmguIE5pYmggdGVsbHVzIG1vbGVzdGllIG51bmMgbm9uIGJsYW5kaXQuIFZhcml1cyBxdWFtIHF1aXNxdWUgaWQgZGlhbSB2ZWwgcXVhbS4gU98AA4YAFW0jAPEabWFlY2VuYXMgdWx0cmljaWVzIG1pIGVnZXQuIEVyYXQgcGVsbGVudGVZAAcQAVBjb21tbwsBEGxbAPMWdCBpbXBlcmRpZXQgZHVpIGFjY3Vtc2FuLiBTdXNwZW5kaXNzZWQA4GVzIGdyYXZpZGEgZGlj8QBQZnVzY2U7AVBwbGFjZXYAAR4B8BJudWxsYS4gRXQgbWFsZXN1YWRhIGZhbWVzIGFjIHR1cnA2AeFnZXN0YXMgaW50ZWdlcroAAuUAI2V0SQH2DlZpdGFlIHB1cnVzIGZhdWNpYnVzIG9ybmFyZSBzngC0LiBVbGxhbWNvcnBIAAGBAPAJIGZhY2lsaXNpIGV0aWFtIGRpZ25pc3NpCgADdAHgIGVuaW0uIFZvbHV0cGGvAANVARR2EgADrwECmgCkYW0uIEN1cnN1c8YAcW1hc3NhIHRIAiJ1bkMBI3V0pQBBLiBBIM8BBawBAIYCAHMAADMB8ABzZW0gdml2ZXJyYS4KClONARFt+wAgc2zeADBjaXATAAbIAsNiaWJlbmR1bSBlc3SRAQD1AQNAAfAVLiBQcmV0aXVtIHZ1bHB1dGF0ZSBzYXBpZW4gbmVjIHNhZ2l0rQICzQIWbZkB8AMuIENvbnZhbGxpcyBhZW5lYW4BA8B0b3J0b3IgYXQgcmnvAAOpAAhYA6FhdCBpbi4gRXVpUgNwbGFjaW5pYTMAQ3F1aXM4APAHc2VkLiBEaXMgcGFydHVyaWVudCBtb5YCUSBuYXNjrANhcmlkaWN1LgMAMgNxYXVyaXMgdvwBBdwCFC4vAxBkXAApYXTtAxFsFQSyZG9uZWMuIFVybmFuA0JpZCBjrQGmbWV0dXMuIFNlZEgCA4cCIGluzAM1bWkgXwFQbmVxdWWPAgGfApNjb25ndWUuIEf5AmNpbiBmZXLwA/AAZXQgc29sbGljaXR1ZGlu3gIAAAMCagAA7AECPQETcJoBAOsDMC4gTgoEcXNjZWxlcmmcAwRcARJt+gAASAABcgQgbSAjAmFmcmluZ2lQA4BMZWN0dXMgdlIEQGJ1bHXGAQHVAQBvAwQAAxB28AQA7wQwLiBBUAIE7wMLEwMBDwBQbSB2ZWh8ARJhUwVgLiBJYWN1CgIwZXUgrQQBvgJCcGhhc84EB3oAAXQBQC4gRmUuAAU8AZF1dCB0cmlzdGlDARR0RgE0LiBMLQUhbWGyAASHAgXXAwLmAzFpbiBSAwBFBSNzaQUCMnN1cw0DBFQFAigBAIUEEGEDAQOzAwFrAhRW/gAYIBQBV21vcmJppgMDRAQCawDVCgpVdCBwaGFyZXRyYU8GBPEDIyBpkwUFxAMFlAJpIG1pLiBEhQYJlwIHdAUBlgAJkQVhaGFiaXRhDgMBnAAENgEBjwMPxwYFCtQFBEMAYC4gVmVsIHkCYSBwb3J0YboBhnB1bHZpbmFyugLwAGN1bSBzb2NpaXMgbmF0b6IBUXBlbmF0VgUQZfwEAB8FVS4gRWdluQEDfQUEogIEHQaAIGluIG5pc2wFACdpIMwCA3sGMG5hbQgEEmywAhB1kgMBuAMUY2oEPy4gQs4ECgERB9AgYXVjdG9yLiBFbmltMgUDAAIGcAcF1gQCLgRgZXQgbGVvxwYQc64HAYEHDy0AE0VTZW0gaQMAawALMgJDLgoKRbAGARMDAKQDNHJjdWAEE2UEBQH5BAMtAQN/AyNsdbQDEW5sASNzIBUBAlsIB3QAACUBAL8BInRp9AADbwAARgQABAAPSgQBElRKBwHHAgfeAgDHBweEBgbfBQNAASFpZHUHEHJMBgIuBHFsYW9yZWV07AIARgUDXwYhZXMOAgEIBQCEAAAEAA6IAAdxBgZiBwmfB4FSaG9uY3VzIAkCAl8FAyUBYSBqdXN0b6IGAlcDAHMAElO3Bg8vAxJCIHNlbmYCAPgIH1CqBAYAEQUDkwYCaQAAOwcGqwQBDgUC8wMASABAT2RpbwYCAasHBAIIBRMIBQoEBRIAAyMANS4gVnwHKGV1GAMhIGYoBQZrCTlwcm9KBgC4AlJ2ZWwuIPQIBqQAABkAA+MHBrQHAuAGMnZlbNMAMS4gQSoDAesKAeoABgQIJm1p0wQDYQYEEgYArgIzLgoKRgIPCQcTAZkDADsEEmWgAjUuIFT8CFBwcmFlc+EHIHNlUwp0IGZldWdpYc0JQkFudGU4BDRiaCCKAAOfBwIUBgUsCxNhxgcFDwMjIHJCAgGYCwKVBAB8BgJgAAlJAXRwb3N1ZXJlbAIWYxgDOC4gUBILAjYDBbgKAaAEB3cBEGGxAgDxAgMoCAXjCQPYAwMBCwR+DAPJAgGECAFVCgL5CQaIARB1lwsCNAECwAAE/AkFcgsCTgkFTAwP3AQCBm8JAL0BBUMAAHgMZCBjcmFzIPcFEyBoBwB3DAAgCwsjDASBAQX3BhRlUwoAgQMSTWEHAlUFBxQBIWVvOQQArgsG2AsAYgAAsAwxLiBKzAMETAQFGgEDhAkgc2n0DAa7CAUIBQHvCQJmAGBlcyBlcm8UDANaBQMuCQKFCQJuBgKWAAkUCMB1cyBtYXVyaXMgYS4=", - "compressedBase64TextRust": "8ldMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXRbAPICZSBtYWduYSBhbGlxdWEuIFQ0APNgb3JjaSBldSBsb2JvcnRpcyBlbGVtZW50dW0gbmliaC4gTmliaCB0ZWxsdXMgbW9sZXN0aWUgbnVuYyBub24gYmxhbmRpdC4gVmFyaXVzIHF1YW0gcXVpc3F1ZSBpZCBkaWFtIHZlbCBxdWFtLiBT3wADhgAVbSMA8RptYWVjZW5hcyB1bHRyaWNpZXMgbWkgZWdldC4gRXJhdCBwZWxsZW50ZVkABxABUGNvbW1vCwEQbFsAkHQgaW1wZXJkafYA8wl1aSBhY2N1bXNhbi4gU3VzcGVuZGlzc2VkAOBlcyBncmF2aWRhIGRpY/EAUGZ1c2NlOwFQcGxhY2V2AAEeAfEkbnVsbGEuIEV0IG1hbGVzdWFkYSBmYW1lcyBhYyB0dXJwaXMgZWdlc3RhcyBpbnRlZ2VyugAC5QAjZXRJAfYOVml0YWUgcHVydXMgZmF1Y2lidXMgb3JuYXJlIHOeALQuIFVsbGFtY29ycEgAAYEAwCBmYWNpbGlzaSBldFUBgGRpZ25pc3NpCgBQYW0gcXW8AcBuaW0uIFZvbHV0cGGvAANVARR2EgADrwECmgCkYW0uIEN1cnN1c8YAcW1hc3NhIHRIAiJ1bkMBEHUGAQClADIuIEHPAQVXAACGAkBlbmltMwHwAHNlbSB2aXZlcnJhLgoKU2QAEW37ACBzbN4AMGNpcBMABrgBw2JpYmVuZHVtIGVzdJEBAPUBA0AB8BUuIFByZXRpdW0gdnVscHV0YXRlIHNhcGllbiBuZWMgc2FnaXStAgLNAgCTAAOZAfANLiBDb252YWxsaXMgYWVuZWFuIGV0IHRvcnRvch8CIHJp7wADqQAISAKhYXQgaW4uIEV1aVIDcGxhY2luaWEzAAFaAQI4APAHc2VkLiBEaXMgcGFydHVyaWVudCBtb5YC8QEgbmFzY2V0dXIgcmlkaWN1LgMABABAYXVyaXEAAPwBBdwCBS8DEGS2ASlhdO0DEWwVBPIGZG9uZWMuIFVybmEgbnVuYyBpZCBjrQGmbWV0dXMuIFNlZEgCA4cCIGluzAMmbWlfASBuZTEDBJ8Ck2Nvbmd1ZS4gR/kCY2luIGZlcvAD8ABldCBzb2xsaWNpdHVkaW7eAgAAAwJqAADsAQIFARNwmgECQQIQTpwAYnNjZWxlcvUDBFwBA/oAAEgAAXIEEW0jAmFmcmluZ2lQA4BMZWN0dXMgdlIEQGJ1bHXGAQHVAQBvAwQAAxB28AQCeAEQQVACBO8DCxMDAQ8AUG0gdmVofAESYVMFYC4gSWFjdQoCYmV1IG5vbr4CYHBoYXNlbKABB3oAAXQBQC4gRmUuAAU8AZF1dCB0cmlzdGlDARB0jwR0c3Rhcy4gTC0FA7IABIcCBdcDAuYDImluUgMwLiBOuAMCBQIFDQMEVAUCKAEAhQQQYQMBA7MDAfMAFFb+AAkUAVdtb3JiaaYDAp8DA2sA1QoKVXQgcGhhcmV0cmFPBgWEAQ9wBQo5LiBEhQYJlwIHLAMBlgAJkQVhaGFiaXRhDgMBnAAENgEBjwMPxwYFCtQFBEMAAfYAAXkCYSBwb3J0YboBhnB1bHZpbmFyugLwAGN1bSBzb2NpaXMgbmF0b6IBQHBlbmFLAhBzrAEA7QZmaXMuIEVnuQEDfQUEogIEHQYyIGluqAQQbqYBB8wCA3sGMG5hbQgEEmywAhB1kgMBuAMUY2oEPy4gQs4ECgKdBZNhdWN0b3IuIEUyBQMAAgZwBwXWBAIpAhBlcwAQb4QFEHOuBwGzAg8tABMYU2kDAJ0FA5YBBNgFQi4KCkXLAgITAwCkAzRyY3VgBBNlBAUB+QQDLQEDfwMjbHW0AxFubAEUcxUBAG4BFmHdAwIlAQC/ASJ0afQAA28AAEYEAAQAD0oEARJUSgcBMgMGrAAAAAEAwwAC5QIBUAID3wUDQAEhaWQ1BhByTAYCLgRwbGFvcmVldDIFAUYFA18GAHcFBPcAAIQAAAQADogAB3EGBmIHCZ8HVFJob25jCQICXwUDJQFhIGp1c3RvogYC6wUAcwASU7cGDy8DEkIgc2VuZgJfZXQuIFCqBAYAEQUDvAACaQAAOwcGqwQBDgUC8wMASABAT2Rpb0MBEGV5AgQCCAUTCAVyBAUSAAMjADUuIFZ8ByhldRgDISBmKAUGawk5cHJvSgYAuAI0dmVs9AgGpAAAGQAArgEAIwkFtAcC4AYydmVs0wAxLiBBKgMC0wkApgEGBAgmbWnTBANhBgQSBgCuAjMuCgpGAg8JBxMBmQMAOwQDIAc0LiBUJANgIHByYWVz4Qcgc2VTCnQgZmV1Z2lhzQlCQW50ZTgEJGJowwUEnwcCxgYFLAsTYcYHBQ8DIyByQgIRZG4FASwGAHwGAmAACUkBcnBvc3VlcmVQAwD6CAWcCTguIFCBBQI2AwW4CgGgBAd3ARBhsQIASwEDKAgHRwABVwcDAQsEfgwDyQICPgMBNwIBnQYGiAEQdZcLA9QDAcAABPwJBXILAk4JBUwMD9wEAgZvCQC9AQVDAAFUASFjcrAFAvcFBFQBACkCACALCyMMBIEBBfcGJ2V09AMfTYMJAg+LAgwxLiBKzAMETAQFGgED5QERcyADBrsIBQgFAWwAAnoBYWVzIGVyb4wCAjYAAy4JAoUJAHMGDxQICGByaXMgYS4=" + "uncompressedText" : "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Tempor orci eu lobortis elementum nibh. Nibh tellus molestie nunc non blandit. Varius quam quisque id diam vel quam. Sit amet aliquam id diam maecenas ultricies mi eget. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. Suspendisse ultrices gravida dictum fusce ut placerat orci nulla. Et malesuada fames ac turpis egestas integer eget aliquet nibh. Vitae purus faucibus ornare suspendisse. Ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Volutpat maecenas volutpat blandit aliquam. Cursus turpis massa tincidunt dui ut ornare. A diam maecenas sed enim ut sem viverra.\n\nSit amet nisl suscipit adipiscing bibendum est ultricies integer. Pretium vulputate sapien nec sagittis aliquam malesuada. Convallis aenean et tortor at risus viverra adipiscing at in. Euismod lacinia at quis risus sed. Dis parturient montes nascetur ridiculus mus mauris vitae ultricies. Varius duis at consectetur lorem donec. Urna nunc id cursus metus. Sed faucibus turpis in eu mi bibendum neque egestas congue. Gravida in fermentum et sollicitudin ac orci. Sed sed risus pretium quam. Nunc scelerisque viverra mauris in aliquam sem fringilla. Lectus vestibulum mattis ullamcorper velit sed. Amet commodo nulla facilisi nullam vehicula ipsum. Iaculis eu non diam phasellus vestibulum lorem. Felis bibendum ut tristique et egestas. Lobortis mattis aliquam faucibus purus in massa. Nisi vitae suscipit tellus mauris a diam maecenas sed. Velit sed ullamcorper morbi tincidunt ornare massa.\n\nUt pharetra sit amet aliquam id diam maecenas ultricies mi. Dolor sit amet consectetur adipiscing elit pellentesque habitant morbi tristique. Consectetur adipiscing elit pellentesque habitant. Vel orci porta non pulvinar. Gravida cum sociis natoque penatibus et magnis. Eget egestas purus viverra accumsan in nisl nisi scelerisque. Erat nam at lectus urna duis convallis. Bibendum est ultricies integer quis auctor. Enim ut tellus elementum sagittis vitae et leo duis. Tellus elementum sagittis vitae et leo duis. Sem fringilla ut morbi tincidunt.\n\nEgestas diam in arcu cursus euismod quis viverra. Amet luctus venenatis lectus magna fringilla urna porttitor. Egestas sed sed risus pretium quam. Turpis massa tincidunt dui ut ornare. Convallis tellus id interdum velit laoreet id donec ultrices. Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Rhoncus urna neque viverra justo nec ultrices. Sapien pellentesque habitant morbi tristique senectus et. Phasellus vestibulum lorem sed risus ultricies tristique nulla aliquet. Odio ut enim blandit volutpat maecenas volutpat blandit. Vulputate eu scelerisque felis imperdiet proin fermentum leo vel. Vitae ultricies leo integer malesuada nunc vel risus. Auctor elit sed vulputate mi sit amet mauris commodo quis.\n\nTurpis in eu mi bibendum neque egestas congue quisque egestas. Tincidunt praesent semper feugiat nibh. Ante in nibh mauris cursus mattis molestie a. Urna porttitor rhoncus dolor purus. Feugiat in fermentum posuere urna nec tincidunt. Pellentesque massa placerat duis ultricies lacus sed turpis tincidunt. Amet dictum sit amet justo donec enim diam vulputate ut. Egestas purus viverra accumsan in. Elementum sagittis vitae et leo. Euismod quis viverra nibh cras pulvinar mattis nunc. Ultricies mi eget mauris pharetra et ultrices. Mauris vitae ultricies leo integer malesuada nunc vel. Justo laoreet sit amet cursus sit. Vestibulum lectus mauris ultrices eros in cursus. Nunc congue nisi vitae suscipit tellus mauris a.", + "compressedBase64TextJava" : "8ldMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXRbAPICZSBtYWduYSBhbGlxdWEuIFQ0APNgb3JjaSBldSBsb2JvcnRpcyBlbGVtZW50dW0gbmliaC4gTmliaCB0ZWxsdXMgbW9sZXN0aWUgbnVuYyBub24gYmxhbmRpdC4gVmFyaXVzIHF1YW0gcXVpc3F1ZSBpZCBkaWFtIHZlbCBxdWFtLiBT3wADhgAVbSMA8RptYWVjZW5hcyB1bHRyaWNpZXMgbWkgZWdldC4gRXJhdCBwZWxsZW50ZVkABxABUGNvbW1vCwEQbDoBkHQgaW1wZXJkafYA8wl1aSBhY2N1bXNhbi4gU3VzcGVuZGlzc2VkAOBlcyBncmF2aWRhIGRpY/EA4GZ1c2NlIHV0IHBsYWNldgABHgHwEm51bGxhLiBFdCBtYWxlc3VhZGEgZmFtZXMgYWMgdHVycDYB4Gdlc3RhcyBpbnRlZ2VyEAAD5QAjZXRJAfYOVml0YWUgcHVydXMgZmF1Y2lidXMgb3JuYXJlIHOeALQuIFVsbGFtY29ycEgAAYEAwCBmYWNpbGlzaSBldFUBgGRpZ25pc3NpCgADdAHgIGVuaW0uIFZvbHV0cGGvAANVARR2EgADrwECmgCkYW0uIEN1cnN1c8YAcW1hc3NhIHRIAgBGAjBkdWkPAQKlADIuIEHPAQVXAACGAgBzAAAkAOVzZW0gdml2ZXJyYS4KCugBQG5pc2zeADBjaXB3AAbIAsNiaWJlbmR1bSBlc3SRAQD1AQNAAfAVLiBQcmV0aXVtIHZ1bHB1dGF0ZSBzYXBpZW4gbmVjIHNhZ2l0rQICzQIAkwADmQHwDS4gQ29udmFsbGlzIGFlbmVhbiBldCB0b3J0b3IfAiByae8AA6kACJAAoWF0IGluLiBFdWlSA3BsYWNpbmlhMwABWgECOADwB3NlZC4gRGlzIHBhcnR1cmllbnQgbW+WAlEgbmFzY6wDYXJpZGljdS4DADIDQGF1cmlxAAD8AQXcAgUvAyBkdagAGXTtAxFsFQSyZG9uZWMuIFVybmFuA0JpZCBjrQGmbWV0dXMuIFNlZEgCA4cCIGluzAMmbWlfASBuZTEDBJ8Ck2Nvbmd1ZS4gR/kCY2luIGZlcvAD8ABldCBzb2xsaWNpdHVkaW7eAgAAAwJqAADsAQIFARNwmgECQQIQTgoEYnNjZWxlcvUDBFwBA/oAAEgAAXIEEW0jAmFmcmluZ2lQA4BMZWN0dXMgdlIEQGJ1bHXGAQHVAQBvAwQAAxB28AQA7wRQLiBBbWUpAQLvAwsTAwEPAFBtIHZlaHwBEmFTBWAuIElhY3UKAiFlda0EASkDYHBoYXNlbKABB3oAAXQBQC4gRmUuAAU8AZF1dCB0cmlzdGlDARB01QMA5QM0LiBMLQUDsgAEhwIF1wMC5gMiaW5SAzAuIE64AwIFAgUNAwRUBQIoAQCFBBBhAwEDswMBawIUVv4ACRQBV21vcmJppgMCnwMDawDVCgpVdCBwaGFyZXRyYU8GBYQBD3AFCjkuIESFBgmXAgd0BQGWAAmRBWFoYWJpdGEOAwGcAAQ2AQGPAw/HBgUK1AUEQwAB9gABeQJhIHBvcnRhugGGcHVsdmluYXK6AvAAY3VtIHNvY2lpcyBuYXRvogFAcGVuYUsCEHOsAQDtBlBpcy4gRYkFBP8CApcBBKICBB0GMiBpbqgEEG6mAQfMAgN7BjBuYW2kAxJssAIQdZIDAbgDFGNqBD8uIELOBAoCnQWTYXVjdG9yLiBFMgUDAAIGcAcF1gQCKQIQZXMAEG/HBhBzrgcBswIPLQATGFNpAwCdBQOWAQTYBUIuCgpFywIC0QUApAM0cmN1YAQTZQQFAfkEAy0BA38DI2x1tAMRbmwBFHMVAQBuARZh3QMCJQEAvwEidGn0AANvAABGBAAEAA9KBAESVEoHATIDBqwAAAABAMMAAuUCAVACA98FA0ABIWlkdQcQckwGAi4EcWxhb3JlZXTsAgBGBQNfBgB3BQT3AACEAAAEAA6IAAdxBgZiBwmfB1RSaG9uYwkCAl8FAyUBYSBqdXN0b6IGAusFAHMAElO3Bg8vAxJCIHNlbmYCX2V0LiBQqgQGABEFA7wAAmkAADsHBqsEAQ4FAvMDAEgAQE9kaW9DARBleQIEAggFEwgFcgQFEgADIwA1LiBWfAcoZXUYAyEgZigFBmsJOXByb0oGALgCNHZlbPQIBqQAABkAA+MHB00JEG5EBgAlCgHTADEuIEEqAwLTCQCmAQYECCZtadMEA2EGBBIGAK4CMy4KCkYCDwkHEwGZAwA7BAMhBDQuIFQkA2AgcHJhZXPhByBzZVMKcCBmZXVnaWHSCAAWC0JBbnRlOAQkYmjDBQSfBwLGBgUsCxNhxgcFDwMjIHJCAgLzCwGVBAB8BgJgAAlJAXJwb3N1ZXJlUAMA+ggFnAk4LiBQEgsCNgMFuAoBoAQHdwEQYbECAEsBAygIB0cAAVcHAwELBH4MA8kCAYQIAVUKAigEBogBEHWXCwPUAwHAAAT8CQVyCwJOCQVMDA/cBAIGbwkAvQEFQwABVAEhY3JbAAL3BQRUAQApAgAgCwsjDASBAQX3BidldPQDEk1hBwJVBQcUAQ+LAgoxLiBKzAMETAQFGgED5QERcyADBrsIBQgFAe8JAmYAYWVzIGVyb4wCAjYAAy4JAoUJAHMGDxQICVBpcyBhLg==", + "compressedBase64TextJavaScript" : "8VhMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgWwDyAmUgbWFnbmEgYWxpcXVhLiBUNADzYG9yY2kgZXUgbG9ib3J0aXMgZWxlbWVudHVtIG5pYmguIE5pYmggdGVsbHVzIG1vbGVzdGllIG51bmMgbm9uIGJsYW5kaXQuIFZhcml1cyBxdWFtIHF1aXNxdWUgaWQgZGlhbSB2ZWwgcXVhbS4gU98AA4YAFW0jAPEabWFlY2VuYXMgdWx0cmljaWVzIG1pIGVnZXQuIEVyYXQgcGVsbGVudGVZAAcQAVBjb21tbwsBEGxbAPMWdCBpbXBlcmRpZXQgZHVpIGFjY3Vtc2FuLiBTdXNwZW5kaXNzZWQA4GVzIGdyYXZpZGEgZGlj8QBQZnVzY2U7AVBwbGFjZXYAAR4B8BJudWxsYS4gRXQgbWFsZXN1YWRhIGZhbWVzIGFjIHR1cnA2AeFnZXN0YXMgaW50ZWdlcroAAuUAI2V0SQH2DlZpdGFlIHB1cnVzIGZhdWNpYnVzIG9ybmFyZSBzngC0LiBVbGxhbWNvcnBIAAGBAPAJIGZhY2lsaXNpIGV0aWFtIGRpZ25pc3NpCgADdAHgIGVuaW0uIFZvbHV0cGGvAANVARR2EgADrwECmgCkYW0uIEN1cnN1c8YAcW1hc3NhIHRIAiJ1bkMBI3V0pQBBLiBBIM8BBawBAIYCAHMAADMB8ABzZW0gdml2ZXJyYS4KClONARFt+wAgc2zeADBjaXATAAbIAsNiaWJlbmR1bSBlc3SRAQD1AQNAAfAVLiBQcmV0aXVtIHZ1bHB1dGF0ZSBzYXBpZW4gbmVjIHNhZ2l0rQICzQIWbZkB8AMuIENvbnZhbGxpcyBhZW5lYW4BA8B0b3J0b3IgYXQgcmnvAAOpAAhYA6FhdCBpbi4gRXVpUgNwbGFjaW5pYTMAQ3F1aXM4APAHc2VkLiBEaXMgcGFydHVyaWVudCBtb5YCUSBuYXNjrANhcmlkaWN1LgMAMgNxYXVyaXMgdvwBBdwCFC4vAxBkXAApYXTtAxFsFQSyZG9uZWMuIFVybmFuA0JpZCBjrQGmbWV0dXMuIFNlZEgCA4cCIGluzAM1bWkgXwFQbmVxdWWPAgGfApNjb25ndWUuIEf5AmNpbiBmZXLwA/AAZXQgc29sbGljaXR1ZGlu3gIAAAMCagAA7AECPQETcJoBAOsDMC4gTgoEcXNjZWxlcmmcAwRcARJt+gAASAABcgQgbSAjAmFmcmluZ2lQA4BMZWN0dXMgdlIEQGJ1bHXGAQHVAQBvAwQAAxB28AQA7wQwLiBBUAIE7wMLEwMBDwBQbSB2ZWh8ARJhUwVgLiBJYWN1CgIwZXUgrQQBvgJCcGhhc84EB3oAAXQBQC4gRmUuAAU8AZF1dCB0cmlzdGlDARR0RgE0LiBMLQUhbWGyAASHAgXXAwLmAzFpbiBSAwBFBSNzaQUCMnN1cw0DBFQFAigBAIUEEGEDAQOzAwFrAhRW/gAYIBQBV21vcmJppgMDRAQCawDVCgpVdCBwaGFyZXRyYU8GBPEDIyBpkwUFxAMFlAJpIG1pLiBEhQYJlwIHdAUBlgAJkQVhaGFiaXRhDgMBnAAENgEBjwMPxwYFCtQFBEMAYC4gVmVsIHkCYSBwb3J0YboBhnB1bHZpbmFyugLwAGN1bSBzb2NpaXMgbmF0b6IBUXBlbmF0VgUQZfwEAB8FVS4gRWdluQEDfQUEogIEHQaAIGluIG5pc2wFACdpIMwCA3sGMG5hbQgEEmywAhB1kgMBuAMUY2oEPy4gQs4ECgERB9AgYXVjdG9yLiBFbmltMgUDAAIGcAcF1gQCLgRgZXQgbGVvxwYQc64HAYEHDy0AE0VTZW0gaQMAawALMgJDLgoKRbAGARMDAKQDNHJjdWAEE2UEBQH5BAMtAQN/AyNsdbQDEW5sASNzIBUBAlsIB3QAACUBAL8BInRp9AADbwAARgQABAAPSgQBElRKBwHHAgfeAgDHBweEBgbfBQNAASFpZHUHEHJMBgIuBHFsYW9yZWV07AIARgUDXwYhZXMOAgEIBQCEAAAEAA6IAAdxBgZiBwmfB4FSaG9uY3VzIAkCAl8FAyUBYSBqdXN0b6IGAlcDAHMAElO3Bg8vAxJCIHNlbmYCAPgIH1CqBAYAEQUDkwYCaQAAOwcGqwQBDgUC8wMASABAT2RpbwYCAasHBAIIBRMIBQoEBRIAAyMANS4gVnwHKGV1GAMhIGYoBQZrCTlwcm9KBgC4AlJ2ZWwuIPQIBqQAABkAA+MHBrQHAuAGMnZlbNMAMS4gQSoDAesKAeoABgQIJm1p0wQDYQYEEgYArgIzLgoKRgIPCQcTAZkDADsEEmWgAjUuIFT8CFBwcmFlc+EHIHNlUwp0IGZldWdpYc0JQkFudGU4BDRiaCCKAAOfBwIUBgUsCxNhxgcFDwMjIHJCAgGYCwKVBAB8BgJgAAlJAXRwb3N1ZXJlbAIWYxgDOC4gUBILAjYDBbgKAaAEB3cBEGGxAgDxAgMoCAXjCQPYAwMBCwR+DAPJAgGECAFVCgL5CQaIARB1lwsCNAECwAAE/AkFcgsCTgkFTAwP3AQCBm8JAL0BBUMAAHgMZCBjcmFzIPcFEyBoBwB3DAAgCwsjDASBAQX3BhRlUwoAgQMSTWEHAlUFBxQBIWVvOQQArgsG2AsAYgAAsAwxLiBKzAMETAQFGgEDhAkgc2n0DAa7CAUIBQHvCQJmAGBlcyBlcm8UDANaBQMuCQKFCQJuBgKWAAkUCMB1cyBtYXVyaXMgYS4=", + "compressedBase64TextRust" : "8ldMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXRbAPICZSBtYWduYSBhbGlxdWEuIFQ0APNgb3JjaSBldSBsb2JvcnRpcyBlbGVtZW50dW0gbmliaC4gTmliaCB0ZWxsdXMgbW9sZXN0aWUgbnVuYyBub24gYmxhbmRpdC4gVmFyaXVzIHF1YW0gcXVpc3F1ZSBpZCBkaWFtIHZlbCBxdWFtLiBT3wADhgAVbSMA8RptYWVjZW5hcyB1bHRyaWNpZXMgbWkgZWdldC4gRXJhdCBwZWxsZW50ZVkABxABUGNvbW1vCwEQbFsAkHQgaW1wZXJkafYA8wl1aSBhY2N1bXNhbi4gU3VzcGVuZGlzc2VkAOBlcyBncmF2aWRhIGRpY/EAUGZ1c2NlOwFQcGxhY2V2AAEeAfEkbnVsbGEuIEV0IG1hbGVzdWFkYSBmYW1lcyBhYyB0dXJwaXMgZWdlc3RhcyBpbnRlZ2VyugAC5QAjZXRJAfYOVml0YWUgcHVydXMgZmF1Y2lidXMgb3JuYXJlIHOeALQuIFVsbGFtY29ycEgAAYEAwCBmYWNpbGlzaSBldFUBgGRpZ25pc3NpCgBQYW0gcXW8AcBuaW0uIFZvbHV0cGGvAANVARR2EgADrwECmgCkYW0uIEN1cnN1c8YAcW1hc3NhIHRIAiJ1bkMBEHUGAQClADIuIEHPAQVXAACGAkBlbmltMwHwAHNlbSB2aXZlcnJhLgoKU2QAEW37ACBzbN4AMGNpcBMABrgBw2JpYmVuZHVtIGVzdJEBAPUBA0AB8BUuIFByZXRpdW0gdnVscHV0YXRlIHNhcGllbiBuZWMgc2FnaXStAgLNAgCTAAOZAfANLiBDb252YWxsaXMgYWVuZWFuIGV0IHRvcnRvch8CIHJp7wADqQAISAKhYXQgaW4uIEV1aVIDcGxhY2luaWEzAAFaAQI4APAHc2VkLiBEaXMgcGFydHVyaWVudCBtb5YC8QEgbmFzY2V0dXIgcmlkaWN1LgMABABAYXVyaXEAAPwBBdwCBS8DEGS2ASlhdO0DEWwVBPIGZG9uZWMuIFVybmEgbnVuYyBpZCBjrQGmbWV0dXMuIFNlZEgCA4cCIGluzAMmbWlfASBuZTEDBJ8Ck2Nvbmd1ZS4gR/kCY2luIGZlcvAD8ABldCBzb2xsaWNpdHVkaW7eAgAAAwJqAADsAQIFARNwmgECQQIQTpwAYnNjZWxlcvUDBFwBA/oAAEgAAXIEEW0jAmFmcmluZ2lQA4BMZWN0dXMgdlIEQGJ1bHXGAQHVAQBvAwQAAxB28AQCeAEQQVACBO8DCxMDAQ8AUG0gdmVofAESYVMFYC4gSWFjdQoCYmV1IG5vbr4CYHBoYXNlbKABB3oAAXQBQC4gRmUuAAU8AZF1dCB0cmlzdGlDARB0jwR0c3Rhcy4gTC0FA7IABIcCBdcDAuYDImluUgMwLiBOuAMCBQIFDQMEVAUCKAEAhQQQYQMBA7MDAfMAFFb+AAkUAVdtb3JiaaYDAp8DA2sA1QoKVXQgcGhhcmV0cmFPBgWEAQ9wBQo5LiBEhQYJlwIHLAMBlgAJkQVhaGFiaXRhDgMBnAAENgEBjwMPxwYFCtQFBEMAAfYAAXkCYSBwb3J0YboBhnB1bHZpbmFyugLwAGN1bSBzb2NpaXMgbmF0b6IBQHBlbmFLAhBzrAEA7QZmaXMuIEVnuQEDfQUEogIEHQYyIGluqAQQbqYBB8wCA3sGMG5hbQgEEmywAhB1kgMBuAMUY2oEPy4gQs4ECgKdBZNhdWN0b3IuIEUyBQMAAgZwBwXWBAIpAhBlcwAQb4QFEHOuBwGzAg8tABMYU2kDAJ0FA5YBBNgFQi4KCkXLAgITAwCkAzRyY3VgBBNlBAUB+QQDLQEDfwMjbHW0AxFubAEUcxUBAG4BFmHdAwIlAQC/ASJ0afQAA28AAEYEAAQAD0oEARJUSgcBMgMGrAAAAAEAwwAC5QIBUAID3wUDQAEhaWQ1BhByTAYCLgRwbGFvcmVldDIFAUYFA18GAHcFBPcAAIQAAAQADogAB3EGBmIHCZ8HVFJob25jCQICXwUDJQFhIGp1c3RvogYC6wUAcwASU7cGDy8DEkIgc2VuZgJfZXQuIFCqBAYAEQUDvAACaQAAOwcGqwQBDgUC8wMASABAT2Rpb0MBEGV5AgQCCAUTCAVyBAUSAAMjADUuIFZ8ByhldRgDISBmKAUGawk5cHJvSgYAuAI0dmVs9AgGpAAAGQAArgEAIwkFtAcC4AYydmVs0wAxLiBBKgMC0wkApgEGBAgmbWnTBANhBgQSBgCuAjMuCgpGAg8JBxMBmQMAOwQDIAc0LiBUJANgIHByYWVz4Qcgc2VTCnQgZmV1Z2lhzQlCQW50ZTgEJGJowwUEnwcCxgYFLAsTYcYHBQ8DIyByQgIRZG4FASwGAHwGAmAACUkBcnBvc3VlcmVQAwD6CAWcCTguIFCBBQI2AwW4CgGgBAd3ARBhsQIASwEDKAgHRwABVwcDAQsEfgwDyQICPgMBNwIBnQYGiAEQdZcLA9QDAcAABPwJBXILAk4JBUwMD9wEAgZvCQC9AQVDAAFUASFjcrAFAvcFBFQBACkCACALCyMMBIEBBfcGJ2V09AMfTYMJAg+LAgwxLiBKzAMETAQFGgED5QERcyADBrsIBQgFAWwAAnoBYWVzIGVyb4wCAjYAAy4JAoUJAHMGDxQICGByaXMgYS4=" }, { - "uncompressedText": "ö()€ Τούτανοτα Тутасота 图塔诺塔 ツタノタ نخاعö()€ Τούτανοτα Тутасота 图塔诺塔 ツタノタ ö()€ Τούτανοτα Тутасота 图塔诺塔 ツタノタ نخاعنخاع", - "compressedBase64TextJava": "8AfDtigp4oKsIM6kzr/Pjc+EzrHOvc6/CADQINCi0YPRgtCw0YHQvggA/xQg5Zu+5aGU6K+65aGUIOODhOOCv+ODjuOCvyDZhtiu2KfYuU4AMw9GADMElACA2YbYrtin2Lk=", - "compressedBase64TextJavaScript": "8AfDtigp4oKsIM6kzr/Pjc+EzrHOvc6/CADQINCi0YPRgtCw0YHQvggA/xQg5Zu+5aGU6K+65aGUIOODhOOCv+ODjuOCvyDZhtiu2KfYuU4AMw9GADPwAdmG2K7Yp9i52YbYrtin2Lk=", - "compressedBase64TextRust": "8AfDtigp4oKsIM6kzr/Pjc+EzrHOvc6/CADQINCi0YPRgtCw0YHQvggA/xQg5Zu+5aGU6K+65aGUIOODhOOCv+ODjuOCvyDZhtiu2KfYuU4AMw+UADuA2YbYrtin2Lk=" + "uncompressedText" : "ö()€ Τούτανοτα Тутасота 图塔诺塔 ツタノタ نخاعö()€ Τούτανοτα Тутасота 图塔诺塔 ツタノタ ö()€ Τούτανοτα Тутасота 图塔诺塔 ツタノタ نخاعنخاع", + "compressedBase64TextJava" : "8AfDtigp4oKsIM6kzr/Pjc+EzrHOvc6/CADQINCi0YPRgtCw0YHQvggA/xQg5Zu+5aGU6K+65aGUIOODhOOCv+ODjuOCvyDZhtiu2KfYuU4AMw9GADMElACA2YbYrtin2Lk=", + "compressedBase64TextJavaScript" : "8AfDtigp4oKsIM6kzr/Pjc+EzrHOvc6/CADQINCi0YPRgtCw0YHQvggA/xQg5Zu+5aGU6K+65aGUIOODhOOCv+ODjuOCvyDZhtiu2KfYuU4AMw9GADPwAdmG2K7Yp9i52YbYrtin2Lk=", + "compressedBase64TextRust" : "8AfDtigp4oKsIM6kzr/Pjc+EzrHOvc6/CADQINCi0YPRgtCw0YHQvggA/xQg5Zu+5aGU6K+65aGUIOODhOOCv+ODjuOCvyDZhtiu2KfYuU4AMw+UADuA2YbYrtin2Lk=" } ], - "byteArrayEncodingTests": [ + "byteArrayEncodingTests" : [ { - "encodedByteArrayAsHex": "000101", - "byteArraysAsHex": ["01" + "encodedByteArrayAsHex" : "000101", + "byteArraysAsHex" : [ + "01" ], - "encodingError": null + "encodingError" : null }, { - "encodedByteArrayAsHex": "000102000202020003020202000402020202", - "byteArraysAsHex": ["02","0202","020202","02020202" + "encodedByteArrayAsHex" : "000102000202020003020202000402020202", + "byteArraysAsHex" : [ + "02", + "0202", + "020202", + "02020202" ], - "encodingError": null + "encodingError" : null }, { - "encodedByteArrayAsHex": "00ff050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505", - "byteArraysAsHex": ["050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505" + "encodedByteArrayAsHex" : "00ff050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505", + "byteArraysAsHex" : [ + "050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505" ], - "encodingError": null + "encodingError" : null }, { - "encodedByteArrayAsHex": "010006060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606", - "byteArraysAsHex": ["06060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606" + "encodedByteArrayAsHex" : "010006060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606", + "byteArraysAsHex" : [ + "06060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606" ], - "encodingError": null + "encodingError" : null }, { - "encodedByteArrayAsHex": "ffff070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707", - "byteArraysAsHex": ["070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707" + "encodedByteArrayAsHex" : "ffff070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707", + "byteArraysAsHex" : [ + "070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707" ], - "encodingError": null + "encodingError" : null }, { - "encodedByteArrayAsHex": null, - "byteArraysAsHex": ["08080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808" + "encodedByteArrayAsHex" : null, + "byteArraysAsHex" : [ + "08080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808" ], - "encodingError": "byte array is to long for encoding" + "encodingError" : "byte array is to long for encoding" } ], - "hkdfTests": [ + "hkdfTests" : [ { - "saltHex": "11ae625e04fceecb9a65c5f7f574ba98", - "inputKeyMaterialHex": "de5d7e4d0745439537dca003d012b679b5d01767a82ead8d06d335da8ef3ec6187a2fbdf847518b1bf2ea297164cd1921f02f5d8fe1a159827a81106b19f200b", - "infoHex": "985996861729ea81", - "lengthInBytes": 8, - "hkdfHex": "a3780e692c39c0d5" + "saltHex" : "11ae625e04fceecb9a65c5f7f574ba98", + "inputKeyMaterialHex" : "de5d7e4d0745439537dca003d012b679b5d01767a82ead8d06d335da8ef3ec6187a2fbdf847518b1bf2ea297164cd1921f02f5d8fe1a159827a81106b19f200b", + "infoHex" : "985996861729ea81", + "lengthInBytes" : 8, + "hkdfHex" : "a3780e692c39c0d5" }, { - "saltHex": "5bbe32d585678aefc2335eea41aeb568", - "inputKeyMaterialHex": "440496f61434830ad66de163054af0802b935f9cd7d80485b1cd8b2e65a1fe2fc4226d1ddd982873d0247d36c4f4f6e35ee736e39b60a5c95dbf5df09ba431c7", - "infoHex": "38a46f4f7d6ccde8", - "lengthInBytes": 9, - "hkdfHex": "f4444a237a55914894" + "saltHex" : "5bbe32d585678aefc2335eea41aeb568", + "inputKeyMaterialHex" : "440496f61434830ad66de163054af0802b935f9cd7d80485b1cd8b2e65a1fe2fc4226d1ddd982873d0247d36c4f4f6e35ee736e39b60a5c95dbf5df09ba431c7", + "infoHex" : "38a46f4f7d6ccde8", + "lengthInBytes" : 9, + "hkdfHex" : "f4444a237a55914894" }, { - "saltHex": "2380f3a3e6ad534499b824e200da228b", - "inputKeyMaterialHex": "5302c66391c2831d0180e9147b3d5da8e63eb9434e28fc61c2654f0f1ed69e6346fbca8e4c2ac4a178c83f2b69e23479d1a9bc5fbd5b202e62f48fe6eb3a9e73", - "infoHex": "603f4c9ffc2d2423", - "lengthInBytes": 10, - "hkdfHex": "c5e7efc49666344e9d70" + "saltHex" : "2380f3a3e6ad534499b824e200da228b", + "inputKeyMaterialHex" : "5302c66391c2831d0180e9147b3d5da8e63eb9434e28fc61c2654f0f1ed69e6346fbca8e4c2ac4a178c83f2b69e23479d1a9bc5fbd5b202e62f48fe6eb3a9e73", + "infoHex" : "603f4c9ffc2d2423", + "lengthInBytes" : 10, + "hkdfHex" : "c5e7efc49666344e9d70" }, { - "saltHex": "57e8fe95e27db2fb6973da7b388ab505", - "inputKeyMaterialHex": "1effc426c8a94364ba92bec7ffb369787d95508c18d2c615b979c6f31be335a4556473f5c62b5e92b9a03deb7f57724a06decd88e68fa870f8aa13ef80617e23", - "infoHex": "36db26708a7e4b6a", - "lengthInBytes": 11, - "hkdfHex": "08c067a331b11cb10fe79d" + "saltHex" : "57e8fe95e27db2fb6973da7b388ab505", + "inputKeyMaterialHex" : "1effc426c8a94364ba92bec7ffb369787d95508c18d2c615b979c6f31be335a4556473f5c62b5e92b9a03deb7f57724a06decd88e68fa870f8aa13ef80617e23", + "infoHex" : "36db26708a7e4b6a", + "lengthInBytes" : 11, + "hkdfHex" : "08c067a331b11cb10fe79d" } ], - "pqcryptEncryptionTests": [ - { - "privateKyberKey": "0600e9122c5e493156ab4a37ca95f51038645a7c196cad1b1a823d4a6a749a259094a5b705693b50afbbc933e94a5ad58601e7c45e7f78ba01b5170898a3c6214b1706114627bad22169365aa4cdcb21b8bca80e5975d9783f3067b83ad3bb75d1932b002887a783ca325858b344ab5b0b12d83a72662032e20ee1e8555e068ad8057d80db863dab43a674c93ddab369f3a482cca236cb36a7ba0d5b3b2f3bf490463a2ebe6057e7a1bfd79313d76badea6494c0a22dcd015ca0134d3628aec0e30fb8890e21bb17642a30e4f2bd4b97390f78b44885604722b3ca6775cdfb25e49b6cfc2abf2e4094e0a794a671b14bb95c5109515a74cdae618dfe52906b8450e00702924080e9620bc6748f4a5b70e9f105d7cc20ac425f3205901f30578513b18af44a3e83c69ff667a2196f96c3293f108480b4c58c93a738cb951850267fd037641c58976b4b190121698b9bbdf777c1043d5bfa7fb53631d3197a40057aa9a81e615876e7aa615149bff0000de145b9e74945bad39c70431291d718646a411e4b8e83976f0f49a9c24badbf3a2a356bc0d6059d56c51975a90222e39bd12c32d579ab064a36b228960ca908aa32cf5a22334c799280b2a17f378df36b4b4f32cdabbab61878cc302583fb00b99b0b0d36fb822dc7cda50ab9e60a85d0f99bff752fe65739604230f41843d69a7318329de3ca0c0164985ecb3f38b3a9f658b216b94ddac4b10eb90c596a9f6327632a74aeb90a86a4636bf200b299344ed12a791e04566740c8b4702c0362157f7b62c9825318fcb69ea97371ea79b994463af5625a6a00120589b38863dce65d64458153e11359d34f1c498421095044d31904284bce6617a5f4c2ef242164a16753eace78ac1b66734e84791e5d5699c4e6a7a8c038a2220298c8b0d927965e0551e417b6ba53c5689a83a1e9bd2206771ddc9e3f43c1f1f5857d77ca6f7bc70da35b83c0877af4a4d6932416620579730a6bf546c5452c9b40534f59bdd6f59b2e707e4ae4737f7b5a8a5726eac87a2fd59c74c006e9190be8e807b9fa877a4640ce7a6c90b406312a9383b993bc60a3c64b19d6782743d844b2964734773025d3c8ef855499b588f7238a505543bfea6405136430c13317957e21d095554182a8d5ab2cd34f074594c9b065e3848feac3052cbb372f416f0c6ab9e862bfb1845f64dac7ec627d4fe1715a5413fff0cde56373cac83f82dabfc0a19887087920bc1f0dda96daf67470d3bec0c733e494a6a6340031d99fd8c1925edb9ab75b9b4e3c498af656881c8c5da96b13e450bab97605169d75439f4ca54fe7bc4493b4378e5176ef66868fbb8d832b312b89c4793576b0ab871dec5573dc7402892153e184cde931400a9dd8a772012c9ee3d310dd66a9c2d573b71159f73112014108ae84b08ac9ab9bd7084f4378fb3096c5a354e0106ea6e5c74cfc7e31a20f3b49ad9e417cb9ac5e4daa77fbd6133d43781decbf867464df383de6eb4874b156e06769a8b7cfec00a01c08a4b238531cf1ca67e95b723639ee40a60aaa715668655cfc67847a4471e3128924133b461cb64c00bab43892494dfdc43ea9ca59eb1b8e4fa5a71571a1ca689a869536659ac7ab444b6ef298df88315c88516e68942d3612c99602264254cb56ccfd46c03548bfffc0cc4e08087e1cc9efb9097754a544354d44b92f70684880126cd215b28543b5e45ba249e1af6277499537a3cf3959349235f64c7fbfc3b542a876573232d81792fc72cfdee8c6c894bacb7937ba099b8c66ae91d097914623fd882f9cbb204c292682426b2e1752950836421146f439076bfa266278b849f124dd8647010b3c7bfb44d44c9641276e9125ca4ca5738b985ad093280f76b86ad02a0f05100bc7a962ab267bacb059e90298eaaebedb2a2e04376b9a1e8da276842c452173c7f287a434d16b013799ee5c4aa4381746653c9f99bd7eb061a41893e11c9a0273246bd91ab957748214ccd39406f2a28ae8e304d6425bd8e90af0120b5c0cb2290345984c5b1f572a16bc098711797c4aca17952139662f761b214b845e7c922f4f6cbad2f55867fa51d9617826dc89b2604230ac2f2cd170d6f11b6a60cc2e39599c6c7aa7038d7d6588009c7d7412b954c1af33fb616c498a58870749bb7f00205a23f725977f85103e36b8803231edad6e3ed362c8fc25791f95e3ed6f159c2000207a3d869fb4dc894e17b5a7238091d92d3d00746e558e27e1904cf8a23a28b5f50600b7e03c31d21a8e887695649fad3b5aa62210c047bf57bb3c6b9cc30a87563af5ba84ecb82fb8b8851270d9a5129f317092fc6763265c323c1890c372f9ab26e96920df2c960c33c7169307c93361f89a659e8532dc375c5fb740820867c249101bd668ad200244dc03979c785e177b4c78676632bf4ec9c7e66b741296bae5c4c84186c3d407306e044d0595796e2546cad748933ab1eff5513a13c14abc16f108405f32ce1dbc020b5c6172dc910c767366fb1b8caa8d7856cd253a78d1a335c8697a7d647d5e082aaac2c97cc892f9a8678b744e0e812f7d73ce05e0151dd4ca3edc2d73310211b5bc943ab851816c34639c6d905d770b4d5ed269da69382d37b0b5d40f1ea5220a94518363a93501823517c03e7c062d19087444251a335bdd16376034c08692b51fdb505dc4ab6e2c246d23824ac56cfa0cc217ca81d86555a87c37d236b292b15481602dc1570b11cb8809f8a81e1580273a972016797a686b72389b93bc4f61006b46f99f38cc5ea39ca58c813ccfe4922eaa95cffc2188554b8c611bb2136935b416a527a18d2a9f757c9c7a8c019d3163d7e0759ad76207b1665dc98a3cf2c40d65cd87bc54a132baacbc3dbba80373c1571410357268a6af323f55383bef65cf852b67f45cc028e0b2c7847b541a24abeb4a11789bda75497de270f261af2a27a8d1d489d7cc8ae78276a2611c618982f67ca11e0c95df6a076bd85d06c6a41539989381596c91ba9e112efd58ba3428cb79107ce0f66351b45379d506e9b88b7f8691b1b8b1a5b438292b10a10755363960308c63229397cad078c71625928363a515b9803b6e5f053d58ac31033b0f8529c477b760a0bb1b611226a65947a8755c5927c9dfa256d9a6aca1502ad21582ad570be56bcd2a003e1fbb6df98b4dbf38a5ef526dfbb89b582c653c9276a882a64f990bf6f6b6fa2806f01b01db2680f11c0bd7755cc4582146a18f23c1b4e8180d9cf62de225af7a90a3d5a76b305c798452969b8a890db46b1ac2622b30a9bceb1a0b9862e17898a8395b61aba83924b16edc6ac1a0c9a184cc6c44057078670074c891e94bc6fc502cdc3a63587caf788e6495b3baf3c23c5044a7e78c6e466bcf1214edd60e2d38190f74c839950c8556a003269120391647ca656c485d5ee1632a288521b0c7959577bff2987de7c9cd08723b5370d50652ff1a8570489e101788ca07450db5469529ba731319b5915df0103439b4242f9c7741fb144244a9481c9a985155b6e52887265b8355a038b2834af730cb3c33134a36b8e2ce82b529b37b7ea65aa1419822c3b44085310d969577db2bccf61bbf342692fe028c9490081e23a24df61ba50867b08caaf89a0450b40ae30594c1169e7851607b411c1f1c96df3115507ac28d7552bdf192a4234b290b1fcb3850e950cb1f4a41f4939a75751d1f257e70f3739f865456823cc93cc68c649867f1a36fc146499627110467f6f6bd72e58017da73369c10fa319d939bb0aa318181a25c30e35e3cc9a6ed1c067c3044d42358e0e4a8614a3f132415ab416b20d7aa0dba57ee1c0158176ec99231c1161fcb60c5a81b99052c63c3369c6373c1c7e27a0ba652e6709ff0d4a72f01ac1d0749ec9b8b6e59a6d01a514fd7b8ed8b0942302f0877b96267c701eacf9d750eed594c829141a8141a4151493012bbaa9151f9ba2a9f45923a2754fda011c1e408bfbb98507059a5617695c5131a36316ae07aecbb7cb3c828448208aba76313752dba12b73815345d1920edf5b5798c330e75bb03e541197492f87cc25b53cd89d0aa10e67234460b95b2a49046909120a1537870d4909368a1771f29135a7ba77efac196948bee1ace01b156050240ea19aec1cab49320a7174a7897bc565885bbe46032c1f07a7f75a6cf7cca0bec1cecb06861e5bb9080a80093a0c3a0cd6d9a7879e205ded27c8ddc5a3452be8ed7a3378c9f7359bd63e395def09fb4da3d25e89d2480317e669f582b181480aa5cc21e10f21302406dd0e10be42297cc56b5ea9b1e6e68bca20390b28ac1a8e77809ca225303190fb427bf765bf729a3766c7ef9010b06a812812ac0e7f4237db241f0bb4eab38690c1287c487362598c4d89c0a543c8194778eddfa6d5ac28a79e81ff0b3344f06cc875aa00020b4e854b0f4b65d7d2df6723d378fb1f6e87215d052f8c172de4895db053d75dc", - "publicKyberKey": "0600b7e03c31d21a8e887695649fad3b5aa62210c047bf57bb3c6b9cc30a87563af5ba84ecb82fb8b8851270d9a5129f317092fc6763265c323c1890c372f9ab26e96920df2c960c33c7169307c93361f89a659e8532dc375c5fb740820867c249101bd668ad200244dc03979c785e177b4c78676632bf4ec9c7e66b741296bae5c4c84186c3d407306e044d0595796e2546cad748933ab1eff5513a13c14abc16f108405f32ce1dbc020b5c6172dc910c767366fb1b8caa8d7856cd253a78d1a335c8697a7d647d5e082aaac2c97cc892f9a8678b744e0e812f7d73ce05e0151dd4ca3edc2d73310211b5bc943ab851816c34639c6d905d770b4d5ed269da69382d37b0b5d40f1ea5220a94518363a93501823517c03e7c062d19087444251a335bdd16376034c08692b51fdb505dc4ab6e2c246d23824ac56cfa0cc217ca81d86555a87c37d236b292b15481602dc1570b11cb8809f8a81e1580273a972016797a686b72389b93bc4f61006b46f99f38cc5ea39ca58c813ccfe4922eaa95cffc2188554b8c611bb2136935b416a527a18d2a9f757c9c7a8c019d3163d7e0759ad76207b1665dc98a3cf2c40d65cd87bc54a132baacbc3dbba80373c1571410357268a6af323f55383bef65cf852b67f45cc028e0b2c7847b541a24abeb4a11789bda75497de270f261af2a27a8d1d489d7cc8ae78276a2611c618982f67ca11e0c95df6a076bd85d06c6a41539989381596c91ba9e112efd58ba3428cb79107ce0f66351b45379d506e9b88b7f8691b1b8b1a5b438292b10a10755363960308c63229397cad078c71625928363a515b9803b6e5f053d58ac31033b0f8529c477b760a0bb1b611226a65947a8755c5927c9dfa256d9a6aca1502ad21582ad570be56bcd2a003e1fbb6df98b4dbf38a5ef526dfbb89b582c653c9276a882a64f990bf6f6b6fa2806f01b01db2680f11c0bd7755cc4582146a18f23c1b4e8180d9cf62de225af7a90a3d5a76b305c798452969b8a890db46b1ac2622b30a9bceb1a0b9862e17898a8395b61aba83924b16edc6ac1a0c9a184cc6c44057078670074c891e94bc6fc502cdc3a63587caf788e6495b3baf3c23c5044a7e78c6e466bcf1214edd60e2d38190f74c839950c8556a003269120391647ca656c485d5ee1632a288521b0c7959577bff2987de7c9cd08723b5370d50652ff1a8570489e101788ca07450db5469529ba731319b5915df0103439b4242f9c7741fb144244a9481c9a985155b6e52887265b8355a038b2834af730cb3c33134a36b8e2ce82b529b37b7ea65aa1419822c3b44085310d969577db2bccf61bbf342692fe028c9490081e23a24df61ba50867b08caaf89a0450b40ae30594c1169e7851607b411c1f1c96df3115507ac28d7552bdf192a4234b290b1fcb3850e950cb1f4a41f4939a75751d1f257e70f3739f865456823cc93cc68c649867f1a36fc146499627110467f6f6bd72e58017da73369c10fa319d939bb0aa318181a25c30e35e3cc9a6ed1c067c3044d42358e0e4a8614a3f132415ab416b20d7aa0dba57ee1c0158176ec99231c1161fcb60c5a81b99052c63c3369c6373c1c7e27a0ba652e6709ff0d4a72f01ac1d0749ec9b8b6e59a6d01a514fd7b8ed8b0942302f0877b96267c701eacf9d750eed594c829141a8141a4151493012bbaa9151f9ba2a9f45923a2754fda011c1e408bfbb98507059a5617695c5131a36316ae07aecbb7cb3c828448208aba76313752dba12b73815345d1920edf5b5798c330e75bb03e541197492f87cc25b53cd89d0aa10e67234460b95b2a49046909120a1537870d4909368a1771f29135a7ba77efac196948bee1ace01b156050240ea19aec1cab49320a7174a7897bc565885bbe46032c1f07a7f75a6cf7cca0bec1cecb06861e5bb9080a80093a0c3a0cd6d9a7879e205ded27c8ddc5a3452be8ed7a3378c9f7359bd63e395def09fb4da3d25e89d2480317e669f582b181480aa5cc21e10f21302406dd0e10be42297cc56b5ea9b1e6e68bca20390b28ac1a8e77809ca225303190fb427bf765bf729a3766c7ef9010b06a812812ac0e7f4237db241f0bb4eab38690c1287c487362598c4d89c0a543c8194778eddfa6d5ac28a79e81ff0b3344f06cc875aa00020b4e854b0f4b65d7d2df6723d378fb1f6e87215d052f8c172de4895db053d75dc", - "publicX25519Key": "7f026d8a3c45bdac0dac0ece7ac8323b6382143593bb50222fc8b8adabf44f34", - "privateX25519Key": "e841cf14528bbf9cfd7bf35d9fb05430f41c3bb914183aba68b5dc540d1f677d", - "epheremalPublicX25519Key": "d0d36e0fe7a105978084489a7f451c446787c8a16d07afa1c1c0e2af0d60432a", - "epheremalPrivateX25519Key": "a8b123838d20e8eec7f7034e1ed58af0a93ad0ad4e7ae38b8d1b075742c1226d", - "pqMessage": "00207f026d8a3c45bdac0dac0ece7ac8323b6382143593bb50222fc8b8adabf44f340020d0d36e0fe7a105978084489a7f451c446787c8a16d07afa1c1c0e2af0d60432a06205e5bd73befd122d75ddbcb5b0b0c3b3078c7882f90df53ed909350b14e6d4f9a527a4aa50103ab6f970e0f28e7af8e7c7a614ef4d5e92b27efe2a75e7e6fcc1956273f48562ac1da9bfc466073cc99b632aecc024842d8cf654d5d8c786bf4e2d767766fe4fa5683fb087a06a3a50ee68bc63826354aeb9f22b53ecd0e396f5c830eb8a45a931be41279e99b06d359fd98f4be30e5b2b69f3d9262787f865442769af3da0177680fc2bed3176d94079132294f44ec4ea78bed8fa6cc6a5d5e13625f2462cae551348222424bdb94c7350836440c4946fda5c34e73f3ab839afea4924bdbfe218f6f7268aee3bf6fbf2239651222ff870ffaeb30dd7d539af33635d5c8e7ff4c1f2b2436088df4973b4e8cba59a8a23cfd69bea7c998bf2f4be712332d498db614dcfbdb25372575e169c2d495ca3ace5eb88bf3315c0cf9db03566bf29bfd82b546b82d47f6ef7d03861f46d0dc98fc0dcbd13f14d466c8551c209b3b56896945fa3abd44a352e22a935908089dd296307fcf602ef03648e5f209f531239e89bbd4b7bd0e311f51800562dfecf73e6c6f0baed5c89c1733710f4f97152da35fe0108e73178dc76402a6ba265eec00a3f82b6cd9fb6d285f2fb3b3d8e91f3ed6845523ae9c34dac2147598003a633330a3e9f70044f0fe65f06d7c6b23d209c0b381aa842353d0fd4b02033c31de7e713d3127e95eef0b8c40c613e1f37998a7617113e14677100a2e93be747a05d5cee40f48c72fbd7a8fd148b18e351a4cfa24bef6c99c32582817e3496541599b3e310d1258b071db3b4813035bf58d635b2962ab4414e4c0fcba09288c1ea036f843676ffda092dffe2dae00bd8cf62340f84114795453902885d13d8d7055651c2ec582b0516be11356bec3321c2815eea9aa90e36561af1e6ab85a72f815506e7655d5ad11709633d0e568c19f9c89eb6784fb50bb645ad1cf3e384599cd682bfb93617a7bfd747776ce09cd0df0d7d3af15a5dd2b546aa59410738e2661b70dc4f05bb980bcd232599b2324f2adb9819f62d6331d62111bb38315871ad8e4124ebcd0bdaaa25e9f972a60715e3e2ecef067c4f7e8df9f85f87dca1fbe1e6ab08269b17877c9491ddcf46d3425b341c1cbcc395a7fa336069366c7b5d5624c78ceccc70f977c403f89c453db7eba0c91139bbf6db4210f7c6e05aa0e508b8936db7f63d4e018681c3ceab1a65994ea26757757c4f814c906e0072b79b8b90b603a20fb9a3957377ce51d69dba6f901be1b4f3e8e0d099578fe88bd7dc5a2868f65ab5354f53ee24feeae1b01e2ac63004400026c23f6219775129e38bd8ed9bdbec01eff362eb263ed6f2eb35afe2a653949fa3a9252d6cbe46b27fcd77ab476c04f2659e430496d40dbdcad06ca996c880d48d8d8919a96aafb39827ef26e38f6181360f56af0de4aac6621916f7d00bf7a118ed1b9519764c0f09f38197dfde49ce39b685d6c829f837ee8057430aabe643bf8110e16df8b384ef48acff6415c886993b67c9cf364371b1f21fe346ffeb8d8b167bdd41ddac1f068f8e53cbb1e8300932d37731eafa510b6128c0604416a63eafbb408f61b49dc0dfd8f8a5a4f5058a083c6fdefde845285b8922247dde6b606ec1f612f53a3fd57ff0dd37f7715ec68333997cdb076f7d78fa116d9fdcdd5c30056d3e245238018fd2d63cd85c9e52b75b183d5f3b72f05001819e03c7cf57f7eee6fc5db9de6efdafab9ef4dfd370b9a013dc9b123702ea4edb92a9aa06c67569b919dd13ca0eae066432cc015d09ef33ada32511426668e0b995b52f57c14ba20e506bc53a091207ba9bde93effbd958661a6745571c93ba54a9df77d0e29782554471d8eac8c7aa11817cc8de90d23a85f24c1c869645b99c8afcff0140d23e593e518c7581f0363e9065f600bb450c57d2129a395a19e096cfd3585b88e87ab9ab5fafba9785e75cd407e54f88140079a6de8420d633824dabbd6e1922ae52dbf1ccc315a166966205a8ada1b44d3892edc748a9839e791e4d37978a63a6a665d5f50f07041ac728f30ba6901664685bae77b48cd38f414ddb455f86eb62ccfd6669a6067375ab04de906d0b73645bba3dd7804a3dfab7616053739ebff8478de725db4a0c4a2afd0c934ce57f5f1eb0c14ad29b4373006fd3f322268952251de2114799a3063a0ea225fba82c6c7eec91a61400061017a3d869fb4dc894e17b5a7238091d92df33440e13130545035cd5106c928ce5da30e67812c55fe6807c5953777648d6e481acc50f02993e374b70c9c3b09b9080588dbf365c5859de042f72b72aa4b274563d2cff862757f4b2c0a9edcc71b99", - "seed": "7a3d869fb4dc894e17b5a7238091d92d3d00746e558e27e1904cf8a23a28b5f5", - "bucketKey": "f11cff03fb6819f5b99f3a8c162980b39f117a9633376b4896173730d397a995" + "hmacSha256Tests" : [ + { + "keyHex" : "4d0fc2a725d4c1195022ddbcbb6838e7b77d131e1497bf28956ef8ea0d6ad164", + "dataHex" : "9f208641e594d324947d63c172834139b247b0e298d29f6c7cc54c2284b754c76953aa060b47cc06fefb5178a8d2662240bb6924712454cd8f40cb76a00b5dda", + "hmacSha256TagHex" : "06443254c9c83339b58b9ba3c1c8a53eb6a04f356a6e1406d94df773a294934c" + }, + { + "keyHex" : "3284ec905abd03e40810f29344dfb7a6d8189c7cb3d8d4e0a34a6b0803006289", + "dataHex" : "8b518ce2abf588563596ec2173c98001d69bf37280de96f809c3235368025c1030e0dd7d7c0613eee7550c1619a379abb34d4e6e7ee0f78ebd7d4386042e2672", + "hmacSha256TagHex" : "a51dafa572fdaccaf8a34e9634129ee7e6d5420eb1092292723198d18204776c" + }, + { + "keyHex" : "44ae6bef60b3fe4ee30ab246ede95539d7923287b7e8d5b7f2dbbd3be8f193a0", + "dataHex" : "974eef4e63c695e3cbba4f2045dd89dec4eb4f3eb25ae5fd0ad02b8a2b62676d9a85b2249783cf8ac78e08c1749a8d91f8e93b12288a85900d398ab2ffbeee99", + "hmacSha256TagHex" : "b84b339acbdffb34c35ba8efa8342a4aba2954826187075f28eae2fb647bd951" + }, + { + "keyHex" : "40864996cd4d60f019286e699dc51742ab7add9b78443f158401a5698a7c78a0", + "dataHex" : "b3fd730706c6dfd562054c1ec3af0d4d32e309115a317c618056b0c9855755084ec90376db27ef5d619646b4ec9d71979f1e9a9bbf3d23993e8a6caa3e80f7e6", + "hmacSha256TagHex" : "38a4ac9b440bb6d7992214fb4e10ab51126a9c160f5f1acda3e108e923de17e9" + } + ], + "pqcryptEncryptionTests" : [ + { + "privateKyberKey" : "0600e9122c5e493156ab4a37ca95f51038645a7c196cad1b1a823d4a6a749a259094a5b705693b50afbbc933e94a5ad58601e7c45e7f78ba01b5170898a3c6214b1706114627bad22169365aa4cdcb21b8bca80e5975d9783f3067b83ad3bb75d1932b002887a783ca325858b344ab5b0b12d83a72662032e20ee1e8555e068ad8057d80db863dab43a674c93ddab369f3a482cca236cb36a7ba0d5b3b2f3bf490463a2ebe6057e7a1bfd79313d76badea6494c0a22dcd015ca0134d3628aec0e30fb8890e21bb17642a30e4f2bd4b97390f78b44885604722b3ca6775cdfb25e49b6cfc2abf2e4094e0a794a671b14bb95c5109515a74cdae618dfe52906b8450e00702924080e9620bc6748f4a5b70e9f105d7cc20ac425f3205901f30578513b18af44a3e83c69ff667a2196f96c3293f108480b4c58c93a738cb951850267fd037641c58976b4b190121698b9bbdf777c1043d5bfa7fb53631d3197a40057aa9a81e615876e7aa615149bff0000de145b9e74945bad39c70431291d718646a411e4b8e83976f0f49a9c24badbf3a2a356bc0d6059d56c51975a90222e39bd12c32d579ab064a36b228960ca908aa32cf5a22334c799280b2a17f378df36b4b4f32cdabbab61878cc302583fb00b99b0b0d36fb822dc7cda50ab9e60a85d0f99bff752fe65739604230f41843d69a7318329de3ca0c0164985ecb3f38b3a9f658b216b94ddac4b10eb90c596a9f6327632a74aeb90a86a4636bf200b299344ed12a791e04566740c8b4702c0362157f7b62c9825318fcb69ea97371ea79b994463af5625a6a00120589b38863dce65d64458153e11359d34f1c498421095044d31904284bce6617a5f4c2ef242164a16753eace78ac1b66734e84791e5d5699c4e6a7a8c038a2220298c8b0d927965e0551e417b6ba53c5689a83a1e9bd2206771ddc9e3f43c1f1f5857d77ca6f7bc70da35b83c0877af4a4d6932416620579730a6bf546c5452c9b40534f59bdd6f59b2e707e4ae4737f7b5a8a5726eac87a2fd59c74c006e9190be8e807b9fa877a4640ce7a6c90b406312a9383b993bc60a3c64b19d6782743d844b2964734773025d3c8ef855499b588f7238a505543bfea6405136430c13317957e21d095554182a8d5ab2cd34f074594c9b065e3848feac3052cbb372f416f0c6ab9e862bfb1845f64dac7ec627d4fe1715a5413fff0cde56373cac83f82dabfc0a19887087920bc1f0dda96daf67470d3bec0c733e494a6a6340031d99fd8c1925edb9ab75b9b4e3c498af656881c8c5da96b13e450bab97605169d75439f4ca54fe7bc4493b4378e5176ef66868fbb8d832b312b89c4793576b0ab871dec5573dc7402892153e184cde931400a9dd8a772012c9ee3d310dd66a9c2d573b71159f73112014108ae84b08ac9ab9bd7084f4378fb3096c5a354e0106ea6e5c74cfc7e31a20f3b49ad9e417cb9ac5e4daa77fbd6133d43781decbf867464df383de6eb4874b156e06769a8b7cfec00a01c08a4b238531cf1ca67e95b723639ee40a60aaa715668655cfc67847a4471e3128924133b461cb64c00bab43892494dfdc43ea9ca59eb1b8e4fa5a71571a1ca689a869536659ac7ab444b6ef298df88315c88516e68942d3612c99602264254cb56ccfd46c03548bfffc0cc4e08087e1cc9efb9097754a544354d44b92f70684880126cd215b28543b5e45ba249e1af6277499537a3cf3959349235f64c7fbfc3b542a876573232d81792fc72cfdee8c6c894bacb7937ba099b8c66ae91d097914623fd882f9cbb204c292682426b2e1752950836421146f439076bfa266278b849f124dd8647010b3c7bfb44d44c9641276e9125ca4ca5738b985ad093280f76b86ad02a0f05100bc7a962ab267bacb059e90298eaaebedb2a2e04376b9a1e8da276842c452173c7f287a434d16b013799ee5c4aa4381746653c9f99bd7eb061a41893e11c9a0273246bd91ab957748214ccd39406f2a28ae8e304d6425bd8e90af0120b5c0cb2290345984c5b1f572a16bc098711797c4aca17952139662f761b214b845e7c922f4f6cbad2f55867fa51d9617826dc89b2604230ac2f2cd170d6f11b6a60cc2e39599c6c7aa7038d7d6588009c7d7412b954c1af33fb616c498a58870749bb7f00205a23f725977f85103e36b8803231edad6e3ed362c8fc25791f95e3ed6f159c2000207a3d869fb4dc894e17b5a7238091d92d3d00746e558e27e1904cf8a23a28b5f50600b7e03c31d21a8e887695649fad3b5aa62210c047bf57bb3c6b9cc30a87563af5ba84ecb82fb8b8851270d9a5129f317092fc6763265c323c1890c372f9ab26e96920df2c960c33c7169307c93361f89a659e8532dc375c5fb740820867c249101bd668ad200244dc03979c785e177b4c78676632bf4ec9c7e66b741296bae5c4c84186c3d407306e044d0595796e2546cad748933ab1eff5513a13c14abc16f108405f32ce1dbc020b5c6172dc910c767366fb1b8caa8d7856cd253a78d1a335c8697a7d647d5e082aaac2c97cc892f9a8678b744e0e812f7d73ce05e0151dd4ca3edc2d73310211b5bc943ab851816c34639c6d905d770b4d5ed269da69382d37b0b5d40f1ea5220a94518363a93501823517c03e7c062d19087444251a335bdd16376034c08692b51fdb505dc4ab6e2c246d23824ac56cfa0cc217ca81d86555a87c37d236b292b15481602dc1570b11cb8809f8a81e1580273a972016797a686b72389b93bc4f61006b46f99f38cc5ea39ca58c813ccfe4922eaa95cffc2188554b8c611bb2136935b416a527a18d2a9f757c9c7a8c019d3163d7e0759ad76207b1665dc98a3cf2c40d65cd87bc54a132baacbc3dbba80373c1571410357268a6af323f55383bef65cf852b67f45cc028e0b2c7847b541a24abeb4a11789bda75497de270f261af2a27a8d1d489d7cc8ae78276a2611c618982f67ca11e0c95df6a076bd85d06c6a41539989381596c91ba9e112efd58ba3428cb79107ce0f66351b45379d506e9b88b7f8691b1b8b1a5b438292b10a10755363960308c63229397cad078c71625928363a515b9803b6e5f053d58ac31033b0f8529c477b760a0bb1b611226a65947a8755c5927c9dfa256d9a6aca1502ad21582ad570be56bcd2a003e1fbb6df98b4dbf38a5ef526dfbb89b582c653c9276a882a64f990bf6f6b6fa2806f01b01db2680f11c0bd7755cc4582146a18f23c1b4e8180d9cf62de225af7a90a3d5a76b305c798452969b8a890db46b1ac2622b30a9bceb1a0b9862e17898a8395b61aba83924b16edc6ac1a0c9a184cc6c44057078670074c891e94bc6fc502cdc3a63587caf788e6495b3baf3c23c5044a7e78c6e466bcf1214edd60e2d38190f74c839950c8556a003269120391647ca656c485d5ee1632a288521b0c7959577bff2987de7c9cd08723b5370d50652ff1a8570489e101788ca07450db5469529ba731319b5915df0103439b4242f9c7741fb144244a9481c9a985155b6e52887265b8355a038b2834af730cb3c33134a36b8e2ce82b529b37b7ea65aa1419822c3b44085310d969577db2bccf61bbf342692fe028c9490081e23a24df61ba50867b08caaf89a0450b40ae30594c1169e7851607b411c1f1c96df3115507ac28d7552bdf192a4234b290b1fcb3850e950cb1f4a41f4939a75751d1f257e70f3739f865456823cc93cc68c649867f1a36fc146499627110467f6f6bd72e58017da73369c10fa319d939bb0aa318181a25c30e35e3cc9a6ed1c067c3044d42358e0e4a8614a3f132415ab416b20d7aa0dba57ee1c0158176ec99231c1161fcb60c5a81b99052c63c3369c6373c1c7e27a0ba652e6709ff0d4a72f01ac1d0749ec9b8b6e59a6d01a514fd7b8ed8b0942302f0877b96267c701eacf9d750eed594c829141a8141a4151493012bbaa9151f9ba2a9f45923a2754fda011c1e408bfbb98507059a5617695c5131a36316ae07aecbb7cb3c828448208aba76313752dba12b73815345d1920edf5b5798c330e75bb03e541197492f87cc25b53cd89d0aa10e67234460b95b2a49046909120a1537870d4909368a1771f29135a7ba77efac196948bee1ace01b156050240ea19aec1cab49320a7174a7897bc565885bbe46032c1f07a7f75a6cf7cca0bec1cecb06861e5bb9080a80093a0c3a0cd6d9a7879e205ded27c8ddc5a3452be8ed7a3378c9f7359bd63e395def09fb4da3d25e89d2480317e669f582b181480aa5cc21e10f21302406dd0e10be42297cc56b5ea9b1e6e68bca20390b28ac1a8e77809ca225303190fb427bf765bf729a3766c7ef9010b06a812812ac0e7f4237db241f0bb4eab38690c1287c487362598c4d89c0a543c8194778eddfa6d5ac28a79e81ff0b3344f06cc875aa00020b4e854b0f4b65d7d2df6723d378fb1f6e87215d052f8c172de4895db053d75dc", + "publicKyberKey" : "0600b7e03c31d21a8e887695649fad3b5aa62210c047bf57bb3c6b9cc30a87563af5ba84ecb82fb8b8851270d9a5129f317092fc6763265c323c1890c372f9ab26e96920df2c960c33c7169307c93361f89a659e8532dc375c5fb740820867c249101bd668ad200244dc03979c785e177b4c78676632bf4ec9c7e66b741296bae5c4c84186c3d407306e044d0595796e2546cad748933ab1eff5513a13c14abc16f108405f32ce1dbc020b5c6172dc910c767366fb1b8caa8d7856cd253a78d1a335c8697a7d647d5e082aaac2c97cc892f9a8678b744e0e812f7d73ce05e0151dd4ca3edc2d73310211b5bc943ab851816c34639c6d905d770b4d5ed269da69382d37b0b5d40f1ea5220a94518363a93501823517c03e7c062d19087444251a335bdd16376034c08692b51fdb505dc4ab6e2c246d23824ac56cfa0cc217ca81d86555a87c37d236b292b15481602dc1570b11cb8809f8a81e1580273a972016797a686b72389b93bc4f61006b46f99f38cc5ea39ca58c813ccfe4922eaa95cffc2188554b8c611bb2136935b416a527a18d2a9f757c9c7a8c019d3163d7e0759ad76207b1665dc98a3cf2c40d65cd87bc54a132baacbc3dbba80373c1571410357268a6af323f55383bef65cf852b67f45cc028e0b2c7847b541a24abeb4a11789bda75497de270f261af2a27a8d1d489d7cc8ae78276a2611c618982f67ca11e0c95df6a076bd85d06c6a41539989381596c91ba9e112efd58ba3428cb79107ce0f66351b45379d506e9b88b7f8691b1b8b1a5b438292b10a10755363960308c63229397cad078c71625928363a515b9803b6e5f053d58ac31033b0f8529c477b760a0bb1b611226a65947a8755c5927c9dfa256d9a6aca1502ad21582ad570be56bcd2a003e1fbb6df98b4dbf38a5ef526dfbb89b582c653c9276a882a64f990bf6f6b6fa2806f01b01db2680f11c0bd7755cc4582146a18f23c1b4e8180d9cf62de225af7a90a3d5a76b305c798452969b8a890db46b1ac2622b30a9bceb1a0b9862e17898a8395b61aba83924b16edc6ac1a0c9a184cc6c44057078670074c891e94bc6fc502cdc3a63587caf788e6495b3baf3c23c5044a7e78c6e466bcf1214edd60e2d38190f74c839950c8556a003269120391647ca656c485d5ee1632a288521b0c7959577bff2987de7c9cd08723b5370d50652ff1a8570489e101788ca07450db5469529ba731319b5915df0103439b4242f9c7741fb144244a9481c9a985155b6e52887265b8355a038b2834af730cb3c33134a36b8e2ce82b529b37b7ea65aa1419822c3b44085310d969577db2bccf61bbf342692fe028c9490081e23a24df61ba50867b08caaf89a0450b40ae30594c1169e7851607b411c1f1c96df3115507ac28d7552bdf192a4234b290b1fcb3850e950cb1f4a41f4939a75751d1f257e70f3739f865456823cc93cc68c649867f1a36fc146499627110467f6f6bd72e58017da73369c10fa319d939bb0aa318181a25c30e35e3cc9a6ed1c067c3044d42358e0e4a8614a3f132415ab416b20d7aa0dba57ee1c0158176ec99231c1161fcb60c5a81b99052c63c3369c6373c1c7e27a0ba652e6709ff0d4a72f01ac1d0749ec9b8b6e59a6d01a514fd7b8ed8b0942302f0877b96267c701eacf9d750eed594c829141a8141a4151493012bbaa9151f9ba2a9f45923a2754fda011c1e408bfbb98507059a5617695c5131a36316ae07aecbb7cb3c828448208aba76313752dba12b73815345d1920edf5b5798c330e75bb03e541197492f87cc25b53cd89d0aa10e67234460b95b2a49046909120a1537870d4909368a1771f29135a7ba77efac196948bee1ace01b156050240ea19aec1cab49320a7174a7897bc565885bbe46032c1f07a7f75a6cf7cca0bec1cecb06861e5bb9080a80093a0c3a0cd6d9a7879e205ded27c8ddc5a3452be8ed7a3378c9f7359bd63e395def09fb4da3d25e89d2480317e669f582b181480aa5cc21e10f21302406dd0e10be42297cc56b5ea9b1e6e68bca20390b28ac1a8e77809ca225303190fb427bf765bf729a3766c7ef9010b06a812812ac0e7f4237db241f0bb4eab38690c1287c487362598c4d89c0a543c8194778eddfa6d5ac28a79e81ff0b3344f06cc875aa00020b4e854b0f4b65d7d2df6723d378fb1f6e87215d052f8c172de4895db053d75dc", + "publicX25519Key" : "7f026d8a3c45bdac0dac0ece7ac8323b6382143593bb50222fc8b8adabf44f34", + "privateX25519Key" : "e841cf14528bbf9cfd7bf35d9fb05430f41c3bb914183aba68b5dc540d1f677d", + "epheremalPublicX25519Key" : "d0d36e0fe7a105978084489a7f451c446787c8a16d07afa1c1c0e2af0d60432a", + "epheremalPrivateX25519Key" : "a8b123838d20e8eec7f7034e1ed58af0a93ad0ad4e7ae38b8d1b075742c1226d", + "pqMessage" : "00207f026d8a3c45bdac0dac0ece7ac8323b6382143593bb50222fc8b8adabf44f340020d0d36e0fe7a105978084489a7f451c446787c8a16d07afa1c1c0e2af0d60432a06205e5bd73befd122d75ddbcb5b0b0c3b3078c7882f90df53ed909350b14e6d4f9a527a4aa50103ab6f970e0f28e7af8e7c7a614ef4d5e92b27efe2a75e7e6fcc1956273f48562ac1da9bfc466073cc99b632aecc024842d8cf654d5d8c786bf4e2d767766fe4fa5683fb087a06a3a50ee68bc63826354aeb9f22b53ecd0e396f5c830eb8a45a931be41279e99b06d359fd98f4be30e5b2b69f3d9262787f865442769af3da0177680fc2bed3176d94079132294f44ec4ea78bed8fa6cc6a5d5e13625f2462cae551348222424bdb94c7350836440c4946fda5c34e73f3ab839afea4924bdbfe218f6f7268aee3bf6fbf2239651222ff870ffaeb30dd7d539af33635d5c8e7ff4c1f2b2436088df4973b4e8cba59a8a23cfd69bea7c998bf2f4be712332d498db614dcfbdb25372575e169c2d495ca3ace5eb88bf3315c0cf9db03566bf29bfd82b546b82d47f6ef7d03861f46d0dc98fc0dcbd13f14d466c8551c209b3b56896945fa3abd44a352e22a935908089dd296307fcf602ef03648e5f209f531239e89bbd4b7bd0e311f51800562dfecf73e6c6f0baed5c89c1733710f4f97152da35fe0108e73178dc76402a6ba265eec00a3f82b6cd9fb6d285f2fb3b3d8e91f3ed6845523ae9c34dac2147598003a633330a3e9f70044f0fe65f06d7c6b23d209c0b381aa842353d0fd4b02033c31de7e713d3127e95eef0b8c40c613e1f37998a7617113e14677100a2e93be747a05d5cee40f48c72fbd7a8fd148b18e351a4cfa24bef6c99c32582817e3496541599b3e310d1258b071db3b4813035bf58d635b2962ab4414e4c0fcba09288c1ea036f843676ffda092dffe2dae00bd8cf62340f84114795453902885d13d8d7055651c2ec582b0516be11356bec3321c2815eea9aa90e36561af1e6ab85a72f815506e7655d5ad11709633d0e568c19f9c89eb6784fb50bb645ad1cf3e384599cd682bfb93617a7bfd747776ce09cd0df0d7d3af15a5dd2b546aa59410738e2661b70dc4f05bb980bcd232599b2324f2adb9819f62d6331d62111bb38315871ad8e4124ebcd0bdaaa25e9f972a60715e3e2ecef067c4f7e8df9f85f87dca1fbe1e6ab08269b17877c9491ddcf46d3425b341c1cbcc395a7fa336069366c7b5d5624c78ceccc70f977c403f89c453db7eba0c91139bbf6db4210f7c6e05aa0e508b8936db7f63d4e018681c3ceab1a65994ea26757757c4f814c906e0072b79b8b90b603a20fb9a3957377ce51d69dba6f901be1b4f3e8e0d099578fe88bd7dc5a2868f65ab5354f53ee24feeae1b01e2ac63004400026c23f6219775129e38bd8ed9bdbec01eff362eb263ed6f2eb35afe2a653949fa3a9252d6cbe46b27fcd77ab476c04f2659e430496d40dbdcad06ca996c880d48d8d8919a96aafb39827ef26e38f6181360f56af0de4aac6621916f7d00bf7a118ed1b9519764c0f09f38197dfde49ce39b685d6c829f837ee8057430aabe643bf8110e16df8b384ef48acff6415c886993b67c9cf364371b1f21fe346ffeb8d8b167bdd41ddac1f068f8e53cbb1e8300932d37731eafa510b6128c0604416a63eafbb408f61b49dc0dfd8f8a5a4f5058a083c6fdefde845285b8922247dde6b606ec1f612f53a3fd57ff0dd37f7715ec68333997cdb076f7d78fa116d9fdcdd5c30056d3e245238018fd2d63cd85c9e52b75b183d5f3b72f05001819e03c7cf57f7eee6fc5db9de6efdafab9ef4dfd370b9a013dc9b123702ea4edb92a9aa06c67569b919dd13ca0eae066432cc015d09ef33ada32511426668e0b995b52f57c14ba20e506bc53a091207ba9bde93effbd958661a6745571c93ba54a9df77d0e29782554471d8eac8c7aa11817cc8de90d23a85f24c1c869645b99c8afcff0140d23e593e518c7581f0363e9065f600bb450c57d2129a395a19e096cfd3585b88e87ab9ab5fafba9785e75cd407e54f88140079a6de8420d633824dabbd6e1922ae52dbf1ccc315a166966205a8ada1b44d3892edc748a9839e791e4d37978a63a6a665d5f50f07041ac728f30ba6901664685bae77b48cd38f414ddb455f86eb62ccfd6669a6067375ab04de906d0b73645bba3dd7804a3dfab7616053739ebff8478de725db4a0c4a2afd0c934ce57f5f1eb0c14ad29b4373006fd3f322268952251de2114799a3063a0ea225fba82c6c7eec91a61400061017a3d869fb4dc894e17b5a7238091d92df33440e13130545035cd5106c928ce5da30e67812c55fe6807c5953777648d6e481acc50f02993e374b70c9c3b09b9080588dbf365c5859de042f72b72aa4b274563d2cff862757f4b2c0a9edcc71b99", + "seed" : "7a3d869fb4dc894e17b5a7238091d92d3d00746e558e27e1904cf8a23a28b5f5", + "bucketKey" : "f11cff03fb6819f5b99f3a8c162980b39f117a9633376b4896173730d397a995" } ], - "x25519Tests": [ - { - "alicePrivateKeyHex": "702b96b918c63af1e371bc4ac4730ca33b0c9b5b1de63cccefd15bc075f3ce6e", - "alicePublicKeyHex": "2dd4ec439a6b09c8b219ccadb928e09f5189d877b43317be1dcc3ee84f721578", - "ephemeralPrivateKeyHex": "60ee5f161582fbadce93f2609d94f41e57162baa470f303782c37e8383615a4b", - "ephemeralPublicKeyHex": "90a39399eb6d4c8af3abda9dcfc3f5000bc26086a0e4adf75d39c4ff6d261860", - "bobPrivateKeyHex": "0883a6b6e7738f325f40668606a453b9cda1a8f0fb43add874775f7d6937ea61", - "bobPublicKeyHex": "c288324323c2f53b41e2044a20b01a750e3babbd865192cd9e5b34a0750a1669", - "ephemeralSharedSecretHex": "884b06885965916e649529b8d885dc21cf4ad6ed9c27d64845784ca3b4c86530", - "authSharedSecretHex": "b200b1c9e0df6ceaf4b0637bf7a59c33cfd39b5e07881e804e685e817d3ee526" + "x25519Tests" : [ + { + "alicePrivateKeyHex" : "702b96b918c63af1e371bc4ac4730ca33b0c9b5b1de63cccefd15bc075f3ce6e", + "alicePublicKeyHex" : "2dd4ec439a6b09c8b219ccadb928e09f5189d877b43317be1dcc3ee84f721578", + "ephemeralPrivateKeyHex" : "60ee5f161582fbadce93f2609d94f41e57162baa470f303782c37e8383615a4b", + "ephemeralPublicKeyHex" : "90a39399eb6d4c8af3abda9dcfc3f5000bc26086a0e4adf75d39c4ff6d261860", + "bobPrivateKeyHex" : "0883a6b6e7738f325f40668606a453b9cda1a8f0fb43add874775f7d6937ea61", + "bobPublicKeyHex" : "c288324323c2f53b41e2044a20b01a750e3babbd865192cd9e5b34a0750a1669", + "ephemeralSharedSecretHex" : "884b06885965916e649529b8d885dc21cf4ad6ed9c27d64845784ca3b4c86530", + "authSharedSecretHex" : "b200b1c9e0df6ceaf4b0637bf7a59c33cfd39b5e07881e804e685e817d3ee526" } ] } diff --git a/packages/node-mimimi/Cargo.lock b/packages/node-mimimi/Cargo.lock index 5e4a1d70c4af..b3ebcccf792b 100644 --- a/packages/node-mimimi/Cargo.lock +++ b/packages/node-mimimi/Cargo.lock @@ -2242,7 +2242,7 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tuta-sdk" -version = "259.250102.0" +version = "259.250106.0" dependencies = [ "aes", "android_log", diff --git a/packages/node-mimimi/src/importer.rs b/packages/node-mimimi/src/importer.rs index 1cbe9acc549f..ba3b30ae1bac 100644 --- a/packages/node-mimimi/src/importer.rs +++ b/packages/node-mimimi/src/importer.rs @@ -398,7 +398,7 @@ impl ImportEssential { ownerGroup: self.target_owner_group.clone(), encImports: serialized_imports, targetMailFolder: self.target_mailset.clone(), - ownerKeyVersion: owner_enc_sk_for_import_post.version, + ownerKeyVersion: owner_enc_sk_for_import_post.version as i64, ownerEncSessionKey: owner_enc_sk_for_import_post.object, newImportedMailSetName: "@internal-imported-mailset".to_string(), mailState: remote_state_id, diff --git a/packages/node-mimimi/src/importer/importable_mail.rs b/packages/node-mimimi/src/importer/importable_mail.rs index caa745e8bfad..5695723c184e 100644 --- a/packages/node-mimimi/src/importer/importable_mail.rs +++ b/packages/node-mimimi/src/importer/importable_mail.rs @@ -133,7 +133,7 @@ impl ImportableMailAttachmentMetaData { ImportAttachment { _id: None, ownerEncFileSessionKey: owner_enc_file_session_key.object, - ownerFileKeyVersion: owner_enc_file_session_key.version, + ownerFileKeyVersion: owner_enc_file_session_key.version as i64, existingAttachmentFile: None, newAttachment: Some(NewImportAttachment { _id: None, diff --git a/packages/node-mimimi/src/reduce_to_chunks.rs b/packages/node-mimimi/src/reduce_to_chunks.rs index ce067224ba8c..f20f896cfcb7 100644 --- a/packages/node-mimimi/src/reduce_to_chunks.rs +++ b/packages/node-mimimi/src/reduce_to_chunks.rs @@ -30,7 +30,7 @@ impl AttachmentUploadData { let eml_file_path = importable_mail.eml_file_path.clone(); let attachments = importable_mail.take_out_attachments(); let import_mail_data = importable_mail - .make_import_mail_data(owner_enc_session_key.object, owner_enc_session_key.version); + .make_import_mail_data(owner_enc_session_key.object, owner_enc_session_key.version as i64); AttachmentUploadData { keyed_import_mail_data: KeyedImportMailData { diff --git a/packages/tutanota-crypto/lib/encryption/Aes.ts b/packages/tutanota-crypto/lib/encryption/Aes.ts index 5d4f1d1e2bab..ee3e30cf184a 100644 --- a/packages/tutanota-crypto/lib/encryption/Aes.ts +++ b/packages/tutanota-crypto/lib/encryption/Aes.ts @@ -1,10 +1,11 @@ import sjcl from "../internal/sjcl.js" import { random } from "../random/Randomizer.js" import { BitArray, bitArrayToUint8Array, uint8ArrayToBitArray } from "../misc/Utils.js" -import { arrayEquals, concat, uint8ArrayToBase64 } from "@tutao/tutanota-utils" +import { assertNotNull, concat, uint8ArrayToBase64 } from "@tutao/tutanota-utils" import { sha256Hash } from "../hashes/Sha256.js" import { CryptoError } from "../misc/CryptoError.js" import { sha512Hash } from "../hashes/Sha512.js" +import { hmacSha256, MacTag, verifyHmacSha256 } from "./Hmac.js" export const ENABLE_MAC = true export const IV_BYTE_LENGTH = 16 @@ -60,8 +61,7 @@ export function aesEncrypt(key: AesKey, bytes: Uint8Array, iv: Uint8Array = gene let data = concat(iv, bitArrayToUint8Array(encryptedBits)) if (useMac) { - let hmac = new sjcl.misc.hmac(subKeys.mKey, sjcl.hash.sha256) - let macBytes = bitArrayToUint8Array(hmac.encrypt(uint8ArrayToBitArray(data))) + const macBytes = hmacSha256(assertNotNull(subKeys.mKey), data) data = concat(new Uint8Array([MAC_ENABLED_PREFIX]), data, macBytes) } @@ -151,12 +151,7 @@ function aesDecryptImpl(key: AesKey, encryptedBytes: Uint8Array, usePadding: boo if (hasMac) { cipherTextWithoutMac = encryptedBytes.subarray(1, encryptedBytes.length - MAC_LENGTH_BYTES) const providedMacBytes = encryptedBytes.subarray(encryptedBytes.length - MAC_LENGTH_BYTES) - const hmac = new sjcl.misc.hmac(subKeys.mKey, sjcl.hash.sha256) - const computedMacBytes = bitArrayToUint8Array(hmac.encrypt(uint8ArrayToBitArray(cipherTextWithoutMac))) - - if (!arrayEquals(providedMacBytes, computedMacBytes)) { - throw new CryptoError("invalid mac") - } + verifyHmacSha256(assertNotNull(subKeys.mKey), cipherTextWithoutMac, providedMacBytes as MacTag) } else { cipherTextWithoutMac = encryptedBytes } diff --git a/packages/tutanota-crypto/lib/encryption/Hmac.ts b/packages/tutanota-crypto/lib/encryption/Hmac.ts new file mode 100644 index 000000000000..be666b4ea296 --- /dev/null +++ b/packages/tutanota-crypto/lib/encryption/Hmac.ts @@ -0,0 +1,26 @@ +import { AesKey } from "./Aes.js" +import sjcl from "../internal/sjcl.js" +import { bitArrayToUint8Array, uint8ArrayToBitArray } from "../misc/Utils.js" +import { arrayEquals } from "@tutao/tutanota-utils" +import { CryptoError } from "../misc/CryptoError.js" + +export type MacTag = Uint8Array & { __brand: "macTag" } + +/** + * Create an HMAC-SHA-256 tag over the given data using the given key. + */ +export function hmacSha256(key: AesKey, data: Uint8Array): MacTag { + const hmac = new sjcl.misc.hmac(key, sjcl.hash.sha256) + return bitArrayToUint8Array(hmac.encrypt(uint8ArrayToBitArray(data))) as MacTag +} + +/** + * Verify an HMAC-SHA-256 tag against the given data and key. + * @throws CryptoError if the tag does not match the data and key. + */ +export function verifyHmacSha256(key: AesKey, data: Uint8Array, tag: MacTag) { + const computedTag = hmacSha256(key, data) + if (!arrayEquals(computedTag, tag)) { + throw new CryptoError("invalid mac") + } +} diff --git a/packages/tutanota-crypto/lib/encryption/KeyEncryption.ts b/packages/tutanota-crypto/lib/encryption/KeyEncryption.ts index 9a2f2e6f5b37..7f65519395c2 100644 --- a/packages/tutanota-crypto/lib/encryption/KeyEncryption.ts +++ b/packages/tutanota-crypto/lib/encryption/KeyEncryption.ts @@ -11,6 +11,15 @@ import type { PQKeyPairs } from "./PQKeyPairs.js" export type EncryptedKeyPairs = EncryptedPqKeyPairs | EncryptedRsaKeyPairs | EncryptedRsaEccKeyPairs +export type AbstractEncryptedKeyPair = { + pubEccKey: null | Uint8Array + pubKyberKey: null | Uint8Array + pubRsaKey: null | Uint8Array + symEncPrivEccKey: null | Uint8Array + symEncPrivKyberKey: null | Uint8Array + symEncPrivRsaKey: null | Uint8Array +} + export type EncryptedPqKeyPairs = { pubEccKey: Uint8Array pubKyberKey: Uint8Array @@ -38,6 +47,17 @@ export type EncryptedRsaEccKeyPairs = { symEncPrivRsaKey: Uint8Array } +export function isEncryptedPqKeyPairs(keyPair: AbstractEncryptedKeyPair): keyPair is EncryptedPqKeyPairs { + return ( + keyPair.pubEccKey != null && + keyPair.pubKyberKey != null && + keyPair.symEncPrivEccKey != null && + keyPair.symEncPrivKyberKey != null && + keyPair.pubRsaKey == null && + keyPair.symEncPrivRsaKey == null + ) +} + export function encryptKey(encryptionKey: AesKey, keyToBeEncrypted: AesKey): Uint8Array { const keyLength = getKeyLengthBytes(encryptionKey) if (keyLength === KEY_LENGTH_BYTES_AES_128) { diff --git a/packages/tutanota-crypto/lib/index.ts b/packages/tutanota-crypto/lib/index.ts index cf2867ef8ff8..d134bf950001 100644 --- a/packages/tutanota-crypto/lib/index.ts +++ b/packages/tutanota-crypto/lib/index.ts @@ -45,10 +45,12 @@ export { } from "./hashes/Argon2id/Argon2id.js" export { KeyLength, EntropySource, HkdfKeyDerivationDomains } from "./misc/Constants.js" export { + AbstractEncryptedKeyPair, EncryptedKeyPairs, EncryptedPqKeyPairs, EncryptedRsaKeyPairs, EncryptedRsaEccKeyPairs, + isEncryptedPqKeyPairs, encryptKey, decryptKey, encryptRsaKey, @@ -94,3 +96,4 @@ export { } from "./misc/Utils.js" export { murmurHash } from "./hashes/MurmurHash.js" export { hkdf } from "./hashes/HKDF.js" +export { hmacSha256, verifyHmacSha256, MacTag } from "./encryption/Hmac.js" diff --git a/packages/tutanota-crypto/lib/misc/Constants.ts b/packages/tutanota-crypto/lib/misc/Constants.ts index d67a5d3086e7..86708ba03b17 100644 --- a/packages/tutanota-crypto/lib/misc/Constants.ts +++ b/packages/tutanota-crypto/lib/misc/Constants.ts @@ -2,6 +2,14 @@ export enum KeyLength { b128 = "128", b256 = "256", } + export type EntropySource = "mouse" | "touch" | "key" | "random" | "static" | "time" | "accel" -export type HkdfKeyDerivationDomains = "userGroupKeyDistributionKey" | "adminGroupKeyRotationHash" +export type HkdfKeyDerivationDomains = + | "userGroupKeyDistributionKey" + | "newAdminPubKeyAuthKeyForUserGroupKeyRotation" + | "adminGroupDistributionKeyPairEncryptionKey" + | "adminGroupDistKeyPairAuthKeyForMultiAdminRotation" + | "newAdminSymKeyAuthKeyForMultiAdminRotationAsUser" + | "newUserGroupKeyAuthKeyForRotationAsNonAdminUser" + | "versionedUserGroupKeyDistributionKey" diff --git a/packages/tutanota-crypto/lib/misc/Utils.ts b/packages/tutanota-crypto/lib/misc/Utils.ts index db99f55e177d..911cb3e562fe 100644 --- a/packages/tutanota-crypto/lib/misc/Utils.ts +++ b/packages/tutanota-crypto/lib/misc/Utils.ts @@ -16,6 +16,7 @@ export function padAes(bytes: Uint8Array): Uint8Array { padding.fill(paddingLength) return concat(bytes, padding) } + export function unpadAes(bytes: Uint8Array): Uint8Array { let paddingLength = bytes[bytes.byteLength - 1] @@ -38,6 +39,7 @@ export function createAuthVerifier(passwordKey: AesKey): Uint8Array { // TODO Compatibility Test return sha256Hash(bitArrayToUint8Array(passwordKey)) } + export function createAuthVerifierAsBase64Url(passwordKey: AesKey): Base64Url { return base64ToBase64Url(uint8ArrayToBase64(createAuthVerifier(passwordKey))) } @@ -101,10 +103,12 @@ export function base64ToKey(base64: Base64): BitArray { } } -export function uint8ArrayToKey(array: Uint8Array): BitArray { +export function uint8ArrayToKey(array: Uint8Array): AesKey { return base64ToKey(uint8ArrayToBase64(array)) } + export function keyToUint8Array(key: BitArray): Uint8Array { return base64ToUint8Array(keyToBase64(key)) } + export const fixedIv: Uint8Array = hexToUint8Array("88888888888888888888888888888888") diff --git a/packages/tutanota-crypto/test/AesTest.ts b/packages/tutanota-crypto/test/AesTest.ts index a7a394f2d832..9725ef4f6a27 100644 --- a/packages/tutanota-crypto/test/AesTest.ts +++ b/packages/tutanota-crypto/test/AesTest.ts @@ -1,6 +1,14 @@ import o from "@tutao/otest" -import type { Hex } from "@tutao/tutanota-utils" -import { concat, hexToUint8Array, stringToUtf8Uint8Array, uint8ArrayToBase64, uint8ArrayToHex, utf8Uint8ArrayToString } from "@tutao/tutanota-utils" +import { + assertNotNull, + concat, + Hex, + hexToUint8Array, + stringToUtf8Uint8Array, + uint8ArrayToBase64, + uint8ArrayToHex, + utf8Uint8ArrayToString, +} from "@tutao/tutanota-utils" import { _aes128RandomKey, Aes256Key, @@ -20,6 +28,7 @@ import { CryptoError } from "../lib/misc/CryptoError.js" import { random } from "../lib/random/Randomizer.js" import { assertThrows, throwsErrorWithMessage } from "@tutao/tutanota-test-utils" import sjcl from "../lib/internal/sjcl.js" +import { hmacSha256 } from "../lib/index.js" o.spec("aes", function () { o("encryption roundtrip 128 without mac", () => arrayRoundtrip(aesEncrypt, aesDecrypt, _aes128RandomKey(), false)) @@ -246,8 +255,7 @@ export function aes256EncryptLegacy(key: Aes256Key, bytes: Uint8Array, iv: Uint8 let data = concat(iv, bitArrayToUint8Array(encryptedBits)) if (useMac) { - let hmac = new sjcl.misc.hmac(subKeys.mKey, sjcl.hash.sha256) - let macBytes = bitArrayToUint8Array(hmac.encrypt(uint8ArrayToBitArray(data))) + const macBytes = hmacSha256(assertNotNull(subKeys.mKey), data) data = concat(new Uint8Array([MAC_ENABLED_PREFIX]), data, macBytes) } diff --git a/packages/tutanota-crypto/test/HmacTest.ts b/packages/tutanota-crypto/test/HmacTest.ts new file mode 100644 index 000000000000..03c2e4ba94e1 --- /dev/null +++ b/packages/tutanota-crypto/test/HmacTest.ts @@ -0,0 +1,27 @@ +import o from "@tutao/otest" +import { aes256RandomKey, hmacSha256, verifyHmacSha256 } from "../lib/index.js" +import { assertThrows } from "@tutao/tutanota-test-utils" +import { CryptoError } from "../lib/misc/CryptoError.js" + +o.spec("hmac", function () { + o("round trip", function () { + const key = aes256RandomKey() + const data = new Uint8Array([0, 1, 2, 3, 4, 5, 6]) + const tag = hmacSha256(key, data) + verifyHmacSha256(key, data, tag) + }) + o("throws if data is not the same", async function () { + const key = aes256RandomKey() + const data = new Uint8Array([0, 1, 2, 3, 4, 5, 6]) + const badData = new Uint8Array([6, 5, 4, 3, 2, 1, 0]) + const tag = hmacSha256(key, data) + await assertThrows(CryptoError, async () => verifyHmacSha256(key, badData, tag)) + }) + o("throws if key is not the same", async function () { + const key = aes256RandomKey() + const badKey = aes256RandomKey() + const data = new Uint8Array([0, 1, 2, 3, 4, 5, 6]) + const tag = hmacSha256(key, data) + await assertThrows(CryptoError, async () => verifyHmacSha256(badKey, data, tag)) + }) +}) diff --git a/packages/tutanota-crypto/test/Suite.ts b/packages/tutanota-crypto/test/Suite.ts index 2a28e77bd8ed..c7d545f96e88 100644 --- a/packages/tutanota-crypto/test/Suite.ts +++ b/packages/tutanota-crypto/test/Suite.ts @@ -12,6 +12,7 @@ import "./Sha256Test.js" import "./TotpVerifierTest.js" import "./EccTest.js" import "./KyberTest.js" +import "./HmacTest.js" import { bootstrapTests } from "./bootstrap.js" await bootstrapTests() diff --git a/packages/tutanota-utils/lib/Utils.ts b/packages/tutanota-utils/lib/Utils.ts index 6b4e638f1640..2099d0bbf03d 100644 --- a/packages/tutanota-utils/lib/Utils.ts +++ b/packages/tutanota-utils/lib/Utils.ts @@ -10,12 +10,29 @@ export type lazy = () => T export type lazyAsync = () => Promise export type Thunk = () => unknown +/** + * Integer constraint from 0 to n (using tail-recursion elimination) + */ +type Enumerate = Acc["length"] extends N ? Acc[number] : Enumerate + +/** + * A key version must be an integer between 0 and 100. + * + * The constraint to < 100 is arbitrary and must be changed when we rotate keys more often. + */ +export type KeyVersion = Enumerate<100> + +export function isKeyVersion(version: number): version is KeyVersion { + // we do not check the upper boundary (100) because this is just a limitation of the type system not a real one + return Number.isInteger(version) && version >= 0 +} + /** * A group key and its version. */ export type Versioned = { object: T - version: number + version: KeyVersion } /** diff --git a/packages/tutanota-utils/lib/index.ts b/packages/tutanota-utils/lib/index.ts index 9538df411d57..ff01e1f8f95b 100644 --- a/packages/tutanota-utils/lib/index.ts +++ b/packages/tutanota-utils/lib/index.ts @@ -156,8 +156,21 @@ export { memoizedWithHiddenArgument, BoundedExecutor, freshVersioned, + isKeyVersion, +} from "./Utils.js" +export type { + Callback, + DeferredObject, + lazy, + lazyAsync, + Thunk, + DeferredObjectWithHandler, + MaybeLazy, + TimeoutSetter, + ErrorInfo, + Versioned, + KeyVersion, } from "./Utils.js" -export type { Callback, DeferredObject, lazy, lazyAsync, Thunk, DeferredObjectWithHandler, MaybeLazy, TimeoutSetter, ErrorInfo, Versioned } from "./Utils.js" export { callWebAssemblyFunctionWithArguments, diff --git a/schemas/sys.json b/schemas/sys.json index 072498dc6a85..8463eb158486 100644 --- a/schemas/sys.json +++ b/schemas/sys.json @@ -465,6 +465,81 @@ "info": "AddValue PlanConfiguration/unlimitedLabels/2494." } ] + }, + { + "version": 118, + "changes": [ + { + "name": "RemoveAssociation", + "sourceType": "Group", + "info": "RemoveAssociation Group/administratedGroups." + }, + { + "name": "RemoveAssociation", + "sourceType": "GroupInfo", + "info": "RemoveAssociation GroupInfo/localAdmin." + }, + { + "name": "AddValue", + "sourceType": "KeyMac", + "info": "AddValue KeyMac/taggingKeyVersion/2521." + }, + { + "name": "RenameAttribute", + "sourceType": "KeyMac", + "info": "RenameAttribute KeyMac: userGroup -> taggingGroup." + }, + { + "name": "RenameAttribute", + "sourceType": "KeyMac", + "info": "RenameAttribute KeyMac: version -> taggedKeyVersion." + }, + { + "name": "RenameAttribute", + "sourceType": "KeyMac", + "info": "RenameAttribute KeyMac: authKeyEncAdminRotationHash -> tag." + }, + { + "name": "RenameAttribute", + "sourceType": "KeyRotation", + "info": "RenameAttribute KeyRotation: adminGroupKeyAuthenticationData -> adminPubKeyMac." + }, + { + "name": "AddAssociation", + "sourceType": "KeyRotation", + "info": "AddAssociation KeyRotation/distEncAdminGroupSymKey/AGGREGATION/2522." + }, + { + "name": "AddAssociation", + "sourceType": "KeyRotation", + "info": "AddAssociation KeyRotation/distKeyMac/AGGREGATION/2523." + }, + { + "name": "AddAssociation", + "sourceType": "KeyRotation", + "info": "AddAssociation KeyRotation/adminDistKeyPair/AGGREGATION/2524." + }, + { + "name": "AddValue", + "sourceType": "UserGroupKeyRotationData", + "info": "AddValue UserGroupKeyRotationData/userGroupEncAdminGroupKey/2544." + }, + { + "name": "AddValue", + "sourceType": "PubEncKeyData", + "info": "AddValue PubEncKeyData/senderIdentifier/2545." + }, + { + "name": "AddValue", + "sourceType": "PubEncKeyData", + "info": "AddValue PubEncKeyData/senderIdentifierType/2546." + }, + { + "name": "AddAssociation", + "sourceType": "PubEncKeyData", + "info": "AddAssociation PubEncKeyData/symKeyMac/AGGREGATION/2547." + } + ] } ] } diff --git a/src/calendar-app/workerUtils/worker/CalendarWorkerLocator.ts b/src/calendar-app/workerUtils/worker/CalendarWorkerLocator.ts index a38d88798592..3653d7e9731d 100644 --- a/src/calendar-app/workerUtils/worker/CalendarWorkerLocator.ts +++ b/src/calendar-app/workerUtils/worker/CalendarWorkerLocator.ts @@ -73,6 +73,8 @@ import type { QueuedBatch } from "../../../common/api/worker/EventQueue.js" import { Credentials } from "../../../common/misc/credentials/Credentials.js" import { AsymmetricCryptoFacade } from "../../../common/api/worker/crypto/AsymmetricCryptoFacade.js" import { CryptoWrapper } from "../../../common/api/worker/crypto/CryptoWrapper.js" +import { KeyAuthenticationFacade } from "../../../common/api/worker/facades/KeyAuthenticationFacade.js" +import { PublicKeyProvider } from "../../../common/api/worker/facades/PublicKeyProvider.js" assertWorkerOrNode() @@ -93,6 +95,7 @@ export type CalendarWorkerLocatorType = { blobAccessToken: BlobAccessTokenFacade keyCache: KeyCache keyLoader: KeyLoaderFacade + publicKeyProvider: PublicKeyProvider keyRotation: KeyRotationFacade // login @@ -209,9 +212,18 @@ export async function initLocator(worker: CalendarWorkerImpl, browserData: Brows locator.pqFacade = new PQFacade(locator.kyberFacade) + locator.publicKeyProvider = new PublicKeyProvider(locator.serviceExecutor) + locator.keyLoader = new KeyLoaderFacade(locator.keyCache, locator.user, locator.cachingEntityClient, locator.cacheManagement) - const asymmetricCrypto = new AsymmetricCryptoFacade(locator.rsa, locator.pqFacade, locator.keyLoader, cryptoWrapper, locator.serviceExecutor) + const asymmetricCrypto = new AsymmetricCryptoFacade( + locator.rsa, + locator.pqFacade, + locator.keyLoader, + cryptoWrapper, + locator.serviceExecutor, + locator.publicKeyProvider, + ) locator.crypto = new CryptoFacade( locator.user, locator.cachingEntityClient, @@ -222,6 +234,8 @@ export async function initLocator(worker: CalendarWorkerImpl, browserData: Brows locator.cache as DefaultEntityRestCache, locator.keyLoader, asymmetricCrypto, + locator.publicKeyProvider, + lazyMemoized(() => locator.keyRotation), ) locator.recoverCode = lazyMemoized(async () => { @@ -236,6 +250,7 @@ export async function initLocator(worker: CalendarWorkerImpl, browserData: Brows const { CounterFacade } = await import("../../../common/api/worker/facades/lazy/CounterFacade.js") return new CounterFacade(locator.serviceExecutor) }) + const keyAuthenticationFacade = new KeyAuthenticationFacade(cryptoWrapper) locator.groupManagement = lazyMemoized(async () => { const { GroupManagementFacade } = await import("../../../common/api/worker/facades/lazy/GroupManagementFacade.js") return new GroupManagementFacade( @@ -248,6 +263,7 @@ export async function initLocator(worker: CalendarWorkerImpl, browserData: Brows await locator.cacheManagement(), asymmetricCrypto, cryptoWrapper, + keyAuthenticationFacade, ) }) locator.keyRotation = new KeyRotationFacade( @@ -262,6 +278,8 @@ export async function initLocator(worker: CalendarWorkerImpl, browserData: Brows locator.share, locator.groupManagement, asymmetricCrypto, + keyAuthenticationFacade, + locator.publicKeyProvider, ) const loginListener: LoginListener = { @@ -374,6 +392,7 @@ export async function initLocator(worker: CalendarWorkerImpl, browserData: Brows fileApp, locator.login, locator.keyLoader, + locator.publicKeyProvider, ) }) const nativePushFacade = new NativePushFacadeSendDispatcher(worker) diff --git a/src/common/api/common/TutanotaConstants.ts b/src/common/api/common/TutanotaConstants.ts index 0fc772c962ed..52bb3a9a84be 100644 --- a/src/common/api/common/TutanotaConstants.ts +++ b/src/common/api/common/TutanotaConstants.ts @@ -1008,6 +1008,8 @@ export enum EncryptionAuthStatus { AES_NO_AUTHENTICATION = "3", /** the entity was sent by us encrypted with TutaCrypt, so it is authenticated */ TUTACRYPT_SENDER = "4", + /** the entity was encrypted with RSA although TutaCrypt keys were available */ + RSA_DESPITE_TUTACRYPT = "5", } export const enum MailReportType { @@ -1232,6 +1234,7 @@ export const DEFAULT_ERROR = "defaultError" export enum PublicKeyIdentifierType { MAIL_ADDRESS = "0", GROUP_ID = "1", + KEY_ROTATION_ID = "2", } export function asPublicKeyIdentifier(maybe: NumberString): PublicKeyIdentifierType { diff --git a/src/common/api/entities/sys/ModelInfo.ts b/src/common/api/entities/sys/ModelInfo.ts index 05bab75f7ed1..789b11347802 100644 --- a/src/common/api/entities/sys/ModelInfo.ts +++ b/src/common/api/entities/sys/ModelInfo.ts @@ -1,6 +1,6 @@ const modelInfo = { - version: 117, - compatibleSince: 114, + version: 118, + compatibleSince: 118, } export default modelInfo \ No newline at end of file diff --git a/src/common/api/entities/sys/Services.ts b/src/common/api/entities/sys/Services.ts index 9f8869f3aeb6..0b1e03bbe775 100644 --- a/src/common/api/entities/sys/Services.ts +++ b/src/common/api/entities/sys/Services.ts @@ -1,4 +1,6 @@ +import { AdminGroupKeyRotationGetOutTypeRef } from "./TypeRefs.js" import { AdminGroupKeyRotationPostInTypeRef } from "./TypeRefs.js" +import { AdminGroupKeyRotationPutInTypeRef } from "./TypeRefs.js" import { AffiliatePartnerKpiServiceGetOutTypeRef } from "./TypeRefs.js" import { AlarmServicePostTypeRef } from "./TypeRefs.js" import { AppStoreSubscriptionGetInTypeRef } from "./TypeRefs.js" @@ -37,7 +39,6 @@ import { GroupKeyRotationInfoGetOutTypeRef } from "./TypeRefs.js" import { GroupKeyRotationPostInTypeRef } from "./TypeRefs.js" import { InvoiceDataGetInTypeRef } from "./TypeRefs.js" import { InvoiceDataGetOutTypeRef } from "./TypeRefs.js" -import { LocalAdminRemovalPostInTypeRef } from "./TypeRefs.js" import { LocationServiceGetReturnTypeRef } from "./TypeRefs.js" import { MailAddressAliasGetInTypeRef } from "./TypeRefs.js" import { MailAddressAliasServiceReturnTypeRef } from "./TypeRefs.js" @@ -95,9 +96,9 @@ import { VersionReturnTypeRef } from "./TypeRefs.js" export const AdminGroupKeyRotationService = Object.freeze({ app: "sys", name: "AdminGroupKeyRotationService", - get: null, + get: { data: null, return: AdminGroupKeyRotationGetOutTypeRef }, post: { data: AdminGroupKeyRotationPostInTypeRef, return: null }, - put: null, + put: { data: AdminGroupKeyRotationPutInTypeRef, return: null }, delete: null, } as const) @@ -299,15 +300,6 @@ export const InvoiceDataService = Object.freeze({ delete: null, } as const) -export const LocalAdminRemovalService = Object.freeze({ - app: "sys", - name: "LocalAdminRemovalService", - get: null, - post: { data: LocalAdminRemovalPostInTypeRef, return: null }, - put: null, - delete: null, -} as const) - export const LocationService = Object.freeze({ app: "sys", name: "LocationService", diff --git a/src/common/api/entities/sys/TypeModels.js b/src/common/api/entities/sys/TypeModels.js index a3b627665128..c442b8fb07bc 100644 --- a/src/common/api/entities/sys/TypeModels.js +++ b/src/common/api/entities/sys/TypeModels.js @@ -219,59 +219,95 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, - "AdminGroupKeyAuthenticationData": { - "name": "AdminGroupKeyAuthenticationData", - "since": 111, + "AdminGroupKeyDistributionElement": { + "name": "AdminGroupKeyDistributionElement", + "since": 118, "type": "AGGREGATED_TYPE", - "id": 2477, - "rootId": "A3N5cwAJrQ", + "id": 2525, + "rootId": "A3N5cwAJ3Q", "versioned": false, "encrypted": false, "values": { "_id": { "final": true, "name": "_id", - "id": 2478, - "since": 111, + "id": 2526, + "since": 118, "type": "CustomId", "cardinality": "One", "encrypted": false - }, - "authKeyEncAdminRotationHash": { + } + }, + "associations": { + "distEncAdminGroupKey": { "final": false, - "name": "authKeyEncAdminRotationHash", - "id": 2481, - "since": 111, - "type": "Bytes", + "name": "distEncAdminGroupKey", + "id": 2528, + "since": 118, + "type": "AGGREGATION", "cardinality": "One", - "encrypted": false + "refType": "PubEncKeyData", + "dependency": null }, - "version": { + "userGroupId": { "final": false, - "name": "version", - "id": 2480, - "since": 111, + "name": "userGroupId", + "id": 2527, + "since": 118, + "type": "ELEMENT_ASSOCIATION", + "cardinality": "One", + "refType": "Group", + "dependency": null + } + }, + "app": "sys", + "version": "118" + }, + "AdminGroupKeyRotationGetOut": { + "name": "AdminGroupKeyRotationGetOut", + "since": 118, + "type": "DATA_TRANSFER_TYPE", + "id": 2540, + "rootId": "A3N5cwAJ7A", + "versioned": false, + "encrypted": false, + "values": { + "_format": { + "final": false, + "name": "_format", + "id": 2541, + "since": 118, "type": "Number", "cardinality": "One", "encrypted": false } }, "associations": { - "userGroup": { + "distributionKeys": { "final": false, - "name": "userGroup", - "id": 2479, - "since": 111, + "name": "distributionKeys", + "id": 2543, + "since": 118, + "type": "AGGREGATION", + "cardinality": "Any", + "refType": "PubDistributionKey", + "dependency": null + }, + "userGroupIdsMissingDistributionKeys": { + "final": false, + "name": "userGroupIdsMissingDistributionKeys", + "id": 2542, + "since": 118, "type": "ELEMENT_ASSOCIATION", - "cardinality": "One", + "cardinality": "Any", "refType": "Group", "dependency": null } }, "app": "sys", - "version": "117" + "version": "118" }, "AdminGroupKeyRotationPostIn": { "name": "AdminGroupKeyRotationPostIn", @@ -293,24 +329,34 @@ export const typeModels = { } }, "associations": { - "adminGroupKeyAuthenticationDataList": { + "adminGroupKeyData": { "final": false, - "name": "adminGroupKeyAuthenticationDataList", + "name": "adminGroupKeyData", + "id": 2366, + "since": 101, + "type": "AGGREGATION", + "cardinality": "One", + "refType": "GroupKeyRotationData", + "dependency": null + }, + "adminPubKeyMacList": { + "final": false, + "name": "adminPubKeyMacList", "id": 2483, "since": 111, "type": "AGGREGATION", "cardinality": "Any", - "refType": "AdminGroupKeyAuthenticationData", + "refType": "KeyMac", "dependency": null }, - "adminGroupKeyData": { + "distribution": { "final": false, - "name": "adminGroupKeyData", - "id": 2366, - "since": 101, + "name": "distribution", + "id": 2529, + "since": 118, "type": "AGGREGATION", - "cardinality": "One", - "refType": "GroupKeyRotationData", + "cardinality": "Any", + "refType": "AdminGroupKeyDistributionElement", "dependency": null }, "userGroupKeyData": { @@ -325,121 +371,51 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, - "AdministratedGroup": { - "name": "AdministratedGroup", - "since": 27, - "type": "LIST_ELEMENT_TYPE", - "id": 1294, - "rootId": "A3N5cwAFDg", + "AdminGroupKeyRotationPutIn": { + "name": "AdminGroupKeyRotationPutIn", + "since": 118, + "type": "DATA_TRANSFER_TYPE", + "id": 2530, + "rootId": "A3N5cwAJ4g", "versioned": false, "encrypted": false, "values": { "_format": { "final": false, "name": "_format", - "id": 1298, - "since": 27, - "type": "Number", - "cardinality": "One", - "encrypted": false - }, - "_id": { - "final": true, - "name": "_id", - "id": 1296, - "since": 27, - "type": "GeneratedId", - "cardinality": "One", - "encrypted": false - }, - "_ownerGroup": { - "final": true, - "name": "_ownerGroup", - "id": 1299, - "since": 27, - "type": "GeneratedId", - "cardinality": "ZeroOrOne", - "encrypted": false - }, - "_permissions": { - "final": true, - "name": "_permissions", - "id": 1297, - "since": 27, - "type": "GeneratedId", - "cardinality": "One", - "encrypted": false - }, - "groupType": { - "final": true, - "name": "groupType", - "id": 1300, - "since": 27, + "id": 2531, + "since": 118, "type": "Number", "cardinality": "One", "encrypted": false } }, "associations": { - "groupInfo": { + "adminDistKeyPair": { "final": false, - "name": "groupInfo", - "id": 1301, - "since": 27, - "type": "LIST_ELEMENT_ASSOCIATION_GENERATED", + "name": "adminDistKeyPair", + "id": 2533, + "since": 118, + "type": "AGGREGATION", "cardinality": "One", - "refType": "GroupInfo", + "refType": "KeyPair", "dependency": null }, - "localAdminGroup": { + "distKeyMac": { "final": false, - "name": "localAdminGroup", - "id": 1302, - "since": 27, - "type": "ELEMENT_ASSOCIATION", - "cardinality": "One", - "refType": "Group", - "dependency": null - } - }, - "app": "sys", - "version": "117" - }, - "AdministratedGroupsRef": { - "name": "AdministratedGroupsRef", - "since": 27, - "type": "AGGREGATED_TYPE", - "id": 1303, - "rootId": "A3N5cwAFFw", - "versioned": false, - "encrypted": false, - "values": { - "_id": { - "final": true, - "name": "_id", - "id": 1304, - "since": 27, - "type": "CustomId", - "cardinality": "One", - "encrypted": false - } - }, - "associations": { - "items": { - "final": true, - "name": "items", - "id": 1305, - "since": 27, - "type": "LIST_ASSOCIATION", + "name": "distKeyMac", + "id": 2532, + "since": 118, + "type": "AGGREGATION", "cardinality": "One", - "refType": "AdministratedGroup", + "refType": "KeyMac", "dependency": null } }, "app": "sys", - "version": "117" + "version": "118" }, "AffiliatePartnerKpiMonthSummary": { "name": "AffiliatePartnerKpiMonthSummary", @@ -516,7 +492,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "AffiliatePartnerKpiServiceGetOut": { "name": "AffiliatePartnerKpiServiceGetOut", @@ -577,7 +553,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "AlarmInfo": { "name": "AlarmInfo", @@ -629,7 +605,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "AlarmNotification": { "name": "AlarmNotification", @@ -729,7 +705,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "AlarmServicePost": { "name": "AlarmServicePost", @@ -763,7 +739,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "AppStoreSubscriptionGetIn": { "name": "AppStoreSubscriptionGetIn", @@ -795,7 +771,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "AppStoreSubscriptionGetOut": { "name": "AppStoreSubscriptionGetOut", @@ -827,7 +803,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "ArchiveRef": { "name": "ArchiveRef", @@ -859,7 +835,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "ArchiveType": { "name": "ArchiveType", @@ -913,7 +889,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "AuditLogEntry": { "name": "AuditLogEntry", @@ -1047,7 +1023,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "AuditLogRef": { "name": "AuditLogRef", @@ -1081,7 +1057,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "AuthenticatedDevice": { "name": "AuthenticatedDevice", @@ -1131,7 +1107,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "Authentication": { "name": "Authentication", @@ -1192,7 +1168,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "AutoLoginDataDelete": { "name": "AutoLoginDataDelete", @@ -1224,7 +1200,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "AutoLoginDataGet": { "name": "AutoLoginDataGet", @@ -1267,7 +1243,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "AutoLoginDataReturn": { "name": "AutoLoginDataReturn", @@ -1299,7 +1275,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "AutoLoginPostReturn": { "name": "AutoLoginPostReturn", @@ -1331,7 +1307,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "Blob": { "name": "Blob", @@ -1381,7 +1357,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "BlobReferenceTokenWrapper": { "name": "BlobReferenceTokenWrapper", @@ -1413,7 +1389,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "Booking": { "name": "Booking", @@ -1537,7 +1513,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "BookingItem": { "name": "BookingItem", @@ -1623,7 +1599,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "BookingsRef": { "name": "BookingsRef", @@ -1657,7 +1633,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "BootstrapFeature": { "name": "BootstrapFeature", @@ -1689,7 +1665,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "Braintree3ds2Request": { "name": "Braintree3ds2Request", @@ -1739,7 +1715,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "Braintree3ds2Response": { "name": "Braintree3ds2Response", @@ -1780,7 +1756,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "BrandingDomainData": { "name": "BrandingDomainData", @@ -1857,7 +1833,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "BrandingDomainDeleteData": { "name": "BrandingDomainDeleteData", @@ -1889,7 +1865,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "BrandingDomainGetReturn": { "name": "BrandingDomainGetReturn", @@ -1923,7 +1899,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "Bucket": { "name": "Bucket", @@ -1957,7 +1933,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "BucketKey": { "name": "BucketKey", @@ -2046,7 +2022,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "BucketPermission": { "name": "BucketPermission", @@ -2188,7 +2164,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "CalendarEventRef": { "name": "CalendarEventRef", @@ -2229,7 +2205,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "CertificateInfo": { "name": "CertificateInfo", @@ -2290,7 +2266,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "Challenge": { "name": "Challenge", @@ -2343,7 +2319,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "ChangeKdfPostIn": { "name": "ChangeKdfPostIn", @@ -2420,7 +2396,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "ChangePasswordPostIn": { "name": "ChangePasswordPostIn", @@ -2515,7 +2491,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "Chat": { "name": "Chat", @@ -2565,7 +2541,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "CloseSessionServicePost": { "name": "CloseSessionServicePost", @@ -2608,7 +2584,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "CreateCustomerServerPropertiesData": { "name": "CreateCustomerServerPropertiesData", @@ -2649,7 +2625,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "CreateCustomerServerPropertiesReturn": { "name": "CreateCustomerServerPropertiesReturn", @@ -2683,7 +2659,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "CreateSessionData": { "name": "CreateSessionData", @@ -2771,7 +2747,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "CreateSessionReturn": { "name": "CreateSessionReturn", @@ -2824,7 +2800,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "CreditCard": { "name": "CreditCard", @@ -2892,7 +2868,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "CustomDomainCheckGetIn": { "name": "CustomDomainCheckGetIn", @@ -2935,7 +2911,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "CustomDomainCheckGetOut": { "name": "CustomDomainCheckGetOut", @@ -2998,7 +2974,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "CustomDomainData": { "name": "CustomDomainData", @@ -3041,7 +3017,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "CustomDomainReturn": { "name": "CustomDomainReturn", @@ -3084,7 +3060,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "Customer": { "name": "Customer", @@ -3341,7 +3317,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "CustomerAccountTerminationPostIn": { "name": "CustomerAccountTerminationPostIn", @@ -3384,7 +3360,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "CustomerAccountTerminationPostOut": { "name": "CustomerAccountTerminationPostOut", @@ -3418,7 +3394,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "CustomerAccountTerminationRequest": { "name": "CustomerAccountTerminationRequest", @@ -3497,7 +3473,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "CustomerInfo": { "name": "CustomerInfo", @@ -3810,7 +3786,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "CustomerProperties": { "name": "CustomerProperties", @@ -3918,7 +3894,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "CustomerServerProperties": { "name": "CustomerServerProperties", @@ -4034,7 +4010,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "DateWrapper": { "name": "DateWrapper", @@ -4066,7 +4042,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "DebitServicePutData": { "name": "DebitServicePutData", @@ -4100,7 +4076,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "DeleteCustomerData": { "name": "DeleteCustomerData", @@ -4180,7 +4156,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "DnsRecord": { "name": "DnsRecord", @@ -4230,7 +4206,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "DomainInfo": { "name": "DomainInfo", @@ -4292,7 +4268,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "DomainMailAddressAvailabilityData": { "name": "DomainMailAddressAvailabilityData", @@ -4324,7 +4300,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "DomainMailAddressAvailabilityReturn": { "name": "DomainMailAddressAvailabilityReturn", @@ -4356,7 +4332,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "EmailSenderListElement": { "name": "EmailSenderListElement", @@ -4415,7 +4391,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "EntityEventBatch": { "name": "EntityEventBatch", @@ -4476,7 +4452,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "EntityUpdate": { "name": "EntityUpdate", @@ -4544,7 +4520,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "Exception": { "name": "Exception", @@ -4585,7 +4561,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "ExternalPropertiesReturn": { "name": "ExternalPropertiesReturn", @@ -4647,7 +4623,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "ExternalUserReference": { "name": "ExternalUserReference", @@ -4718,7 +4694,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "Feature": { "name": "Feature", @@ -4750,7 +4726,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "File": { "name": "File", @@ -4800,7 +4776,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "GeneratedIdWrapper": { "name": "GeneratedIdWrapper", @@ -4832,7 +4808,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "GiftCard": { "name": "GiftCard", @@ -4945,7 +4921,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "GiftCardCreateData": { "name": "GiftCardCreateData", @@ -5013,7 +4989,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "GiftCardCreateReturn": { "name": "GiftCardCreateReturn", @@ -5047,7 +5023,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "GiftCardDeleteData": { "name": "GiftCardDeleteData", @@ -5081,7 +5057,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "GiftCardGetReturn": { "name": "GiftCardGetReturn", @@ -5133,7 +5109,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "GiftCardOption": { "name": "GiftCardOption", @@ -5165,7 +5141,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "GiftCardRedeemData": { "name": "GiftCardRedeemData", @@ -5217,7 +5193,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "GiftCardRedeemGetReturn": { "name": "GiftCardRedeemGetReturn", @@ -5269,7 +5245,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "GiftCardsRef": { "name": "GiftCardsRef", @@ -5303,7 +5279,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "Group": { "name": "Group", @@ -5416,16 +5392,6 @@ export const typeModels = { "refType": "Group", "dependency": null }, - "administratedGroups": { - "final": true, - "name": "administratedGroups", - "id": 1306, - "since": 27, - "type": "AGGREGATION", - "cardinality": "ZeroOrOne", - "refType": "AdministratedGroupsRef", - "dependency": null - }, "archives": { "final": true, "name": "archives", @@ -5528,7 +5494,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "GroupInfo": { "name": "GroupInfo", @@ -5659,16 +5625,6 @@ export const typeModels = { "refType": "Group", "dependency": null }, - "localAdmin": { - "final": true, - "name": "localAdmin", - "id": 1287, - "since": 27, - "type": "ELEMENT_ASSOCIATION", - "cardinality": "ZeroOrOne", - "refType": "Group", - "dependency": null - }, "mailAddressAliases": { "final": true, "name": "mailAddressAliases", @@ -5681,7 +5637,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "GroupKey": { "name": "GroupKey", @@ -5788,7 +5744,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "GroupKeyRotationData": { "name": "GroupKeyRotationData", @@ -5888,7 +5844,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "GroupKeyRotationInfoGetOut": { "name": "GroupKeyRotationInfoGetOut", @@ -5931,7 +5887,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "GroupKeyRotationPostIn": { "name": "GroupKeyRotationPostIn", @@ -5965,7 +5921,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "GroupKeyUpdate": { "name": "GroupKeyUpdate", @@ -6062,7 +6018,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "GroupKeyUpdateData": { "name": "GroupKeyUpdateData", @@ -6123,7 +6079,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "GroupKeyUpdatesRef": { "name": "GroupKeyUpdatesRef", @@ -6157,7 +6113,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "GroupKeysRef": { "name": "GroupKeysRef", @@ -6191,7 +6147,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "GroupMember": { "name": "GroupMember", @@ -6281,7 +6237,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "GroupMembership": { "name": "GroupMembership", @@ -6389,7 +6345,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "GroupMembershipKeyData": { "name": "GroupMembershipKeyData", @@ -6450,7 +6406,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "GroupMembershipUpdateData": { "name": "GroupMembershipUpdateData", @@ -6502,7 +6458,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "GroupRoot": { "name": "GroupRoot", @@ -6583,7 +6539,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "IdTupleWrapper": { "name": "IdTupleWrapper", @@ -6624,7 +6580,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "InstanceSessionKey": { "name": "InstanceSessionKey", @@ -6703,7 +6659,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "Invoice": { "name": "Invoice", @@ -6919,7 +6875,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "InvoiceDataGetIn": { "name": "InvoiceDataGetIn", @@ -6951,7 +6907,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "InvoiceDataGetOut": { "name": "InvoiceDataGetOut", @@ -7093,7 +7049,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "InvoiceDataItem": { "name": "InvoiceDataItem", @@ -7170,7 +7126,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "InvoiceInfo": { "name": "InvoiceInfo", @@ -7349,7 +7305,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "InvoiceItem": { "name": "InvoiceItem", @@ -7435,7 +7391,68 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" + }, + "KeyMac": { + "name": "KeyMac", + "since": 111, + "type": "AGGREGATED_TYPE", + "id": 2477, + "rootId": "A3N5cwAJrQ", + "versioned": false, + "encrypted": false, + "values": { + "_id": { + "final": true, + "name": "_id", + "id": 2478, + "since": 111, + "type": "CustomId", + "cardinality": "One", + "encrypted": false + }, + "tag": { + "final": false, + "name": "tag", + "id": 2481, + "since": 111, + "type": "Bytes", + "cardinality": "One", + "encrypted": false + }, + "taggedKeyVersion": { + "final": false, + "name": "taggedKeyVersion", + "id": 2480, + "since": 111, + "type": "Number", + "cardinality": "One", + "encrypted": false + }, + "taggingKeyVersion": { + "final": false, + "name": "taggingKeyVersion", + "id": 2521, + "since": 118, + "type": "Number", + "cardinality": "One", + "encrypted": false + } + }, + "associations": { + "taggingGroup": { + "final": false, + "name": "taggingGroup", + "id": 2479, + "since": 111, + "type": "ELEMENT_ASSOCIATION", + "cardinality": "One", + "refType": "Group", + "dependency": null + } + }, + "app": "sys", + "version": "118" }, "KeyPair": { "name": "KeyPair", @@ -7512,7 +7529,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "KeyRotation": { "name": "KeyRotation", @@ -7579,19 +7596,49 @@ export const typeModels = { } }, "associations": { - "adminGroupKeyAuthenticationData": { + "adminDistKeyPair": { "final": false, - "name": "adminGroupKeyAuthenticationData", + "name": "adminDistKeyPair", + "id": 2524, + "since": 118, + "type": "AGGREGATION", + "cardinality": "ZeroOrOne", + "refType": "KeyPair", + "dependency": null + }, + "adminPubKeyMac": { + "final": false, + "name": "adminPubKeyMac", "id": 2482, "since": 111, "type": "AGGREGATION", "cardinality": "ZeroOrOne", - "refType": "AdminGroupKeyAuthenticationData", + "refType": "KeyMac", + "dependency": null + }, + "distEncAdminGroupSymKey": { + "final": false, + "name": "distEncAdminGroupSymKey", + "id": 2522, + "since": 118, + "type": "AGGREGATION", + "cardinality": "ZeroOrOne", + "refType": "PubEncKeyData", + "dependency": null + }, + "distKeyMac": { + "final": false, + "name": "distKeyMac", + "id": 2523, + "since": 118, + "type": "AGGREGATION", + "cardinality": "ZeroOrOne", + "refType": "KeyMac", "dependency": null } }, "app": "sys", - "version": "117" + "version": "118" }, "KeyRotationsRef": { "name": "KeyRotationsRef", @@ -7625,102 +7672,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" - }, - "LocalAdminGroupReplacementData": { - "name": "LocalAdminGroupReplacementData", - "since": 113, - "type": "AGGREGATED_TYPE", - "id": 2484, - "rootId": "A3N5cwAJtA", - "versioned": false, - "encrypted": false, - "values": { - "_id": { - "final": true, - "name": "_id", - "id": 2485, - "since": 113, - "type": "CustomId", - "cardinality": "One", - "encrypted": false - }, - "adminGroupEncGKey": { - "final": false, - "name": "adminGroupEncGKey", - "id": 2487, - "since": 113, - "type": "Bytes", - "cardinality": "One", - "encrypted": false - }, - "adminGroupKeyVersion": { - "final": false, - "name": "adminGroupKeyVersion", - "id": 2489, - "since": 113, - "type": "Number", - "cardinality": "One", - "encrypted": false - }, - "groupKeyVersion": { - "final": false, - "name": "groupKeyVersion", - "id": 2488, - "since": 113, - "type": "Number", - "cardinality": "One", - "encrypted": false - } - }, - "associations": { - "groupId": { - "final": false, - "name": "groupId", - "id": 2486, - "since": 113, - "type": "ELEMENT_ASSOCIATION", - "cardinality": "One", - "refType": "Group", - "dependency": null - } - }, - "app": "sys", - "version": "117" - }, - "LocalAdminRemovalPostIn": { - "name": "LocalAdminRemovalPostIn", - "since": 113, - "type": "DATA_TRANSFER_TYPE", - "id": 2490, - "rootId": "A3N5cwAJug", - "versioned": false, - "encrypted": false, - "values": { - "_format": { - "final": false, - "name": "_format", - "id": 2491, - "since": 113, - "type": "Number", - "cardinality": "One", - "encrypted": false - } - }, - "associations": { - "groupUpdates": { - "final": false, - "name": "groupUpdates", - "id": 2492, - "since": 113, - "type": "AGGREGATION", - "cardinality": "Any", - "refType": "LocalAdminGroupReplacementData", - "dependency": null - } - }, - "app": "sys", - "version": "117" + "version": "118" }, "LocationServiceGetReturn": { "name": "LocationServiceGetReturn", @@ -7752,7 +7704,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "Login": { "name": "Login", @@ -7811,7 +7763,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "MailAddressAlias": { "name": "MailAddressAlias", @@ -7852,7 +7804,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "MailAddressAliasGetIn": { "name": "MailAddressAliasGetIn", @@ -7886,7 +7838,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "MailAddressAliasServiceData": { "name": "MailAddressAliasServiceData", @@ -7929,7 +7881,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "MailAddressAliasServiceDataDelete": { "name": "MailAddressAliasServiceDataDelete", @@ -7981,7 +7933,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "MailAddressAliasServiceReturn": { "name": "MailAddressAliasServiceReturn", @@ -8040,7 +7992,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "MailAddressAvailability": { "name": "MailAddressAvailability", @@ -8081,7 +8033,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "MailAddressToGroup": { "name": "MailAddressToGroup", @@ -8142,7 +8094,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "MembershipAddData": { "name": "MembershipAddData", @@ -8213,7 +8165,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "MembershipPutIn": { "name": "MembershipPutIn", @@ -8247,7 +8199,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "MembershipRemoveData": { "name": "MembershipRemoveData", @@ -8291,7 +8243,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "MissedNotification": { "name": "MissedNotification", @@ -8407,7 +8359,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "MultipleMailAddressAvailabilityData": { "name": "MultipleMailAddressAvailabilityData", @@ -8441,7 +8393,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "MultipleMailAddressAvailabilityReturn": { "name": "MultipleMailAddressAvailabilityReturn", @@ -8475,7 +8427,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "NotificationInfo": { "name": "NotificationInfo", @@ -8527,7 +8479,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "NotificationMailTemplate": { "name": "NotificationMailTemplate", @@ -8577,7 +8529,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "NotificationSessionKey": { "name": "NotificationSessionKey", @@ -8620,7 +8572,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "OrderProcessingAgreement": { "name": "OrderProcessingAgreement", @@ -8736,7 +8688,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "OtpChallenge": { "name": "OtpChallenge", @@ -8770,7 +8722,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "PaymentDataServiceGetData": { "name": "PaymentDataServiceGetData", @@ -8802,7 +8754,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "PaymentDataServiceGetReturn": { "name": "PaymentDataServiceGetReturn", @@ -8834,7 +8786,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "PaymentDataServicePostData": { "name": "PaymentDataServicePostData", @@ -8868,7 +8820,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "PaymentDataServicePutData": { "name": "PaymentDataServicePutData", @@ -8983,7 +8935,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "PaymentDataServicePutReturn": { "name": "PaymentDataServicePutReturn", @@ -9026,7 +8978,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "PaymentErrorInfo": { "name": "PaymentErrorInfo", @@ -9076,7 +9028,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "Permission": { "name": "Permission", @@ -9228,7 +9180,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "PlanConfiguration": { "name": "PlanConfiguration", @@ -9350,7 +9302,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "PlanPrices": { "name": "PlanPrices", @@ -9492,7 +9444,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "PlanServiceGetOut": { "name": "PlanServiceGetOut", @@ -9526,7 +9478,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "PriceData": { "name": "PriceData", @@ -9587,7 +9539,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "PriceItemData": { "name": "PriceItemData", @@ -9646,7 +9598,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "PriceRequestData": { "name": "PriceRequestData", @@ -9723,7 +9675,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "PriceServiceData": { "name": "PriceServiceData", @@ -9766,7 +9718,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "PriceServiceReturn": { "name": "PriceServiceReturn", @@ -9838,7 +9790,68 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" + }, + "PubDistributionKey": { + "name": "PubDistributionKey", + "since": 118, + "type": "AGGREGATED_TYPE", + "id": 2534, + "rootId": "A3N5cwAJ5g", + "versioned": false, + "encrypted": false, + "values": { + "_id": { + "final": true, + "name": "_id", + "id": 2535, + "since": 118, + "type": "CustomId", + "cardinality": "One", + "encrypted": false + }, + "pubEccKey": { + "final": true, + "name": "pubEccKey", + "id": 2538, + "since": 118, + "type": "Bytes", + "cardinality": "One", + "encrypted": false + }, + "pubKeyMac": { + "final": false, + "name": "pubKeyMac", + "id": 2537, + "since": 118, + "type": "Bytes", + "cardinality": "One", + "encrypted": false + }, + "pubKyberKey": { + "final": true, + "name": "pubKyberKey", + "id": 2539, + "since": 118, + "type": "Bytes", + "cardinality": "One", + "encrypted": false + } + }, + "associations": { + "userGroupId": { + "final": false, + "name": "userGroupId", + "id": 2536, + "since": 118, + "type": "ELEMENT_ASSOCIATION", + "cardinality": "One", + "refType": "Group", + "dependency": null + } + }, + "app": "sys", + "version": "118" }, "PubEncKeyData": { "name": "PubEncKeyData", @@ -9903,6 +9916,24 @@ export const typeModels = { "cardinality": "One", "encrypted": false }, + "senderIdentifier": { + "final": true, + "name": "senderIdentifier", + "id": 2545, + "since": 118, + "type": "String", + "cardinality": "ZeroOrOne", + "encrypted": false + }, + "senderIdentifierType": { + "final": true, + "name": "senderIdentifierType", + "id": 2546, + "since": 118, + "type": "Number", + "cardinality": "ZeroOrOne", + "encrypted": false + }, "senderKeyVersion": { "final": true, "name": "senderKeyVersion", @@ -9913,9 +9944,20 @@ export const typeModels = { "encrypted": false } }, - "associations": {}, + "associations": { + "symKeyMac": { + "final": false, + "name": "symKeyMac", + "id": 2547, + "since": 118, + "type": "AGGREGATION", + "cardinality": "ZeroOrOne", + "refType": "KeyMac", + "dependency": null + } + }, "app": "sys", - "version": "117" + "version": "118" }, "PublicKeyGetIn": { "name": "PublicKeyGetIn", @@ -9965,7 +10007,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "PublicKeyGetOut": { "name": "PublicKeyGetOut", @@ -10024,7 +10066,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "PublicKeyPutIn": { "name": "PublicKeyPutIn", @@ -10076,7 +10118,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "PushIdentifier": { "name": "PushIdentifier", @@ -10234,7 +10276,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "PushIdentifierList": { "name": "PushIdentifierList", @@ -10268,7 +10310,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "ReceivedGroupInvitation": { "name": "ReceivedGroupInvitation", @@ -10429,7 +10471,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "RecoverCode": { "name": "RecoverCode", @@ -10515,7 +10557,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "RecoverCodeData": { "name": "RecoverCodeData", @@ -10574,7 +10616,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "ReferralCodeGetIn": { "name": "ReferralCodeGetIn", @@ -10608,7 +10650,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "ReferralCodePostIn": { "name": "ReferralCodePostIn", @@ -10631,7 +10673,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "ReferralCodePostOut": { "name": "ReferralCodePostOut", @@ -10665,7 +10707,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "RegistrationCaptchaServiceData": { "name": "RegistrationCaptchaServiceData", @@ -10706,7 +10748,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "RegistrationCaptchaServiceGetData": { "name": "RegistrationCaptchaServiceGetData", @@ -10774,7 +10816,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "RegistrationCaptchaServiceReturn": { "name": "RegistrationCaptchaServiceReturn", @@ -10815,7 +10857,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "RegistrationReturn": { "name": "RegistrationReturn", @@ -10847,7 +10889,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "RegistrationServiceData": { "name": "RegistrationServiceData", @@ -10897,7 +10939,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "RejectedSender": { "name": "RejectedSender", @@ -10992,7 +11034,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "RejectedSendersRef": { "name": "RejectedSendersRef", @@ -11026,7 +11068,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "RepeatRule": { "name": "RepeatRule", @@ -11105,7 +11147,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "ResetFactorsDeleteData": { "name": "ResetFactorsDeleteData", @@ -11155,7 +11197,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "ResetPasswordPostIn": { "name": "ResetPasswordPostIn", @@ -11234,7 +11276,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "RootInstance": { "name": "RootInstance", @@ -11293,7 +11335,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "SaltData": { "name": "SaltData", @@ -11325,7 +11367,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "SaltReturn": { "name": "SaltReturn", @@ -11366,7 +11408,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "SecondFactor": { "name": "SecondFactor", @@ -11454,7 +11496,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "SecondFactorAuthAllowedReturn": { "name": "SecondFactorAuthAllowedReturn", @@ -11486,7 +11528,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "SecondFactorAuthData": { "name": "SecondFactorAuthData", @@ -11558,7 +11600,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "SecondFactorAuthDeleteData": { "name": "SecondFactorAuthDeleteData", @@ -11592,7 +11634,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "SecondFactorAuthGetData": { "name": "SecondFactorAuthGetData", @@ -11624,7 +11666,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "SecondFactorAuthGetReturn": { "name": "SecondFactorAuthGetReturn", @@ -11656,7 +11698,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "SecondFactorAuthentication": { "name": "SecondFactorAuthentication", @@ -11742,7 +11784,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "SendRegistrationCodeData": { "name": "SendRegistrationCodeData", @@ -11801,7 +11843,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "SendRegistrationCodeReturn": { "name": "SendRegistrationCodeReturn", @@ -11833,7 +11875,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "SentGroupInvitation": { "name": "SentGroupInvitation", @@ -11922,7 +11964,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "Session": { "name": "Session", @@ -12065,7 +12107,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "SignOrderProcessingAgreementData": { "name": "SignOrderProcessingAgreementData", @@ -12106,7 +12148,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "SseConnectData": { "name": "SseConnectData", @@ -12149,7 +12191,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "StringConfigValue": { "name": "StringConfigValue", @@ -12190,7 +12232,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "StringWrapper": { "name": "StringWrapper", @@ -12222,7 +12264,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "SurveyData": { "name": "SurveyData", @@ -12281,7 +12323,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "SwitchAccountTypePostIn": { "name": "SwitchAccountTypePostIn", @@ -12379,7 +12421,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "SystemKeysReturn": { "name": "SystemKeysReturn", @@ -12495,7 +12537,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "TakeOverDeletedAddressData": { "name": "TakeOverDeletedAddressData", @@ -12554,7 +12596,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "TypeInfo": { "name": "TypeInfo", @@ -12595,7 +12637,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "U2fChallenge": { "name": "U2fChallenge", @@ -12638,7 +12680,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "U2fKey": { "name": "U2fKey", @@ -12690,7 +12732,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "U2fRegisteredDevice": { "name": "U2fRegisteredDevice", @@ -12758,7 +12800,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "U2fResponseData": { "name": "U2fResponseData", @@ -12808,7 +12850,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "UpdatePermissionKeyData": { "name": "UpdatePermissionKeyData", @@ -12870,7 +12912,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "UpdateSessionKeysPostIn": { "name": "UpdateSessionKeysPostIn", @@ -12904,7 +12946,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "UpgradePriceServiceData": { "name": "UpgradePriceServiceData", @@ -12956,7 +12998,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "UpgradePriceServiceReturn": { "name": "UpgradePriceServiceReturn", @@ -13127,7 +13169,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "User": { "name": "User", @@ -13342,7 +13384,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "UserAlarmInfo": { "name": "UserAlarmInfo", @@ -13421,7 +13463,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "UserAlarmInfoListType": { "name": "UserAlarmInfoListType", @@ -13455,7 +13497,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "UserAreaGroups": { "name": "UserAreaGroups", @@ -13489,7 +13531,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "UserAuthentication": { "name": "UserAuthentication", @@ -13543,7 +13585,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "UserDataDelete": { "name": "UserDataDelete", @@ -13595,7 +13637,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "UserExternalAuthInfo": { "name": "UserExternalAuthInfo", @@ -13665,7 +13707,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "UserGroupKeyDistribution": { "name": "UserGroupKeyDistribution", @@ -13733,7 +13775,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "UserGroupKeyRotationData": { "name": "UserGroupKeyRotationData", @@ -13798,6 +13840,15 @@ export const typeModels = { "cardinality": "One", "encrypted": false }, + "userGroupEncAdminGroupKey": { + "final": false, + "name": "userGroupEncAdminGroupKey", + "id": 2544, + "since": 118, + "type": "Bytes", + "cardinality": "ZeroOrOne", + "encrypted": false + }, "userGroupEncPreviousGroupKey": { "final": false, "name": "userGroupEncPreviousGroupKey", @@ -13860,7 +13911,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "UserGroupKeyRotationPostIn": { "name": "UserGroupKeyRotationPostIn", @@ -13894,7 +13945,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "UserGroupRoot": { "name": "UserGroupRoot", @@ -13975,7 +14026,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "VariableExternalAuthInfo": { "name": "VariableExternalAuthInfo", @@ -14079,7 +14130,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "VerifierTokenServiceIn": { "name": "VerifierTokenServiceIn", @@ -14111,7 +14162,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "VerifierTokenServiceOut": { "name": "VerifierTokenServiceOut", @@ -14143,7 +14194,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "VerifyRegistrationCodeData": { "name": "VerifyRegistrationCodeData", @@ -14184,7 +14235,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "Version": { "name": "Version", @@ -14255,7 +14306,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "VersionData": { "name": "VersionData", @@ -14314,7 +14365,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "VersionInfo": { "name": "VersionInfo", @@ -14439,7 +14490,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "VersionReturn": { "name": "VersionReturn", @@ -14473,7 +14524,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "WebauthnResponseData": { "name": "WebauthnResponseData", @@ -14532,7 +14583,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "WebsocketCounterData": { "name": "WebsocketCounterData", @@ -14575,7 +14626,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "WebsocketCounterValue": { "name": "WebsocketCounterValue", @@ -14616,7 +14667,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "WebsocketEntityData": { "name": "WebsocketEntityData", @@ -14668,7 +14719,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "WebsocketLeaderStatus": { "name": "WebsocketLeaderStatus", @@ -14700,7 +14751,7 @@ export const typeModels = { }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "WhitelabelChild": { "name": "WhitelabelChild", @@ -14815,7 +14866,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "WhitelabelChildrenRef": { "name": "WhitelabelChildrenRef", @@ -14849,7 +14900,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "WhitelabelConfig": { "name": "WhitelabelConfig", @@ -14984,7 +15035,7 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" }, "WhitelabelParent": { "name": "WhitelabelParent", @@ -15028,6 +15079,6 @@ export const typeModels = { } }, "app": "sys", - "version": "117" + "version": "118" } } \ No newline at end of file diff --git a/src/common/api/entities/sys/TypeRefs.ts b/src/common/api/entities/sys/TypeRefs.ts index 34224372bba3..64438df37452 100644 --- a/src/common/api/entities/sys/TypeRefs.ts +++ b/src/common/api/entities/sys/TypeRefs.ts @@ -37,20 +37,33 @@ export type AccountingInfo = { appStoreSubscription: null | IdTuple; invoiceInfo: null | Id; } -export const AdminGroupKeyAuthenticationDataTypeRef: TypeRef = new TypeRef("sys", "AdminGroupKeyAuthenticationData") +export const AdminGroupKeyDistributionElementTypeRef: TypeRef = new TypeRef("sys", "AdminGroupKeyDistributionElement") -export function createAdminGroupKeyAuthenticationData(values: StrippedEntity): AdminGroupKeyAuthenticationData { - return Object.assign(create(typeModels.AdminGroupKeyAuthenticationData, AdminGroupKeyAuthenticationDataTypeRef), values) +export function createAdminGroupKeyDistributionElement(values: StrippedEntity): AdminGroupKeyDistributionElement { + return Object.assign(create(typeModels.AdminGroupKeyDistributionElement, AdminGroupKeyDistributionElementTypeRef), values) } -export type AdminGroupKeyAuthenticationData = { - _type: TypeRef; +export type AdminGroupKeyDistributionElement = { + _type: TypeRef; _id: Id; - authKeyEncAdminRotationHash: Uint8Array; - version: NumberString; - userGroup: Id; + distEncAdminGroupKey: PubEncKeyData; + userGroupId: Id; +} +export const AdminGroupKeyRotationGetOutTypeRef: TypeRef = new TypeRef("sys", "AdminGroupKeyRotationGetOut") + +export function createAdminGroupKeyRotationGetOut(values: StrippedEntity): AdminGroupKeyRotationGetOut { + return Object.assign(create(typeModels.AdminGroupKeyRotationGetOut, AdminGroupKeyRotationGetOutTypeRef), values) +} + +export type AdminGroupKeyRotationGetOut = { + _type: TypeRef; + + _format: NumberString; + + distributionKeys: PubDistributionKey[]; + userGroupIdsMissingDistributionKeys: Id[]; } export const AdminGroupKeyRotationPostInTypeRef: TypeRef = new TypeRef("sys", "AdminGroupKeyRotationPostIn") @@ -63,40 +76,24 @@ export type AdminGroupKeyRotationPostIn = { _format: NumberString; - adminGroupKeyAuthenticationDataList: AdminGroupKeyAuthenticationData[]; adminGroupKeyData: GroupKeyRotationData; + adminPubKeyMacList: KeyMac[]; + distribution: AdminGroupKeyDistributionElement[]; userGroupKeyData: UserGroupKeyRotationData; } -export const AdministratedGroupTypeRef: TypeRef = new TypeRef("sys", "AdministratedGroup") +export const AdminGroupKeyRotationPutInTypeRef: TypeRef = new TypeRef("sys", "AdminGroupKeyRotationPutIn") -export function createAdministratedGroup(values: StrippedEntity): AdministratedGroup { - return Object.assign(create(typeModels.AdministratedGroup, AdministratedGroupTypeRef), values) +export function createAdminGroupKeyRotationPutIn(values: StrippedEntity): AdminGroupKeyRotationPutIn { + return Object.assign(create(typeModels.AdminGroupKeyRotationPutIn, AdminGroupKeyRotationPutInTypeRef), values) } -export type AdministratedGroup = { - _type: TypeRef; +export type AdminGroupKeyRotationPutIn = { + _type: TypeRef; _format: NumberString; - _id: IdTuple; - _ownerGroup: null | Id; - _permissions: Id; - groupType: NumberString; - groupInfo: IdTuple; - localAdminGroup: Id; -} -export const AdministratedGroupsRefTypeRef: TypeRef = new TypeRef("sys", "AdministratedGroupsRef") - -export function createAdministratedGroupsRef(values: StrippedEntity): AdministratedGroupsRef { - return Object.assign(create(typeModels.AdministratedGroupsRef, AdministratedGroupsRefTypeRef), values) -} - -export type AdministratedGroupsRef = { - _type: TypeRef; - - _id: Id; - - items: Id; + adminDistKeyPair: KeyPair; + distKeyMac: KeyMac; } export const AffiliatePartnerKpiMonthSummaryTypeRef: TypeRef = new TypeRef("sys", "AffiliatePartnerKpiMonthSummary") @@ -1362,7 +1359,6 @@ export type Group = { type: NumberString; admin: null | Id; - administratedGroups: null | AdministratedGroupsRef; archives: ArchiveType[]; currentKeys: null | KeyPair; customer: null | Id; @@ -1398,7 +1394,6 @@ export type GroupInfo = { name: string; group: Id; - localAdmin: null | Id; mailAddressAliases: MailAddressAlias[]; } export const GroupKeyTypeRef: TypeRef = new TypeRef("sys", "GroupKey") @@ -1787,6 +1782,22 @@ export type InvoiceItem = { totalPrice: NumberString; type: NumberString; } +export const KeyMacTypeRef: TypeRef = new TypeRef("sys", "KeyMac") + +export function createKeyMac(values: StrippedEntity): KeyMac { + return Object.assign(create(typeModels.KeyMac, KeyMacTypeRef), values) +} + +export type KeyMac = { + _type: TypeRef; + + _id: Id; + tag: Uint8Array; + taggedKeyVersion: NumberString; + taggingKeyVersion: NumberString; + + taggingGroup: Id; +} export const KeyPairTypeRef: TypeRef = new TypeRef("sys", "KeyPair") export function createKeyPair(values: StrippedEntity): KeyPair { @@ -1820,7 +1831,10 @@ export type KeyRotation = { groupKeyRotationType: NumberString; targetKeyVersion: NumberString; - adminGroupKeyAuthenticationData: null | AdminGroupKeyAuthenticationData; + adminDistKeyPair: null | KeyPair; + adminPubKeyMac: null | KeyMac; + distEncAdminGroupSymKey: null | PubEncKeyData; + distKeyMac: null | KeyMac; } export const KeyRotationsRefTypeRef: TypeRef = new TypeRef("sys", "KeyRotationsRef") @@ -1835,35 +1849,6 @@ export type KeyRotationsRef = { list: Id; } -export const LocalAdminGroupReplacementDataTypeRef: TypeRef = new TypeRef("sys", "LocalAdminGroupReplacementData") - -export function createLocalAdminGroupReplacementData(values: StrippedEntity): LocalAdminGroupReplacementData { - return Object.assign(create(typeModels.LocalAdminGroupReplacementData, LocalAdminGroupReplacementDataTypeRef), values) -} - -export type LocalAdminGroupReplacementData = { - _type: TypeRef; - - _id: Id; - adminGroupEncGKey: Uint8Array; - adminGroupKeyVersion: NumberString; - groupKeyVersion: NumberString; - - groupId: Id; -} -export const LocalAdminRemovalPostInTypeRef: TypeRef = new TypeRef("sys", "LocalAdminRemovalPostIn") - -export function createLocalAdminRemovalPostIn(values: StrippedEntity): LocalAdminRemovalPostIn { - return Object.assign(create(typeModels.LocalAdminRemovalPostIn, LocalAdminRemovalPostInTypeRef), values) -} - -export type LocalAdminRemovalPostIn = { - _type: TypeRef; - - _format: NumberString; - - groupUpdates: LocalAdminGroupReplacementData[]; -} export const LocationServiceGetReturnTypeRef: TypeRef = new TypeRef("sys", "LocationServiceGetReturn") export function createLocationServiceGetReturn(values: StrippedEntity): LocationServiceGetReturn { @@ -2415,6 +2400,22 @@ export type PriceServiceReturn = { currentPriceThisPeriod: null | PriceData; futurePriceNextPeriod: null | PriceData; } +export const PubDistributionKeyTypeRef: TypeRef = new TypeRef("sys", "PubDistributionKey") + +export function createPubDistributionKey(values: StrippedEntity): PubDistributionKey { + return Object.assign(create(typeModels.PubDistributionKey, PubDistributionKeyTypeRef), values) +} + +export type PubDistributionKey = { + _type: TypeRef; + + _id: Id; + pubEccKey: Uint8Array; + pubKeyMac: Uint8Array; + pubKyberKey: Uint8Array; + + userGroupId: Id; +} export const PubEncKeyDataTypeRef: TypeRef = new TypeRef("sys", "PubEncKeyData") export function createPubEncKeyData(values: StrippedEntity): PubEncKeyData { @@ -2430,7 +2431,11 @@ export type PubEncKeyData = { recipientIdentifier: string; recipientIdentifierType: NumberString; recipientKeyVersion: NumberString; + senderIdentifier: null | string; + senderIdentifierType: null | NumberString; senderKeyVersion: null | NumberString; + + symKeyMac: null | KeyMac; } export const PublicKeyGetInTypeRef: TypeRef = new TypeRef("sys", "PublicKeyGetIn") @@ -3401,6 +3406,7 @@ export type UserGroupKeyRotationData = { authVerifier: Uint8Array; distributionKeyEncUserGroupKey: Uint8Array; passphraseEncUserGroupKey: Uint8Array; + userGroupEncAdminGroupKey: null | Uint8Array; userGroupEncPreviousGroupKey: Uint8Array; userGroupKeyVersion: NumberString; diff --git a/src/common/api/entities/tutanota/TypeModels.js b/src/common/api/entities/tutanota/TypeModels.js index 9bda2152c9fa..5269047f6b63 100644 --- a/src/common/api/entities/tutanota/TypeModels.js +++ b/src/common/api/entities/tutanota/TypeModels.js @@ -1,6 +1,6 @@ // This is an automatically generated file, please do not edit by hand! -// You should not use it directly, please use `resolveTypReference()` instead. +// You should not use it directly, please use `resolveTypReference()` instead. // We do not want tsc to spend time either checking or inferring type of these huge expressions. Even when it does try to infer them they are still wrong. // The actual type is an object with keys as entities names and values as TypeModel. diff --git a/src/common/api/worker/crypto/AsymmetricCryptoFacade.ts b/src/common/api/worker/crypto/AsymmetricCryptoFacade.ts index f9e95c8190d9..2eb8bd467c2b 100644 --- a/src/common/api/worker/crypto/AsymmetricCryptoFacade.ts +++ b/src/common/api/worker/crypto/AsymmetricCryptoFacade.ts @@ -20,14 +20,16 @@ import { import type { RsaImplementation } from "./RsaImplementation" import { PQFacade } from "../facades/PQFacade.js" import { CryptoError } from "@tutao/tutanota-crypto/error.js" -import { asCryptoProtoocolVersion, CryptoProtocolVersion, EncryptionAuthStatus, PublicKeyIdentifierType } from "../../common/TutanotaConstants.js" +import { asCryptoProtoocolVersion, CryptoProtocolVersion, EncryptionAuthStatus } from "../../common/TutanotaConstants.js" import { arrayEquals, assertNotNull, uint8ArrayToHex, Versioned } from "@tutao/tutanota-utils" -import { KeyLoaderFacade } from "../facades/KeyLoaderFacade.js" +import { KeyLoaderFacade, parseKeyVersion } from "../facades/KeyLoaderFacade.js" import { ProgrammingError } from "../../common/error/ProgrammingError.js" -import { createPublicKeyGetIn, createPublicKeyPutIn, PubEncKeyData, type PublicKeyGetOut } from "../../entities/sys/TypeRefs.js" +import { createPublicKeyPutIn, PubEncKeyData } from "../../entities/sys/TypeRefs.js" import { CryptoWrapper } from "./CryptoWrapper.js" import { PublicKeyService } from "../../entities/sys/Services.js" import { IServiceExecutor } from "../../common/ServiceRequest.js" +import { PublicKeyIdentifier, PublicKeyProvider, PublicKeys } from "../facades/PublicKeyProvider.js" +import { KeyVersion } from "@tutao/tutanota-utils/dist/Utils.js" assertWorkerOrNode() @@ -36,21 +38,11 @@ export type DecapsulatedAesKey = { senderIdentityPubKey: EccPublicKey | null // for authentication: null for rsa only } -export type PublicKeyIdentifier = { - identifier: string - identifierType: PublicKeyIdentifierType -} - export type PubEncSymKey = { pubEncSymKeyBytes: Uint8Array cryptoProtocolVersion: CryptoProtocolVersion - senderKeyVersion: number | null - recipientKeyVersion: number -} -export type PublicKeys = { - pubRsaKey: null | Uint8Array - pubEccKey: null | Uint8Array - pubKyberKey: null | Uint8Array + senderKeyVersion: KeyVersion | null + recipientKeyVersion: KeyVersion } /** @@ -64,6 +56,7 @@ export class AsymmetricCryptoFacade { private readonly keyLoaderFacade: KeyLoaderFacade, private readonly cryptoWrapper: CryptoWrapper, private readonly serviceExecutor: IServiceExecutor, + private readonly publicKeyProvider: PublicKeyProvider, ) {} /** @@ -74,14 +67,9 @@ export class AsymmetricCryptoFacade { * @param senderIdentityPubKey the senderIdentityPubKey that was used to encrypt/authenticate the data. * @param senderKeyVersion the version of the senderIdentityPubKey. */ - async authenticateSender(identifier: PublicKeyIdentifier, senderIdentityPubKey: Uint8Array, senderKeyVersion: number): Promise { - const keyData = createPublicKeyGetIn({ - identifier: identifier.identifier, - identifierType: identifier.identifierType, - version: senderKeyVersion.toString(), - }) - const publicKeyGetOut = await this.serviceExecutor.get(PublicKeyService, keyData) - return publicKeyGetOut.pubEccKey != null && arrayEquals(publicKeyGetOut.pubEccKey, senderIdentityPubKey) + async authenticateSender(identifier: PublicKeyIdentifier, senderIdentityPubKey: Uint8Array, senderKeyVersion: KeyVersion): Promise { + const publicKeys = await this.publicKeyProvider.loadVersionedPubKey(identifier, senderKeyVersion) + return publicKeys.pubEccKey != null && arrayEquals(publicKeys.pubEccKey, senderIdentityPubKey) ? EncryptionAuthStatus.TUTACRYPT_AUTHENTICATION_SUCCEEDED : EncryptionAuthStatus.TUTACRYPT_AUTHENTICATION_FAILED } @@ -105,7 +93,7 @@ export class AsymmetricCryptoFacade { const encryptionAuthStatus = await this.authenticateSender( senderIdentifier, assertNotNull(decapsulatedAesKey.senderIdentityPubKey), - Number(assertNotNull(pubEncKeyData.senderKeyVersion)), + parseKeyVersion(assertNotNull(pubEncKeyData.senderKeyVersion)), ) if (encryptionAuthStatus !== EncryptionAuthStatus.TUTACRYPT_AUTHENTICATION_SUCCEEDED) { throw new CryptoError("the provided public key could not be authenticated") @@ -157,7 +145,7 @@ export class AsymmetricCryptoFacade { */ async loadKeyPairAndDecryptSymKey( recipientKeyPairGroupId: Id, - recipientKeyVersion: number, + recipientKeyVersion: KeyVersion, cryptoProtocolVersion: CryptoProtocolVersion, pubEncSymKey: Uint8Array, ): Promise { @@ -276,14 +264,3 @@ export class AsymmetricCryptoFacade { } } } - -export function convertToVersionedPublicKeys(publicKeyGetOut: PublicKeyGetOut): Versioned { - return { - object: { - pubRsaKey: publicKeyGetOut.pubRsaKey, - pubKyberKey: publicKeyGetOut.pubKyberKey, - pubEccKey: publicKeyGetOut.pubEccKey, - }, - version: Number(publicKeyGetOut.pubKeyVersion), - } -} diff --git a/src/common/api/worker/crypto/CryptoFacade.ts b/src/common/api/worker/crypto/CryptoFacade.ts index cbc5056234a8..58cfaf5793de 100644 --- a/src/common/api/worker/crypto/CryptoFacade.ts +++ b/src/common/api/worker/crypto/CryptoFacade.ts @@ -4,12 +4,14 @@ import { downcast, isSameTypeRef, isSameTypeRefByAttr, + lazy, neverNull, ofClass, promiseMap, stringToUtf8Uint8Array, TypeRef, uint8ArrayToBase64, + Versioned, } from "@tutao/tutanota-utils" import { AccountType, @@ -24,12 +26,11 @@ import { SYSTEM_GROUP_MAIL_ADDRESS, } from "../../common/TutanotaConstants" import { HttpMethod, resolveTypeReference } from "../../common/EntityFunctions" -import type { BucketKey, BucketPermission, GroupMembership, InstanceSessionKey, Permission, PublicKeyGetOut } from "../../entities/sys/TypeRefs.js" +import type { BucketKey, BucketPermission, GroupMembership, InstanceSessionKey, Permission } from "../../entities/sys/TypeRefs.js" import { BucketKeyTypeRef, BucketPermissionTypeRef, createInstanceSessionKey, - createPublicKeyGetIn, createUpdatePermissionKeyData, GroupInfoTypeRef, GroupTypeRef, @@ -58,20 +59,34 @@ import type { Entity, Instance, SomeEntity, TypeModel } from "../../common/Entit import { assertWorkerOrNode } from "../../common/Env" import type { EntityClient } from "../../common/EntityClient" import { RestClient } from "../rest/RestClient" -import { Aes256Key, aes256RandomKey, aesEncrypt, AesKey, bitArrayToUint8Array, decryptKey, EccPublicKey, encryptKey, sha256Hash } from "@tutao/tutanota-crypto" +import { + Aes256Key, + aes256RandomKey, + aesEncrypt, + AesKey, + bitArrayToUint8Array, + decryptKey, + EccPublicKey, + encryptKey, + isPqKeyPairs, + sha256Hash, +} from "@tutao/tutanota-crypto" import { RecipientNotResolvedError } from "../../common/error/RecipientNotResolvedError" import { IServiceExecutor } from "../../common/ServiceRequest" import { EncryptTutanotaPropertiesService } from "../../entities/tutanota/Services" -import { PublicKeyService, UpdatePermissionKeyService } from "../../entities/sys/Services" +import { UpdatePermissionKeyService } from "../../entities/sys/Services" import { UserFacade } from "../facades/UserFacade" import { elementIdPart, getElementId, getListId } from "../../common/utils/EntityUtils.js" import { InstanceMapper } from "./InstanceMapper.js" import { OwnerEncSessionKeysUpdateQueue } from "./OwnerEncSessionKeysUpdateQueue.js" import { DefaultEntityRestCache } from "../rest/DefaultEntityRestCache.js" import { CryptoError } from "@tutao/tutanota-crypto/error.js" -import { KeyLoaderFacade } from "../facades/KeyLoaderFacade.js" +import { KeyLoaderFacade, parseKeyVersion } from "../facades/KeyLoaderFacade.js" import { encryptKeyWithVersionedKey, VersionedEncryptedKey, VersionedKey } from "./CryptoWrapper.js" -import { AsymmetricCryptoFacade, convertToVersionedPublicKeys } from "./AsymmetricCryptoFacade.js" +import { AsymmetricCryptoFacade } from "./AsymmetricCryptoFacade.js" +import { PublicKeyProvider, PublicKeys } from "../facades/PublicKeyProvider.js" +import { KeyVersion } from "@tutao/tutanota-utils/dist/Utils.js" +import { KeyRotationFacade } from "../facades/KeyRotationFacade.js" assertWorkerOrNode() @@ -98,6 +113,8 @@ export class CryptoFacade { private readonly cache: DefaultEntityRestCache | null, private readonly keyLoaderFacade: KeyLoaderFacade, private readonly asymmetricCryptoFacade: AsymmetricCryptoFacade, + private readonly publicKeyProvider: PublicKeyProvider, + private readonly keyRotationFacade: lazy, ) {} async applyMigrationsForInstance(decryptedInstance: T): Promise { @@ -178,11 +195,14 @@ export class CryptoFacade { const resolvedSessionKeys = await this.resolveWithBucketKey(bucketKey, instance, typeModel) return resolvedSessionKeys.resolvedSessionKeyForInstance } else if (instance._ownerEncSessionKey && this.userFacade.isFullyLoggedIn() && this.userFacade.hasGroup(instance._ownerGroup)) { - const gk = await this.keyLoaderFacade.loadSymGroupKey(instance._ownerGroup, Number(instance._ownerKeyVersion ?? 0)) + const gk = await this.keyLoaderFacade.loadSymGroupKey(instance._ownerGroup, parseKeyVersion(instance._ownerKeyVersion ?? "0")) return this.resolveSessionKeyWithOwnerKey(instance, gk) } else if (instance.ownerEncSessionKey) { // Likely a DataTransferType, so this is a service. - const gk = await this.keyLoaderFacade.loadSymGroupKey(this.userFacade.getGroupId(GroupType.Mail), Number(instance.ownerKeyVersion ?? 0)) + const gk = await this.keyLoaderFacade.loadSymGroupKey( + this.userFacade.getGroupId(GroupType.Mail), + parseKeyVersion(instance.ownerKeyVersion ?? "0"), + ) return this.resolveSessionKeyWithOwnerKey(instance, gk) } else { // See PermissionType jsdoc for more info on permissions @@ -244,7 +264,7 @@ export class CryptoFacade { // bucket key is encrypted with public key for internal recipient const { decryptedAesKey, senderIdentityPubKey } = await this.asymmetricCryptoFacade.loadKeyPairAndDecryptSymKey( bucketKey.keyGroup, - Number(bucketKey.recipientKeyVersion), + parseKeyVersion(bucketKey.recipientKeyVersion), asCryptoProtoocolVersion(bucketKey.protocolVersion), bucketKey.pubEncBucketKey, ) @@ -253,7 +273,7 @@ export class CryptoFacade { } else if (bucketKey.groupEncBucketKey) { // received as secure external recipient or reply from secure external sender let keyGroup - const groupKeyVersion = Number(bucketKey.recipientKeyVersion) + const groupKeyVersion = parseKeyVersion(bucketKey.recipientKeyVersion) if (bucketKey.keyGroup) { // 1. Uses when receiving confidential replies from external users. // 2. legacy code path for old external clients that used to encrypt bucket keys with user group keys. @@ -305,7 +325,7 @@ export class CryptoFacade { * @param groupKeyVersion the version of the key from the keyGroup * @param groupEncBucketKey The group key encrypted bucket key. */ - private async resolveWithGroupReference(keyGroup: Id, groupKeyVersion: number, groupEncBucketKey: Uint8Array): Promise { + private async resolveWithGroupReference(keyGroup: Id, groupKeyVersion: KeyVersion, groupEncBucketKey: Uint8Array): Promise { if (this.userFacade.hasGroup(keyGroup)) { // the logged-in user (most likely external) is a member of that group. Then we have the group key from the memberships const groupKey = await this.keyLoaderFacade.loadSymGroupKey(keyGroup, groupKeyVersion) @@ -321,11 +341,11 @@ export class CryptoFacade { if (!externalUserGroupdId) { throw new SessionKeyNotFoundError("no admin group on key group: " + externalMailGroupId) } - const externalUserGroupKeyVersion = Number(externalMailGroup.adminGroupKeyVersion ?? 0) + const externalUserGroupKeyVersion = parseKeyVersion(externalMailGroup.adminGroupKeyVersion ?? "0") const externalUserGroup = await this.entityClient.load(GroupTypeRef, externalUserGroupdId) const internalUserGroupId = externalUserGroup.admin - const internalUserGroupKeyVersion = Number(externalUserGroup.adminGroupKeyVersion ?? 0) + const internalUserGroupKeyVersion = parseKeyVersion(externalUserGroup.adminGroupKeyVersion ?? "0") if (!(internalUserGroupId && this.userFacade.hasGroup(internalUserGroupId))) { throw new SessionKeyNotFoundError("no admin group or no membership of admin group: " + internalUserGroupId) } @@ -335,13 +355,13 @@ export class CryptoFacade { const currentExternalUserGroupKey = decryptKey(internalUserGroupKey, assertNotNull(externalUserGroup.adminGroupEncGKey)) const externalUserGroupKey = await this.keyLoaderFacade.loadSymGroupKey(externalUserGroupdId, externalUserGroupKeyVersion, { object: currentExternalUserGroupKey, - version: Number(externalUserGroup.groupKeyVersion), + version: parseKeyVersion(externalUserGroup.groupKeyVersion), }) const currentExternalMailGroupKey = decryptKey(externalUserGroupKey, assertNotNull(externalMailGroup.adminGroupEncGKey)) const externalMailGroupKey = await this.keyLoaderFacade.loadSymGroupKey(externalMailGroupId, externalMailGroupKeyVersion, { object: currentExternalMailGroupKey, - version: Number(externalMailGroup.groupKeyVersion), + version: parseKeyVersion(externalMailGroup.groupKeyVersion), }) return decryptKey(externalMailGroupKey, groupEncBucketKey) @@ -380,7 +400,7 @@ export class CryptoFacade { const customerGroupPermission = listPermissions.find((p) => p.group === customerGroupMembership.group) if (!customerGroupPermission) throw new SessionKeyNotFoundError("Permission not found, could not apply OwnerGroup migration") - const customerGroupKeyVersion = Number(customerGroupPermission.symKeyVersion ?? 0) + const customerGroupKeyVersion = parseKeyVersion(customerGroupPermission.symKeyVersion ?? "0") const customerGroupKey = await this.keyLoaderFacade.loadSymGroupKey(customerGroupMembership.group, customerGroupKeyVersion) const versionedCustomerGroupKey = { object: customerGroupKey, version: customerGroupKeyVersion } const listKey = decryptKey(customerGroupKey, assertNotNull(customerGroupPermission.symEncSessionKey)) @@ -426,7 +446,7 @@ export class CryptoFacade { if (symmetricPermission) { const gk = await this.keyLoaderFacade.loadSymGroupKey( assertNotNull(symmetricPermission._ownerGroup), - Number(symmetricPermission._ownerKeyVersion ?? 0), + parseKeyVersion(symmetricPermission._ownerKeyVersion ?? "0"), ) return decryptKey(gk, assertNotNull(symmetricPermission._ownerEncSessionKey)) } else { @@ -462,11 +482,12 @@ export class CryptoFacade { typeModel, encryptionAuthStatus, pqMessageSenderKey, - bucketKey.protocolVersion === CryptoProtocolVersion.TUTA_CRYPT ? Number(bucketKey.senderKeyVersion ?? 0) : null, + bucketKey.protocolVersion === CryptoProtocolVersion.TUTA_CRYPT ? parseKeyVersion(bucketKey.senderKeyVersion ?? "0") : null, instance, resolvedSessionKeyForInstance, instanceSessionKeyWithOwnerEncSessionKey, decryptedSessionKey, + bucketKey.keyGroup, ) } instanceSessionKeyWithOwnerEncSessionKey.symEncSessionKey = ownerEncSessionKey.key @@ -483,39 +504,52 @@ export class CryptoFacade { private async authenticateMainInstance( typeModel: TypeModel, - encryptionAuthStatus: - | EncryptionAuthStatus - | null - | EncryptionAuthStatus.RSA_NO_AUTHENTICATION - | EncryptionAuthStatus.TUTACRYPT_AUTHENTICATION_SUCCEEDED - | EncryptionAuthStatus.TUTACRYPT_AUTHENTICATION_FAILED - | EncryptionAuthStatus.AES_NO_AUTHENTICATION, + encryptionAuthStatus: EncryptionAuthStatus | null, pqMessageSenderKey: Uint8Array | null, - pqMessageSenderKeyVersion: number | null, + pqMessageSenderKeyVersion: KeyVersion | null, instance: Record, resolvedSessionKeyForInstance: number[], instanceSessionKeyWithOwnerEncSessionKey: InstanceSessionKey, decryptedSessionKey: number[], + keyGroup: Id | null, ) { // we only authenticate mail instances const isMailInstance = isSameTypeRefByAttr(MailTypeRef, typeModel.app, typeModel.name) if (isMailInstance) { if (!encryptionAuthStatus) { if (!pqMessageSenderKey) { + // This message was encrypted with RSA. We check if TutaCrypt could have been used instead. + const recipientGroup = assertNotNull( + keyGroup, + "trying to authenticate an asymmetrically encrypted message, but we can't determine the recipient's group ID", + ) + const currentKeyPair = await this.keyLoaderFacade.loadCurrentKeyPair(recipientGroup) encryptionAuthStatus = EncryptionAuthStatus.RSA_NO_AUTHENTICATION + if (isPqKeyPairs(currentKeyPair.object)) { + const keyRotationFacade = this.keyRotationFacade() + const rotatedGroups = await keyRotationFacade.getGroupIdsThatPerformedKeyRotations() + if (!rotatedGroups.includes(recipientGroup)) { + encryptionAuthStatus = EncryptionAuthStatus.RSA_DESPITE_TUTACRYPT + } + } } else { const mail = this.isLiteralInstance(instance) ? ((await this.instanceMapper.decryptAndMapToInstance(typeModel, instance, resolvedSessionKeyForInstance)) as Mail) : (instance as Mail) const senderMailAddress = mail.confidential ? mail.sender.address : SYSTEM_GROUP_MAIL_ADDRESS - encryptionAuthStatus = await this.tryAuthenticateSenderOfMainInstance(senderMailAddress, pqMessageSenderKey, pqMessageSenderKeyVersion) + encryptionAuthStatus = await this.tryAuthenticateSenderOfMainInstance( + senderMailAddress, + pqMessageSenderKey, + // must not be null if this is a TutaCrypt message with a pqMessageSenderKey + assertNotNull(pqMessageSenderKeyVersion), + ) } } instanceSessionKeyWithOwnerEncSessionKey.encryptionAuthStatus = aesEncrypt(decryptedSessionKey, stringToUtf8Uint8Array(encryptionAuthStatus)) } } - private async tryAuthenticateSenderOfMainInstance(senderMailAddress: string, pqMessageSenderKey: Uint8Array, pqMessageSenderKeyVersion: number | null) { + private async tryAuthenticateSenderOfMainInstance(senderMailAddress: string, pqMessageSenderKey: Uint8Array, pqMessageSenderKeyVersion: KeyVersion) { try { return await this.asymmetricCryptoFacade.authenticateSender( { @@ -523,7 +557,7 @@ export class CryptoFacade { identifierType: PublicKeyIdentifierType.MAIL_ADDRESS, }, pqMessageSenderKey, - assertNotNull(pqMessageSenderKeyVersion), + pqMessageSenderKeyVersion, ) } catch (e) { // we do not want to fail mail decryption here, e.g. in case an alias was removed we would get a permanent NotFoundError. @@ -568,7 +602,7 @@ export class CryptoFacade { if (bucketPermission.ownerEncBucketKey != null) { const ownerGroupKey = await this.keyLoaderFacade.loadSymGroupKey( neverNull(bucketPermission._ownerGroup), - Number(bucketPermission.ownerKeyVersion ?? 0), + parseKeyVersion(bucketPermission.ownerKeyVersion ?? "0"), ) bucketKey = decryptKey(ownerGroupKey, bucketPermission.ownerEncBucketKey) } else if (bucketPermission.symEncBucketKey) { @@ -576,7 +610,7 @@ export class CryptoFacade { // The bucket key is encrypted with the user group key of the external user. // We maintain this code as we still have some old BucketKeys in some external mailboxes. // Can be removed if we finished mail details migration or when we do cleanup of external mailboxes. - const userGroupKey = await this.keyLoaderFacade.loadSymUserGroupKey(Number(bucketPermission.symKeyVersion ?? 0)) + const userGroupKey = await this.keyLoaderFacade.loadSymUserGroupKey(parseKeyVersion(bucketPermission.symKeyVersion ?? "0")) bucketKey = decryptKey(userGroupKey, bucketPermission.symEncBucketKey) } else { throw new SessionKeyNotFoundError( @@ -608,7 +642,7 @@ export class CryptoFacade { const { decryptedAesKey } = await this.asymmetricCryptoFacade.loadKeyPairAndDecryptSymKey( bucketPermission.group, - Number(bucketPermission.pubKeyVersion ?? 0), + parseKeyVersion(bucketPermission.pubKeyVersion ?? "0"), asCryptoProtoocolVersion(bucketPermission.protocolVersion), pubEncBucketKey, ) @@ -681,13 +715,11 @@ export class CryptoFacade { recipientMailAddress: string, notFoundRecipients: Array, ): Promise { - const keyData = createPublicKeyGetIn({ - identifier: recipientMailAddress, - identifierType: PublicKeyIdentifierType.MAIL_ADDRESS, - version: null, - }) try { - const publicKeyGetOut = await this.serviceExecutor.get(PublicKeyService, keyData) + const pubKeys = await this.publicKeyProvider.loadCurrentPubKey({ + identifier: recipientMailAddress, + identifierType: PublicKeyIdentifierType.MAIL_ADDRESS, + }) // We do not create any key data in case there is one not found recipient, but we want to // collect ALL not found recipients when iterating a recipient list. if (notFoundRecipients.length !== 0) { @@ -696,10 +728,10 @@ export class CryptoFacade { const isExternalSender = this.userFacade.getUser()?.accountType === AccountType.EXTERNAL // we only encrypt symmetric as external sender if the recipient supports tuta-crypt. // Clients need to support symmetric decryption from external users. We can always encrypt symmetricly when old clients are deactivated that don't support tuta-crypt. - if (publicKeyGetOut.pubKyberKey && isExternalSender) { + if (pubKeys.object.pubKyberKey && isExternalSender) { return this.createSymEncInternalRecipientKeyData(recipientMailAddress, bucketKey) } else { - return this.createPubEncInternalRecipientKeyData(bucketKey, recipientMailAddress, publicKeyGetOut, senderUserGroupId) + return this.createPubEncInternalRecipientKeyData(bucketKey, recipientMailAddress, pubKeys, senderUserGroupId) } } catch (e) { if (e instanceof NotFoundError) { @@ -713,8 +745,12 @@ export class CryptoFacade { } } - private async createPubEncInternalRecipientKeyData(bucketKey: AesKey, recipientMailAddress: string, publicKeyGetOut: PublicKeyGetOut, senderGroupId: Id) { - const recipientPublicKeys = convertToVersionedPublicKeys(publicKeyGetOut) + private async createPubEncInternalRecipientKeyData( + bucketKey: AesKey, + recipientMailAddress: string, + recipientPublicKeys: Versioned, + senderGroupId: Id, + ) { const pubEncBucketKey = await this.asymmetricCryptoFacade.asymEncryptSymKey(bucketKey, recipientPublicKeys, senderGroupId) return createInternalRecipientKeyData({ mailAddress: recipientMailAddress, diff --git a/src/common/api/worker/crypto/CryptoWrapper.ts b/src/common/api/worker/crypto/CryptoWrapper.ts index 67edc6f3193b..087530eb38ff 100644 --- a/src/common/api/worker/crypto/CryptoWrapper.ts +++ b/src/common/api/worker/crypto/CryptoWrapper.ts @@ -21,20 +21,24 @@ import { generateEccKeyPair, hkdf, HkdfKeyDerivationDomains, + hmacSha256, IV_BYTE_LENGTH, KEY_LENGTH_BYTES_AES_256, keyToUint8Array, KyberPrivateKey, KyberPublicKey, kyberPublicKeyToBytes, + MacTag, type PQKeyPairs, random, type RsaEccKeyPair, type RsaKeyPair, sha256Hash, uint8ArrayToKey, + verifyHmacSha256, } from "@tutao/tutanota-crypto" import { stringToUtf8Uint8Array, Versioned } from "@tutao/tutanota-utils" +import { KeyVersion } from "@tutao/tutanota-utils/dist/Utils.js" /** * An AesKey (usually a group key) and its version. @@ -44,7 +48,7 @@ export type VersionedKey = Versioned * A key that is encrypted with a given version of some other key. */ export type VersionedEncryptedKey = { - encryptingKeyVersion: number // the version of the encryption key NOT the encrypted key + encryptingKeyVersion: KeyVersion // the version of the encryption key NOT the encrypted key key: Uint8Array // encrypted key } @@ -116,7 +120,7 @@ export class CryptoWrapper { return sha256Hash(data) } - deriveKeyWithHkdf({ key, salt, context }: { key: AesKey; salt: string; context: HkdfKeyDerivationDomains }) { + deriveKeyWithHkdf({ key, salt, context }: { key: AesKey; salt: string; context: HkdfKeyDerivationDomains }): Aes256Key { return deriveKey({ salt, key, @@ -124,6 +128,14 @@ export class CryptoWrapper { length: KEY_LENGTH_BYTES_AES_256, }) } + + hmacSha256(key: AesKey, data: Uint8Array): MacTag { + return hmacSha256(key, data) + } + + verifyHmacSha256(key: AesKey, data: Uint8Array, tag: MacTag) { + return verifyHmacSha256(key, data, tag) + } } function deriveKey({ salt, key, info, length }: { salt: string; key: number[]; info: string; length: number }) { diff --git a/src/common/api/worker/facades/EntropyFacade.ts b/src/common/api/worker/facades/EntropyFacade.ts index 7fc54c25face..628c16699c75 100644 --- a/src/common/api/worker/facades/EntropyFacade.ts +++ b/src/common/api/worker/facades/EntropyFacade.ts @@ -5,7 +5,7 @@ import { EntropyService } from "../../entities/tutanota/Services.js" import { lazy, noOp, ofClass } from "@tutao/tutanota-utils" import { ConnectionError, LockedError, ServiceUnavailableError } from "../../common/error/RestError.js" import { IServiceExecutor } from "../../common/ServiceRequest.js" -import { KeyLoaderFacade } from "./KeyLoaderFacade.js" +import { KeyLoaderFacade, parseKeyVersion } from "./KeyLoaderFacade.js" import { encryptBytes } from "../crypto/CryptoWrapper.js" export interface EntropyDataChunk { @@ -74,7 +74,7 @@ export class EntropyFacade { if (tutanotaProperties.userEncEntropy) { try { const keyLoaderFacade = this.lazyKeyLoaderFacade() - const userGroupKey = await keyLoaderFacade.loadSymUserGroupKey(Number(tutanotaProperties.userKeyVersion ?? 0)) + const userGroupKey = await keyLoaderFacade.loadSymUserGroupKey(parseKeyVersion(tutanotaProperties.userKeyVersion ?? "0")) const entropy = authenticatedAesDecrypt(userGroupKey, tutanotaProperties.userEncEntropy) random.addStaticEntropy(entropy) } catch (error) { diff --git a/src/common/api/worker/facades/KeyAuthenticationFacade.ts b/src/common/api/worker/facades/KeyAuthenticationFacade.ts new file mode 100644 index 000000000000..70e56c6550db --- /dev/null +++ b/src/common/api/worker/facades/KeyAuthenticationFacade.ts @@ -0,0 +1,228 @@ +import { CryptoWrapper } from "../crypto/CryptoWrapper.js" +import { assertNotNull, concat, KeyVersion } from "@tutao/tutanota-utils" +import { Aes256Key, AesKey, bitArrayToUint8Array, EncryptedPqKeyPairs, KeyPairType, MacTag, PQPublicKeys } from "@tutao/tutanota-crypto" +import { assertWorkerOrNode } from "../../common/Env.js" +import { KeyMac, PubDistributionKey } from "../../entities/sys/TypeRefs.js" +import { PublicKeys } from "./PublicKeyProvider.js" + +assertWorkerOrNode() + +type AuthenticationBindingData = { + userGroupId: Id + adminGroupId: Id +} + +type BaseKeyAuthenticationParams = { + tagType: keyof typeof systemMap + sourceOfTrust: {} + // this can be a user group key, an admin group key, an admin group public key or a distribution public key + untrustedKey: {} + bindingData: AuthenticationBindingData +} + +export type UserGroupKeyAuthenticationParams = BaseKeyAuthenticationParams & { + tagType: "USER_GROUP_KEY_TAG" + untrustedKey: { newUserGroupKey: Aes256Key } + sourceOfTrust: { currentUserGroupKey: AesKey } + bindingData: AuthenticationBindingData & { + currentUserGroupKeyVersion: KeyVersion + newUserGroupKeyVersion: KeyVersion + newAdminGroupKeyVersion: KeyVersion + } +} + +/** + * A system to authenticate some key. + */ +type KeyAuthenticationSystem = { + /** + * Canonicalizes the data we want to authenticate, i.e., the new key and some binding data, into a byte array. + * @param params + */ + generateAuthenticationData(params: T): Uint8Array + /** + * Derives the authentication key from a trusted key and some additional binding parameters. + * @param params + * @param cryptoWrapper + */ + deriveKey(params: T, cryptoWrapper: CryptoWrapper): Aes256Key +} + +/** + * Purpose: prove to admins that the new User Group Key is authentic. + * By deriving this key from the current User Group Key, the admin knows that it was created by someone who had access to this key, + * that is, either the user or another admin. + */ +const userGroupKeyAuthenticationSystem: KeyAuthenticationSystem = { + deriveKey( + { bindingData: { userGroupId, adminGroupId, newAdminGroupKeyVersion, newUserGroupKeyVersion, currentUserGroupKeyVersion }, sourceOfTrust }, + cryptoWrapper, + ) { + return cryptoWrapper.deriveKeyWithHkdf({ + salt: `adminGroup: ${adminGroupId}, userGroup: ${userGroupId}, currentUserGroupKeyVersion: ${currentUserGroupKeyVersion}, newAdminGroupKeyVersion: ${newAdminGroupKeyVersion}, newUserGroupKeyVersion: ${newUserGroupKeyVersion}`, + key: sourceOfTrust.currentUserGroupKey, + context: "newUserGroupKeyAuthKeyForRotationAsNonAdminUser", + }) + }, + generateAuthenticationData({ untrustedKey: { newUserGroupKey } }) { + return bitArrayToUint8Array(newUserGroupKey) + }, +} + +export type NewAdminPubKeyAuthenticationParams = BaseKeyAuthenticationParams & { + tagType: "NEW_ADMIN_PUB_KEY_TAG" + untrustedKey: { newAdminPubKey: PQPublicKeys } + sourceOfTrust: { receivingUserGroupKey: AesKey } // this receiving user is an admin receiving the new admin group pub keys + bindingData: AuthenticationBindingData & { + newAdminGroupKeyVersion: KeyVersion + currentReceivingUserGroupKeyVersion: KeyVersion + } +} + +/** + * Purpose: prove to users that the new Admin Group Public Key is authentic. + * By deriving this key from the current User Group Key, the user knows that it was created either by someone who had access to this key, + * that is, either themselves or an admin. + */ +const newAdminPubKeyAuthenticationSystem: KeyAuthenticationSystem = { + deriveKey({ bindingData: { userGroupId, adminGroupId, newAdminGroupKeyVersion, currentReceivingUserGroupKeyVersion }, sourceOfTrust }, cryptoWrapper) { + return cryptoWrapper.deriveKeyWithHkdf({ + salt: `adminGroup: ${adminGroupId}, userGroup: ${userGroupId}, currentUserGroupKeyVersion: ${currentReceivingUserGroupKeyVersion}, newAdminGroupKeyVersion: ${newAdminGroupKeyVersion}`, + key: sourceOfTrust.receivingUserGroupKey, + context: "newAdminPubKeyAuthKeyForUserGroupKeyRotation", + }) + }, + generateAuthenticationData({ + untrustedKey: { + newAdminPubKey: { eccPublicKey, kyberPublicKey }, + }, + }) { + return concat(eccPublicKey, kyberPublicKey.raw) + }, +} + +export type PubDistKeyAuthenticationParams = BaseKeyAuthenticationParams & { + tagType: "PUB_DIST_KEY_TAG" + untrustedKey: { distPubKey: PQPublicKeys } + sourceOfTrust: { currentAdminGroupKey: AesKey } + bindingData: AuthenticationBindingData & { + currentUserGroupKeyVersion: KeyVersion + currentAdminGroupKeyVersion: KeyVersion + } +} + +/** + * Purpose: prove to other admins that the Distribution Public Key is authentic. + * By deriving this key from the current Admin Group Key, the admin knows that it was created by someone who had access to this key, + * that is, either themselves or another admin. + */ +const pubDistKeyAuthenticationSystem: KeyAuthenticationSystem = { + deriveKey({ bindingData: { adminGroupId, userGroupId, currentUserGroupKeyVersion, currentAdminGroupKeyVersion }, sourceOfTrust }, cryptoWrapper) { + return cryptoWrapper.deriveKeyWithHkdf({ + salt: `adminGroup: ${adminGroupId}, userGroup: ${userGroupId}, currentUserGroupKeyVersion: ${currentUserGroupKeyVersion}, currentAdminGroupKeyVersion: ${currentAdminGroupKeyVersion}`, + key: sourceOfTrust.currentAdminGroupKey, + context: "adminGroupDistKeyPairAuthKeyForMultiAdminRotation", + }) + }, + generateAuthenticationData({ + untrustedKey: { + distPubKey: { eccPublicKey, kyberPublicKey }, + }, + }) { + return concat(eccPublicKey, kyberPublicKey.raw) + }, +} + +export type AdminSymKeyAuthenticationParams = BaseKeyAuthenticationParams & { + tagType: "ADMIN_SYM_KEY_TAG" + untrustedKey: { newAdminGroupKey: Aes256Key } + sourceOfTrust: { currentReceivingUserGroupKey: AesKey } // this receiving user is an admin receiving the new admin group sym key + bindingData: AuthenticationBindingData & { + newAdminGroupKeyVersion: KeyVersion + currentReceivingUserGroupKeyVersion: KeyVersion + } +} + +/** + * Purpose: prove to other admins that the new Admin Group Symmetric Key is authentic. + * By deriving this key from the current User Group Key, the admin user knows that it was created either by someone who had access to this key, + * that is, either themselves or another admin. + */ +const adminSymKeyAuthenticationSystem: KeyAuthenticationSystem = { + deriveKey({ bindingData: { adminGroupId, userGroupId, newAdminGroupKeyVersion, currentReceivingUserGroupKeyVersion }, sourceOfTrust }, cryptoWrapper) { + return cryptoWrapper.deriveKeyWithHkdf({ + salt: `adminGroup: ${adminGroupId}, userGroup: ${userGroupId}, currentUserGroupKeyVersion: ${currentReceivingUserGroupKeyVersion}, newAdminGroupKeyVersion: ${newAdminGroupKeyVersion}`, + key: sourceOfTrust.currentReceivingUserGroupKey, + context: "newAdminSymKeyAuthKeyForMultiAdminRotationAsUser", + }) + }, + generateAuthenticationData({ untrustedKey: { newAdminGroupKey } }) { + return bitArrayToUint8Array(newAdminGroupKey) + }, +} + +export type KeyAuthenticationParams = + | UserGroupKeyAuthenticationParams + | NewAdminPubKeyAuthenticationParams + | PubDistKeyAuthenticationParams + | AdminSymKeyAuthenticationParams + +const systemMap = { + USER_GROUP_KEY_TAG: userGroupKeyAuthenticationSystem, + NEW_ADMIN_PUB_KEY_TAG: newAdminPubKeyAuthenticationSystem, + PUB_DIST_KEY_TAG: pubDistKeyAuthenticationSystem, + ADMIN_SYM_KEY_TAG: adminSymKeyAuthenticationSystem, +} + +/** + * Authenticates keys by deriving trust in another key using a Message Authentication Code (MAC tag). + */ +export class KeyAuthenticationFacade { + constructor(private readonly cryptoWrapper: CryptoWrapper) {} + + /** + * Computes a MAC tag using an existing key authentication system. + * @param keyAuthenticationParams Parameters for the chosen key authentication system, containing trusted key, key to be verified, and binding data + */ + public computeTag(keyAuthenticationParams: KeyAuthenticationParams): MacTag { + const keyAuthenticationSystem: KeyAuthenticationSystem = systemMap[keyAuthenticationParams.tagType] + const authKey = keyAuthenticationSystem.deriveKey(keyAuthenticationParams, this.cryptoWrapper) + const authData = keyAuthenticationSystem.generateAuthenticationData(keyAuthenticationParams) + return this.cryptoWrapper.hmacSha256(authKey, authData) + } + + /** + * Verifies a MAC tag using an existing key authentication system. + * @param keyAuthenticationParams Parameters for the chosen key authentication system, containing trusted key, key to be verified, and binding data + * @param tag The MAC tag to be verified. Must be a branded MacTag, which you can get with brandKeyMac() in most cases + */ + public verifyTag(keyAuthenticationParams: KeyAuthenticationParams, tag: MacTag): void { + const keyAuthenticationSystem: KeyAuthenticationSystem = systemMap[keyAuthenticationParams.tagType] + const authKey = keyAuthenticationSystem.deriveKey(keyAuthenticationParams, this.cryptoWrapper) + const authData = keyAuthenticationSystem.generateAuthenticationData(keyAuthenticationParams) + this.cryptoWrapper.verifyHmacSha256(authKey, authData, tag) + } +} + +type BrandedKeyMac = Omit & { tag: MacTag } + +/** + * Brands a KeyMac so that it has a branded MacTag, which can be used in authentication methods. + */ +export function brandKeyMac(keyMac: KeyMac): BrandedKeyMac { + return keyMac as BrandedKeyMac +} + +/** + * Converts some form of public PQ keys to the PQPublicKeys type. Assumes pubEccKey and pubKyberKey exist. + * @param kp + */ +export function asPQPublicKeys(kp: EncryptedPqKeyPairs | PubDistributionKey | PublicKeys): PQPublicKeys { + return { + keyPairType: KeyPairType.TUTA_CRYPT, + eccPublicKey: assertNotNull(kp.pubEccKey), + kyberPublicKey: { + raw: assertNotNull(kp.pubKyberKey), + }, + } +} diff --git a/src/common/api/worker/facades/KeyCache.ts b/src/common/api/worker/facades/KeyCache.ts index 4308eca9e518..bc3f0bf68e48 100644 --- a/src/common/api/worker/facades/KeyCache.ts +++ b/src/common/api/worker/facades/KeyCache.ts @@ -2,6 +2,7 @@ import { getFromMap, neverNull } from "@tutao/tutanota-utils" import { User } from "../../entities/sys/TypeRefs.js" import { VersionedKey } from "../crypto/CryptoWrapper.js" import { Aes256Key } from "@tutao/tutanota-crypto" +import { checkKeyVersionConstraints, parseKeyVersion } from "./KeyLoaderFacade.js" /** * A cache for decrypted current keys of each group. Encrypted keys are stored on membership.symEncGKey. @@ -12,13 +13,17 @@ export class KeyCache { // also it is used to decrypt the rest of the keys therefore it requires some special handling private currentUserGroupKey: VersionedKey | null = null // the new user group key will be re-encrypted with this key to distribute the rotated user group key without asking for the password - private userGroupKeyDistributionKey: Aes256Key | null = null + private userDistKey: Aes256Key | null = null + + private legacyUserDistKey: Aes256Key | null = null setCurrentUserGroupKey(newUserGroupKey: VersionedKey) { if (this.currentUserGroupKey != null && this.currentUserGroupKey.version > newUserGroupKey.version) { console.log("Tried to set an outdated user group key") return } + // we need to make sure that the versions returned from the server are non-negative integers, because we rely on that in key verification + checkKeyVersionConstraints(newUserGroupKey.version) this.currentUserGroupKey = newUserGroupKey } @@ -26,12 +31,20 @@ export class KeyCache { return this.currentUserGroupKey } - setUserGroupKeyDistributionKey(userGroupKeyDistributionKey: Aes256Key) { - this.userGroupKeyDistributionKey = userGroupKeyDistributionKey + setUserDistKey(userDistKey: Aes256Key) { + this.userDistKey = userDistKey + } + + setLegacyUserDistKey(legacyUserDistKey: Aes256Key) { + this.legacyUserDistKey = legacyUserDistKey + } + + getUserDistKey(): Aes256Key | null { + return this.userDistKey } - getUserGroupKeyDistributionKey(): Aes256Key | null { - return this.userGroupKeyDistributionKey + getLegacyUserDistKey(): Aes256Key | null { + return this.legacyUserDistKey } /** @@ -41,14 +54,17 @@ export class KeyCache { */ getCurrentGroupKey(groupId: Id, keyLoader: () => Promise): Promise { return getFromMap(this.currentGroupKeys, groupId, async () => { - return keyLoader() + const loadedKey = await keyLoader() + // we need to make sure that the versions returned from the server are non-negative integers, because we rely on that in key verification + checkKeyVersionConstraints(loadedKey.version) + return loadedKey }) } reset() { this.currentGroupKeys = new Map>() this.currentUserGroupKey = null - this.userGroupKeyDistributionKey = null + this.userDistKey = null } /** @@ -58,7 +74,7 @@ export class KeyCache { */ async removeOutdatedGroupKeys(user: User) { const currentUserGroupKeyVersion = neverNull(this.getCurrentUserGroupKey()).version - const receivedUserGroupKeyVersion = Number(user.userGroup.groupKeyVersion) + const receivedUserGroupKeyVersion = parseKeyVersion(user.userGroup.groupKeyVersion) if (receivedUserGroupKeyVersion > currentUserGroupKeyVersion) { //we just ignore this as the same batch MUST have a UserGroupKeyDistribution entity event update console.log(`Received user update with new user group key version: ${currentUserGroupKeyVersion} -> ${receivedUserGroupKeyVersion}`) @@ -67,7 +83,7 @@ export class KeyCache { const newCurrentGroupKeyCache = new Map>() for (const membership of user.memberships) { const cachedGroupKey = this.currentGroupKeys.get(membership.group) - if (cachedGroupKey != null && Number(membership.groupKeyVersion) === (await cachedGroupKey).version) { + if (cachedGroupKey != null && parseKeyVersion(membership.groupKeyVersion) === (await cachedGroupKey).version) { await getFromMap(newCurrentGroupKeyCache, membership.group, () => cachedGroupKey) } } diff --git a/src/common/api/worker/facades/KeyLoaderFacade.ts b/src/common/api/worker/facades/KeyLoaderFacade.ts index 52c12f3cf754..87c88d21ad6d 100644 --- a/src/common/api/worker/facades/KeyLoaderFacade.ts +++ b/src/common/api/worker/facades/KeyLoaderFacade.ts @@ -1,7 +1,7 @@ import { EntityClient } from "../../common/EntityClient.js" -import { AesKey, AsymmetricKeyPair, decryptKey, decryptKeyPair, EncryptedKeyPairs } from "@tutao/tutanota-crypto" +import { AesKey, AsymmetricKeyPair, decryptKey, decryptKeyPair, EncryptedKeyPairs, isRsaOrRsaEccKeyPair } from "@tutao/tutanota-crypto" import { Group, GroupKey, GroupKeyTypeRef, GroupTypeRef, KeyPair } from "../../entities/sys/TypeRefs.js" -import { Versioned } from "@tutao/tutanota-utils/dist/Utils.js" +import { isKeyVersion, KeyVersion, Versioned } from "@tutao/tutanota-utils/dist/Utils.js" import { UserFacade } from "./UserFacade.js" import { NotFoundError } from "../../common/error/RestError.js" import { customIdToString, getElementId, isSameId, stringToCustomId } from "../../common/utils/EntityUtils.js" @@ -9,6 +9,7 @@ import { KeyCache } from "./KeyCache.js" import { assertNotNull, lazyAsync } from "@tutao/tutanota-utils" import { CacheManagementFacade } from "./lazy/CacheManagementFacade.js" import { ProgrammingError } from "../../common/error/ProgrammingError.js" +import { CryptoError } from "@tutao/tutanota-crypto/error.js" import { VersionedKey } from "../crypto/CryptoWrapper.js" /** @@ -29,7 +30,7 @@ export class KeyLoaderFacade { * @param requestedVersion the requestedVersion of the key to be loaded * @param currentGroupKey needs to be set if the user is not a member of the group (e.g. an admin) */ - async loadSymGroupKey(groupId: Id, requestedVersion: number, currentGroupKey?: VersionedKey): Promise { + async loadSymGroupKey(groupId: Id, requestedVersion: KeyVersion, currentGroupKey?: VersionedKey): Promise { if (currentGroupKey != null && currentGroupKey.version < requestedVersion) { // we might not have the membership for this group. so the caller needs to handle it by refreshing the cache throw new Error( @@ -64,7 +65,7 @@ export class KeyLoaderFacade { return this.keyCache.getCurrentGroupKey(groupId, () => this.loadAndDecryptCurrentSymGroupKey(groupId)) } - async loadSymUserGroupKey(requestedVersion: number): Promise { + async loadSymUserGroupKey(requestedVersion: KeyVersion): Promise { // we provide the current user group key to break a possibly infinite recursion let currentUserGroupKey = this.getCurrentSymUserGroupKey() if (currentUserGroupKey.version < requestedVersion) { @@ -79,7 +80,7 @@ export class KeyLoaderFacade { return this.userFacade.getCurrentUserGroupKey() } - async loadKeypair(keyPairGroupId: Id, requestedVersion: number): Promise { + async loadKeypair(keyPairGroupId: Id, requestedVersion: KeyVersion): Promise { let group = await this.entityClient.load(GroupTypeRef, keyPairGroupId) let currentGroupKey = await this.getCurrentSymGroupKey(keyPairGroupId) @@ -94,45 +95,49 @@ export class KeyLoaderFacade { let group = await this.entityClient.load(GroupTypeRef, groupId) let currentGroupKey = await this.getCurrentSymGroupKey(groupId) - if (Number(group.groupKeyVersion) !== currentGroupKey.version) { + if (parseKeyVersion(group.groupKeyVersion) !== currentGroupKey.version) { // There is a race condition after rotating the group key were the group entity in the cache is not in sync with current key version in the key cache. // group.groupKeyVersion might be newer than currentGroupKey.version. // We reload group and user and refresh entity and key cache to synchronize both caches. group = (await (await this.cacheManagementFacade()).refreshKeyCache(groupId)).group currentGroupKey = await this.getCurrentSymGroupKey(groupId) - if (Number(group.groupKeyVersion) !== currentGroupKey.version) { + if (parseKeyVersion(group.groupKeyVersion) !== currentGroupKey.version) { // we still do not have the proper state to get the current key pair throw new Error(`inconsistent key version state in cache and key cache for group ${groupId}`) } } - return { object: this.validateAndDecryptKeyPair(group.currentKeys, groupId, currentGroupKey.object), version: Number(group.groupKeyVersion) } + return { object: this.validateAndDecryptKeyPair(group.currentKeys, groupId, currentGroupKey), version: parseKeyVersion(group.groupKeyVersion) } } - private async loadKeyPairImpl(group: Group, requestedVersion: number, currentGroupKey: VersionedKey) { + private async loadKeyPairImpl(group: Group, requestedVersion: KeyVersion, currentGroupKey: VersionedKey) { const keyPairGroupId = group._id let keyPair: KeyPair | null - let symGroupKey: AesKey + let symGroupKey: VersionedKey if (requestedVersion > currentGroupKey.version) { throw new Error(`Not possible to get newer key version than is cached for group ${keyPairGroupId}`) } else if (requestedVersion === currentGroupKey.version) { - symGroupKey = currentGroupKey.object - if (Number(group.groupKeyVersion) === currentGroupKey.version) { + symGroupKey = currentGroupKey + if (parseKeyVersion(group.groupKeyVersion) === currentGroupKey.version) { keyPair = group.currentKeys } else { - const formerKeysList = assertNotNull(group.formerGroupKeys).list // we load by the version and thus can be sure that we are able to decrypt this key - const formerGroupKey = await this.entityClient.load(GroupKeyTypeRef, [formerKeysList, stringToCustomId(String(currentGroupKey.version))]) + const formerGroupKey = await this.loadFormerGroupKeyInstance(group, currentGroupKey.version) keyPair = formerGroupKey.keyPair } } else { // load a former key pair: groupKeyVersion < groupKey.version const { symmetricGroupKey, groupKeyInstance } = await this.findFormerGroupKey(group, currentGroupKey, requestedVersion) keyPair = groupKeyInstance.keyPair - symGroupKey = symmetricGroupKey + symGroupKey = { object: symmetricGroupKey, version: requestedVersion } } return this.validateAndDecryptKeyPair(keyPair, keyPairGroupId, symGroupKey) } + async loadFormerGroupKeyInstance(group: Group, version: KeyVersion): Promise { + const formerKeysList = assertNotNull(group.formerGroupKeys).list + return await this.entityClient.load(GroupKeyTypeRef, [formerKeysList, convertKeyVersionToCustomId(version)]) + } + /** * * @param groupId MUST NOT be the user group id! @@ -143,9 +148,9 @@ export class KeyLoaderFacade { throw new ProgrammingError("Must not add the user group to the regular group key cache") } const groupMembership = this.userFacade.getMembership(groupId) - const requiredUserGroupKey = await this.loadSymUserGroupKey(Number(groupMembership.symKeyVersion)) + const requiredUserGroupKey = await this.loadSymUserGroupKey(parseKeyVersion(groupMembership.symKeyVersion)) return { - version: Number(groupMembership.groupKeyVersion), + version: parseKeyVersion(groupMembership.groupKeyVersion), object: decryptKey(requiredUserGroupKey, groupMembership.symEncGKey), } } @@ -153,11 +158,11 @@ export class KeyLoaderFacade { private async findFormerGroupKey( group: Group, currentGroupKey: VersionedKey, - targetKeyVersion: number, + targetKeyVersion: KeyVersion, ): Promise<{ symmetricGroupKey: AesKey; groupKeyInstance: GroupKey }> { const formerKeysList = assertNotNull(group.formerGroupKeys).list // start id is not included in the result of the range request, so we need to start at current version. - const startId = stringToCustomId(String(currentGroupKey.version)) + const startId = convertKeyVersionToCustomId(currentGroupKey.version) const amountOfKeysIncludingTarget = currentGroupKey.version - targetKeyVersion const formerKeys: GroupKey[] = await this.entityClient.loadRange(GroupKeyTypeRef, formerKeysList, startId, amountOfKeysIncludingTarget, true) @@ -189,15 +194,35 @@ export class KeyLoaderFacade { return { symmetricGroupKey: lastGroupKey, groupKeyInstance: lastGroupKeyInstance } } - private decodeGroupKeyVersion(id: Id): number { - return Number(customIdToString(id)) + private decodeGroupKeyVersion(id: Id): KeyVersion { + return parseKeyVersion(customIdToString(id)) } - private validateAndDecryptKeyPair(keyPair: KeyPair | null, groupId: Id, groupKey: AesKey) { + private validateAndDecryptKeyPair(keyPair: KeyPair | null, groupId: Id, groupKey: VersionedKey) { if (keyPair == null) { throw new NotFoundError(`no key pair on group ${groupId}`) } // this cast is acceptable as those are the constraints we have on KeyPair. we just cannot know which one we have statically - return decryptKeyPair(groupKey, keyPair as EncryptedKeyPairs) + const decryptedKeyPair = decryptKeyPair(groupKey.object, keyPair as EncryptedKeyPairs) + if (groupKey.version !== 0 && isRsaOrRsaEccKeyPair(decryptedKeyPair)) { + throw new CryptoError("received an rsa key pair in a version other than 0: " + groupKey.version) + } + return decryptedKeyPair + } +} + +function convertKeyVersionToCustomId(version: KeyVersion) { + return stringToCustomId(String(version)) +} + +export function parseKeyVersion(version: NumberString): KeyVersion { + const versionAsNumber = Number(version) + return checkKeyVersionConstraints(versionAsNumber) +} + +export function checkKeyVersionConstraints(version: number): KeyVersion { + if (!isKeyVersion(version)) { + throw new CryptoError("key version is not a non-negative integer") } + return version } diff --git a/src/common/api/worker/facades/KeyRotationFacade.ts b/src/common/api/worker/facades/KeyRotationFacade.ts index ff8c767e7ff3..a2194946349f 100644 --- a/src/common/api/worker/facades/KeyRotationFacade.ts +++ b/src/common/api/worker/facades/KeyRotationFacade.ts @@ -1,18 +1,18 @@ import { EntityClient } from "../../common/EntityClient.js" import { - AdminGroupKeyAuthenticationData, - AdminGroupKeyRotationPostIn, - createAdminGroupKeyAuthenticationData, + AdminGroupKeyDistributionElement, + createAdminGroupKeyDistributionElement, createAdminGroupKeyRotationPostIn, + createAdminGroupKeyRotationPutIn, createGroupKeyRotationData, createGroupKeyRotationPostIn, createGroupKeyUpdateData, createGroupMembershipKeyData, createGroupMembershipUpdateData, + createKeyMac, createKeyPair, createMembershipPutIn, createPubEncKeyData, - createPublicKeyGetIn, createRecoverCodeData, createUserGroupKeyRotationData, createUserGroupKeyRotationPostIn, @@ -28,22 +28,28 @@ import { GroupMembershipUpdateData, GroupMemberTypeRef, GroupTypeRef, + KeyMac, KeyPair, KeyRotation, KeyRotationTypeRef, + PubDistributionKey, PubEncKeyData, - PublicKeyGetOut, RecoverCodeData, SentGroupInvitationTypeRef, User, UserGroupRootTypeRef, UserTypeRef, } from "../../entities/sys/TypeRefs.js" -import { assertEnumValue, GroupKeyRotationType, GroupType, PublicKeyIdentifierType } from "../../common/TutanotaConstants.js" import { - arrayEquals, + asPublicKeyIdentifier, + assertEnumValue, + CryptoProtocolVersion, + GroupKeyRotationType, + GroupType, + PublicKeyIdentifierType, +} from "../../common/TutanotaConstants.js" +import { assertNotNull, - concat, defer, DeferredObject, downcast, @@ -52,21 +58,26 @@ import { isEmpty, isNotNull, isSameTypeRef, + KeyVersion, lazyAsync, promiseMap, Versioned, } from "@tutao/tutanota-utils" -import { customIdToUint8array, elementIdPart, isSameId, listIdPart } from "../../common/utils/EntityUtils.js" -import { KeyLoaderFacade } from "./KeyLoaderFacade.js" +import { elementIdPart, getElementId, isSameId, listIdPart } from "../../common/utils/EntityUtils.js" +import { checkKeyVersionConstraints, KeyLoaderFacade, parseKeyVersion } from "./KeyLoaderFacade.js" import { Aes256Key, AesKey, bitArrayToUint8Array, createAuthVerifier, + EccKeyPair, EncryptedPqKeyPairs, getKeyLengthBytes, + isEncryptedPqKeyPairs, KEY_LENGTH_BYTES_AES_256, + MacTag, PQKeyPairs, + PQPublicKeys, uint8ArrayToKey, } from "@tutao/tutanota-crypto" import { PQFacade } from "./PQFacade.js" @@ -75,7 +86,6 @@ import { GroupKeyRotationInfoService, GroupKeyRotationService, MembershipService, - PublicKeyService, UserGroupKeyRotationService, } from "../../entities/sys/Services.js" import { IServiceExecutor } from "../../common/ServiceRequest.js" @@ -90,10 +100,20 @@ import { ShareFacade } from "./lazy/ShareFacade.js" import { GroupManagementFacade } from "./lazy/GroupManagementFacade.js" import { RecipientsNotFoundError } from "../../common/error/RecipientsNotFoundError.js" import { LockedError } from "../../common/error/RestError.js" -import { AsymmetricCryptoFacade, PublicKeys } from "../crypto/AsymmetricCryptoFacade.js" +import { AsymmetricCryptoFacade } from "../crypto/AsymmetricCryptoFacade.js" +import { TutanotaError } from "@tutao/tutanota-error" +import { asPQPublicKeys, brandKeyMac, KeyAuthenticationFacade } from "./KeyAuthenticationFacade.js" +import { PublicKeyProvider, PublicKeys } from "./PublicKeyProvider.js" assertWorkerOrNode() +export enum MultiAdminGroupKeyAdminActionPath { + WAIT_FOR_OTHER_ADMINS, + CREATE_DISTRIBUTION_KEYS, + PERFORM_KEY_ROTATION, + IMPOSSIBLE_STATE, +} + /** * Type to keep a pending key rotation and the password key in memory as long as the key rotation has not been processed. */ @@ -140,6 +160,12 @@ export class KeyRotationFacade { * @VisibleForTesting */ pendingKeyRotations: PendingKeyRotation + /** + * Keeps track of which User and Team groups have performed Key Rotation (only for the current session). + * Other group types may be included, but it is not guaranteed. + * @private + */ + private groupIdsThatPerformedKeyRotations: Set private readonly facadeInitializedDeferredObject: DeferredObject private pendingGroupKeyUpdateIds: IdTuple[] // already rotated groups for which we need to update the memberships (GroupKeyUpdateIds all in one list) @@ -155,6 +181,8 @@ export class KeyRotationFacade { private readonly shareFacade: lazyAsync, private readonly groupManagementFacade: lazyAsync, private readonly asymmetricCryptoFacade: AsymmetricCryptoFacade, + private readonly keyAuthenticationFacade: KeyAuthenticationFacade, + private readonly publicKeyProvider: PublicKeyProvider, ) { this.pendingKeyRotations = { pwKey: null, @@ -164,6 +192,7 @@ export class KeyRotationFacade { } this.facadeInitializedDeferredObject = defer() this.pendingGroupKeyUpdateIds = [] + this.groupIdsThatPerformedKeyRotations = new Set() } /** @@ -197,7 +226,7 @@ export class KeyRotationFacade { } } catch (e) { if (e instanceof LockedError) { - // we catch here so that we also catch errors in the finally block + // we catch here so that we also catch errors in the `finally` block console.log("error when processing key rotation or group key update", e) } else { throw e @@ -248,11 +277,11 @@ export class KeyRotationFacade { const groupKeyRotationType = assertEnumValue(GroupKeyRotationType, this.pendingKeyRotations.adminOrUserGroupKeyRotation.groupKeyRotationType) switch (groupKeyRotationType) { case GroupKeyRotationType.AdminGroupKeyRotationMultipleAdminAccount: - console.log("Rotating the admin group with multiple members is not yet implemented") + await this.rotateMultipleAdminsGroupKeys(user, this.pendingKeyRotations.pwKey, this.pendingKeyRotations.adminOrUserGroupKeyRotation) break case GroupKeyRotationType.AdminGroupKeyRotationSingleUserAccount: case GroupKeyRotationType.AdminGroupKeyRotationMultipleUserAccount: - await this.rotateAdminGroupKeys(user, this.pendingKeyRotations.pwKey, this.pendingKeyRotations.adminOrUserGroupKeyRotation) + await this.rotateSingleAdminGroupKeys(user, this.pendingKeyRotations.pwKey, this.pendingKeyRotations.adminOrUserGroupKeyRotation) break case GroupKeyRotationType.User: await this.rotateUserGroupKey(user, this.pendingKeyRotations.pwKey, this.pendingKeyRotations.adminOrUserGroupKeyRotation) @@ -288,6 +317,10 @@ export class KeyRotationFacade { } await this.serviceExecutor.post(GroupKeyRotationService, serviceData) + for (const groupKeyUpdate of serviceData.groupKeyUpdates) { + this.groupIdsThatPerformedKeyRotations.add(groupKeyUpdate.group) + } + if (!isEmpty(invitationData)) { const shareFacade = await this.shareFacade() await promiseMap(invitationData, (preparedInvite) => shareFacade.sendGroupInvitationRequest(preparedInvite)) @@ -297,7 +330,7 @@ export class KeyRotationFacade { /** * @VisibleForTesting */ - async rotateAdminGroupKeys(user: User, passphraseKey: Aes256Key, keyRotation: KeyRotation) { + async rotateSingleAdminGroupKeys(user: User, passphraseKey: Aes256Key, keyRotation: KeyRotation) { if (hasNonQuantumSafeKeys(passphraseKey)) { console.log("Not allowed to rotate admin group keys with a bcrypt password key") return @@ -305,8 +338,10 @@ export class KeyRotationFacade { const currentUserGroupKey = this.keyLoaderFacade.getCurrentSymUserGroupKey() const adminGroupMembership = getFirstOrThrow(getUserGroupMemberships(user, GroupType.Admin)) const currentAdminGroupKey = await this.keyLoaderFacade.getCurrentSymGroupKey(adminGroupMembership.group) - const adminKeyRotationData = await this.prepareKeyRotationForAdminGroup(keyRotation, user, currentUserGroupKey, currentAdminGroupKey, passphraseKey) - return this.serviceExecutor.post(AdminGroupKeyRotationService, adminKeyRotationData) + const adminKeyRotationData = await this.prepareKeyRotationForSingleAdmin(keyRotation, user, currentUserGroupKey, currentAdminGroupKey, passphraseKey) + + await this.serviceExecutor.post(AdminGroupKeyRotationService, adminKeyRotationData.keyRotationData) + this.groupIdsThatPerformedKeyRotations.add(user.userGroup.group) } //We assume that the logged-in user is an admin user and that the key encrypting the group key are already pq secure @@ -360,13 +395,13 @@ export class KeyRotationFacade { return groupKeyUpdates } - private async prepareKeyRotationForAdminGroup( + private async prepareKeyRotationForSingleAdmin( keyRotation: KeyRotation, user: User, currentUserGroupKey: VersionedKey, currentAdminGroupKey: VersionedKey, passphraseKey: Aes256Key, - ): Promise { + ) { const adminGroupId = this.getTargetGroupId(keyRotation) const userGroupMembership = user.userGroup const userGroupId = userGroupMembership.group @@ -377,11 +412,8 @@ export class KeyRotationFacade { const newAdminGroupKeys = await this.generateGroupKeys(adminGroup) const adminKeyPair = assertNotNull(newAdminGroupKeys.encryptedKeyPair) - const pubEccKey = assertNotNull(adminKeyPair.pubEccKey) - const pubKyberKey = assertNotNull(adminKeyPair.pubKyberKey) - const adminGroupKeyAuthenticationDataList = await this.generateEncryptedKeyHashes( - pubEccKey, - pubKyberKey, + const adminPubKeyMacList = await this.generatePubKeyTagsForNonAdminUsers( + asPQPublicKeys(adminKeyPair), newAdminGroupKeys.symGroupKey.version, adminGroupId, assertNotNull(user.customer), @@ -422,60 +454,77 @@ export class KeyRotationFacade { adminGroupKeyVersion: String(encryptedUserKeys.newAdminGroupKeyEncNewUserGroupKey.encryptingKeyVersion), passphraseEncUserGroupKey: encryptedUserKeys.passphraseKeyEncNewUserGroupKey.key, pubAdminGroupEncUserGroupKey: null, + userGroupEncAdminGroupKey: null, }) - return createAdminGroupKeyRotationPostIn({ adminGroupKeyData, userGroupKeyData, adminGroupKeyAuthenticationDataList }) + return { + keyRotationData: createAdminGroupKeyRotationPostIn({ + adminGroupKeyData, + userGroupKeyData, + adminPubKeyMacList, + distribution: [], + }), + newAdminGroupKeys, + newUserGroupKeys, + } } - private async generateEncryptedKeyHashes( - pubEccKey: Uint8Array, - pubKyberKey: Uint8Array, - adminGroupKeyVersion: number, + private async generatePubKeyTagsForNonAdminUsers( + newAdminPubKey: PQPublicKeys, + newAdminGroupKeyVersion: KeyVersion, adminGroupId: Id, customerId: Id, groupToExclude: Id, - ): Promise> { - const keyHash = this.generateKeyHash(adminGroupKeyVersion, adminGroupId, pubEccKey, pubKyberKey) - const keyHashes: AdminGroupKeyAuthenticationData[] = [] + ): Promise> { + const keyTags: KeyMac[] = [] const customer = await this.entityClient.load(CustomerTypeRef, customerId) const userGroupInfos = await this.entityClient.loadAll(GroupInfoTypeRef, customer.userGroups) + let groupManagementFacade = await this.groupManagementFacade() + for (const userGroupInfo of userGroupInfos) { if (isSameId(userGroupInfo.group, groupToExclude)) continue - let gmf = await this.groupManagementFacade() - const userGroupKey = await gmf.getCurrentGroupKeyViaAdminEncGKey(userGroupInfo.group) - const authKey = this.deriveRotationHashKey(userGroupInfo.group, userGroupKey) - const encryptedKeyHash = this.cryptoWrapper.aesEncrypt(authKey, keyHash) - const publicKeyHash = createAdminGroupKeyAuthenticationData({ - userGroup: userGroupInfo.group, - authKeyEncAdminRotationHash: encryptedKeyHash, - version: String(adminGroupKeyVersion), + + const currentUserGroupKey = await groupManagementFacade.getCurrentGroupKeyViaAdminEncGKey(userGroupInfo.group) + const tag = this.keyAuthenticationFacade.computeTag({ + tagType: "NEW_ADMIN_PUB_KEY_TAG", + sourceOfTrust: { receivingUserGroupKey: currentUserGroupKey.object }, + untrustedKey: { newAdminPubKey }, + bindingData: { + userGroupId: userGroupInfo.group, + adminGroupId, + currentReceivingUserGroupKeyVersion: currentUserGroupKey.version, + newAdminGroupKeyVersion, + }, }) - keyHashes.push(publicKeyHash) + + const publicKeyTag = createKeyMac({ + taggingGroup: userGroupInfo.group, + tag, + taggedKeyVersion: String(newAdminGroupKeyVersion), + taggingKeyVersion: String(currentUserGroupKey.version), + }) + keyTags.push(publicKeyTag) } - return keyHashes + return keyTags } - private deriveRotationHashKey(userGroupId: Id, userGroupKey: VersionedKey) { + private deriveAdminGroupDistributionKeyPairEncryptionKey( + adminGroupId: Id, + userGroupId: Id, + currentAdminGroupKeyVersion: KeyVersion, + currentUserGroupKeyVersion: number, + pwKey: Aes256Key, + ): Aes256Key { return this.cryptoWrapper.deriveKeyWithHkdf({ - salt: userGroupId, - key: userGroupKey.object, - context: "adminGroupKeyRotationHash", + salt: `adminGroup: ${adminGroupId}, userGroup: ${userGroupId}, currentUserGroupKeyVersion: ${currentUserGroupKeyVersion}, currentAdminGroupKeyVersion: ${currentAdminGroupKeyVersion}`, + key: pwKey, + context: "adminGroupDistributionKeyPairEncryptionKey", }) } - private generateKeyHash(adminGroupKeyVersion: number, adminGroupId: string, pubEccKey: Uint8Array, pubKyberKey: Uint8Array) { - const versionByte = Uint8Array.from([0]) - const adminKeyVersion = Uint8Array.from([adminGroupKeyVersion]) - const identifierType = Uint8Array.from([Number(PublicKeyIdentifierType.GROUP_ID)]) - const identifier = customIdToUint8array(adminGroupId) // also works for generated IDs - //Format: versionbyte, pubEccKey, pubKyberKey, groupKeyVersion, identifier, identifierType - const hashData = concat(versionByte, pubEccKey, pubKyberKey, adminKeyVersion, identifier, identifierType) - return this.cryptoWrapper.sha256Hash(hashData) - } - private async prepareKeyRotationForAreaGroup( keyRotation: KeyRotation, currentUserGroupKey: VersionedKey, @@ -494,7 +543,7 @@ export class KeyRotationFacade { const groupKeyUpdatesForMembers = await this.createGroupKeyUpdatesForMembers(targetGroup, newGroupKeys.symGroupKey) const groupKeyRotationData = createGroupKeyRotationData({ - adminGroupEncGroupKey: null, // for user area groups we do not have an adminGroupEncGroupKey so we set it always to null. + adminGroupEncGroupKey: null, // for user area groups we do not have an adminGroupEncGroupKey, so we set it always to null. adminGroupKeyVersion: null, group: targetGroupId, groupKeyVersion: String(newGroupKeys.symGroupKey.version), @@ -528,7 +577,7 @@ export class KeyRotationFacade { const members = await this.entityClient.loadAll(GroupMemberTypeRef, targetGroup.members) const ownMember = members.find((member) => member.user == user._id) const otherMembers = members.filter((member) => member.user != user._id) - let currentGroupKey = await this.getCurrentGroupKey(targetGroupId, targetGroup) + let currentGroupKey = await this.getCurrentGroupKey(targetGroup) const newGroupKeys = await this.generateGroupKeys(targetGroup) const encryptedGroupKeys = await this.encryptGroupKeys(targetGroup, currentGroupKey, newGroupKeys, currentAdminGroupKey) @@ -569,14 +618,14 @@ export class KeyRotationFacade { }) } - private async getCurrentGroupKey(targetGroupId: string, targetGroup: Group): Promise { + private async getCurrentGroupKey(targetGroup: Group): Promise { try { - return await this.keyLoaderFacade.getCurrentSymGroupKey(targetGroupId) + return await this.keyLoaderFacade.getCurrentSymGroupKey(targetGroup._id) } catch (e) { //if we cannot get/decrypt the group key via membership we try via adminEncGroupKey const groupManagementFacade = await this.groupManagementFacade() - const currentKey = await groupManagementFacade.getGroupKeyViaAdminEncGKey(targetGroupId, Number(targetGroup.groupKeyVersion)) - return { object: currentKey, version: Number(targetGroup.groupKeyVersion) } + const currentKey = await groupManagementFacade.getGroupKeyViaAdminEncGKey(targetGroup._id, parseKeyVersion(targetGroup.groupKeyVersion)) + return { object: currentKey, version: parseKeyVersion(targetGroup.groupKeyVersion) } } } @@ -626,13 +675,13 @@ export class KeyRotationFacade { } private encryptUserGroupKeyForUser(passphraseKey: AesKey, newUserGroupKeys: GeneratedGroupKeys, userGroup: Group, currentGroupKey: VersionedKey) { - const versionedPassphraseKey = { + const versionedPassphraseKey: VersionedKey = { object: passphraseKey, version: 0, // dummy } const membershipSymEncNewGroupKey = this.cryptoWrapper.encryptKeyWithVersionedKey(versionedPassphraseKey, newUserGroupKeys.symGroupKey.object) - const userGroupKeyDistributionKey = this.userFacade.deriveUserGroupKeyDistributionKey(userGroup._id, passphraseKey) - const distributionKeyEncNewUserGroupKey = this.cryptoWrapper.encryptKey(userGroupKeyDistributionKey, newUserGroupKeys.symGroupKey.object) + const legacyUserDistKey = this.userFacade.deriveLegacyUserDistKey(userGroup._id, passphraseKey) + const distributionKeyEncNewUserGroupKey = this.cryptoWrapper.encryptKey(legacyUserDistKey, newUserGroupKeys.symGroupKey.object) const authVerifier = createAuthVerifier(passphraseKey) const newGroupKeyEncCurrentGroupKey = this.cryptoWrapper.encryptKeyWithVersionedKey(newUserGroupKeys.symGroupKey, currentGroupKey.object) return { membershipSymEncNewGroupKey, distributionKeyEncNewUserGroupKey, authVerifier, newGroupKeyEncCurrentGroupKey } @@ -693,8 +742,9 @@ export class KeyRotationFacade { // always pass an empty list because we don't want the encryption to be skipped in case other recipients weren't found // recipients that are not found will be null anyway, and added to membersToRemove const notFoundRecipients: Array = [] + const senderGroupId = this.userFacade.getUserGroupId() const recipientKeyData = await this.cryptoFacade.encryptBucketKeyForInternalRecipient( - this.userFacade.getUserGroupId(), + senderGroupId, bucketKey, memberMailAddress, notFoundRecipients, @@ -708,6 +758,9 @@ export class KeyRotationFacade { recipientKeyVersion: keyData.recipientKeyVersion, senderKeyVersion: keyData.senderKeyVersion, protocolVersion: keyData.protocolVersion, + senderIdentifier: senderGroupId, + senderIdentifierType: PublicKeyIdentifierType.GROUP_ID, + symKeyMac: null, }) const groupKeyUpdateData = createGroupKeyUpdateData({ sessionKeyEncGroupKey: this.cryptoWrapper.encryptBytes(sessionKey, bitArrayToUint8Array(newGroupKey.object)), @@ -768,9 +821,9 @@ export class KeyRotationFacade { private async encryptGroupKeyForOtherUsers(userId: Id, newGroupKey: VersionedKey): Promise { const groupManagementFacade = await this.groupManagementFacade() const user = await this.entityClient.load(UserTypeRef, userId) - const userGroupKey = await groupManagementFacade.getGroupKeyViaAdminEncGKey(user.userGroup.group, Number(user.userGroup.groupKeyVersion)) + const userGroupKey = await groupManagementFacade.getGroupKeyViaAdminEncGKey(user.userGroup.group, parseKeyVersion(user.userGroup.groupKeyVersion)) const encrypteNewGroupKey = this.cryptoWrapper.encryptKey(userGroupKey, newGroupKey.object) - return { key: encrypteNewGroupKey, encryptingKeyVersion: Number(user.userGroup.groupKeyVersion) } + return { key: encrypteNewGroupKey, encryptingKeyVersion: parseKeyVersion(user.userGroup.groupKeyVersion) } } private async generateGroupKeys(group: Group): Promise { @@ -779,7 +832,7 @@ export class KeyRotationFacade { return { symGroupKey: { object: symGroupKeyBytes, - version: Number(group.groupKeyVersion) + 1, + version: checkKeyVersionConstraints(parseKeyVersion(group.groupKeyVersion) + 1), }, encryptedKeyPair: keyPair, } @@ -790,20 +843,24 @@ export class KeyRotationFacade { */ private async createNewKeyPairValue(groupToRotate: Group, newSymmetricGroupKey: Aes256Key): Promise { if (groupToRotate.currentKeys) { - const newPqPairs = await this.pqFacade.generateKeyPairs() - return { - pubRsaKey: null, - symEncPrivRsaKey: null, - pubEccKey: newPqPairs.eccKeyPair.publicKey, - symEncPrivEccKey: this.cryptoWrapper.encryptEccKey(newSymmetricGroupKey, newPqPairs.eccKeyPair.privateKey), - pubKyberKey: this.cryptoWrapper.kyberPublicKeyToBytes(newPqPairs.kyberKeyPair.publicKey), - symEncPrivKyberKey: this.cryptoWrapper.encryptKyberKey(newSymmetricGroupKey, newPqPairs.kyberKeyPair.privateKey), - } + return this.generateAndEncryptPqKeyPairs(newSymmetricGroupKey) } else { return null } } + private async generateAndEncryptPqKeyPairs(symmmetricEncryptionKey: Aes256Key): Promise { + const newPqPairs = await this.pqFacade.generateKeyPairs() + return { + pubRsaKey: null, + symEncPrivRsaKey: null, + pubEccKey: newPqPairs.eccKeyPair.publicKey, + symEncPrivEccKey: this.cryptoWrapper.encryptEccKey(symmmetricEncryptionKey, newPqPairs.eccKeyPair.privateKey), + pubKyberKey: this.cryptoWrapper.kyberPublicKeyToBytes(newPqPairs.kyberKeyPair.publicKey), + symEncPrivKyberKey: this.cryptoWrapper.encryptKyberKey(symmmetricEncryptionKey, newPqPairs.kyberKeyPair.privateKey), + } + } + /** * @VisibleForTesting * @private @@ -868,37 +925,11 @@ export class KeyRotationFacade { const userGroupId = userGroupMembership.group const currentUserGroupKey = this.keyLoaderFacade.getCurrentSymUserGroupKey() console.log(`KeyRotationFacade: rotate key for group: ${userGroupId}, groupKeyRotationType: ${userGroupKeyRotation.groupKeyRotationType}`) - // check hashes - if (userGroupKeyRotation.adminGroupKeyAuthenticationData == null) { - throw new Error("The hash encrypted by admin is not present in the user group key rotation !") - } - const { version: adminGroupKeyVersion, authKeyEncAdminRotationHash } = userGroupKeyRotation.adminGroupKeyAuthenticationData - - const authKey = this.deriveRotationHashKey(userGroupId, currentUserGroupKey) - const decryptedAdminHash = this.cryptoWrapper.aesDecrypt(authKey, authKeyEncAdminRotationHash, true) const userGroup: Group = await this.entityClient.load(GroupTypeRef, userGroupId) - // get admin group public keys const adminGroupId = assertNotNull(userGroup.admin) - const adminPublicKeyGetIn = createPublicKeyGetIn({ - identifier: adminGroupId, - identifierType: PublicKeyIdentifierType.GROUP_ID, - version: null, - }) - const adminPublicKeyGetOut = await this.serviceExecutor.get(PublicKeyService, adminPublicKeyGetIn) - const { pubEccKey, pubKyberKey } = adminPublicKeyGetOut - if (pubEccKey == null) { - throw new Error("tried to generate a keyhash when rotating but received an empty public ecc key!") - } - if (pubKyberKey == null) { - throw new Error("tried to generate a keyhash when rotating but received an empty public kyber key!") - } - const clientGeneratedKeyHash = this.generateKeyHash(Number(adminGroupKeyVersion), adminGroupId, pubEccKey, pubKyberKey) - // at this point the decrypted admin key hash MUST equal the one that we generated for this key rotation - if (!arrayEquals(decryptedAdminHash, clientGeneratedKeyHash)) { - throw new Error("mismatch between client generated hash and encrypted admin hash, aborting rotation") - } + const newUserGroupKeys = await this.generateGroupKeys(userGroup) const { membershipSymEncNewGroupKey, distributionKeyEncNewUserGroupKey, authVerifier, newGroupKeyEncCurrentGroupKey } = this.encryptUserGroupKeyForUser( @@ -909,7 +940,34 @@ export class KeyRotationFacade { ) const recoverCodeData = await this.reencryptRecoverCodeIfExists(user, pwKey, newUserGroupKeys) - const pubAdminGroupEncUserGroupKey = await this.encryptUserGroupKeyForAdmin(newUserGroupKeys, adminPublicKeyGetOut, adminGroupId) + let pubAdminGroupEncUserGroupKey: null | PubEncKeyData = null + let adminGroupEncUserGroupKey: null | Uint8Array = null + let userGroupEncAdminGroupKey: null | Uint8Array = null + let adminGroupKeyVersion: NumberString + //optionally decrypt new admin group key + if (userGroupKeyRotation.distEncAdminGroupSymKey != null) { + const encryptedKeysForAdmin = await this.handleUserGroupKeyRotationAsAdmin( + userGroupKeyRotation, + adminGroupId, + pwKey, + userGroupId, + currentUserGroupKey, + newUserGroupKeys, + ) + adminGroupEncUserGroupKey = encryptedKeysForAdmin.adminGroupEncUserGroupKey + adminGroupKeyVersion = encryptedKeysForAdmin.adminGroupKeyVersion + userGroupEncAdminGroupKey = encryptedKeysForAdmin.userGroupEncAdminGroupKey + } else { + const encryptedKeysForUser = await this.handleUserGroupKeyRotationAsUser( + userGroupKeyRotation, + currentUserGroupKey, + userGroupId, + adminGroupId, + newUserGroupKeys, + ) + pubAdminGroupEncUserGroupKey = encryptedKeysForUser.pubAdminGroupEncUserGroupKey + adminGroupKeyVersion = String(encryptedKeysForUser.adminGroupKeyVersion) + } const userGroupKeyData = createUserGroupKeyRotationData({ userGroupKeyVersion: String(newUserGroupKeys.symGroupKey.version), @@ -919,29 +977,143 @@ export class KeyRotationFacade { distributionKeyEncUserGroupKey: distributionKeyEncNewUserGroupKey, keyPair: assertNotNull(makeKeyPair(newUserGroupKeys.encryptedKeyPair)), authVerifier, - adminGroupKeyVersion: pubAdminGroupEncUserGroupKey.recipientKeyVersion, + adminGroupKeyVersion, pubAdminGroupEncUserGroupKey, - adminGroupEncUserGroupKey: null, - recoverCodeData: recoverCodeData, + adminGroupEncUserGroupKey, + recoverCodeData, + userGroupEncAdminGroupKey, }) - await this.serviceExecutor.post(UserGroupKeyRotationService, createUserGroupKeyRotationPostIn({ userGroupKeyData })) + await this.serviceExecutor.post( + UserGroupKeyRotationService, + createUserGroupKeyRotationPostIn({ + userGroupKeyData, + }), + ) + this.groupIdsThatPerformedKeyRotations.add(userGroupId) } - private async encryptUserGroupKeyForAdmin( - newUserGroupKeys: GeneratedGroupKeys, - publicKeyGetOut: PublicKeyGetOut, + private async handleUserGroupKeyRotationAsUser( + userGroupKeyRotation: KeyRotation, + currentUserGroupKey: VersionedKey, + userGroupId: Id, adminGroupId: Id, - ): Promise { - const adminPubKeys: Versioned = { - version: Number(publicKeyGetOut.pubKeyVersion), - object: { - pubEccKey: publicKeyGetOut.pubEccKey, - pubKyberKey: publicKeyGetOut.pubKyberKey, - pubRsaKey: null, + newUserGroupKeys: GeneratedGroupKeys, + ) { + if (userGroupKeyRotation.adminPubKeyMac == null) { + throw new Error("The hash encrypted by admin is not present in the user group key rotation !") + } + + const { taggedKeyVersion, tag, taggingKeyVersion } = brandKeyMac(userGroupKeyRotation.adminPubKeyMac) + if (parseKeyVersion(taggingKeyVersion) !== currentUserGroupKey.version) { + throw new Error( + `the encrypting key version in the userEncAdminPubKeyHash does not match hash: ${taggingKeyVersion} current user group key:${currentUserGroupKey.version}`, + ) + } + + // get admin group public keys + const currentAdminPubKeys = await this.publicKeyProvider.loadCurrentPubKey({ + identifier: adminGroupId, + identifierType: PublicKeyIdentifierType.GROUP_ID, + }) + const adminGroupKeyVersion = parseKeyVersion(taggedKeyVersion) + if (currentAdminPubKeys.version !== adminGroupKeyVersion) { + throw new Error("the public key service did not return the tagged key version to verify the admin public key") + } + + this.keyAuthenticationFacade.verifyTag( + { + tagType: "NEW_ADMIN_PUB_KEY_TAG", + sourceOfTrust: { receivingUserGroupKey: currentUserGroupKey.object }, + untrustedKey: { newAdminPubKey: asPQPublicKeys(currentAdminPubKeys.object) }, + bindingData: { + userGroupId, + adminGroupId, + newAdminGroupKeyVersion: adminGroupKeyVersion, + currentReceivingUserGroupKeyVersion: currentUserGroupKey.version, + }, }, + tag, + ) + + const pubAdminGroupEncUserGroupKey = await this.encryptUserGroupKeyForAdminAsymmetrically( + userGroupId, + newUserGroupKeys, + currentAdminPubKeys, + adminGroupId, + currentUserGroupKey, + ) + return { pubAdminGroupEncUserGroupKey, adminGroupKeyVersion: currentAdminPubKeys.version } + } + + private async handleUserGroupKeyRotationAsAdmin( + userGroupKeyRotation: KeyRotation, + adminGroupId: Id, + pwKey: Aes256Key, + userGroupId: Id, + currentUserGroupKey: VersionedKey, + newUserGroupKeys: GeneratedGroupKeys, + ) { + const distEncAdminGroupSymKey = assertNotNull(userGroupKeyRotation.distEncAdminGroupSymKey, "missing new admin group key") + const pubAdminEncGKeyAuthHash = brandKeyMac(assertNotNull(distEncAdminGroupSymKey.symKeyMac, "missing new admin group key encrypted hash")) + if (userGroupKeyRotation.adminDistKeyPair == null || !isEncryptedPqKeyPairs(userGroupKeyRotation.adminDistKeyPair)) { + throw new Error("missing some required parameters for a user group key rotation as admin") } + //derive adminDistKeyPairDistributionKey + const currentAdminGroupKeyFromMembership = await this.keyLoaderFacade.getCurrentSymGroupKey(adminGroupId) // get admin group key from the membership (not yet rotated) + const adminGroupKeyDistributionKeyPairKey = this.deriveAdminGroupDistributionKeyPairEncryptionKey( + adminGroupId, + userGroupId, + currentAdminGroupKeyFromMembership.version, + currentUserGroupKey.version, + pwKey, + ) + // decrypt his private distribution key + const adminGroupDistKeyPair = this.cryptoWrapper.decryptKeyPair(adminGroupKeyDistributionKeyPairKey, userGroupKeyRotation.adminDistKeyPair) + //decrypt new symmetric admin group key + const senderIdentifier = { + identifier: assertNotNull(distEncAdminGroupSymKey.senderIdentifier), + identifierType: asPublicKeyIdentifier(assertNotNull(distEncAdminGroupSymKey.senderIdentifierType)), + } + const decapsulatedNewAdminGroupKey = await this.asymmetricCryptoFacade.decryptSymKeyWithKeyPairAndAuthenticate( + adminGroupDistKeyPair, + distEncAdminGroupSymKey, + senderIdentifier, + ) + const versionedNewAdminGroupKey = { + object: decapsulatedNewAdminGroupKey.decryptedAesKey, + version: parseKeyVersion(pubAdminEncGKeyAuthHash.taggedKeyVersion), + } + + this.keyAuthenticationFacade.verifyTag( + { + tagType: "ADMIN_SYM_KEY_TAG", + sourceOfTrust: { currentReceivingUserGroupKey: currentUserGroupKey.object }, + untrustedKey: { newAdminGroupKey: versionedNewAdminGroupKey.object }, + bindingData: { + currentReceivingUserGroupKeyVersion: currentUserGroupKey.version, + adminGroupId, + userGroupId, + newAdminGroupKeyVersion: versionedNewAdminGroupKey.version, + }, + }, + pubAdminEncGKeyAuthHash.tag, + ) + + const adminGroupEncUserGroupKey = this.cryptoWrapper.encryptKeyWithVersionedKey(versionedNewAdminGroupKey, newUserGroupKeys.symGroupKey.object).key + const userGroupEncAdminGroupKey = this.cryptoWrapper.encryptKeyWithVersionedKey(newUserGroupKeys.symGroupKey, versionedNewAdminGroupKey.object).key + const adminGroupKeyVersion = String(versionedNewAdminGroupKey.version) + return { adminGroupEncUserGroupKey, userGroupEncAdminGroupKey, adminGroupKeyVersion } + } + + private async encryptUserGroupKeyForAdminAsymmetrically( + userGroupId: Id, + newUserGroupKeys: GeneratedGroupKeys, + adminPubKeys: Versioned, + adminGroupId: Id, + currentUserGroupKey: VersionedKey, + ): Promise { // we want to authenticate with new sender key pair. so we just decrypt it again const pqKeyPair: PQKeyPairs = this.cryptoWrapper.decryptKeyPair(newUserGroupKeys.symGroupKey.object, assertNotNull(newUserGroupKeys.encryptedKeyPair)) @@ -950,6 +1122,30 @@ export class KeyRotationFacade { object: pqKeyPair.eccKeyPair, }) + const tag = this.keyAuthenticationFacade.computeTag({ + tagType: "USER_GROUP_KEY_TAG", + untrustedKey: { + newUserGroupKey: newUserGroupKeys.symGroupKey.object, + }, + sourceOfTrust: { + currentUserGroupKey: currentUserGroupKey.object, + }, + bindingData: { + userGroupId, + adminGroupId, + newAdminGroupKeyVersion: adminPubKeys.version, + currentUserGroupKeyVersion: currentUserGroupKey.version, + newUserGroupKeyVersion: newUserGroupKeys.symGroupKey.version, + }, + }) + + const symKeyMac = createKeyMac({ + taggingGroup: userGroupId, + tag, + taggedKeyVersion: String(newUserGroupKeys.symGroupKey.version), + taggingKeyVersion: String(currentUserGroupKey.version), + }) + return createPubEncKeyData({ recipientIdentifier: adminGroupId, recipientIdentifierType: PublicKeyIdentifierType.GROUP_ID, @@ -957,7 +1153,231 @@ export class KeyRotationFacade { protocolVersion: pubEncSymKey.cryptoProtocolVersion, senderKeyVersion: pubEncSymKey.senderKeyVersion != null ? pubEncSymKey.senderKeyVersion.toString() : null, recipientKeyVersion: pubEncSymKey.recipientKeyVersion.toString(), + senderIdentifier: userGroupId, + senderIdentifierType: PublicKeyIdentifierType.GROUP_ID, + symKeyMac, + }) + } + + private async createDistributionKeyPair(pwKey: Aes256Key, multiAdminKeyRotation: KeyRotation) { + let adminGroupId = getElementId(multiAdminKeyRotation) + const currentAdminGroupKey = await this.keyLoaderFacade.getCurrentSymGroupKey(adminGroupId) + const currentUserGroupKey = this.keyLoaderFacade.getCurrentSymUserGroupKey() + const userGroupId = this.userFacade.getUserGroupId() + const userGroupKey = this.keyLoaderFacade.getCurrentSymUserGroupKey() + const adminDistKeyPairDistributionKey = this.deriveAdminGroupDistributionKeyPairEncryptionKey( + adminGroupId, + userGroupId, + currentAdminGroupKey.version, + userGroupKey.version, + pwKey, + ) + const adminDistributionKeyPair = await this.generateAndEncryptPqKeyPairs(adminDistKeyPairDistributionKey) + + const tag = this.keyAuthenticationFacade.computeTag({ + tagType: "PUB_DIST_KEY_TAG", + sourceOfTrust: { currentAdminGroupKey: currentAdminGroupKey.object }, + untrustedKey: { + distPubKey: asPQPublicKeys(adminDistributionKeyPair), + }, + bindingData: { + userGroupId, + adminGroupId, + currentUserGroupKeyVersion: currentUserGroupKey.version, + currentAdminGroupKeyVersion: currentAdminGroupKey.version, + }, + }) + + const putDistributionKeyPairsOnKeyRotation = createAdminGroupKeyRotationPutIn({ + adminDistKeyPair: assertNotNull(makeKeyPair(adminDistributionKeyPair)), + distKeyMac: createKeyMac({ + tag, + taggedKeyVersion: "0", // dummy value because this is only used for the rotation and does not have a version + taggingGroup: adminGroupId, + taggingKeyVersion: currentAdminGroupKey.version.toString(), + }), }) + await this.serviceExecutor.put(AdminGroupKeyRotationService, putDistributionKeyPairsOnKeyRotation) + } + + async rotateMultipleAdminsGroupKeys(user: User, passphraseKey: Aes256Key, keyRotation: KeyRotation) { + // first get all admin members' available distribution keys + const { distributionKeys, userGroupIdsMissingDistributionKeys } = await this.serviceExecutor.get(AdminGroupKeyRotationService, null) + + switch (this.decideMultiAdminGroupKeyRotationNextPathOfAction(userGroupIdsMissingDistributionKeys, user, distributionKeys)) { + case MultiAdminGroupKeyAdminActionPath.WAIT_FOR_OTHER_ADMINS: + break + case MultiAdminGroupKeyAdminActionPath.CREATE_DISTRIBUTION_KEYS: + await this.createDistributionKeyPair(passphraseKey, keyRotation) + break + case MultiAdminGroupKeyAdminActionPath.PERFORM_KEY_ROTATION: + await this.performMultiAdminKeyRotation(keyRotation, user, passphraseKey, distributionKeys) + break + case MultiAdminGroupKeyAdminActionPath.IMPOSSIBLE_STATE: + throw new TutanotaError( + "MultiAdminGroupKeyAdminActionPathImpossibleStateMetError", + "Impossible state met while performing multi admin key rotation", + ) + } + } + + private async performMultiAdminKeyRotation(keyRotation: KeyRotation, user: User, passphraseKey: number[], distributionKeys: PubDistributionKey[]) { + const adminGroupId = this.getTargetGroupId(keyRotation) + + // load current admin group key + const currentAdminGroupKey = await this.keyLoaderFacade.getCurrentSymGroupKey(adminGroupId) + + // creation of a new admin group key + const currentUserGroupKey = this.keyLoaderFacade.getCurrentSymUserGroupKey() + const { keyRotationData, newAdminGroupKeys, newUserGroupKeys } = await this.prepareKeyRotationForSingleAdmin( + keyRotation, + user, + currentUserGroupKey, + currentAdminGroupKey, + passphraseKey, + ) + const newSymAdminGroupKey = newAdminGroupKeys.symGroupKey + + const { symGroupKey: symUserGroupKey, encryptedKeyPair: encryptedUserKeyPair } = newUserGroupKeys + const generatedPrivateEccKey = this.cryptoWrapper.aesDecrypt(symUserGroupKey.object, assertNotNull(encryptedUserKeyPair?.symEncPrivEccKey), true) + const generatedPublicEccKey = assertNotNull(encryptedUserKeyPair?.pubEccKey) + const generatedEccKeyPair: Versioned = { + version: symUserGroupKey.version, + object: { + privateKey: generatedPrivateEccKey, + publicKey: generatedPublicEccKey, + }, + } + + const groupManagementFacade = await this.groupManagementFacade() + + // distribution for all other admins using their distribution keys + for (const distributionKey of distributionKeys) { + // we do not distribute for ourselves + if (isSameId(distributionKey.userGroupId, user.userGroup.group)) continue + // verify authenticity of this distribution key + // reproduce hash + + const userGroupId = distributionKey.userGroupId + const targetUserGroupKey = await groupManagementFacade.getCurrentGroupKeyViaAdminEncGKey(userGroupId) + const givenTag = distributionKey.pubKeyMac as MacTag + + this.keyAuthenticationFacade.verifyTag( + { + tagType: "PUB_DIST_KEY_TAG", + sourceOfTrust: { currentAdminGroupKey: currentAdminGroupKey.object }, + untrustedKey: { + distPubKey: asPQPublicKeys(distributionKey), + }, + bindingData: { + userGroupId, + adminGroupId, + currentUserGroupKeyVersion: targetUserGroupKey.version, + currentAdminGroupKeyVersion: currentAdminGroupKey.version, + }, + }, + givenTag, + ) + + const recipientPublicDistKeys: Versioned = { + version: 0, + object: { + pubRsaKey: null, + pubEccKey: distributionKey.pubEccKey, + pubKyberKey: distributionKey.pubKyberKey, + }, + } + + const encryptedAdminGroupKeyForThisAdmin = await this.asymmetricCryptoFacade.tutaCryptEncryptSymKey( + newSymAdminGroupKey.object, + recipientPublicDistKeys, + generatedEccKeyPair, + ) + + const adminSymKeyTag = this.keyAuthenticationFacade.computeTag({ + tagType: "ADMIN_SYM_KEY_TAG", + sourceOfTrust: { currentReceivingUserGroupKey: targetUserGroupKey.object }, + untrustedKey: { newAdminGroupKey: newSymAdminGroupKey.object }, + bindingData: { + adminGroupId, + userGroupId, + currentReceivingUserGroupKeyVersion: currentUserGroupKey.version, + newAdminGroupKeyVersion: newSymAdminGroupKey.version, + }, + }) + + const symKeyMac = createKeyMac({ + taggingGroup: adminGroupId, + taggedKeyVersion: String(newSymAdminGroupKey.version), + taggingKeyVersion: String(currentAdminGroupKey.version), + tag: adminSymKeyTag, + }) + + const pubEncKeyData = createPubEncKeyData({ + recipientIdentifierType: PublicKeyIdentifierType.GROUP_ID, + recipientIdentifier: "dummy", + recipientKeyVersion: "0", + pubEncSymKey: encryptedAdminGroupKeyForThisAdmin.pubEncSymKeyBytes, + senderIdentifierType: PublicKeyIdentifierType.GROUP_ID, + senderIdentifier: user.userGroup.group, + senderKeyVersion: String(generatedEccKeyPair.version), + protocolVersion: CryptoProtocolVersion.TUTA_CRYPT, + symKeyMac, + }) + const thisAdminDistributionElement: AdminGroupKeyDistributionElement = createAdminGroupKeyDistributionElement({ + userGroupId: distributionKey.userGroupId, + distEncAdminGroupKey: pubEncKeyData, + }) + + keyRotationData.distribution.push(thisAdminDistributionElement) + } + + // call service + await this.serviceExecutor.post(AdminGroupKeyRotationService, keyRotationData) + this.groupIdsThatPerformedKeyRotations.add(user.userGroup.group) + } + + /** + * Context: multi admin group key rotation + * + * This utility function determines the action a given admin must take in a multi admin group key rotation scenario + * This action can be one of these three + * - the admin should wait for the other to create their distribution keys + * - the admin should create their distribution keys + * - the admin should perform the key rotation and distribute the new keys to other admins + * + * @param userGroupIdsMissingDistributionKeys all admin member ids that currently don't have distribution keys + * @param adminUser the current logged-in admin user + * @param distributionKeys the distribution keys already created (include the admins user keys) + * + */ + public decideMultiAdminGroupKeyRotationNextPathOfAction( + userGroupIdsMissingDistributionKeys: Id[], + adminUser: User, + distributionKeys: PubDistributionKey[], + ): MultiAdminGroupKeyAdminActionPath { + const everyoneHasDistributionKeys = userGroupIdsMissingDistributionKeys.length === 0 + const everyoneElseHasDistributionKeysButMe = + userGroupIdsMissingDistributionKeys.length === 1 && isSameId(userGroupIdsMissingDistributionKeys[0], adminUser.userGroup.group) + const iHaveDistributionKeys = distributionKeys.some((dk) => isSameId(dk.userGroupId, adminUser.userGroup.group)) + + // check order is important + if (everyoneElseHasDistributionKeysButMe || everyoneHasDistributionKeys) { + return MultiAdminGroupKeyAdminActionPath.PERFORM_KEY_ROTATION + } else if (!everyoneHasDistributionKeys && iHaveDistributionKeys) { + return MultiAdminGroupKeyAdminActionPath.WAIT_FOR_OTHER_ADMINS + } else if (!everyoneElseHasDistributionKeysButMe && !iHaveDistributionKeys) { + return MultiAdminGroupKeyAdminActionPath.CREATE_DISTRIBUTION_KEYS + } else { + return MultiAdminGroupKeyAdminActionPath.IMPOSSIBLE_STATE + } + } + + /** + * Gets a list of the groups for which we have rotated keys in the session, so far. + */ + public async getGroupIdsThatPerformedKeyRotations(): Promise> { + return Array.from(this.groupIdsThatPerformedKeyRotations.values()) } } diff --git a/src/common/api/worker/facades/LoginFacade.ts b/src/common/api/worker/facades/LoginFacade.ts index 4bc267d141cb..14d42b9648e8 100644 --- a/src/common/api/worker/facades/LoginFacade.ts +++ b/src/common/api/worker/facades/LoginFacade.ts @@ -350,7 +350,7 @@ export class LoginFacade { // In order do not rework the entity processing and its initialization for new clients we // replace the cached instances after doing the migration await (await this.cacheManagementFacade()).reloadUser() - this.userFacade.setUserGroupKeyDistributionKey(newUserPassphraseKey) + this.userFacade.setUserDistKey(currentUserGroupKey.version, newUserPassphraseKey) } /** @@ -952,7 +952,7 @@ export class LoginFacade { await this.serviceExecutor.post(ChangePasswordService, service) - this.userFacade.setUserGroupKeyDistributionKey(newUserPassphraseKey) + this.userFacade.setUserDistKey(currentUserGroupKey.version, newUserPassphraseKey) const accessToken = assertNotNull(this.userFacade.getAccessToken()) const sessionData = await this.loadSessionData(accessToken) if (sessionData.accessKey != null) { diff --git a/src/common/api/worker/facades/PublicKeyProvider.ts b/src/common/api/worker/facades/PublicKeyProvider.ts new file mode 100644 index 000000000000..3a1792e69545 --- /dev/null +++ b/src/common/api/worker/facades/PublicKeyProvider.ts @@ -0,0 +1,72 @@ +import { createPublicKeyGetIn, PublicKeyGetOut } from "../../entities/sys/TypeRefs.js" +import { IServiceExecutor } from "../../common/ServiceRequest.js" +import { PublicKeyService } from "../../entities/sys/Services.js" +import { parseKeyVersion } from "./KeyLoaderFacade.js" +import { Versioned } from "@tutao/tutanota-utils" +import { PublicKeyIdentifierType } from "../../common/TutanotaConstants.js" +import { KeyVersion } from "@tutao/tutanota-utils/dist/Utils.js" +import { InvalidDataError } from "../../common/error/RestError.js" +import { CryptoError } from "@tutao/tutanota-crypto/error.js" + +export type PublicKeyIdentifier = { + identifier: string + identifierType: PublicKeyIdentifierType +} +export type PublicKeys = { + pubRsaKey: null | Uint8Array + pubEccKey: null | Uint8Array + pubKyberKey: null | Uint8Array +} + +/** + * Load public keys. + * Handle key versioning. + */ +export class PublicKeyProvider { + constructor(private readonly serviceExecutor: IServiceExecutor) {} + + async loadCurrentPubKey(pubKeyIdentifier: PublicKeyIdentifier): Promise> { + return this.loadPubKey(pubKeyIdentifier, null) + } + + async loadVersionedPubKey(pubKeyIdentifier: PublicKeyIdentifier, version: KeyVersion): Promise { + return (await this.loadPubKey(pubKeyIdentifier, version)).object + } + + private async loadPubKey(pubKeyIdentifier: PublicKeyIdentifier, version: KeyVersion | null): Promise> { + const requestData = createPublicKeyGetIn({ + version: version ? String(version) : null, + identifier: pubKeyIdentifier.identifier, + identifierType: pubKeyIdentifier.identifierType, + }) + const publicKeyGetOut = await this.serviceExecutor.get(PublicKeyService, requestData) + const pubKeys = this.convertToVersionedPublicKeys(publicKeyGetOut) + this.enforceRsaKeyVersionConstraint(pubKeys) + if (version != null && pubKeys.version !== version) { + throw new InvalidDataError("the server returned a key version that was not requested") + } + return pubKeys + } + + /** + * RSA keys were only created before introducing key versions, i.e. they always have version 0. + * + * Receiving a higher version would indicate a protocol downgrade/ MITM attack, and we reject such keys. + */ + private enforceRsaKeyVersionConstraint(pubKeys: Versioned) { + if (pubKeys.version !== 0 && pubKeys.object.pubRsaKey != null) { + throw new CryptoError("rsa key in a version that is not 0") + } + } + + private convertToVersionedPublicKeys(publicKeyGetOut: PublicKeyGetOut): Versioned { + return { + object: { + pubRsaKey: publicKeyGetOut.pubRsaKey, + pubKyberKey: publicKeyGetOut.pubKyberKey, + pubEccKey: publicKeyGetOut.pubEccKey, + }, + version: parseKeyVersion(publicKeyGetOut.pubKeyVersion), + } + } +} diff --git a/src/common/api/worker/facades/UserFacade.ts b/src/common/api/worker/facades/UserFacade.ts index 614e773b92d7..f2fb7a1e5846 100644 --- a/src/common/api/worker/facades/UserFacade.ts +++ b/src/common/api/worker/facades/UserFacade.ts @@ -1,12 +1,14 @@ import { GroupType } from "../../common/TutanotaConstants" -import { AesKey, decryptKey } from "@tutao/tutanota-crypto" -import { assertNotNull } from "@tutao/tutanota-utils" +import { Aes256Key, AesKey, decryptKey } from "@tutao/tutanota-crypto" +import { assertNotNull, KeyVersion } from "@tutao/tutanota-utils" import { ProgrammingError } from "../../common/error/ProgrammingError" import { createWebsocketLeaderStatus, GroupMembership, User, UserGroupKeyDistribution, WebsocketLeaderStatus } from "../../entities/sys/TypeRefs" import { LoginIncompleteError } from "../../common/error/LoginIncompleteError" import { isSameId } from "../../common/utils/EntityUtils.js" import { KeyCache } from "./KeyCache.js" import { CryptoWrapper, VersionedKey } from "../crypto/CryptoWrapper.js" +import { CryptoError } from "@tutao/tutanota-crypto/error.js" +import { checkKeyVersionConstraints, parseKeyVersion } from "./KeyLoaderFacade.js" export interface AuthDataProvider { /** @@ -55,23 +57,34 @@ export class UserFacade implements AuthDataProvider { } const userGroupMembership = this.user.userGroup const currentUserGroupKey = { - version: Number(userGroupMembership.groupKeyVersion), + version: parseKeyVersion(userGroupMembership.groupKeyVersion), object: decryptKey(userPassphraseKey, userGroupMembership.symEncGKey), } this.keyCache.setCurrentUserGroupKey(currentUserGroupKey) - this.setUserGroupKeyDistributionKey(userPassphraseKey) + this.setUserDistKey(currentUserGroupKey.version, userPassphraseKey) } - setUserGroupKeyDistributionKey(userPassphraseKey: number[]) { + setUserDistKey(currentUserGroupKeyVersion: KeyVersion, userPassphraseKey: AesKey) { if (this.user == null) { throw new ProgrammingError("Invalid state: no user") } + // Why this magic + 1? Because we don't have access to the new version number when calling this function so we compute it from the current one + const newUserGroupKeyVersion = checkKeyVersionConstraints(currentUserGroupKeyVersion + 1) const userGroupMembership = this.user.userGroup - const userGroupKeyDistributionKey = this.deriveUserGroupKeyDistributionKey(userGroupMembership.group, userPassphraseKey) - this.keyCache.setUserGroupKeyDistributionKey(userGroupKeyDistributionKey) + const legacyUserDistKey = this.deriveLegacyUserDistKey(userGroupMembership.group, userPassphraseKey) + const userDistKey = this.deriveUserDistKey(userGroupMembership.group, newUserGroupKeyVersion, userPassphraseKey) + this.keyCache.setLegacyUserDistKey(legacyUserDistKey) + this.keyCache.setUserDistKey(userDistKey) } - deriveUserGroupKeyDistributionKey(userGroupId: Id, userPassphraseKey: AesKey): AesKey { + /** + * Derives a distribution key from the password key to share the new user group key of the user to their other clients (apps, web etc) + * This is a fallback function that gets called when the output key of `deriveUserDistKey` fails to decrypt the new user group key + * @deprecated + * @param userGroupId user group id of the logged in user + * @param userPasswordKey current password key of the user + */ + deriveLegacyUserDistKey(userGroupId: Id, userPasswordKey: AesKey): AesKey { // we prepare a key to encrypt potential user group key rotations with // when passwords are changed clients are logged-out of other sessions // this key is only needed by the logged-in clients, so it should be reliable enough to assume that userPassphraseKey is in sync @@ -81,11 +94,26 @@ export class UserFacade implements AuthDataProvider { return this.cryptoWrapper.deriveKeyWithHkdf({ salt: userGroupId, - key: userPassphraseKey, + key: userPasswordKey, context: "userGroupKeyDistributionKey", }) } + /** + * Derives a distribution to share the new user group key of the user to their other clients (apps, web etc) + * @param userGroupId user group id of the logged in user + * @param newUserGroupKeyVersion the new user group key version + * @param userPasswordKey current password key of the user + */ + deriveUserDistKey(userGroupId: Id, newUserGroupKeyVersion: KeyVersion, userPasswordKey: AesKey): Aes256Key { + return this.cryptoWrapper.deriveKeyWithHkdf({ + salt: `userGroup: ${userGroupId}, newUserGroupKeyVersion: ${newUserGroupKeyVersion}`, + key: userPasswordKey, + // Formerly,this was not bound to the user group key version. + context: "versionedUserGroupKeyDistributionKey", + }) + } + async updateUser(user: User) { if (this.user == null) { throw new ProgrammingError("Update user is called without logging in. This function is not for you.") @@ -203,14 +231,29 @@ export class UserFacade implements AuthDataProvider { } updateUserGroupKey(userGroupKeyDistribution: UserGroupKeyDistribution) { - const userGroupKeyDistributionKey = this.keyCache.getUserGroupKeyDistributionKey() - if (userGroupKeyDistributionKey == null) { + const userDistKey = this.keyCache.getUserDistKey() + if (userDistKey == null) { console.log("could not update userGroupKey because distribution key is not available") return } let newUserGroupKeyBytes try { - newUserGroupKeyBytes = decryptKey(userGroupKeyDistributionKey, userGroupKeyDistribution.distributionEncUserGroupKey) + try { + newUserGroupKeyBytes = decryptKey(userDistKey, userGroupKeyDistribution.distributionEncUserGroupKey) + } catch (e) { + if (e instanceof CryptoError) { + // this might be due to old encryption with the legacy derivation of the distribution key + // try with the legacy one instead + const legacyUserDistKey = this.keyCache.getLegacyUserDistKey() + if (legacyUserDistKey == null) { + console.log("could not update userGroupKey because old legacy distribution key is not available") + return + } + newUserGroupKeyBytes = decryptKey(legacyUserDistKey, userGroupKeyDistribution.distributionEncUserGroupKey) + } else { + throw e + } + } } catch (e) { // this may happen during offline storage synchronisation when the event queue contains user group key rotation and a password change. // We can ignore this error as we already have the latest user group key after connecting the offline client @@ -219,7 +262,7 @@ export class UserFacade implements AuthDataProvider { } const newUserGroupKey = { object: newUserGroupKeyBytes, - version: Number(userGroupKeyDistribution.userGroupKeyVersion), + version: parseKeyVersion(userGroupKeyDistribution.userGroupKeyVersion), } console.log(`updating userGroupKey. new version: ${userGroupKeyDistribution.userGroupKeyVersion}`) this.keyCache.setCurrentUserGroupKey(newUserGroupKey) diff --git a/src/common/api/worker/facades/lazy/CacheManagementFacade.ts b/src/common/api/worker/facades/lazy/CacheManagementFacade.ts index a2902f962885..1058b1bcd094 100644 --- a/src/common/api/worker/facades/lazy/CacheManagementFacade.ts +++ b/src/common/api/worker/facades/lazy/CacheManagementFacade.ts @@ -1,4 +1,4 @@ -import { Group, GroupKeyTypeRef, GroupTypeRef, User, UserGroupKeyDistributionTypeRef, UserTypeRef } from "../../../entities/sys/TypeRefs.js" +import { Group, GroupTypeRef, User, UserGroupKeyDistributionTypeRef, UserTypeRef } from "../../../entities/sys/TypeRefs.js" import { EntityClient } from "../../../common/EntityClient.js" import { assertWorkerOrNode } from "../../../common/Env.js" import { UserFacade } from "../UserFacade.js" diff --git a/src/common/api/worker/facades/lazy/ConfigurationDatabase.ts b/src/common/api/worker/facades/lazy/ConfigurationDatabase.ts index 6fdb9ce40b2f..8a15d6708d7c 100644 --- a/src/common/api/worker/facades/lazy/ConfigurationDatabase.ts +++ b/src/common/api/worker/facades/lazy/ConfigurationDatabase.ts @@ -16,7 +16,7 @@ import { import { UserFacade } from "../UserFacade.js" import { EncryptedDbKeyBaseMetaData, EncryptedIndexerMetaData, Metadata, ObjectStoreName } from "../../search/IndexTables.js" import { DbError } from "../../../common/error/DbError.js" -import { KeyLoaderFacade } from "../KeyLoaderFacade.js" +import { checkKeyVersionConstraints, KeyLoaderFacade } from "../KeyLoaderFacade.js" import type { QueuedBatch } from "../../EventQueue.js" import { encryptKeyWithVersionedKey, VersionedKey } from "../../crypto/CryptoWrapper.js" @@ -210,7 +210,7 @@ export async function getMetaData(db: DbFacade, objectStoreName: ObjectStoreName const transaction = await db.createTransaction(true, [objectStoreName]) const userEncDbKey = (await transaction.get(objectStoreName, Metadata.userEncDbKey)) as Uint8Array const encDbIv = (await transaction.get(objectStoreName, Metadata.encDbIv)) as Uint8Array - const userGroupKeyVersion = (await transaction.get(objectStoreName, Metadata.userGroupKeyVersion)) ?? 0 // was not written for old dbs + const userGroupKeyVersion = checkKeyVersionConstraints((await transaction.get(objectStoreName, Metadata.userGroupKeyVersion)) ?? 0) // was not written for old dbs if (userEncDbKey == null || encDbIv == null) { return null } else { @@ -231,7 +231,7 @@ export async function getIndexerMetaData(db: DbFacade, objectStoreName: ObjectSt const transaction = await db.createTransaction(true, [objectStoreName]) const userEncDbKey = (await transaction.get(objectStoreName, Metadata.userEncDbKey)) as Uint8Array const encDbIv = (await transaction.get(objectStoreName, Metadata.encDbIv)) as Uint8Array - const userGroupKeyVersion = (await transaction.get(objectStoreName, Metadata.userGroupKeyVersion)) ?? 0 // was not written for old dbs + const userGroupKeyVersion = checkKeyVersionConstraints((await transaction.get(objectStoreName, Metadata.userGroupKeyVersion)) ?? 0) // was not written for old dbs const mailIndexingEnabled = (await transaction.get(objectStoreName, Metadata.mailIndexingEnabled)) as boolean const excludedListIds = (await transaction.get(objectStoreName, Metadata.excludedListIds)) as Id[] const lastEventIndexTimeMs = (await transaction.get(objectStoreName, Metadata.lastEventIndexTimeMs)) as number diff --git a/src/common/api/worker/facades/lazy/CustomerFacade.ts b/src/common/api/worker/facades/lazy/CustomerFacade.ts index 338c7129670d..c7e520a3c796 100644 --- a/src/common/api/worker/facades/lazy/CustomerFacade.ts +++ b/src/common/api/worker/facades/lazy/CustomerFacade.ts @@ -66,7 +66,7 @@ import { ProgrammingError } from "../../../common/error/ProgrammingError.js" import { getWhitelabelDomainInfo } from "../../../common/utils/CustomerUtils.js" import type { PdfWriter } from "../../pdf/PdfWriter.js" import { createCustomerAccountCreateData } from "../../../entities/tutanota/TypeRefs.js" -import { KeyLoaderFacade } from "../KeyLoaderFacade.js" +import { KeyLoaderFacade, parseKeyVersion } from "../KeyLoaderFacade.js" import { RecoverCodeFacade } from "./RecoverCodeFacade.js" import { encryptKeyWithVersionedKey, VersionedEncryptedKey, VersionedKey } from "../../crypto/CryptoWrapper.js" import { AsymmetricCryptoFacade } from "../../crypto/AsymmetricCryptoFacade.js" @@ -142,7 +142,7 @@ export class CustomerFacade { pubKyberKey, pubRsaKey, }, - version: Number(keyData.systemAdminPubKeyVersion), + version: parseKeyVersion(keyData.systemAdminPubKeyVersion), } const { pubEncSymKeyBytes, cryptoProtocolVersion } = await this.asymmetricCryptoFacade.asymEncryptSymKey( sessionKey, @@ -285,9 +285,9 @@ export class CustomerFacade { currentLanguage: string, app: SubscriptionApp, ): Promise { - const userGroupKey = { object: aes256RandomKey(), version: 0 } - const adminGroupKey = { object: aes256RandomKey(), version: 0 } - const customerGroupKey = { object: aes256RandomKey(), version: 0 } + const userGroupKey: VersionedKey = { object: aes256RandomKey(), version: 0 } + const adminGroupKey: VersionedKey = { object: aes256RandomKey(), version: 0 } + const customerGroupKey: VersionedKey = { object: aes256RandomKey(), version: 0 } const userGroupInfoSessionKey = aes256RandomKey() const adminGroupInfoSessionKey = aes256RandomKey() const customerGroupInfoSessionKey = aes256RandomKey() @@ -296,8 +296,6 @@ export class CustomerFacade { const keyData = await this.serviceExecutor.get(SystemKeysService, null) const pubRsaKey = keyData.systemAdminPubRsaKey - const pubEccKey = keyData.systemAdminPubEccKey - const pubKyberKey = keyData.systemAdminPubKyberKey let systemAdminPubEncAccountingInfoSessionKey: VersionedEncryptedKey let systemAdminPublicProtocolVersion: CryptoProtocolVersion @@ -306,7 +304,7 @@ export class CustomerFacade { const systemAdminPubEncAccountingInfoSessionKeyBytes = await this.rsa.encrypt(rsaPublicKey, bitArrayToUint8Array(accountingInfoSessionKey)) systemAdminPubEncAccountingInfoSessionKey = { key: systemAdminPubEncAccountingInfoSessionKeyBytes, - encryptingKeyVersion: Number(keyData.systemAdminPubKeyVersion), + encryptingKeyVersion: parseKeyVersion(keyData.systemAdminPubKeyVersion), } systemAdminPublicProtocolVersion = CryptoProtocolVersion.RSA } else { @@ -383,7 +381,7 @@ export class CustomerFacade { const keyData = await this.serviceExecutor.get(SystemKeysService, null) await this.switchAccountGroup(neverNull(keyData.freeGroup), neverNull(keyData.premiumGroup), { object: uint8ArrayToBitArray(keyData.premiumGroupKey), - version: Number(keyData.premiumGroupKeyVersion), + version: parseKeyVersion(keyData.premiumGroupKeyVersion), }) } catch (e) { e.message = e.message + " error switching free to premium group" @@ -397,7 +395,7 @@ export class CustomerFacade { const keyData = await this.serviceExecutor.get(SystemKeysService, null) await this.switchAccountGroup(neverNull(keyData.premiumGroup), neverNull(keyData.freeGroup), { object: uint8ArrayToBitArray(keyData.freeGroupKey), - version: Number(keyData.freeGroupKeyVersion), + version: parseKeyVersion(keyData.freeGroupKeyVersion), }) } catch (e) { e.message = e.message + " error switching premium to free group" diff --git a/src/common/api/worker/facades/lazy/GroupManagementFacade.ts b/src/common/api/worker/facades/lazy/GroupManagementFacade.ts index 8f8fbc2331fb..3638421938ce 100644 --- a/src/common/api/worker/facades/lazy/GroupManagementFacade.ts +++ b/src/common/api/worker/facades/lazy/GroupManagementFacade.ts @@ -8,37 +8,25 @@ import { createUserAreaGroupDeleteData, createUserAreaGroupPostData, } from "../../../entities/tutanota/TypeRefs.js" -import { assertNotNull, freshVersioned, getFirstOrThrow, isNotEmpty, neverNull } from "@tutao/tutanota-utils" -import { - AdministratedGroup, - AdministratedGroupTypeRef, - createLocalAdminGroupReplacementData, - createLocalAdminRemovalPostIn, - createMembershipAddData, - createMembershipRemoveData, - CustomerTypeRef, - Group, - GroupInfoTypeRef, - GroupTypeRef, - LocalAdminGroupReplacementData, - User, - UserTypeRef, -} from "../../../entities/sys/TypeRefs.js" +import { assertNotNull, freshVersioned, getFirstOrThrow, neverNull } from "@tutao/tutanota-utils" +import { createMembershipAddData, createMembershipRemoveData, Group, GroupTypeRef, PubEncKeyData, User, UserTypeRef } from "../../../entities/sys/TypeRefs.js" import { CounterFacade } from "./CounterFacade.js" import { EntityClient } from "../../../common/EntityClient.js" import { assertWorkerOrNode } from "../../../common/Env.js" import { IServiceExecutor } from "../../../common/ServiceRequest.js" import { CalendarService, ContactListGroupService, MailGroupService, TemplateGroupService } from "../../../entities/tutanota/Services.js" -import { LocalAdminRemovalService, MembershipService } from "../../../entities/sys/Services.js" +import { MembershipService } from "../../../entities/sys/Services.js" import { UserFacade } from "../UserFacade.js" import { ProgrammingError } from "../../../common/error/ProgrammingError.js" import { PQFacade } from "../PQFacade.js" -import { KeyLoaderFacade } from "../KeyLoaderFacade.js" +import { KeyLoaderFacade, parseKeyVersion } from "../KeyLoaderFacade.js" import { CacheManagementFacade } from "./CacheManagementFacade.js" -import { CryptoWrapper, encryptKeyWithVersionedKey, encryptString, VersionedKey } from "../../crypto/CryptoWrapper.js" +import { CryptoWrapper, encryptKeyWithVersionedKey, encryptString, VersionedEncryptedKey, VersionedKey } from "../../crypto/CryptoWrapper.js" import { AsymmetricCryptoFacade } from "../../crypto/AsymmetricCryptoFacade.js" import { AesKey, PQKeyPairs } from "@tutao/tutanota-crypto" -import { isGlobalAdmin } from "../../../common/utils/UserUtils.js" +import { brandKeyMac, KeyAuthenticationFacade } from "../KeyAuthenticationFacade.js" +import { TutanotaError } from "@tutao/tutanota-error" +import { KeyVersion } from "@tutao/tutanota-utils/dist/Utils.js" assertWorkerOrNode() @@ -53,6 +41,7 @@ export class GroupManagementFacade { private readonly cacheManagementFacade: CacheManagementFacade, private readonly asymmetricCryptoFacade: AsymmetricCryptoFacade, private readonly cryptoWrapper: CryptoWrapper, + private readonly keyAuthenticationFacade: KeyAuthenticationFacade, ) {} async readUsedSharedMailGroupStorage(group: Group): Promise { @@ -243,7 +232,7 @@ export class GroupManagementFacade { } } - async getGroupKeyViaUser(groupId: Id, version: number, viaUser: Id): Promise { + async getGroupKeyViaUser(groupId: Id, version: KeyVersion, viaUser: Id): Promise { const currentGroupKey = await this.getCurrentGroupKeyViaUser(groupId, viaUser) return this.keyLoaderFacade.loadSymGroupKey(groupId, version, currentGroupKey) } @@ -261,15 +250,15 @@ export class GroupManagementFacade { throw new Error(`User doesn't have this group membership! User: ${viaUser} groupId: ${groupId}`) } const requiredUserGroupKeyVersion = membership.symKeyVersion - const requiredUserGroupKey = await this.getGroupKeyViaAdminEncGKey(user.userGroup.group, Number(requiredUserGroupKeyVersion)) + const requiredUserGroupKey = await this.getGroupKeyViaAdminEncGKey(user.userGroup.group, parseKeyVersion(requiredUserGroupKeyVersion)) const key = this.cryptoWrapper.decryptKey(requiredUserGroupKey, membership.symEncGKey) - const version = Number(membership.groupKeyVersion) + const version = parseKeyVersion(membership.groupKeyVersion) return { object: key, version } } - async getGroupKeyViaAdminEncGKey(groupId: Id, version: number): Promise { + async getGroupKeyViaAdminEncGKey(groupId: Id, version: KeyVersion): Promise { if (this.userFacade.hasGroup(groupId)) { // e.g. I am a global admin and want to add another user to the global admin group return this.keyLoaderFacade.loadSymGroupKey(groupId, version) @@ -307,105 +296,101 @@ export class GroupManagementFacade { } // e.g. I am a member of the group that administrates group G and want to add a new member to G - const requiredAdminKeyVersion = Number(group.adminGroupKeyVersion ?? 0) + const requiredAdminKeyVersion = parseKeyVersion(group.adminGroupKeyVersion ?? "0") if (group.adminGroupEncGKey != null) { - return await this.decryptViaSymmetricAdminGKey(group, requiredAdminKeyVersion) + return await this.decryptViaSymmetricAdminGKey( + group, + { + key: group.adminGroupEncGKey, + encryptingKeyVersion: requiredAdminKeyVersion, + }, + parseKeyVersion(group.groupKeyVersion), + ) } else { - return await this.decryptViaAsymmetricAdminGKey(group, requiredAdminKeyVersion) + // assume that the group is a userGroup. otherwise pubAdminGroupEncGKey cannot be set + return await this.decryptViaAsymmetricAdminGKey(group, assertNotNull(group.pubAdminGroupEncGKey)) } } } - private async decryptViaSymmetricAdminGKey(group: Group, requiredAdminKeyVersion: number): Promise { - const requiredAdminGroupKey = await this.keyLoaderFacade.loadSymGroupKey(assertNotNull(group.admin), requiredAdminKeyVersion) - const decryptedKey = this.cryptoWrapper.decryptKey(requiredAdminGroupKey, assertNotNull(group.adminGroupEncGKey)) - return { object: decryptedKey, version: Number(group.groupKeyVersion) } - } - - private async decryptViaAsymmetricAdminGKey(group: Group, requiredAdminKeyVersion: number): Promise { - const requiredAdminGroupKeyPair = await this.keyLoaderFacade.loadKeypair(assertNotNull(group.admin), requiredAdminKeyVersion) - const pubEncKeyData = assertNotNull(group.pubAdminGroupEncGKey) - const decryptedKey = await this.asymmetricCryptoFacade.decryptSymKeyWithKeyPairAndAuthenticate(requiredAdminGroupKeyPair, pubEncKeyData, { - identifier: group._id, - identifierType: PublicKeyIdentifierType.GROUP_ID, - }) - return { object: decryptedKey.decryptedAesKey, version: Number(group.groupKeyVersion) } + private async decryptViaSymmetricAdminGKey(group: Group, encryptedGroupKey: VersionedEncryptedKey, encryptedKeyVersion: KeyVersion): Promise { + const requiredAdminGroupKey = await this.keyLoaderFacade.loadSymGroupKey(assertNotNull(group.admin), encryptedGroupKey.encryptingKeyVersion) + const decryptedKey = this.cryptoWrapper.decryptKey(requiredAdminGroupKey, encryptedGroupKey.key) + return { object: decryptedKey, version: encryptedKeyVersion } } /** - * Context: removal of local admins - * Problem: local admins encrypted the user group key of their users with their admin group key but global admin can't - * decrypt these with their admin group key. - * We want the global admin to still be able to decrypt user data. - * - * This function will decrypt the user group key with the local admin group key and then encrypt it with the global admin group key - * Please note that this function is free of side effects, it only returns a new reference of the newly modified group. - * - * @param globalAdminGroupKey the key of the global admin that will encrypt the user group key - * @param localAdminGroupKey the key of the local admin that was used to encrypt the user group key and will be used to decrypt the user group key - * @param userGroup the user group that needs its adminEncGroupKey to be replaced + * @param userGroup the group for which we are trying to get the key + * @param pubAdminEncUserKeyData some version of the group key encrypted with some version of the public admin group key. This can be the current one from the group or one of the former group keys. + * @private */ - async replaceLocalAdminEncGroupKeyWithGlobalAdminEncGroupKey( - globalAdminGroupKey: VersionedKey, - localAdminGroupKey: AesKey, - userGroup: Group, - ): Promise { - const localAdminEncUserGroupKey = assertNotNull(userGroup.adminGroupEncGKey) - const decryptedUserGroupKey = this.cryptoWrapper.decryptKey(localAdminGroupKey, localAdminEncUserGroupKey) - - const globalAdminEncUserGroupKey = this.cryptoWrapper.encryptKey(globalAdminGroupKey.object, decryptedUserGroupKey) - - const groupUpdate = createLocalAdminGroupReplacementData({ - adminGroupKeyVersion: String(globalAdminGroupKey.version), - adminGroupEncGKey: globalAdminEncUserGroupKey, - groupId: userGroup._id, - groupKeyVersion: userGroup.groupKeyVersion, - }) - return groupUpdate - } - - /** - * Since local admins won't be supported anymore and will be removed we need to let the - * global admin access the locally administrated group data. - * As its name suggest this function migrate the users administrated by the local admins - * to the global admin of the customer so that the global admin can have direct - * encryption and decryption of its users group keys. - */ - async migrateLocalAdminsToGlobalAdmins() { - const user = this.userFacade.getLoggedInUser() - if (!isGlobalAdmin(user)) { - return + private async decryptViaAsymmetricAdminGKey(userGroup: Group, pubAdminEncUserKeyData: PubEncKeyData): Promise { + const requiredAdminGroupKeyPair = await this.keyLoaderFacade.loadKeypair( + assertNotNull(userGroup.admin), + parseKeyVersion(pubAdminEncUserKeyData.recipientKeyVersion), + ) + const decryptedUserGroupKey = ( + await this.asymmetricCryptoFacade.decryptSymKeyWithKeyPairAndAuthenticate(requiredAdminGroupKeyPair, pubAdminEncUserKeyData, { + identifier: userGroup._id, + identifierType: PublicKeyIdentifierType.GROUP_ID, + }) + ).decryptedAesKey + + // this function is called recursively. therefore we must not return the group key version from the group but from the pubAdminEncUserKeyData + const versionedDecryptedUserGroupKey = { + object: decryptedUserGroupKey, + version: parseKeyVersion(assertNotNull(pubAdminEncUserKeyData.symKeyMac).taggedKeyVersion), } - const customer = await this.entityClient.load(CustomerTypeRef, assertNotNull(user.customer)) - const teamGroupInfos = await this.entityClient.loadAll(GroupInfoTypeRef, customer.teamGroups) - const localAdminGroupInfos = teamGroupInfos.filter((group) => group.groupType === GroupType.LocalAdmin) - const adminGroupId: Id = customer.adminGroup - const adminGroupKey = await this.keyLoaderFacade.getCurrentSymGroupKey(adminGroupId) - const postIn = createLocalAdminRemovalPostIn({ groupUpdates: [] }) - - for (let localAdminGroupInfo of localAdminGroupInfos) { - const localAdminGroup = await this.entityClient.load(GroupTypeRef, localAdminGroupInfo.group) - const administratedGroupsListId = localAdminGroup.administratedGroups?.items - if (administratedGroupsListId == null) return null - const administratedGroups: Array = await this.entityClient.loadAll(AdministratedGroupTypeRef, administratedGroupsListId) - - // we assume local admins never had their key rotation done and so their sym key version (requestedVersion) is stuck to 0 by default - const thisLocalAdminGroupKey = await this.getCurrentGroupKeyViaAdminEncGKey(localAdminGroup._id) - for (let ag of administratedGroups) { - const thisRelatedGroupInfo = await this.entityClient.load(GroupInfoTypeRef, ag.groupInfo) - const thisRelatedGroup = await this.entityClient.load(GroupTypeRef, thisRelatedGroupInfo.group) - - const groupUpdate = await this.replaceLocalAdminEncGroupKeyWithGlobalAdminEncGroupKey( - adminGroupKey, - thisLocalAdminGroupKey.object, - thisRelatedGroup, - ) - postIn.groupUpdates.push(groupUpdate) + await this.verifyUserGroupKeyMac(pubAdminEncUserKeyData, userGroup, versionedDecryptedUserGroupKey) + + return versionedDecryptedUserGroupKey + } + + private async verifyUserGroupKeyMac(pubEncKeyData: PubEncKeyData, userGroup: Group, receivedUserGroupKey: VersionedKey) { + const givenUserGroupKeyMac = brandKeyMac(assertNotNull(pubEncKeyData.symKeyMac)) + + // The given mac is authenticated by the previous user group key, so we can get the version from there. + const previousUserGroupKeyVersion = parseKeyVersion(givenUserGroupKeyMac.taggingKeyVersion) + const recipientAdminGroupKeyVersion = parseKeyVersion(pubEncKeyData.recipientKeyVersion) + + // get previous user group key: ag1 -> ag0 -> ug0 + const formerGroupKey = await this.keyLoaderFacade.loadFormerGroupKeyInstance(userGroup, previousUserGroupKeyVersion) + let previousUserGroupKey: VersionedKey + if (formerGroupKey.adminGroupEncGKey != null) { + previousUserGroupKey = await this.decryptViaSymmetricAdminGKey( + userGroup, + { + key: formerGroupKey.adminGroupEncGKey, + encryptingKeyVersion: parseKeyVersion(assertNotNull(formerGroupKey.adminGroupKeyVersion)), + }, + previousUserGroupKeyVersion, + ) + } else if (formerGroupKey.pubAdminGroupEncGKey != null) { + const userGroupKeyMac = assertNotNull(formerGroupKey.pubAdminGroupEncGKey.symKeyMac) + // recurse, but expect to hit the end _before_ version 0, which should always be symmetrically encrypted + if (userGroupKeyMac.taggedKeyVersion === "0") { + throw new TutanotaError("UserGroupKeyNotTrustedError", "cannot establish trust on the user group key") } + previousUserGroupKey = await this.decryptViaAsymmetricAdminGKey(userGroup, formerGroupKey.pubAdminGroupEncGKey) + } else { + throw new TutanotaError("MissingAdminEncGroupKeyError", "cannot verify user group key") } - if (isNotEmpty(postIn.groupUpdates)) { - await this.serviceExecutor.post(LocalAdminRemovalService, postIn) - } + + this.keyAuthenticationFacade.verifyTag( + { + tagType: "USER_GROUP_KEY_TAG", + sourceOfTrust: { currentUserGroupKey: previousUserGroupKey.object }, + untrustedKey: { newUserGroupKey: receivedUserGroupKey.object }, + bindingData: { + userGroupId: userGroup._id, + adminGroupId: assertNotNull(userGroup.admin), + currentUserGroupKeyVersion: previousUserGroupKey.version, + newUserGroupKeyVersion: receivedUserGroupKey.version, + newAdminGroupKeyVersion: recipientAdminGroupKeyVersion, + }, + }, + givenUserGroupKeyMac.tag, + ) } } diff --git a/src/common/api/worker/facades/lazy/MailAddressFacade.ts b/src/common/api/worker/facades/lazy/MailAddressFacade.ts index ef507f3701f0..f0246fe60469 100644 --- a/src/common/api/worker/facades/lazy/MailAddressFacade.ts +++ b/src/common/api/worker/facades/lazy/MailAddressFacade.ts @@ -23,7 +23,7 @@ import { MailboxProperties, MailboxPropertiesTypeRef, } from "../../../entities/tutanota/TypeRefs.js" -import { assertNotNull, findAndRemove, getFirstOrThrow, ofClass } from "@tutao/tutanota-utils" +import { assertNotNull, findAndRemove, getFirstOrThrow, KeyVersion, ofClass } from "@tutao/tutanota-utils" import { getEnabledMailAddressesForGroupInfo } from "../../../common/utils/GroupUtils.js" import { PreconditionFailedError } from "../../../common/error/RestError.js" import { ProgrammingError } from "../../../common/error/ProgrammingError.js" @@ -147,7 +147,7 @@ export class MailAddressFacade { mailboxGroupRoot.mailboxProperties = await this.createMailboxProperties(mailboxGroupRoot, currentGroupKey) } - const groupKeyProvider = async (version: number) => + const groupKeyProvider = async (version: KeyVersion) => viaUser ? await this.groupManagement.getGroupKeyViaUser(mailGroupId, version, viaUser) : await this.groupManagement.getGroupKeyViaAdminEncGKey(mailGroupId, version) @@ -210,7 +210,7 @@ export class MailAddressFacade { } private async updateMailboxProperties(mailboxProperties: MailboxProperties, viaUser?: Id): Promise { - const groupKeyProvider = async (version: number) => + const groupKeyProvider = async (version: KeyVersion) => viaUser ? await this.groupManagement.getGroupKeyViaUser(assertNotNull(mailboxProperties._ownerGroup), version, viaUser) : await this.groupManagement.getGroupKeyViaAdminEncGKey(assertNotNull(mailboxProperties._ownerGroup), version) diff --git a/src/common/api/worker/facades/lazy/MailFacade.ts b/src/common/api/worker/facades/lazy/MailFacade.ts index 89915a08a884..0b49dd26f3ec 100644 --- a/src/common/api/worker/facades/lazy/MailFacade.ts +++ b/src/common/api/worker/facades/lazy/MailFacade.ts @@ -75,10 +75,9 @@ import { } from "../../../entities/tutanota/TypeRefs.js" import { RecipientsNotFoundError } from "../../../common/error/RecipientsNotFoundError.js" import { NotFoundError } from "../../../common/error/RestError.js" -import type { EntityUpdate, ExternalUserReference, PublicKeyGetOut, User } from "../../../entities/sys/TypeRefs.js" +import type { EntityUpdate, ExternalUserReference, User } from "../../../entities/sys/TypeRefs.js" import { BlobReferenceTokenWrapper, - createPublicKeyGetIn, ExternalUserReferenceTypeRef, GroupInfoTypeRef, GroupRootTypeRef, @@ -100,6 +99,7 @@ import { ofClass, promiseFilter, promiseMap, + Versioned, } from "@tutao/tutanota-utils" import { BlobFacade } from "./BlobFacade.js" import { assertWorkerOrNode, isApp, isDesktop } from "../../../common/Env.js" @@ -126,7 +126,6 @@ import { import { DataFile } from "../../../common/DataFile.js" import { FileReference, isDataFile, isFileReference } from "../../../common/utils/FileUtils.js" import { CounterService } from "../../../entities/monitor/Services.js" -import { PublicKeyService } from "../../../entities/sys/Services.js" import { IServiceExecutor } from "../../../common/ServiceRequest.js" import { createWriteCounterData } from "../../../entities/monitor/TypeRefs.js" import { UserFacade } from "../UserFacade.js" @@ -136,8 +135,9 @@ import { LoginFacade } from "../LoginFacade.js" import { ProgrammingError } from "../../../common/error/ProgrammingError.js" import { OwnerEncSessionKeyProvider } from "../../rest/EntityRestClient.js" import { resolveTypeReference } from "../../../common/EntityFunctions.js" -import { KeyLoaderFacade } from "../KeyLoaderFacade.js" +import { KeyLoaderFacade, parseKeyVersion } from "../KeyLoaderFacade.js" import { encryptBytes, encryptKeyWithVersionedKey, encryptString, VersionedEncryptedKey, VersionedKey } from "../../crypto/CryptoWrapper.js" +import { PublicKeyProvider, PublicKeys } from "../PublicKeyProvider.js" assertWorkerOrNode() type Attachments = ReadonlyArray @@ -185,6 +185,7 @@ export class MailFacade { private readonly fileApp: NativeFileApp, private readonly loginFacade: LoginFacade, private readonly keyLoaderFacade: KeyLoaderFacade, + private readonly publicKeyProvider: PublicKeyProvider, ) {} async createMailFolder(name: string, parent: IdTuple | null, ownerGroupId: Id): Promise { @@ -319,7 +320,8 @@ export class MailFacade { const senderMailGroupId = await this._getMailGroupIdForMailAddress(this.userFacade.getLoggedInUser(), senderMailAddress) - const mailGroupKeyVersion = Number(draft._ownerKeyVersion ?? 0) + // we assume that there is an _ownerEncSessionKey anyway, so we can default to 0 + const mailGroupKeyVersion = parseKeyVersion(draft._ownerKeyVersion ?? "0") const mailGroupKey = { version: mailGroupKeyVersion, object: await this.keyLoaderFacade.loadSymGroupKey(senderMailGroupId, mailGroupKeyVersion), @@ -786,14 +788,14 @@ export class MailFacade { const externalMailGroup = await this.entityClient.load(GroupTypeRef, externalMailGroupId) const externalUserGroup = await this.entityClient.load(GroupTypeRef, externalUserGroupId) - const requiredInternalUserGroupKeyVersion = Number(externalUserGroup.adminGroupKeyVersion ?? 0) - const requiredExternalUserGroupKeyVersion = Number(externalMailGroup.adminGroupKeyVersion ?? 0) + const requiredInternalUserGroupKeyVersion = parseKeyVersion(externalUserGroup.adminGroupKeyVersion ?? "0") + const requiredExternalUserGroupKeyVersion = parseKeyVersion(externalMailGroup.adminGroupKeyVersion ?? "0") const internalUserEncExternalUserKey = assertNotNull(externalUserGroup.adminGroupEncGKey, "no adminGroupEncGKey on external user group") const externalUserEncExternalMailKey = assertNotNull(externalMailGroup.adminGroupEncGKey, "no adminGroupEncGKey on external mail group") const requiredInternalUserGroupKey = await this.keyLoaderFacade.loadSymGroupKey(this.userFacade.getUserGroupId(), requiredInternalUserGroupKeyVersion) const currentExternalUserGroupKey = { object: decryptKey(requiredInternalUserGroupKey, internalUserEncExternalUserKey), - version: Number(externalUserGroup.groupKeyVersion), + version: parseKeyVersion(externalUserGroup.groupKeyVersion), } const requiredExternalUserGroupKey = await this.keyLoaderFacade.loadSymGroupKey( externalUserGroupId, @@ -802,7 +804,7 @@ export class MailFacade { ) const currentExternalMailGroupKey = { object: decryptKey(requiredExternalUserGroupKey, externalUserEncExternalMailKey), - version: Number(externalMailGroup.groupKeyVersion), + version: parseKeyVersion(externalMailGroup.groupKeyVersion), } return { currentExternalUserGroupKey, @@ -810,16 +812,12 @@ export class MailFacade { } } - getRecipientKeyData(mailAddress: string): Promise { - return this.serviceExecutor - .get( - PublicKeyService, - createPublicKeyGetIn({ - identifierType: PublicKeyIdentifierType.MAIL_ADDRESS, - identifier: mailAddress, - version: null, // get the current version for encryption - }), - ) + getRecipientKeyData(mailAddress: string): Promise | null> { + return this.publicKeyProvider + .loadCurrentPubKey({ + identifierType: PublicKeyIdentifierType.MAIL_ADDRESS, + identifier: mailAddress, + }) .catch(ofClass(NotFoundError, () => null)) } @@ -975,7 +973,7 @@ export class MailFacade { ) return { key: instanceSessionKey.symEncSessionKey, - encryptingKeyVersion: Number(instanceSessionKey.symKeyVersion), + encryptingKeyVersion: parseKeyVersion(instanceSessionKey.symKeyVersion), } } } @@ -1008,7 +1006,7 @@ export class MailFacade { private keyProviderFromInstance(mail: Mail) { return async () => ({ key: assertNotNull(mail._ownerEncSessionKey), - encryptingKeyVersion: Number(mail._ownerKeyVersion), + encryptingKeyVersion: parseKeyVersion(mail._ownerKeyVersion ?? "0"), }) } diff --git a/src/common/api/worker/facades/lazy/RecoverCodeFacade.ts b/src/common/api/worker/facades/lazy/RecoverCodeFacade.ts index 6ff9fb11fa50..b6ff88d20f52 100644 --- a/src/common/api/worker/facades/lazy/RecoverCodeFacade.ts +++ b/src/common/api/worker/facades/lazy/RecoverCodeFacade.ts @@ -1,6 +1,6 @@ import { asKdfType } from "../../../common/TutanotaConstants.js" import { createRecoverCode, RecoverCodeTypeRef, User } from "../../../entities/sys/TypeRefs.js" -import { assertNotNull, type Hex, uint8ArrayToHex } from "@tutao/tutanota-utils" +import { assertNotNull, type Hex, KeyVersion, uint8ArrayToHex } from "@tutao/tutanota-utils" import { LoginFacade } from "../LoginFacade.js" import { assertWorkerOrNode } from "../../../common/Env.js" import { @@ -15,14 +15,14 @@ import { } from "@tutao/tutanota-crypto" import { EntityClient } from "../../../common/EntityClient.js" import { UserFacade } from "../UserFacade.js" -import { KeyLoaderFacade } from "../KeyLoaderFacade.js" +import { KeyLoaderFacade, parseKeyVersion } from "../KeyLoaderFacade.js" import { VersionedKey } from "../../crypto/CryptoWrapper.js" assertWorkerOrNode() export type RecoverData = { userEncRecoverCode: Uint8Array - userKeyVersion: number + userKeyVersion: KeyVersion recoverCodeEncUserGroupKey: Uint8Array hexCode: Hex recoveryCodeVerifier: Uint8Array @@ -76,7 +76,7 @@ export class RecoverCodeFacade { } const recoveryCodeEntity = await this.entityClient.load(RecoverCodeTypeRef, recoverCodeId, { extraHeaders }) - const userGroupKey = await this.keyLoaderFacade.loadSymUserGroupKey(Number(recoveryCodeEntity.userKeyVersion)) + const userGroupKey = await this.keyLoaderFacade.loadSymUserGroupKey(parseKeyVersion(recoveryCodeEntity.userKeyVersion)) return decryptKey(userGroupKey, recoveryCodeEntity.userEncRecoverCode) } diff --git a/src/common/api/worker/facades/lazy/ShareFacade.ts b/src/common/api/worker/facades/lazy/ShareFacade.ts index fa64c4608ced..6d4c3b1a80a8 100644 --- a/src/common/api/worker/facades/lazy/ShareFacade.ts +++ b/src/common/api/worker/facades/lazy/ShareFacade.ts @@ -18,7 +18,7 @@ import { IServiceExecutor } from "../../../common/ServiceRequest.js" import { GroupInvitationService } from "../../../entities/tutanota/Services.js" import { UserFacade } from "../UserFacade.js" import { EntityClient } from "../../../common/EntityClient.js" -import { KeyLoaderFacade } from "../KeyLoaderFacade.js" +import { KeyLoaderFacade, parseKeyVersion } from "../KeyLoaderFacade.js" import { encryptBytes, encryptKeyWithVersionedKey, encryptString, VersionedKey } from "../../crypto/CryptoWrapper.js" assertWorkerOrNode() @@ -92,7 +92,7 @@ export class ShareFacade { async acceptGroupInvitation(invitation: ReceivedGroupInvitation): Promise { const userGroupInfo = await this.entityClient.load(GroupInfoTypeRef, this.userFacade.getLoggedInUser().userGroup.groupInfo) const userGroupInfoSessionKey = await this.cryptoFacade.resolveSessionKeyForInstance(userGroupInfo) - const sharedGroupKey = { object: uint8ArrayToBitArray(invitation.sharedGroupKey), version: Number(invitation.sharedGroupKeyVersion) } + const sharedGroupKey = { object: uint8ArrayToBitArray(invitation.sharedGroupKey), version: parseKeyVersion(invitation.sharedGroupKeyVersion) } const userGroupKey = this.userFacade.getCurrentUserGroupKey() const userGroupEncGroupKey = encryptKeyWithVersionedKey(userGroupKey, sharedGroupKey.object) const sharedGroupEncInviteeGroupInfoKey = encryptKeyWithVersionedKey(sharedGroupKey, neverNull(userGroupInfoSessionKey)) diff --git a/src/common/api/worker/offline/OfflineStorageMigrator.ts b/src/common/api/worker/offline/OfflineStorageMigrator.ts index c255003ebf77..8c2263eb59fc 100644 --- a/src/common/api/worker/offline/OfflineStorageMigrator.ts +++ b/src/common/api/worker/offline/OfflineStorageMigrator.ts @@ -38,6 +38,7 @@ import { sys115 } from "./migrations/sys-v115.js" import { tutanota78 } from "./migrations/tutanota-v78.js" import { sys116 } from "./migrations/sys-v116.js" import { tutanota79 } from "./migrations/tutanota-v79.js" +import { sys118 } from "./migrations/sys-v118.js" export interface OfflineMigration { readonly app: VersionMetadataBaseKey @@ -88,6 +89,7 @@ export const OFFLINE_STORAGE_MIGRATIONS: ReadonlyArray = [ tutanota78, sys116, tutanota79, + sys118, ] const CURRENT_OFFLINE_VERSION = 2 diff --git a/src/common/api/worker/offline/migrations/sys-v118.ts b/src/common/api/worker/offline/migrations/sys-v118.ts new file mode 100644 index 000000000000..549b64225e91 --- /dev/null +++ b/src/common/api/worker/offline/migrations/sys-v118.ts @@ -0,0 +1,13 @@ +import { OfflineMigration } from "../OfflineStorageMigrator.js" +import { OfflineStorage } from "../OfflineStorage.js" +import { migrateAllElements, migrateAllListElements, removeValue } from "../StandardMigrations.js" +import { GroupInfoTypeRef, GroupTypeRef } from "../../../entities/sys/TypeRefs.js" + +export const sys118: OfflineMigration = { + app: "sys", + version: 118, + async migrate(storage: OfflineStorage) { + await migrateAllListElements(GroupInfoTypeRef, storage, [removeValue("localAdmin")]) + await migrateAllElements(GroupTypeRef, storage, [removeValue("administratedGroups")]) + }, +} diff --git a/src/common/api/worker/rest/EntityRestClient.ts b/src/common/api/worker/rest/EntityRestClient.ts index b25662731b20..c8a0dcc7bc02 100644 --- a/src/common/api/worker/rest/EntityRestClient.ts +++ b/src/common/api/worker/rest/EntityRestClient.ts @@ -12,7 +12,7 @@ import { NotFoundError, PayloadTooLargeError, } from "../../common/error/RestError" -import type { lazy } from "@tutao/tutanota-utils" +import type { KeyVersion, lazy } from "@tutao/tutanota-utils" import { isSameTypeRef, Mapper, ofClass, promiseMap, splitInChunks, TypeRef } from "@tutao/tutanota-utils" import { assertWorkerOrNode } from "../../common/Env" import type { ListElementEntity, SomeEntity, TypeModel } from "../../common/EntityTypes" @@ -29,6 +29,7 @@ import { BlobAccessTokenFacade } from "../facades/BlobAccessTokenFacade.js" import { AesKey } from "@tutao/tutanota-crypto" import { isOfflineError } from "../../common/utils/ErrorUtils.js" import { VersionedEncryptedKey, VersionedKey } from "../crypto/CryptoWrapper.js" +import { parseKeyVersion } from "../facades/KeyLoaderFacade.js" assertWorkerOrNode() @@ -76,7 +77,7 @@ export interface OwnerEncSessionKeyProvider { } export interface OwnerKeyProvider { - (ownerKeyVersion: number): Promise + (ownerKeyVersion: KeyVersion): Promise } /** @@ -183,7 +184,7 @@ export class EntityRestClient implements EntityRestInterface { private async resolveSessionKey(ownerKeyProvider: OwnerKeyProvider | undefined, migratedEntity: Record, typeModel: TypeModel) { try { if (ownerKeyProvider && migratedEntity._ownerEncSessionKey) { - const ownerKey = await ownerKeyProvider(Number(migratedEntity._ownerKeyVersion ?? 0)) + const ownerKey = await ownerKeyProvider(parseKeyVersion(migratedEntity._ownerKeyVersion ?? 0)) return this._crypto.resolveSessionKeyWithOwnerKey(migratedEntity, ownerKey) } else { return await this._crypto.resolveSessionKey(typeModel, migratedEntity) diff --git a/src/common/api/worker/search/IndexTables.ts b/src/common/api/worker/search/IndexTables.ts index f000a4c48b24..c5315148a97e 100644 --- a/src/common/api/worker/search/IndexTables.ts +++ b/src/common/api/worker/search/IndexTables.ts @@ -1,3 +1,5 @@ +import { KeyVersion } from "@tutao/tutanota-utils" + export type ObjectStoreName = string export type IndexName = string @@ -24,7 +26,7 @@ export const Metadata = { export type EncryptedDbKeyBaseMetaData = { userEncDbKey: Uint8Array encDbIv: Uint8Array - userGroupKeyVersion: number + userGroupKeyVersion: KeyVersion } export type EncryptedIndexerMetaData = EncryptedDbKeyBaseMetaData & { diff --git a/src/common/misc/LanguageViewModel.ts b/src/common/misc/LanguageViewModel.ts index 154008665992..13169e9d5468 100644 --- a/src/common/misc/LanguageViewModel.ts +++ b/src/common/misc/LanguageViewModel.ts @@ -222,6 +222,7 @@ export const enum InfoLink { AppStoreDowngrade = "https://tuta.com/support/#appstore-subscription-downgrade", PasswordGenerator = "https://tuta.com/faq#passphrase-generator", HomePageFreeSignup = "https://tuta.com/free-email", + DeprecatedKey = "https://tuta.com/support#deprecated-key-warning", } /** diff --git a/src/common/misc/TranslationKey.ts b/src/common/misc/TranslationKey.ts index c0cd64b03106..dc4579b8aadc 100644 --- a/src/common/misc/TranslationKey.ts +++ b/src/common/misc/TranslationKey.ts @@ -124,7 +124,6 @@ export type TranslationKeyType = | "appStoreSubscriptionError_msg" | "archive_action" | "archive_label" - | "assignAdminRightsToLocallyAdministratedUserError_msg" | "assignLabel_action" | "assistant_label" | "attachFiles_action" @@ -219,11 +218,11 @@ export type TranslationKeyType = | "cancellationReasonUsability_label" | "cancelledBy_label" | "cancelledReferralCreditPosting_label" - | "cancelLocalAdminGroup_label" | "cancelMailImport_action" | "cancelSharedMailbox_label" | "cancelUserAccounts_label" | "cancel_action" + | "cannotAddAdminWhenMultiAdminKeyRotationScheduled_msg" | "cannotEditEvent_msg" | "cannotEditFullEvent_msg" | "cannotEditNotOrganizer_msg" @@ -894,10 +893,6 @@ export type TranslationKeyType = | "loadingTemplates_label" | "loading_msg" | "loadMore_action" - | "localAdminGroupAssignedError_msg" - | "localAdminGroups_label" - | "localAdminGroup_label" - | "localAdmin_label" | "localDataSection_label" | "location_label" | "lockdownModeNotSupported1_msg" @@ -1772,8 +1767,6 @@ export type TranslationKeyType = | "unsubscribe_action" | "unsuccessfulDrop_msg" | "until_label" - | "updateAdminshipGlobalAdmin_msg" - | "updateAdminshipLocalAdminGroupError_msg" | "updateAllCalendarEvents_action" | "updateAvailable_label" | "updateFound_label" @@ -1863,3 +1856,4 @@ export type TranslationKeyType = | "yourMessage_label" | "you_label" | "emptyString_msg" + | "deprecatedKeyWarning_msg" diff --git a/src/common/settings/UserViewer.ts b/src/common/settings/UserViewer.ts index e43c604ef80b..581c430963e4 100644 --- a/src/common/settings/UserViewer.ts +++ b/src/common/settings/UserViewer.ts @@ -195,8 +195,6 @@ export class UserViewer implements UpdatableSettingsDetailsViewer { Dialog.message("userAccountDeactivated_msg") } else if (this.isItMe()) { Dialog.message("removeOwnAdminFlagInfo_msg") - } else if (this.userGroupInfo.localAdmin != null) { - Dialog.message("assignAdminRightsToLocallyAdministratedUserError_msg") } else { showProgressDialog( "pleaseWait_msg", @@ -207,6 +205,9 @@ export class UserViewer implements UpdatableSettingsDetailsViewer { ofClass(PreconditionFailedError, (e) => { if (e.data && e.data === "usergroup.pending-key-rotation") { Dialog.message("makeAdminPendingUserGroupKeyRotationError_msg") + } else if (e.data === "multiadmingroup.pending-key-rotation") { + // when a multi admin key rotation is scheduled we do not want to introduce new members into the admin group + Dialog.message("cannotAddAdminWhenMultiAdminKeyRotationScheduled_msg") } else { throw e } @@ -404,7 +405,6 @@ export class UserViewer implements UpdatableSettingsDetailsViewer { ) { this.userGroupInfo = await locator.entityClient.load(GroupInfoTypeRef, this.userGroupInfo._id) await this.updateUsedStorageAndAdminFlag() - this.administratedBy = this.userGroupInfo.localAdmin m.redraw() } else if ( isUpdateForTypeRef(UserTypeRef, update) && diff --git a/src/common/subscription/SubscriptionViewer.ts b/src/common/subscription/SubscriptionViewer.ts index 6a6878cdd677..849309ccfaa1 100644 --- a/src/common/subscription/SubscriptionViewer.ts +++ b/src/common/subscription/SubscriptionViewer.ts @@ -591,19 +591,10 @@ export class SubscriptionViewer implements UpdatableSettingsViewer { } private async updateGroupsField(): Promise { - let localAdminCount = getCurrentCount(BookingItemFeatureType.LocalAdminGroup, this._lastBooking) - const localAdminText = localAdminCount + " " + lang.get(localAdminCount === 1 ? "localAdminGroup_label" : "localAdminGroups_label") - let sharedMailCount = getCurrentCount(BookingItemFeatureType.SharedMailGroup, this._lastBooking) + const sharedMailCount = getCurrentCount(BookingItemFeatureType.SharedMailGroup, this._lastBooking) + // Plural forms and number placement inside the string should be handled by the translation framework, but this is what we got now. const sharedMailText = sharedMailCount + " " + lang.get(sharedMailCount === 1 ? "sharedMailbox_label" : "sharedMailboxes_label") - - if (localAdminCount === 0) { - // also show the shared mailboxes text if no groups exists at all - this._groupsFieldValue(sharedMailText) - } else if (localAdminCount > 0 && sharedMailCount > 0) { - this._groupsFieldValue(sharedMailText + ", " + localAdminText) - } else { - this._groupsFieldValue(localAdminText) - } + this._groupsFieldValue(sharedMailText) } private async updateWhitelabelField(planConfig: PlanConfiguration): Promise { diff --git a/src/common/subscription/SwitchSubscriptionDialogModel.ts b/src/common/subscription/SwitchSubscriptionDialogModel.ts index 327593382e71..4221ac49e56b 100644 --- a/src/common/subscription/SwitchSubscriptionDialogModel.ts +++ b/src/common/subscription/SwitchSubscriptionDialogModel.ts @@ -43,16 +43,14 @@ export class SwitchSubscriptionDialogModel { if (LegacyPlans.includes(this.planType)) { const userItem = this.lastBooking.items.find((item) => item.featureType === BookingItemFeatureType.LegacyUsers) const sharedMailItem = this.lastBooking.items.find((item) => item.featureType === BookingItemFeatureType.SharedMailGroup) - const localAdminItem = this.lastBooking.items.find((item) => item.featureType === BookingItemFeatureType.LocalAdminGroup) // A user that has PlanType.Premium will always have LegacyUsers booked. const userCount = Number(userItem?.currentCount) // These may be booked but not always. const sharedMailCount = sharedMailItem ? Number(sharedMailItem.currentCount) : 0 - const localAdminCount = localAdminItem ? Number(localAdminItem.currentCount) : 0 - return userCount + sharedMailCount + localAdminCount > 1 + return userCount + sharedMailCount > 1 } return false diff --git a/src/mail-app/app.ts b/src/mail-app/app.ts index 2e21e988c1b7..ac408f302331 100644 --- a/src/mail-app/app.ts +++ b/src/mail-app/app.ts @@ -138,8 +138,6 @@ import("./translations/en.js") await mailLocator.mailModel.init() }, async onFullLoginSuccess() { - await mailLocator.groupManagementFacade.migrateLocalAdminsToGlobalAdmins() - // We might have outdated Customer features, force reload the customer to make sure the customizations are up-to-date if (isOfflineStorageAvailable()) { await mailLocator.logins.loadCustomizations(CacheMode.Bypass) diff --git a/src/mail-app/mail/view/MailViewerHeader.ts b/src/mail-app/mail/view/MailViewerHeader.ts index 32524505404f..cd08a2dbaf10 100644 --- a/src/mail-app/mail/view/MailViewerHeader.ts +++ b/src/mail-app/mail/view/MailViewerHeader.ts @@ -282,9 +282,9 @@ export class MailViewerHeader implements Component { return [ m( "." + responsiveCardHMargin(), - this.renderPhishingWarning(viewModel) || - this.renderHardAuthenticationFailWarning(viewModel) || - this.renderSoftAuthenticationFailWarning(viewModel), + this.renderPhishingWarning(viewModel) ?? viewModel.isWarningDismissed() + ? null + : this.renderHardAuthenticationFailWarning(viewModel) ?? this.renderSoftAuthenticationFailWarning(viewModel), ), m("." + responsiveCardHMargin(), this.renderExternalContentBanner(attrs)), m("hr.hr.mt-xs." + responsiveCardHMargin()), @@ -625,7 +625,8 @@ export class MailViewerHeader implements Component { const authFailed = viewModel.checkMailAuthenticationStatus(MailAuthenticationStatus.HARD_FAIL) || viewModel.mail.encryptionAuthStatus === EncryptionAuthStatus.TUTACRYPT_AUTHENTICATION_FAILED - if (!viewModel.isWarningDismissed() && authFailed) { + + if (authFailed) { return m(InfoBanner, { message: "mailAuthFailed_msg", icon: Icons.Warning, @@ -642,7 +643,20 @@ export class MailViewerHeader implements Component { } private renderSoftAuthenticationFailWarning(viewModel: MailViewerViewModel): Children | null { - if (!viewModel.isWarningDismissed() && viewModel.checkMailAuthenticationStatus(MailAuthenticationStatus.SOFT_FAIL)) { + const buttons: ReadonlyArray = [ + { + label: "close_alt", + click: () => viewModel.setWarningDismissed(true), + }, + ] + if (viewModel.mail.encryptionAuthStatus === EncryptionAuthStatus.RSA_DESPITE_TUTACRYPT) { + return m(InfoBanner, { + message: () => lang.get("deprecatedKeyWarning_msg"), + icon: Icons.Warning, + helpLink: canSeeTutaLinks(viewModel.logins) ? InfoLink.DeprecatedKey : null, + buttons: buttons, + }) + } else if (viewModel.checkMailAuthenticationStatus(MailAuthenticationStatus.SOFT_FAIL)) { return m(InfoBanner, { message: () => viewModel.mail.differentEnvelopeSender @@ -652,12 +666,7 @@ export class MailViewerHeader implements Component { : lang.get("mailAuthMissing_label"), icon: Icons.Warning, helpLink: canSeeTutaLinks(viewModel.logins) ? InfoLink.MailAuth : null, - buttons: [ - { - label: "close_alt", - click: () => viewModel.setWarningDismissed(true), - }, - ], + buttons: buttons, }) } else { return null diff --git a/src/mail-app/mailLocator.ts b/src/mail-app/mailLocator.ts index f72ba60f104e..634f7dfaa913 100644 --- a/src/mail-app/mailLocator.ts +++ b/src/mail-app/mailLocator.ts @@ -63,15 +63,7 @@ import { SearchViewModel } from "./search/view/SearchViewModel.js" import { SearchRouter } from "../common/search/view/SearchRouter.js" import { MailOpenedListener } from "./mail/view/MailViewModel.js" import { getEnabledMailAddressesWithUser } from "../common/mailFunctionality/SharedMailUtils.js" -import { - CLIENT_ONLY_CALENDARS, - Const, - DEFAULT_CLIENT_ONLY_CALENDAR_COLORS, - FeatureType, - GroupType, - KdfType, - MailSetKind, -} from "../common/api/common/TutanotaConstants.js" +import { CLIENT_ONLY_CALENDARS, Const, DEFAULT_CLIENT_ONLY_CALENDAR_COLORS, FeatureType, GroupType, KdfType } from "../common/api/common/TutanotaConstants.js" import { ShareableGroupType } from "../common/sharing/GroupUtils.js" import { ReceivedGroupInvitationsModel } from "../common/sharing/model/ReceivedGroupInvitationsModel.js" import { CalendarViewModel } from "../calendar-app/calendar/view/CalendarViewModel.js" @@ -124,7 +116,6 @@ import { getDisplayedSender } from "../common/api/common/CommonMailUtils.js" import { MailModel } from "./mail/model/MailModel.js" import { locator } from "../common/api/main/CommonLocator.js" import { showSnackBar } from "../common/gui/base/SnackBar.js" -import { assertSystemFolderOfType } from "./mail/model/MailUtils.js" import { WorkerRandomizer } from "../common/api/worker/workerInterfaces.js" import { SearchCategoryTypes } from "./search/model/SearchUtils.js" import { WorkerInterface } from "./workerUtils/worker/WorkerImpl.js" @@ -137,7 +128,6 @@ import { lang } from "../common/misc/LanguageViewModel.js" import type { CalendarContactPreviewViewModel } from "../calendar-app/calendar/gui/eventpopup/CalendarContactPreviewViewModel.js" import { KeyLoaderFacade } from "../common/api/worker/facades/KeyLoaderFacade.js" import { ContactSuggestion } from "../common/native/common/generatedipc/ContactSuggestion" -import { getElementId } from "../common/api/common/utils/EntityUtils.js" import { MailImporter } from "./mail/import/MailImporter.js" assertMainOrNode() diff --git a/src/mail-app/translations/de.ts b/src/mail-app/translations/de.ts index b68ed4b820b0..442ea77adcc1 100644 --- a/src/mail-app/translations/de.ts +++ b/src/mail-app/translations/de.ts @@ -145,7 +145,6 @@ export default { "appStoreSubscriptionError_msg": "Leider ist die Zahlungstransaktion fehlgeschlagen. Bitte versuche es später erneut oder kontaktiere den Support.", "archive_action": "Archivieren", "archive_label": "Archiv", - "assignAdminRightsToLocallyAdministratedUserError_msg": "Du kannst lokal administrierte Benutzer nicht zum globalen Admin machen.", "assignLabel_action": "Labels zuweisen", "assistant_label": "Assistent*in", "attachFiles_action": "Dateien anhängen", @@ -240,11 +239,11 @@ export default { "cancellationReasonUsability_label": "Tuta ist zu schwer zu benutzen", "cancelledBy_label": "(storniert zum {endOfSubscriptionPeriod})", "cancelledReferralCreditPosting_label": "Stornierte Empfehlungsgutschrift", - "cancelLocalAdminGroup_label": "Abbestellung von lokaler Admin-Gruppe", "cancelMailImport_action": "Import abbrechen", "cancelSharedMailbox_label": "Abbestellung von geteilter Mailbox", "cancelUserAccounts_label": "Abbestellung von {1} Benutzer", "cancel_action": "Abbrechen", + "cannotAddAdminWhenMultiAdminKeyRotationScheduled_msg": "Du versuchst, einen neuen Admin hinzuzufügen, aber wir warten derzeit darauf, dass alle aktuellen Admins eine Verbindung herstellen, damit wir die Sicherheitsverbesserung deines Kontos abschließen können.", "cannotEditEvent_msg": "Du kannst nur Teile dieses Ereignisses bearbeiten.", "cannotEditFullEvent_msg": "Du kannst nur Teile dieses Termins bearbeiten, weil er nicht in deinem Kalender erstellt wurde.", "cannotEditNotOrganizer_msg": "Du kannst diesen Termin nicht bearbeiten, da du nicht der Organisator bist.", @@ -694,7 +693,7 @@ export default { "giftCardUpgradeNotifyDebit_msg": "Ein Teil des Preises des ersten Jahres ({price}) wird von dem Guthaben des Gutscheins beglichen. Bitte bezahle den Restbetrag ({amount}) unter 'Einstellungen' ⇨ 'Bezahlung'.", "giftCardUpgradeNotifyRevolutionary_msg": "Dein Account wird automatisch auf einen Revolutionary-Account mit einem jährlichen Abo umgestellt.", "giftCard_label": "Gutschein", - "globalAdmin_label": "Globaler Admin", + "globalAdmin_label": "Admin", "globalSettings_label": "Globale Einstellungen", "goPremium_msg": "Als zahlende*r Nutzer*in kannst du links im Menü deine Suchfilter anpassen.", "grantContactPermissionAction": "Erlaubnis zum Zugriff auf Kontakte erteilen", @@ -915,10 +914,6 @@ export default { "loadingTemplates_label": "Vorlagen werden geladen...", "loading_msg": "Lade ...", "loadMore_action": "Mehr laden", - "localAdminGroupAssignedError_msg": "Benutzer oder Gruppen sind dieser lokalen Admin-Gruppe noch zugeordnet. Sie kann nicht deaktiviert werden.", - "localAdminGroups_label": "Lokale Admin-Gruppen", - "localAdminGroup_label": "Lokale Admin-Gruppe", - "localAdmin_label": "Lokaler Admin", "localDataSection_label": "Lokale Daten", "location_label": "Ort", "lockdownModeNotSupported1_msg": "Der Blockierungsmodus ist auf deinem Gerät aktiviert. Dies verhindert, dass zukünftige Versionen von Tuta ausgeführt werden können.", @@ -1793,8 +1788,6 @@ export default { "unsubscribe_action": "Abbestellen", "unsuccessfulDrop_msg": "Das Drag & Drop war nicht erfolgreich, weil die Daten noch nicht heruntergeladen worden sind. Bitte versuche es erneut, wenn der Fortschrittsbalken vollständig ist.", "until_label": "bis", - "updateAdminshipGlobalAdmin_msg": "Du kannst nicht den Admin eines globalen Admins ändern.", - "updateAdminshipLocalAdminGroupError_msg": "Du kannst den Admin einer lokalen Admin-Gruppe nicht ändern.", "updateAllCalendarEvents_action": "Alle Termine aktualisieren", "updateAvailable_label": "Neue Version für Tuta Desktop verfügbar ({version})", "updateFound_label": "Es ist eine neue Version verfügbar.", @@ -1882,6 +1875,7 @@ export default { "yourCalendars_label": "Deine Kalender", "yourFolders_action": "DEINE ORDNER", "yourMessage_label": "Deine Nachricht", - "you_label": "Du" + "you_label": "Du", + "deprecatedKeyWarning_msg": "Für diese Nachricht wurde ein veraltetes Verschlüsselungsprotokoll verwendet und sie stammt möglicherweise nicht von diesem Benutzer", } } diff --git a/src/mail-app/translations/de_sie.ts b/src/mail-app/translations/de_sie.ts index 4875754fe181..3a89b2720957 100644 --- a/src/mail-app/translations/de_sie.ts +++ b/src/mail-app/translations/de_sie.ts @@ -145,7 +145,6 @@ export default { "appStoreSubscriptionError_msg": "Leider ist die Zahlungstransaktion fehlgeschlagen. Bitte versuchen Sie es später erneut oder kontaktieren Sie den Support.", "archive_action": "Archivieren", "archive_label": "Archiv", - "assignAdminRightsToLocallyAdministratedUserError_msg": "Sie können lokal administrierte Benutzer nicht zum globalen Admin machen.", "assignLabel_action": "Labels zuweisen", "assistant_label": "Assistent*in", "attachFiles_action": "Dateien anhängen", @@ -240,11 +239,11 @@ export default { "cancellationReasonUsability_label": "Tuta ist zu schwer zu benutzen", "cancelledBy_label": "(storniert zum {endOfSubscriptionPeriod})", "cancelledReferralCreditPosting_label": "Stornierte Empfehlungsgutschrift", - "cancelLocalAdminGroup_label": "Abbestellung von lokaler Admin-Gruppe", "cancelMailImport_action": "Import abbrechen", "cancelSharedMailbox_label": "Abbestellung von geteilter Mailbox", "cancelUserAccounts_label": "Abbestellung von {1} Benutzer", "cancel_action": "Abbrechen", + "cannotAddAdminWhenMultiAdminKeyRotationScheduled_msg": "Sie versuchen, einen neuen Admin hinzuzufügen, aber wir warten derzeit darauf, dass alle aktuellen Admins eine Verbindung herstellen, damit wir die Sicherheitsverbesserung Ihres Kontos abschließen können.", "cannotEditEvent_msg": "Sie können nur Teile dieses Termins bearbeiten.", "cannotEditFullEvent_msg": "Sie können nur Teile dieses Termins bearbeiten, weil er nicht in Ihrem Kalender erstellt wurde.", "cannotEditNotOrganizer_msg": "Sie können diesen Termin nicht bearbeiten, da Sie nicht der Organisator sind.", @@ -694,7 +693,7 @@ export default { "giftCardUpgradeNotifyDebit_msg": "Ein Teil des Preises des ersten Jahres ({price}) wird von dem Guthaben des Gutscheins beglichen. Bitte bezahlen Sie den Restbetrag ({amount}) unter 'Einstellungen' ⇨ 'Bezahlung'.", "giftCardUpgradeNotifyRevolutionary_msg": "Ihr Account wird automatisch auf einen Revolutionary-Account mit einem jährlichen Abonnement umgestellt.", "giftCard_label": "Gutschein", - "globalAdmin_label": "Globaler Admin", + "globalAdmin_label": "Admin", "globalSettings_label": "Globale Einstellungen", "goPremium_msg": "Als zahlende*r Nutzer*in können Sie links im Menü Ihre Suchfilter anpassen.", "grantContactPermissionAction": "Erlaubnis zum Zugriff auf Kontakte erteilen", @@ -915,10 +914,6 @@ export default { "loadingTemplates_label": "Vorlagen werden geladen...", "loading_msg": "Lade ...", "loadMore_action": "Mehr laden", - "localAdminGroupAssignedError_msg": "Benutzer oder Gruppen sind dieser lokalen Admin-Gruppe noch zugeordnet. Sie kann nicht deaktiviert werden.", - "localAdminGroups_label": "Lokale Admin-Gruppen", - "localAdminGroup_label": "Lokale Admin-Gruppe", - "localAdmin_label": "Lokaler Admin", "localDataSection_label": "Lokale Daten", "location_label": "Ort", "lockdownModeNotSupported1_msg": "Der Blockierungsmodus ist auf Ihrem Gerät aktiviert. Dies verhindert, dass zukünftige Versionen von Tuta ausgeführt werden können.", @@ -1793,8 +1788,6 @@ export default { "unsubscribe_action": "Abbestellen", "unsuccessfulDrop_msg": "Das Drag & Drop war nicht erfolgreich, weil die Daten noch nicht heruntergeladen worden sind. Bitte versuchen Sie es erneut, wenn der Fortschrittsbalken vollständig ist.", "until_label": "bis", - "updateAdminshipGlobalAdmin_msg": "Sie können nicht den Admin eines globalen Admins ändern.", - "updateAdminshipLocalAdminGroupError_msg": "Sie können den Admin einer lokalen Admin-Gruppe nicht ändern.", "updateAllCalendarEvents_action": "Alle Termine aktualisieren", "updateAvailable_label": "Neue Version für Tuta Desktop verfügbar ({version})", "updateFound_label": "Es ist eine neue Version verfügbar.", @@ -1882,6 +1875,7 @@ export default { "yourCalendars_label": "Deine Kalender", "yourFolders_action": "Ihre ORDNER", "yourMessage_label": "Ihre Nachricht", - "you_label": "Sie" + "you_label": "Sie", + "deprecatedKeyWarning_msg": "Für diese Nachricht wurde ein veraltetes Verschlüsselungsprotokoll verwendet und sie stammt möglicherweise nicht von diesem Benutzer" } } diff --git a/src/mail-app/translations/en.ts b/src/mail-app/translations/en.ts index bbb2b62cfea1..72a4f642edec 100644 --- a/src/mail-app/translations/en.ts +++ b/src/mail-app/translations/en.ts @@ -141,7 +141,6 @@ export default { "appStoreSubscriptionError_msg": "Sorry, the payment transaction failed. Please try again later or contact support.", "archive_action": "Archive", "archive_label": "Archive", - "assignAdminRightsToLocallyAdministratedUserError_msg": "You can't assign global admin rights to a locally administrated user.", "assignLabel_action": "Assign labels", "assistant_label": "Assistant", "attachFiles_action": "Attach files", @@ -236,11 +235,11 @@ export default { "cancellationReasonUsability_label": "Tuta is too hard to use", "cancelledBy_label": "(cancelled by {endOfSubscriptionPeriod})", "cancelledReferralCreditPosting_label": "Cancelled referral credit", - "cancelLocalAdminGroup_label": "Cancel local admin group", "cancelMailImport_action": "Cancel import", "cancelSharedMailbox_label": "Cancel shared mailbox", "cancelUserAccounts_label": "Cancel {1} user(s)", "cancel_action": "Cancel", + "cannotAddAdminWhenMultiAdminKeyRotationScheduled_msg": "You are trying to add a new admin but we are currently waiting for all current admins to connect so we can finish upgrading the security of your account.", "cannotEditEvent_msg": "You can only edit parts of this event.", "cannotEditFullEvent_msg": "You can only edit parts of this event because it was not created in your calendar.", "cannotEditNotOrganizer_msg": "You cannot edit this event because you are not its organizer.", @@ -690,7 +689,7 @@ export default { "giftCardUpgradeNotifyDebit_msg": "The cost of the first year ({price}) will be partially paid for with your gift card. Please go to 'Settings' ⇨ 'Payment' to pay the remaining value ({amount}).", "giftCardUpgradeNotifyRevolutionary_msg": "You will be automatically upgraded to a Revolutionary account with a yearly subscription.", "giftCard_label": "Gift card", - "globalAdmin_label": "Global admin", + "globalAdmin_label": "Admin", "globalSettings_label": "Global settings", "goPremium_msg": "As a paid user you can adjust your search filters in the menu to the left.", "grantContactPermissionAction": "Grant permission to access contacts", @@ -911,10 +910,6 @@ export default { "loadingTemplates_label": "Loading templates...", "loading_msg": "Loading ...", "loadMore_action": "Load more", - "localAdminGroupAssignedError_msg": "Users or groups are still assigned to this local admin group. It can't be deactivated.", - "localAdminGroups_label": "Local admin groups", - "localAdminGroup_label": "Local admin group", - "localAdmin_label": "Local admin", "localDataSection_label": "Local data", "location_label": "Location", "lockdownModeNotSupported1_msg": "Your device has Lockdown Mode enabled which will prevent future versions of Tuta from running.", @@ -1789,8 +1784,6 @@ export default { "unsubscribe_action": "Unsubscribe", "unsuccessfulDrop_msg": "The drag & drop was unsuccessful because the data had not finished downloading. You may try again once the progress bar is finished.", "until_label": "until", - "updateAdminshipGlobalAdmin_msg": "You can't change the adminship of a global administrator.", - "updateAdminshipLocalAdminGroupError_msg": "You can't change the adminship of a local admin group.", "updateAllCalendarEvents_action": "Update all events", "updateAvailable_label": "Update for Tuta Desktop available ({version})", "updateFound_label": "New version is available.", @@ -1878,6 +1871,7 @@ export default { "yourCalendars_label": "Your calendars", "yourFolders_action": "YOUR FOLDERS", "yourMessage_label": "Your message", - "you_label": "You" + "you_label": "You", + "deprecatedKeyWarning_msg": "This message was encrypted with an older key. While it may be legitimate, it's less secure." } } diff --git a/src/mail-app/workerUtils/index/MailIndexer.ts b/src/mail-app/workerUtils/index/MailIndexer.ts index 03d1daf12768..7dd0f5d909a6 100644 --- a/src/mail-app/workerUtils/index/MailIndexer.ts +++ b/src/mail-app/workerUtils/index/MailIndexer.ts @@ -59,6 +59,7 @@ import { hasError } from "../../../common/api/common/utils/ErrorUtils.js" import { getDisplayedSender, getMailBodyText, MailAddressAndName } from "../../../common/api/common/CommonMailUtils.js" import { isDraft } from "../../mail/model/MailChecks.js" +import { parseKeyVersion } from "../../../common/api/worker/facades/KeyLoaderFacade.js" export const INITIAL_MAIL_INDEX_INTERVAL_DAYS = 28 const ENTITY_INDEXER_CHUNK = 50 @@ -182,7 +183,7 @@ export class MailIndexer { mailDetails = await this._defaultCachingEntity .loadMultiple(MailDetailsDraftTypeRef, listIdPart(mailDetailsDraftId), [elementIdPart(mailDetailsDraftId)], async () => ({ key: mailOwnerEncSessionKey, - encryptingKeyVersion: Number(mail._ownerKeyVersion ?? 0), + encryptingKeyVersion: parseKeyVersion(mail._ownerKeyVersion ?? "0"), })) .then((d) => { const draft = first(d) @@ -198,7 +199,7 @@ export class MailIndexer { mailDetails = await this._defaultCachingEntity .loadMultiple(MailDetailsBlobTypeRef, listIdPart(mailDetailsBlobId), [elementIdPart(mailDetailsBlobId)], async () => ({ key: mailOwnerEncSessionKey, - encryptingKeyVersion: Number(mail._ownerKeyVersion ?? 0), + encryptingKeyVersion: parseKeyVersion(mail._ownerKeyVersion ?? "0"), })) .then((d) => { const blob = first(d) @@ -813,7 +814,7 @@ class IndexLoader { const mail = assertNotNull(mailDetailsBlobMails.find((m) => elementIdPart(assertNotNull(m.mailDetails)) === instanceElementId)) return { key: assertNotNull(mail._ownerEncSessionKey), - encryptingKeyVersion: Number(mail._ownerKeyVersion ?? 0), + encryptingKeyVersion: parseKeyVersion(mail._ownerKeyVersion ?? "0"), } } const mailDetailsBlobs = await this.loadInChunks(MailDetailsBlobTypeRef, listId, ids, ownerEncSessionKeyProvider) @@ -836,7 +837,7 @@ class IndexLoader { const mail = assertNotNull(mailDetailsDraftMails.find((m) => elementIdPart(assertNotNull(m.mailDetailsDraft)) === instanceElementId)) return { key: assertNotNull(mail._ownerEncSessionKey), - encryptingKeyVersion: Number(mail._ownerKeyVersion ?? 0), + encryptingKeyVersion: parseKeyVersion(mail._ownerKeyVersion ?? "0"), } } const mailDetailsDrafts = await this.loadInChunks(MailDetailsDraftTypeRef, listId, ids, ownerEncSessionKeyProvider) diff --git a/src/mail-app/workerUtils/worker/WorkerImpl.ts b/src/mail-app/workerUtils/worker/WorkerImpl.ts index f88ad5c42acf..18b8d699b37b 100644 --- a/src/mail-app/workerUtils/worker/WorkerImpl.ts +++ b/src/mail-app/workerUtils/worker/WorkerImpl.ts @@ -40,6 +40,7 @@ import { ExposedEventBus, MainInterface, WorkerRandomizer } from "../../../commo import { CryptoError } from "@tutao/tutanota-crypto/error.js" import { CryptoWrapper } from "../../../common/api/worker/crypto/CryptoWrapper.js" import { AsymmetricCryptoFacade } from "../../../common/api/worker/crypto/AsymmetricCryptoFacade.js" +import { PublicKeyProvider } from "../../../common/api/worker/facades/PublicKeyProvider.js" assertWorkerOrNode() @@ -66,6 +67,7 @@ export interface WorkerInterface { readonly restInterface: EntityRestInterface readonly serviceExecutor: IServiceExecutor readonly cryptoWrapper: CryptoWrapper + readonly publicKeyProvider: PublicKeyProvider readonly asymmetricCryptoFacade: AsymmetricCryptoFacade readonly cryptoFacade: CryptoFacade readonly cacheStorage: ExposedCacheStorage @@ -217,6 +219,10 @@ export class WorkerImpl implements NativeInterface { return locator.cryptoWrapper }, + async publicKeyProvider() { + return locator.publicKeyProvider + }, + async asymmetricCryptoFacade() { return locator.asymmetricCrypto }, diff --git a/src/mail-app/workerUtils/worker/WorkerLocator.ts b/src/mail-app/workerUtils/worker/WorkerLocator.ts index e6e8ae9f6591..91946bc22e72 100644 --- a/src/mail-app/workerUtils/worker/WorkerLocator.ts +++ b/src/mail-app/workerUtils/worker/WorkerLocator.ts @@ -86,6 +86,8 @@ import { MailOfflineCleaner } from "../offline/MailOfflineCleaner.js" import type { QueuedBatch } from "../../../common/api/worker/EventQueue.js" import { Credentials } from "../../../common/misc/credentials/Credentials.js" import { AsymmetricCryptoFacade } from "../../../common/api/worker/crypto/AsymmetricCryptoFacade.js" +import { KeyAuthenticationFacade } from "../../../common/api/worker/facades/KeyAuthenticationFacade.js" +import { PublicKeyProvider } from "../../../common/api/worker/facades/PublicKeyProvider.js" assertWorkerOrNode() @@ -108,6 +110,7 @@ export type WorkerLocatorType = { blobAccessToken: BlobAccessTokenFacade keyCache: KeyCache keyLoader: KeyLoaderFacade + publicKeyProvider: PublicKeyProvider keyRotation: KeyRotationFacade // login @@ -241,7 +244,16 @@ export async function initLocator(worker: WorkerImpl, browserData: BrowserData) locator.keyLoader = new KeyLoaderFacade(locator.keyCache, locator.user, locator.cachingEntityClient, locator.cacheManagement) - locator.asymmetricCrypto = new AsymmetricCryptoFacade(locator.rsa, locator.pqFacade, locator.keyLoader, locator.cryptoWrapper, locator.serviceExecutor) + locator.publicKeyProvider = new PublicKeyProvider(locator.serviceExecutor) + + locator.asymmetricCrypto = new AsymmetricCryptoFacade( + locator.rsa, + locator.pqFacade, + locator.keyLoader, + locator.cryptoWrapper, + locator.serviceExecutor, + locator.publicKeyProvider, + ) locator.crypto = new CryptoFacade( locator.user, @@ -253,6 +265,8 @@ export async function initLocator(worker: WorkerImpl, browserData: BrowserData) cache, locator.keyLoader, locator.asymmetricCrypto, + locator.publicKeyProvider, + lazyMemoized(() => locator.keyRotation), ) locator.recoverCode = lazyMemoized(async () => { @@ -267,6 +281,7 @@ export async function initLocator(worker: WorkerImpl, browserData: BrowserData) const { CounterFacade } = await import("../../../common/api/worker/facades/lazy/CounterFacade.js") return new CounterFacade(locator.serviceExecutor) }) + const keyAuthenticationFacade = new KeyAuthenticationFacade(locator.cryptoWrapper) locator.groupManagement = lazyMemoized(async () => { const { GroupManagementFacade } = await import("../../../common/api/worker/facades/lazy/GroupManagementFacade.js") return new GroupManagementFacade( @@ -279,6 +294,7 @@ export async function initLocator(worker: WorkerImpl, browserData: BrowserData) await locator.cacheManagement(), locator.asymmetricCrypto, locator.cryptoWrapper, + keyAuthenticationFacade, ) }) locator.keyRotation = new KeyRotationFacade( @@ -293,6 +309,8 @@ export async function initLocator(worker: WorkerImpl, browserData: BrowserData) locator.share, locator.groupManagement, locator.asymmetricCrypto, + keyAuthenticationFacade, + locator.publicKeyProvider, ) const loginListener: LoginListener = { @@ -418,6 +436,7 @@ export async function initLocator(worker: WorkerImpl, browserData: BrowserData) fileApp, locator.login, locator.keyLoader, + locator.publicKeyProvider, ) }) const nativePushFacade = new NativePushFacadeSendDispatcher(worker) diff --git a/test/tests/Suite.ts b/test/tests/Suite.ts index a8960563957f..7b203abd3dd8 100644 --- a/test/tests/Suite.ts +++ b/test/tests/Suite.ts @@ -32,6 +32,7 @@ import "./api/worker/facades/PQMessageTest.js" import "./api/worker/facades/PQFacadeTest.js" import "./api/worker/facades/CalendarFacadeTest.js" import "./api/worker/facades/UserFacadeTest.js" +import "./api/worker/facades/PublicKeyProviderTest.js" import "./api/worker/facades/KeyLoaderFacadeTest.js" import "./api/worker/SuspensionHandlerTest.js" import "./api/worker/facades/ConfigurationDbTest.js" @@ -129,6 +130,7 @@ import "./api/worker/invoicegen/XRechnungInvoiceGeneratorTest.js" import "./subscription/SignupFormTest.js" import "./api/worker/facades/ContactFacadeTest.js" import "./api/worker/facades/KeyRotationFacadeTest.js" +import "./api/worker/facades/KeyAuthenticationFacadeTest.js" import "./mail/view/ConversationViewModelTest.js" import "./mail/view/MailViewerViewModelTest.js" import "./api/worker/facades/KeyCacheTest.js" diff --git a/test/tests/api/worker/crypto/AsymmetricCryptoFacadeTest.ts b/test/tests/api/worker/crypto/AsymmetricCryptoFacadeTest.ts index 42cf5e4a514b..b7ce01712e16 100644 --- a/test/tests/api/worker/crypto/AsymmetricCryptoFacadeTest.ts +++ b/test/tests/api/worker/crypto/AsymmetricCryptoFacadeTest.ts @@ -1,5 +1,5 @@ import o from "../../../../../packages/otest/dist/otest.js" -import { AsymmetricCryptoFacade, PublicKeys } from "../../../../../src/common/api/worker/crypto/AsymmetricCryptoFacade.js" +import { AsymmetricCryptoFacade } from "../../../../../src/common/api/worker/crypto/AsymmetricCryptoFacade.js" import { RsaImplementation } from "../../../../../src/common/api/worker/crypto/RsaImplementation.js" import { PQFacade } from "../../../../../src/common/api/worker/facades/PQFacade.js" import { matchers, object, verify, when } from "testdouble" @@ -18,20 +18,16 @@ import { rsaPublicKeyToHex, uint8ArrayToBitArray, } from "@tutao/tutanota-crypto" -import { KeyLoaderFacade } from "../../../../../src/common/api/worker/facades/KeyLoaderFacade.js" +import { KeyLoaderFacade, parseKeyVersion } from "../../../../../src/common/api/worker/facades/KeyLoaderFacade.js" import { CryptoWrapper } from "../../../../../src/common/api/worker/crypto/CryptoWrapper.js" import { IServiceExecutor } from "../../../../../src/common/api/common/ServiceRequest.js" import { hexToUint8Array, Versioned } from "@tutao/tutanota-utils" import { PublicKeyService } from "../../../../../src/common/api/entities/sys/Services.js" -import { - createPublicKeyGetIn, - PubEncKeyData, - PubEncKeyDataTypeRef, - PublicKeyGetIn, - PublicKeyPutIn, -} from "../../../../../src/common/api/entities/sys/TypeRefs.js" +import { PubEncKeyData, PubEncKeyDataTypeRef, PublicKeyPutIn } from "../../../../../src/common/api/entities/sys/TypeRefs.js" import { ProgrammingError } from "../../../../../src/common/api/common/error/ProgrammingError.js" import { createTestEntity } from "../../../TestUtils.js" +import { PublicKeyIdentifier, PublicKeyProvider, PublicKeys } from "../../../../../src/common/api/worker/facades/PublicKeyProvider.js" +import { KeyVersion } from "@tutao/tutanota-utils/dist/Utils.js" o.spec("AsymmetricCryptoFacadeTest", function () { let rsa: RsaImplementation @@ -39,6 +35,7 @@ o.spec("AsymmetricCryptoFacadeTest", function () { let keyLoaderFacade: KeyLoaderFacade let cryptoWrapper: CryptoWrapper let serviceExecutor: IServiceExecutor + let publicKeyProvider: PublicKeyProvider let asymmetricCryptoFacade: AsymmetricCryptoFacade @@ -48,30 +45,30 @@ o.spec("AsymmetricCryptoFacadeTest", function () { keyLoaderFacade = object() cryptoWrapper = object() serviceExecutor = object() - asymmetricCryptoFacade = new AsymmetricCryptoFacade(rsa, pqFacade, keyLoaderFacade, cryptoWrapper, serviceExecutor) + publicKeyProvider = object() + asymmetricCryptoFacade = new AsymmetricCryptoFacade(rsa, pqFacade, keyLoaderFacade, cryptoWrapper, serviceExecutor, publicKeyProvider) }) o.spec("authenticateSender", function () { let identifier: string let identifierType: PublicKeyIdentifierType let senderIdentityPubKey: Uint8Array - let senderKeyVersion: number - let keyData: PublicKeyGetIn + let senderKeyVersion: KeyVersion + let pubKeyIdentifier: PublicKeyIdentifier o.beforeEach(() => { identifier = object() identifierType = object() senderIdentityPubKey = new Uint8Array([1, 2, 3]) senderKeyVersion = 0 - keyData = createPublicKeyGetIn({ + pubKeyIdentifier = { identifier, identifierType, - version: senderKeyVersion.toString(), - }) + } }) o("should return TUTACRYPT_AUTHENTICATION_SUCCEEDED if the key matches", async function () { - when(serviceExecutor.get(PublicKeyService, keyData)).thenResolve({ pubEccKey: senderIdentityPubKey }) + when(publicKeyProvider.loadVersionedPubKey(pubKeyIdentifier, senderKeyVersion)).thenResolve({ pubEccKey: senderIdentityPubKey }) const result = await asymmetricCryptoFacade.authenticateSender({ identifier, identifierType }, senderIdentityPubKey, senderKeyVersion) @@ -79,7 +76,11 @@ o.spec("AsymmetricCryptoFacadeTest", function () { }) o("should return TUTACRYPT_AUTHENTICATION_FAILED if sender does not have an ecc identity key in the requested version", async function () { - when(serviceExecutor.get(PublicKeyService, keyData)).thenResolve({ pubEccKey: null, pubRsaKey: new Uint8Array([4, 5, 6]), pubKyberKey: null }) + when(publicKeyProvider.loadVersionedPubKey(pubKeyIdentifier, senderKeyVersion)).thenResolve({ + pubEccKey: null, + pubRsaKey: new Uint8Array([4, 5, 6]), + pubKyberKey: null, + }) const result = await asymmetricCryptoFacade.authenticateSender({ identifier, identifierType }, senderIdentityPubKey, senderKeyVersion) @@ -87,7 +88,7 @@ o.spec("AsymmetricCryptoFacadeTest", function () { }) o("should return TUTACRYPT_AUTHENTICATION_FAILED if the key does not match", async function () { - when(serviceExecutor.get(PublicKeyService, keyData)).thenResolve({ pubEccKey: new Uint8Array([4, 5, 6]) }) + when(publicKeyProvider.loadVersionedPubKey(pubKeyIdentifier, senderKeyVersion)).thenResolve({ pubEccKey: new Uint8Array([4, 5, 6]) }) const result = await asymmetricCryptoFacade.authenticateSender({ identifier, identifierType }, senderIdentityPubKey, senderKeyVersion) @@ -119,13 +120,12 @@ o.spec("AsymmetricCryptoFacadeTest", function () { senderIdentityPubKey: object(), }) when( - serviceExecutor.get( - PublicKeyService, - createPublicKeyGetIn({ - version: senderKeyVersion, + publicKeyProvider.loadVersionedPubKey( + { identifierType: senderIdentifierType, identifier: senderIdentifier, - }), + }, + parseKeyVersion(senderKeyVersion), ), ).thenResolve({ pubEccKey: new Uint8Array([4, 5, 6]) }) @@ -156,7 +156,7 @@ o.spec("AsymmetricCryptoFacadeTest", function () { identifierType: senderIdentifierType, }) - verify(serviceExecutor.get(PublicKeyService, matchers.anything()), { times: 0 }) + verify(publicKeyProvider, { times: 0 }) o(result).deepEquals({ senderIdentityPubKey: null, decryptedAesKey: uint8ArrayToBitArray(symKey) }) }) }) diff --git a/test/tests/api/worker/crypto/CompatibilityTest.ts b/test/tests/api/worker/crypto/CompatibilityTest.ts index 7bf77257c3c1..f2fcd0207c3c 100644 --- a/test/tests/api/worker/crypto/CompatibilityTest.ts +++ b/test/tests/api/worker/crypto/CompatibilityTest.ts @@ -16,11 +16,13 @@ import { hexToRsaPrivateKey, hexToRsaPublicKey, hkdf, + hmacSha256, KeyLength, KeyPairType, kyberPrivateKeyToBytes, kyberPublicKeyToBytes, LibOQSExports, + MacTag, PQKeyPairs, PQPublicKeys, random, @@ -28,6 +30,7 @@ import { rsaDecrypt, rsaEncrypt, uint8ArrayToBitArray, + verifyHmacSha256, } from "@tutao/tutanota-crypto" import { base64ToUint8Array, @@ -280,6 +283,16 @@ o.spec("crypto compatibility", function () { } }) + o("hmac-sha256", function () { + for (const td of testData.hmacSha256Tests) { + const key = uint8ArrayToBitArray(hexToUint8Array(td.keyHex)) + const data = hexToUint8Array(td.dataHex) + const hmacSha256Tag = hexToUint8Array(td.hmacSha256TagHex) as MacTag + o(hmacSha256(key, data)).deepEquals(hmacSha256Tag) + verifyHmacSha256(key, data, hmacSha256Tag) + } + }) + o("pqcrypt", async function () { for (const td of testData.pqcryptEncryptionTests) { random.generateRandomData = (number) => hexToUint8Array(td.seed).slice(0, number) diff --git a/test/tests/api/worker/crypto/CompatibilityTestData.json b/test/tests/api/worker/crypto/CompatibilityTestData.json index 8a85746c22a1..050e45a3567f 100644 --- a/test/tests/api/worker/crypto/CompatibilityTestData.json +++ b/test/tests/api/worker/crypto/CompatibilityTestData.json @@ -3915,6 +3915,28 @@ "hkdfHex": "ecaa159a84cbb5d45e656e" } ], + "hmacSha256Tests": [ + { + "keyHex": "4d0fc2a725d4c1195022ddbcbb6838e7b77d131e1497bf28956ef8ea0d6ad164", + "dataHex": "9f208641e594d324947d63c172834139b247b0e298d29f6c7cc54c2284b754c76953aa060b47cc06fefb5178a8d2662240bb6924712454cd8f40cb76a00b5dda", + "hmacSha256TagHex": "06443254c9c83339b58b9ba3c1c8a53eb6a04f356a6e1406d94df773a294934c" + }, + { + "keyHex": "3284ec905abd03e40810f29344dfb7a6d8189c7cb3d8d4e0a34a6b0803006289", + "dataHex": "8b518ce2abf588563596ec2173c98001d69bf37280de96f809c3235368025c1030e0dd7d7c0613eee7550c1619a379abb34d4e6e7ee0f78ebd7d4386042e2672", + "hmacSha256TagHex": "a51dafa572fdaccaf8a34e9634129ee7e6d5420eb1092292723198d18204776c" + }, + { + "keyHex": "44ae6bef60b3fe4ee30ab246ede95539d7923287b7e8d5b7f2dbbd3be8f193a0", + "dataHex": "974eef4e63c695e3cbba4f2045dd89dec4eb4f3eb25ae5fd0ad02b8a2b62676d9a85b2249783cf8ac78e08c1749a8d91f8e93b12288a85900d398ab2ffbeee99", + "hmacSha256TagHex": "b84b339acbdffb34c35ba8efa8342a4aba2954826187075f28eae2fb647bd951" + }, + { + "keyHex": "40864996cd4d60f019286e699dc51742ab7add9b78443f158401a5698a7c78a0", + "dataHex": "b3fd730706c6dfd562054c1ec3af0d4d32e309115a317c618056b0c9855755084ec90376db27ef5d619646b4ec9d71979f1e9a9bbf3d23993e8a6caa3e80f7e6", + "hmacSha256TagHex": "38a4ac9b440bb6d7992214fb4e10ab51126a9c160f5f1acda3e108e923de17e9" + } + ], "pqcryptEncryptionTests": [ { "privateKyberKey": "06005f0773ca36c9398a88a1d66ac7229ab33956cb48556f8c0968f4adf356014cf68ac92660fb9660b037c8b08b05d37a462aa01e8eec20bf56b352648c0148371d613ffcc137fa75c17aa2bdbd042b0eb5bd8b847669931d17cb96d6f0a21e63b0e3ea07e150cce2095817176adce74842730d6bc8b43267bf01e373bf805b158a6e8edc0712f6aaa16c233c74a9a1607da3754e6a0486c86615e308a680578db67934bfe64ae5604cb2bc52af9399baa93774c46105905c4c65639d36692ff22de72baa42d72452c3cea8131b5be0cc5792285312aed92c9a8e47b301f510893b48d6f019b6b27b40250ef17806b63220d8078850074b355864b52909a58922aa3131f31287a86a4362479e002d75ebf8a7ad037b603130fb37adfe169b67aca996c75042054d15f70768b751d3b34339850e9898173258b2e301b9f72311f5f52fe7f2198d8284e291435eb1986f1baeb5eb918261180860397e750303a39725a59af61cc1f3ab5bf92c855e4365e599abf8667679e7c88531544352817cf09624cb7238018a634c5dd7b415aab611464bc258393f2a3ab8e9e04b9c332d4f84acfdb451fb2a73bc3695ce081e2e873a52807f0043a56956951fe4b9d9b6b12ddc9735f8311a15a427b438aae69b9073687a339406e56dfec48e585c20a711b717969e1969bac7d860bba8b7890620e6f017c8363721272b6d703bb791c5a24b461648b022a535cd7acdfb140fc6a11e2f5206bdd6216877707f7c3769e33750836f34c85a376bae9e0946ecea113cb801eb6025d5e0cc0169b7a7a2c1ac310f4470c565fc2f3d08c1f8ec1d0d0aa9bffc1ff2a914a2a8bb7229a7f59ca248208c1932675ab36fadb392e297c26b9a461a326085e26b35d66107fbc23ab40b2795990f63366d440e051c3637e64885b87cc914af1fb34dc9b59a0a575a920956748646040a68e8e77210f0379af6584530b50703675774c8de7b42cd447c822334ca553d641a06ff92bb041309d225a39341c5a111525e3a1713277cd8d521dfa6cd41b661c9b181dfac327c8485c6e59f78d5b854c837c8199374049eb225085454b0fcf9aabfd65e0a7ab577e82e61c7628c7890f9647d76147f73a39f6cb15e74a1562536ba0fd1ca13679e8770707ad33e9ce30e94d1823ff040ca82c1f8aaca1e276e5762c8ed3159db4a428877667c7490348c7bae9377a339c7683880abc9a685060ce591a25089a336474b11f0a1b6528a9da003eab55f08ba628507609599a32c5706d96623429732eae09c56323b3e55869de8c1c3fa65d79891a9f1bbea841d62c6688ddb65964a4b9da60ca475cb1bfba8b48563e7b782a24c82b0939fb038930ee515b7cb5b229265cf2070399657a6e76f2ebbcc76ac2b87874c5e2a76a2c0a8abc9b46a157db3b37084a36fc7105c05e46de8d555e352cce1b2918c7c6a2c1120a50a444b607ae8611755d847d2c02e6ba61181ab4a601968175b7a9afc30a4a299115974fd8c971870c0c7b42b31d17f32f43a246206e754bad4226051ba6d3e5b9b42c802e02995688a8d0179b4324b585e0618ec31599ca781bba98ae1c350e0f0a6d46b667314b681f3860fc12696f00aa32a23763c09c3e286ffa8239eb00816fa0a10955b08950de0437f9f62b4a547ac583b8b88caa2e0014f9c79c423d0af90408dc53c7390c3942eda828607608ca0c2902b71fe2614e3f52818a25a21065c13e2c3c0981ab54b2ce3fa49cfc001d029c6afb51ac557192ed4b25c51770b422cbcdb7ed3c0c0fe7c25664608a5315b1ca2747a354c3991194b7467098b25c58b0f0075530a0c2930151253e10ab7303e9c122e99685176817d5b6c50b40899d0f78ac5372565824decb804edf5bb6055597b786a552a0034217972e239d6444006657d882cc775320187e956e3d577cf89362710aabeb756efc44fc5d3861b7549fa886be6b591979942684448f2571fad06cd1fb1b95e05bfacac379abb9c6cba44ee698c69e61270517b4192621f580c11a79366ab2b02a909e9452e01001d8bcb2672554fd3b6a121a941c24724bdd91634146271885abbd25348113248e97091293434645c4240c89f953d49a837bca9ab975107c2e07ab8d0458750b65a0b4b41d69654c091f79a4a844087a2a238d6abcd002011e241806e501cf2d0ebc5daac356d0f2bcbf51b176b4a9e78c1350499db196c002031d7acfa83d3c0fa2c05b867953870f88348fc2368d16f72ef8618fd317774fd0600063644ba7b644f43056decc4d0597f32ba80cdf25f3a92c335216c608a4b6fd4062ba2861b2628317b7f82a6794515ca2d823bf93620c1fb0f309b3bbd5b85a5281e0dd507a58392d21c6c5e845dabe693a0692e2436aadd88cbb33b805b6866ad285e722a91d432360825151890b42c2aa94da9cb2818c546bcb3bf09bb91d5a33f2a4e245313beea60f7ecaef732c897cc8f549384c0a6cac9d9c774576f604867cb592d59e2542ec82149bb7d4c55735b5585106c8524a10479b27bcea4949c5561f7132680016d42f1a249633f169433cc034d503259ab47b09c4ac8e1b36db6287423db18b02410c5cb8da4909a32c67319d86a7697b3d9b5a75ab24fc80a882c0cae384839d8ec6cc35055711159367463fa5a421cc4331416277e27c8a6f2bbf4a5931008cd49fc56325a5a4228868f72a45ff6c8f26495ba00bf5b1158b1e24e80268e467684b0b69bade8525c346e121c16927b8f0daa8582a554f0056a82306800fc1822b4bd8015628f1a5d21835c790335cd8c5d7e00a6ef2012efb5307276193c340deeca8290b136f1275a1d555cfc96a715708889bc33b3d49c5c627b98b98f3ee1240bf55270e4c8cf6155ea042606775f39c2bed4679980d1421ae03203e17d7bd341d16517333b74eb93882691af2cbc9353580d90183fb3c03cc7e091d0f192b9a6af89949213e56a86a81203ccad16d7baf1a55af5a77f00adb8b559c1d576480b3010f1a5012c49cb3d6b85234878dba266bad84a75fb81471c2d99d2060c92032fa81bd4e931bd61cc10d582a34285a20327c9b6724ad118d8c9abd7d59890724e95118fc39c38f1a9c9413b262c6b32e03abd4fb1b0e9d12f550c8bf8dc408ff565cf8a84313156e5bbc108259e4cea464625cd625767c36539844b55d28b66818b9959463aeb75ad29b446889c48fda958e7305b2f99c9208c4e2ef93213326675d860a78503226a1d7499c5f9c877752aa895e81407352cd4c45e4f2c18499b86906c94453a1fbd45a69581379bf0b403701d580188c14b46e496b018f1ca88ba5280e559f2f54cfee5aed72aa86fa80409992670464009e252a2a74fcad2ab22062b8a0283453a88b43410160972f73c948b195ebe975fa2f05852f1219fb207a1a2bbaf83b67ec6948a092ee7e3a85ab9cb72822b6285c1d0bc3561cacca6b838a05498578c51cd432c078352ca51094ad419c1da431728a5588b5f91cc125ef3b172a74d331acc7ec5b83f3c2d9f783574237c68ca25beb0667df47f8238a2c9ea74937a5f46f9360c91419137379d01a971a48f17ca1dcf02a3ab5a6a667945e0f790caa08f84169c0192401a01b10c86a38ffc1240365c6d4116e3483b6ff3637c86b462dac9a12a090c000002383c3c8057a2da2cc028a6de908b0e045a652aba96bc52fa73084cc58cec512f99948ef809b289398dd4f01b94e00219733d99a2305ba96caadc70cc257eaa1aaf08c74f9225cbce6b47c4f512d93b74ba799460fc1cb0e8ce038692ab412569e99a5fe91b5ebaa70f370a7c380910e2107ddcc82c017245c9a04383096c40699df72fbb4cb515c55734993614b931c5842648634e71957d42b1349ce5ba1247104cb65c35990924045120248738ca1b146510a86bb66bf10e5458907b731e335a09a2902b9937cd632b97f5861a4ab43f73ba495082254a15ac98909173c92e59354588117c0746b2340518529a2797a755e600c32e16a73b5b0cdfea3bd968327987126644195b1965cc3b8e2679c6a528bb58d4c749b039773a32108761e8b1cb390c245a6b07a996c7c2383c8367284e45c30a81481a124efae433800b616e4a63ce4c67aac470bde0b8f5e08183c18e18d58cdb872f01c17bf9b674d0d626fa2c49771a8e45453c2b3998872551ac4794ba2673724accc1aa3a6859a758c293506c92953817218242dbfc498ce1936ee301747709772925b3bb80bb124f89022951f62f5eca2ad868b8ec5bbc3db2c6732c30fa625c5ee68762f52dcc842e0d3a5096e75afc46411345b310933e27e72a5d4b87e4fa8fb5e85cc6818adc83253ae36ee8172b6c9bc09dcaacc83a6b9e26caab2c949050904ca4122bf72e2a483ce0e92b2ca2bc23e20b5dcb2de1cbae4be1b58caaa174c4432780c45ac24663b6800020aff9bba44ca2aa03186de9f34013fb6b4deb8a0f7abb1b4e32057c0b3572b3d1", diff --git a/test/tests/api/worker/crypto/CryptoFacadeTest.ts b/test/tests/api/worker/crypto/CryptoFacadeTest.ts index cc778e43d932..b6778bf03875 100644 --- a/test/tests/api/worker/crypto/CryptoFacadeTest.ts +++ b/test/tests/api/worker/crypto/CryptoFacadeTest.ts @@ -3,6 +3,7 @@ import { arrayEquals, assertNotNull, hexToUint8Array, + KeyVersion, neverNull, stringToUtf8Uint8Array, uint8ArrayToBase64, @@ -40,8 +41,6 @@ import { createInstanceSessionKey, createKeyPair, createPermission, - createPublicKeyGetIn, - createPublicKeyGetOut, createTypeInfo, CustomerAccountTerminationRequestTypeRef, Group, @@ -74,6 +73,7 @@ import { encryptRsaKey, generateEccKeyPair, IV_BYTE_LENGTH, + KeyPairType, kyberPrivateKeyToBytes, kyberPublicKeyToBytes, pqKeyPairsToPublicKeys, @@ -85,7 +85,7 @@ import { InstanceMapper } from "../../../../../src/common/api/worker/crypto/Inst import type { TypeModel } from "../../../../../src/common/api/common/EntityTypes.js" import { IServiceExecutor } from "../../../../../src/common/api/common/ServiceRequest.js" import { matchers, object, verify, when } from "testdouble" -import { PublicKeyService, UpdatePermissionKeyService } from "../../../../../src/common/api/entities/sys/Services.js" +import { UpdatePermissionKeyService } from "../../../../../src/common/api/entities/sys/Services.js" import { getListId, isSameId } from "../../../../../src/common/api/common/utils/EntityUtils.js" import { HttpMethod, resolveTypeReference, typeModels } from "../../../../../src/common/api/common/EntityFunctions.js" import { UserFacade } from "../../../../../src/common/api/worker/facades/UserFacade.js" @@ -98,14 +98,17 @@ import { createTestEntity } from "../../../TestUtils.js" import { RSA_TEST_KEYPAIR } from "../facades/RsaPqPerformanceTest.js" import { DefaultEntityRestCache } from "../../../../../src/common/api/worker/rest/DefaultEntityRestCache.js" import { loadLibOQSWASM } from "../WASMTestUtils.js" -import { KeyLoaderFacade } from "../../../../../src/common/api/worker/facades/KeyLoaderFacade.js" -import { AsymmetricCryptoFacade, convertToVersionedPublicKeys } from "../../../../../src/common/api/worker/crypto/AsymmetricCryptoFacade.js" +import { KeyLoaderFacade, parseKeyVersion } from "../../../../../src/common/api/worker/facades/KeyLoaderFacade.js" +import { AsymmetricCryptoFacade } from "../../../../../src/common/api/worker/crypto/AsymmetricCryptoFacade.js" +import { PublicKeyProvider, PublicKeys } from "../../../../../src/common/api/worker/facades/PublicKeyProvider.js" +import { KeyRotationFacade } from "../../../../../src/common/api/worker/facades/KeyRotationFacade.js" const { captor, anything, argThat } = matchers const kyberFacade = new WASMKyberFacade(await loadLibOQSWASM()) const pqFacade: PQFacade = new PQFacade(kyberFacade) let asymmetricCryptoFacade: AsymmetricCryptoFacade +let publicKeyProvider: PublicKeyProvider /** * Helper to have all the mocked items available in the test case. @@ -124,7 +127,7 @@ const senderAddress = "hello@tutao.de" async function prepareBucketKeyInstance( bucketEncMailSessionKey: Uint8Array, fileSessionKeys: Array, - bk: number[], + bk: AesKey, pubEncBucketKey: Uint8Array, recipientUser: TestUser, instanceMapper: InstanceMapper, @@ -170,7 +173,7 @@ async function prepareBucketKeyInstance( when( asymmetricCryptoFacade.loadKeyPairAndDecryptSymKey( assertNotNull(bucketKey.keyGroup), - Number(bucketKey.recipientKeyVersion), + parseKeyVersion(bucketKey.recipientKeyVersion), asCryptoProtoocolVersion(bucketKey.protocolVersion), pubEncBucketKey, ), @@ -193,12 +196,12 @@ o.spec("CryptoFacadeTest", function () { let userFacade: UserFacade let keyLoaderFacade: KeyLoaderFacade let cache: DefaultEntityRestCache + let keyRotationFacade: KeyRotationFacade o.before(function () { restClient = object() when(restClient.request(anything(), anything(), anything())).thenResolve(undefined) userFacade = object() - keyLoaderFacade = object() cache = object() }) @@ -207,6 +210,9 @@ o.spec("CryptoFacadeTest", function () { entityClient = object() asymmetricCryptoFacade = object() ownerEncSessionKeysUpdateQueue = object() + publicKeyProvider = object() + keyLoaderFacade = object() + keyRotationFacade = object() crypto = new CryptoFacade( userFacade, entityClient, @@ -217,6 +223,8 @@ o.spec("CryptoFacadeTest", function () { cache, keyLoaderFacade, asymmetricCryptoFacade, + publicKeyProvider, + () => keyRotationFacade, ) }) @@ -313,7 +321,7 @@ o.spec("CryptoFacadeTest", function () { when( asymmetricCryptoFacade.loadKeyPairAndDecryptSymKey( assertNotNull(bucketPermission.group), - Number(bucketPermission.pubKeyVersion), + parseKeyVersion(bucketPermission.pubKeyVersion!), protocolVersion, pubEncBucketKey, ), @@ -401,7 +409,7 @@ o.spec("CryptoFacadeTest", function () { when( asymmetricCryptoFacade.loadKeyPairAndDecryptSymKey( assertNotNull(bucketPermission.group), - Number(bucketPermission.pubKeyVersion), + parseKeyVersion(bucketPermission.pubKeyVersion!), protocolVersion, pubEncBucketKey, ), @@ -484,7 +492,7 @@ o.spec("CryptoFacadeTest", function () { when( asymmetricCryptoFacade.loadKeyPairAndDecryptSymKey( assertNotNull(bucketPermission.group), - Number(bucketPermission.pubKeyVersion), + parseKeyVersion(bucketPermission.pubKeyVersion!), protocolVersion, pubEncBucketKey, ), @@ -594,15 +602,6 @@ o.spec("CryptoFacadeTest", function () { Object.assign(testData.mailLiteral, { body: "bodyId" }) const mail = createTestEntity(MailTypeRef, testData.mailLiteral) - when(serviceExecutor.get(PublicKeyService, anything())).thenResolve( - createPublicKeyGetOut({ - pubEccKey: testData.senderIdentityKeyPair.publicKey, - pubKeyVersion: "0", - pubKyberKey: null, - pubRsaKey: null, - }), - ) - // const sessionKey = neverNull(await crypto.resolveSessionKey(testData.MailTypeModel, testData.mailLiteral)) const updatedFiles = await crypto.enforceSessionKeyUpdateIfNeeded(mail, files) verify(ownerEncSessionKeysUpdateQueue.postUpdateSessionKeysService(anything()), { times: 1 }) @@ -620,6 +619,8 @@ o.spec("CryptoFacadeTest", function () { cache, keyLoaderFacade, asymmetricCryptoFacade, + publicKeyProvider, + () => keyRotationFacade, ) let senderMailAddress = "alice@tutanota.com" let recipientMailAddress = "bob@tutanota.com" @@ -657,7 +658,6 @@ o.spec("CryptoFacadeTest", function () { admin: "admin1", adminGroupEncGKey: null, adminGroupKeyVersion: null, - administratedGroups: null, archives: [], customer: "customer1", enabled: false, @@ -688,36 +688,27 @@ o.spec("CryptoFacadeTest", function () { encapsulation: pqEncapsulation, }) - const recipientPublicKeyGetOut = createPublicKeyGetOut({ - pubKeyVersion: "0", - pubEccKey: recipientKeyPair.pubEccKey, - pubKyberKey: recipientKeyPair.pubKyberKey, - pubRsaKey: null, - }) - when( - serviceExecutor.get( - PublicKeyService, - createPublicKeyGetIn({ identifierType: PublicKeyIdentifierType.MAIL_ADDRESS, identifier: recipientMailAddress, version: null }), - ), - ).thenResolve(recipientPublicKeyGetOut) - when( - serviceExecutor.get( - PublicKeyService, - createPublicKeyGetIn({ identifierType: PublicKeyIdentifierType.MAIL_ADDRESS, identifier: senderMailAddress, version: "0" }), - ), - ).thenResolve( - createPublicKeyGetOut({ - pubKeyVersion: "0", - pubEccKey: senderKeyPair.pubEccKey, - pubKyberKey: senderKeyPair.pubKyberKey, + const recipientPublicKeys: Versioned = { + version: 0, + object: { + pubEccKey: recipientKeyPair.pubEccKey, + pubKyberKey: recipientKeyPair.pubKyberKey, pubRsaKey: null, - }), + }, + } + when(publicKeyProvider.loadCurrentPubKey({ identifierType: PublicKeyIdentifierType.MAIL_ADDRESS, identifier: recipientMailAddress })).thenResolve( + recipientPublicKeys, ) + when(publicKeyProvider.loadVersionedPubKey({ identifierType: PublicKeyIdentifierType.MAIL_ADDRESS, identifier: recipientMailAddress }, 0)).thenResolve({ + pubEccKey: senderKeyPair.pubEccKey, + pubKyberKey: senderKeyPair.pubKyberKey, + pubRsaKey: null, + }) when(entityClient.load(GroupTypeRef, senderUserGroup._id)).thenResolve(senderUserGroup) when(keyLoaderFacade.getCurrentSymGroupKey(senderUserGroup._id)).thenResolve({ object: senderGroupKey, version: 0 }) - when(asymmetricCryptoFacade.asymEncryptSymKey(bk, convertToVersionedPublicKeys(recipientPublicKeyGetOut), senderUserGroup._id)).thenResolve({ - recipientKeyVersion: Number(recipientPublicKeyGetOut.pubKeyVersion), - senderKeyVersion: Number(senderUserGroup.groupKeyVersion), + when(asymmetricCryptoFacade.asymEncryptSymKey(bk, recipientPublicKeys, senderUserGroup._id)).thenResolve({ + recipientKeyVersion: recipientPublicKeys.version, + senderKeyVersion: parseKeyVersion(senderUserGroup.groupKeyVersion), pubEncSymKeyBytes: encodedPqMessage, cryptoProtocolVersion: CryptoProtocolVersion.TUTA_CRYPT, }) @@ -733,7 +724,7 @@ o.spec("CryptoFacadeTest", function () { o(internalRecipientKeyData.protocolVersion).equals(CryptoProtocolVersion.TUTA_CRYPT) o(internalRecipientKeyData!.mailAddress).equals(recipientMailAddress) o(internalRecipientKeyData!.pubEncBucketKey).deepEquals(encodedPqMessage) - verify(serviceExecutor.put(PublicKeyService, anything()), { times: 0 }) + verify(publicKeyProvider, { times: 0 }) }) o("encryptBucketKeyForInternalRecipient with existing PQKeys for sender", async () => { @@ -747,6 +738,8 @@ o.spec("CryptoFacadeTest", function () { cache, keyLoaderFacade, asymmetricCryptoFacade, + publicKeyProvider, + () => keyRotationFacade, ) let senderMailAddress = "alice@tutanota.com" let recipientMailAddress = "bob@tutanota.com" @@ -785,7 +778,6 @@ o.spec("CryptoFacadeTest", function () { admin: null, adminGroupEncGKey: null, adminGroupKeyVersion: null, - administratedGroups: null, archives: [], customer: null, enabled: false, @@ -802,38 +794,31 @@ o.spec("CryptoFacadeTest", function () { when(keyLoaderFacade.loadCurrentKeyPair(senderUserGroup._id)).thenResolve({ version: 0, object: senderKeyPairs }) const notFoundRecipients = [] - const recipientPublicKeyGetOut = createPublicKeyGetOut({ - pubKeyVersion: "0", - pubRsaKey: recipientKeyPair.pubRsaKey, - pubEccKey: null, - pubKyberKey: null, - }) - when( - serviceExecutor.get( - PublicKeyService, - createPublicKeyGetIn({ identifierType: PublicKeyIdentifierType.MAIL_ADDRESS, identifier: recipientMailAddress, version: null }), - ), - ).thenResolve(recipientPublicKeyGetOut) - when( - serviceExecutor.get( - PublicKeyService, - createPublicKeyGetIn({ identifierType: PublicKeyIdentifierType.MAIL_ADDRESS, identifier: senderMailAddress, version: null }), - ), - ).thenResolve( - createPublicKeyGetOut({ - pubKeyVersion: "0", + const recipientPublicKeys: Versioned = { + version: 0, + object: { + pubRsaKey: recipientKeyPair.pubRsaKey, + pubEccKey: null, + pubKyberKey: null, + }, + } + when(publicKeyProvider.loadCurrentPubKey({ identifierType: PublicKeyIdentifierType.MAIL_ADDRESS, identifier: recipientMailAddress })).thenResolve( + recipientPublicKeys, + ) + when(publicKeyProvider.loadCurrentPubKey({ identifierType: PublicKeyIdentifierType.MAIL_ADDRESS, identifier: senderMailAddress })).thenResolve({ + version: 0, + object: { pubEccKey: senderKeyPair.pubEccKey, pubKyberKey: senderKeyPair.pubKyberKey, - _ownerGroup: "", pubRsaKey: null, - }), - ) + }, + }) when(entityClient.load(GroupTypeRef, senderUserGroup._id)).thenResolve(senderUserGroup) when(keyLoaderFacade.getCurrentSymGroupKey(senderUserGroup._id)).thenResolve({ object: senderGroupKey, version: 0 }) const pubEncBucketKey = object() - when(asymmetricCryptoFacade.asymEncryptSymKey(bk, convertToVersionedPublicKeys(recipientPublicKeyGetOut), senderUserGroup._id)).thenResolve({ - recipientKeyVersion: Number(recipientPublicKeyGetOut.pubKeyVersion), - senderKeyVersion: Number(senderUserGroup.groupKeyVersion), + when(asymmetricCryptoFacade.asymEncryptSymKey(bk, recipientPublicKeys, senderUserGroup._id)).thenResolve({ + recipientKeyVersion: recipientPublicKeys.version, + senderKeyVersion: parseKeyVersion(senderUserGroup.groupKeyVersion), pubEncSymKeyBytes: pubEncBucketKey, cryptoProtocolVersion: CryptoProtocolVersion.RSA, }) @@ -849,7 +834,7 @@ o.spec("CryptoFacadeTest", function () { o(internalRecipientKeyData!.mailAddress).equals(recipientMailAddress) o(internalRecipientKeyData.protocolVersion).equals(CryptoProtocolVersion.RSA) o(internalRecipientKeyData.pubEncBucketKey).deepEquals(pubEncBucketKey) - verify(serviceExecutor.put(PublicKeyService, anything()), { times: 0 }) + verify(publicKeyProvider, { times: 0 }) }) o("authenticateSender | sender is authenticated for correct SenderIdentityKey", async function () { @@ -865,7 +850,7 @@ o.spec("CryptoFacadeTest", function () { identifierType: PublicKeyIdentifierType.MAIL_ADDRESS, }, testData.senderIdentityKeyPair.publicKey, - Number(senderKeyVersion), + parseKeyVersion(senderKeyVersion), ), ).thenResolve(EncryptionAuthStatus.TUTACRYPT_AUTHENTICATION_SUCCEEDED) @@ -899,7 +884,7 @@ o.spec("CryptoFacadeTest", function () { identifierType: PublicKeyIdentifierType.MAIL_ADDRESS, }, testData.senderIdentityKeyPair.publicKey, - Number(senderKeyVersion), + parseKeyVersion(senderKeyVersion), ), ).thenResolve(EncryptionAuthStatus.TUTACRYPT_AUTHENTICATION_SUCCEEDED) @@ -932,7 +917,7 @@ o.spec("CryptoFacadeTest", function () { identifierType: PublicKeyIdentifierType.MAIL_ADDRESS, }, testData.senderIdentityKeyPair.publicKey, - Number(senderKeyVersion), + parseKeyVersion(senderKeyVersion), ), ).thenResolve(EncryptionAuthStatus.TUTACRYPT_AUTHENTICATION_FAILED) @@ -972,6 +957,68 @@ o.spec("CryptoFacadeTest", function () { o(actualAutStatus).deepEquals(EncryptionAuthStatus.RSA_NO_AUTHENTICATION) }) + o("authenticateSender | RSA was used despite recipient having tutacrypt", async function () { + o.timeout(500) // in CI or with debugging it can take a while + const testData = await prepareRsaPubEncBucketKeyResolveSessionKeyTest() + Object.assign(testData.mailLiteral, { body: "bodyId" }) + + when(keyLoaderFacade.loadCurrentKeyPair(anything())).thenResolve({ + version: 1, + object: { + keyPairType: KeyPairType.TUTA_CRYPT, + kyberKeyPair: object(), + eccKeyPair: object(), + }, + }) + + when(keyRotationFacade.getGroupIdsThatPerformedKeyRotations()).thenResolve([]) + + const sessionKey = neverNull(await crypto.resolveSessionKey(testData.MailTypeModel, testData.mailLiteral)) + o(sessionKey).deepEquals(testData.sk) + + const updatedInstanceSessionKeysCaptor = captor() + verify(ownerEncSessionKeysUpdateQueue.updateInstanceSessionKeys(updatedInstanceSessionKeysCaptor.capture(), anything()), { times: 1 }) + const updatedInstanceSessionKeys = updatedInstanceSessionKeysCaptor.value as Array + o(updatedInstanceSessionKeys.length).equals(testData.bucketKey.bucketEncSessionKeys.length) + const mailInstanceSessionKey = updatedInstanceSessionKeys.find((instanceSessionKey) => + isSameId([instanceSessionKey.instanceList, instanceSessionKey.instanceId], testData.mailLiteral._id), + ) + + const actualAutStatus = utf8Uint8ArrayToString(aesDecrypt(testData.sk, neverNull(mailInstanceSessionKey).encryptionAuthStatus!)) + o(actualAutStatus).deepEquals(EncryptionAuthStatus.RSA_DESPITE_TUTACRYPT) + }) + + o("authenticateSender | RSA was used right after a key rotation", async function () { + o.timeout(500) // in CI or with debugging it can take a while + const testData = await prepareRsaPubEncBucketKeyResolveSessionKeyTest() + Object.assign(testData.mailLiteral, { body: "bodyId" }) + + when(keyLoaderFacade.loadCurrentKeyPair(anything())).thenResolve({ + version: 1, + object: { + keyPairType: KeyPairType.TUTA_CRYPT, + kyberKeyPair: object(), + eccKeyPair: object(), + }, + }) + + when(keyRotationFacade.getGroupIdsThatPerformedKeyRotations()).thenResolve([testData.userGroupId]) + + const sessionKey = neverNull(await crypto.resolveSessionKey(testData.MailTypeModel, testData.mailLiteral)) + o(sessionKey).deepEquals(testData.sk) + + const updatedInstanceSessionKeysCaptor = captor() + verify(ownerEncSessionKeysUpdateQueue.updateInstanceSessionKeys(updatedInstanceSessionKeysCaptor.capture(), anything()), { times: 1 }) + const updatedInstanceSessionKeys = updatedInstanceSessionKeysCaptor.value as Array + o(updatedInstanceSessionKeys.length).equals(testData.bucketKey.bucketEncSessionKeys.length) + const mailInstanceSessionKey = updatedInstanceSessionKeys.find((instanceSessionKey) => + isSameId([instanceSessionKey.instanceList, instanceSessionKey.instanceId], testData.mailLiteral._id), + ) + + const actualAutStatus = utf8Uint8ArrayToString(aesDecrypt(testData.sk, neverNull(mailInstanceSessionKey).encryptionAuthStatus!)) + o(actualAutStatus).deepEquals(EncryptionAuthStatus.RSA_NO_AUTHENTICATION) + }) + o("authenticateSender | no authentication needed for secure external recipient", async function () { o.timeout(500) // in CI or with debugging it can take a while const file1SessionKey = aes256RandomKey() @@ -1004,10 +1051,10 @@ o.spec("CryptoFacadeTest", function () { const mailCaptor = matchers.captor() const userCaptor = matchers.captor() - verify(keyLoaderFacade.loadSymGroupKey(externalUser.userGroup._id, Number(externalUser.mailGroup.adminGroupKeyVersion), userCaptor.capture())) + verify(keyLoaderFacade.loadSymGroupKey(externalUser.userGroup._id, parseKeyVersion(externalUser.mailGroup.adminGroupKeyVersion!), userCaptor.capture())) verify(keyLoaderFacade.loadSymGroupKey(externalUser.mailGroup._id, testData.recipientKeyVersion, mailCaptor.capture())) - o(userCaptor.value.version).equals(Number(externalUser.userGroup.groupKeyVersion)) - o(mailCaptor.value.version).equals(Number(externalUser.mailGroup.groupKeyVersion)) + o(userCaptor.value.version).equals(parseKeyVersion(externalUser.userGroup.groupKeyVersion)) + o(mailCaptor.value.version).equals(parseKeyVersion(externalUser.mailGroup.groupKeyVersion)) const updatedInstanceSessionKeysCaptor = captor() verify(ownerEncSessionKeysUpdateQueue.updateInstanceSessionKeys(updatedInstanceSessionKeysCaptor.capture(), anything()), { times: 1 }) @@ -1229,15 +1276,6 @@ o.spec("CryptoFacadeTest", function () { const testData = await preparePqPubEncBucketKeyResolveSessionKeyTest() Object.assign(testData.mailLiteral, { body: "bodyId" }) - when(serviceExecutor.get(PublicKeyService, anything())).thenResolve( - createPublicKeyGetOut({ - pubEccKey: testData.senderIdentityKeyPair.publicKey, - pubKeyVersion: "0", - pubKyberKey: null, - pubRsaKey: null, - }), - ) - const sessionKey = neverNull(await crypto.resolveSessionKey(testData.MailTypeModel, testData.mailLiteral)) o(sessionKey).deepEquals(testData.sk) @@ -1248,15 +1286,6 @@ o.spec("CryptoFacadeTest", function () { const testData = await preparePqPubEncBucketKeyResolveSessionKeyTest() Object.assign(testData.mailLiteral, { mailDetailsDraft: ["draftDetailsListId", "draftDetailsId"] }) - when(serviceExecutor.get(PublicKeyService, anything())).thenResolve( - createPublicKeyGetOut({ - pubEccKey: testData.senderIdentityKeyPair.publicKey, - pubKeyVersion: "0", - pubKyberKey: null, - pubRsaKey: null, - }), - ) - const sessionKey = neverNull(await crypto.resolveSessionKey(testData.MailTypeModel, testData.mailLiteral)) o(sessionKey).deepEquals(testData.sk) @@ -1271,15 +1300,6 @@ o.spec("CryptoFacadeTest", function () { mailDetailsDraft: ["draftDetailsListId", "draftDetailsId"], }) - when(serviceExecutor.get(PublicKeyService, anything())).thenResolve( - createPublicKeyGetOut({ - pubEccKey: testData.senderIdentityKeyPair.publicKey, - pubKeyVersion: "0", - pubKyberKey: null, - pubRsaKey: null, - }), - ) - const mailInstance = await instanceMapper.decryptAndMapToInstance(testData.MailTypeModel, testData.mailLiteral, testData.sk) // do not use testdouble here because it's hard to not break the function itself and then verify invocations @@ -1300,15 +1320,6 @@ o.spec("CryptoFacadeTest", function () { const testData = await preparePqPubEncBucketKeyResolveSessionKeyTest() Object.assign(testData.mailLiteral, { mailDetails: ["mailDetailsArchiveId", "mailDetailsId"] }) - when(serviceExecutor.get(PublicKeyService, anything())).thenResolve( - createPublicKeyGetOut({ - pubEccKey: testData.senderIdentityKeyPair.publicKey, - pubKeyVersion: "0", - pubKyberKey: null, - pubRsaKey: null, - }), - ) - const sessionKey = neverNull(await crypto.resolveSessionKey(testData.MailTypeModel, testData.mailLiteral)) o(sessionKey).deepEquals(testData.sk) @@ -1323,15 +1334,6 @@ o.spec("CryptoFacadeTest", function () { const testData = await preparePqPubEncBucketKeyResolveSessionKeyTest([file1SessionKey, file2SessionKey]) Object.assign(testData.mailLiteral, { mailDetails: ["mailDetailsArchiveId", "mailDetailsId"] }) - when(serviceExecutor.get(PublicKeyService, anything())).thenResolve( - createPublicKeyGetOut({ - pubEccKey: testData.senderIdentityKeyPair.publicKey, - pubKeyVersion: "0", - pubKyberKey: null, - pubRsaKey: null, - }), - ) - const mailSessionKey = neverNull(await crypto.resolveSessionKey(testData.MailTypeModel, testData.mailLiteral)) o(mailSessionKey).deepEquals(testData.sk) @@ -1463,6 +1465,7 @@ o.spec("CryptoFacadeTest", function () { bk: Aes256Key mailGroupKey: Aes256Key MailTypeModel: TypeModel + userGroupId: Id }> { // configure test user const recipientUser = createTestUser("Bob", entityClient) @@ -1529,6 +1532,14 @@ o.spec("CryptoFacadeTest", function () { senderKeyVersion: null, recipientKeyVersion: "0", }) + when(keyLoaderFacade.loadCurrentKeyPair(recipientUser.userGroup._id)).thenResolve({ + object: { + keyPairType: KeyPairType.RSA, + publicKey: RSA_TEST_KEYPAIR.publicKey, + privateKey: RSA_TEST_KEYPAIR.privateKey, + }, + version: 0, + }) const BucketKeyModel = await resolveTypeReference(BucketKeyTypeRef) const bucketKeyLiteral = await instanceMapper.encryptAndMapToLiteral(BucketKeyModel, bucketKey, null) @@ -1537,7 +1548,7 @@ o.spec("CryptoFacadeTest", function () { when( asymmetricCryptoFacade.loadKeyPairAndDecryptSymKey( assertNotNull(bucketKey.keyGroup), - Number(bucketKey.recipientKeyVersion), + parseKeyVersion(bucketKey.recipientKeyVersion), asCryptoProtoocolVersion(bucketKey.protocolVersion), pubEncBucketKey, ), @@ -1550,6 +1561,7 @@ o.spec("CryptoFacadeTest", function () { bk, mailGroupKey: recipientUser.mailGroupKey, MailTypeModel, + userGroupId: recipientUser.userGroup._id, } } @@ -1645,7 +1657,7 @@ o.spec("CryptoFacadeTest", function () { when( asymmetricCryptoFacade.loadKeyPairAndDecryptSymKey( assertNotNull(bucketKey.keyGroup), - Number(bucketKey.recipientKeyVersion), + parseKeyVersion(bucketKey.recipientKeyVersion), asCryptoProtoocolVersion(bucketKey.protocolVersion), pubEncBucketKey, ), @@ -1760,7 +1772,7 @@ o.spec("CryptoFacadeTest", function () { MailTypeModel: TypeModel internalUser: TestUser externalUser: TestUser - recipientKeyVersion: number + recipientKeyVersion: KeyVersion }> { // Setup test users and groups const internalUser = createTestUser("Alice", entityClient) @@ -1779,8 +1791,10 @@ o.spec("CryptoFacadeTest", function () { configureLoggedInUser(internalUser, userFacade, keyLoaderFacade) - when(keyLoaderFacade.loadSymGroupKey(externalUser.mailGroup._id, Number(recipientKeyVersion), anything())).thenResolve(externalUser.mailGroupKey) - when(keyLoaderFacade.loadSymGroupKey(externalUser.userGroup._id, Number(externalUser.mailGroup.adminGroupKeyVersion), anything())).thenResolve( + when(keyLoaderFacade.loadSymGroupKey(externalUser.mailGroup._id, parseKeyVersion(recipientKeyVersion), anything())).thenResolve( + externalUser.mailGroupKey, + ) + when(keyLoaderFacade.loadSymGroupKey(externalUser.userGroup._id, parseKeyVersion(externalUser.mailGroup.adminGroupKeyVersion), anything())).thenResolve( externalUser.userGroupKey, ) @@ -1833,7 +1847,7 @@ o.spec("CryptoFacadeTest", function () { MailTypeModel, internalUser, externalUser, - recipientKeyVersion: Number(recipientKeyVersion), + recipientKeyVersion: parseKeyVersion(recipientKeyVersion), } } }) diff --git a/test/tests/api/worker/facades/ConfigurationDbTest.ts b/test/tests/api/worker/facades/ConfigurationDbTest.ts index 92a572a07041..05ce6d8de684 100644 --- a/test/tests/api/worker/facades/ConfigurationDbTest.ts +++ b/test/tests/api/worker/facades/ConfigurationDbTest.ts @@ -7,7 +7,7 @@ import { loadEncryptionMetadata, updateEncryptionMetadata, } from "../../../../../src/common/api/worker/facades/lazy/ConfigurationDatabase.js" -import { downcast } from "@tutao/tutanota-utils" +import { downcast, KeyVersion } from "@tutao/tutanota-utils" import { DbStub } from "../search/DbStub.js" import { ExternalImageRule } from "../../../../../src/common/api/common/TutanotaConstants.js" import { UserTypeRef } from "../../../../../src/common/api/entities/sys/TypeRefs.js" @@ -174,7 +174,7 @@ o.spec("ConfigurationDbTest", function () { }) o("write group key version when updating database", async function () { - const oldGroupKey = { version: currentUserGroupKey.version - 1, object: aes256RandomKey() } + const oldGroupKey = { version: (currentUserGroupKey.version - 1) as KeyVersion, object: aes256RandomKey() } when(keyLoaderFacade.loadSymUserGroupKey(oldGroupKey.version)).thenResolve(oldGroupKey.object) when(transaction.get(ConfigurationMetaDataOS, Metadata.userGroupKeyVersion)).thenResolve(oldGroupKey.version) when(transaction.get(ConfigurationMetaDataOS, Metadata.userEncDbKey)).thenResolve(encryptKey(oldGroupKey.object, dbKey)) diff --git a/test/tests/api/worker/facades/GroupManagementFacadeTest.ts b/test/tests/api/worker/facades/GroupManagementFacadeTest.ts index b25551aff7ef..aa506d941fac 100644 --- a/test/tests/api/worker/facades/GroupManagementFacadeTest.ts +++ b/test/tests/api/worker/facades/GroupManagementFacadeTest.ts @@ -5,30 +5,31 @@ import { CounterFacade } from "../../../../../src/common/api/worker/facades/lazy import { EntityClient } from "../../../../../src/common/api/common/EntityClient.js" import { IServiceExecutor } from "../../../../../src/common/api/common/ServiceRequest.js" import { PQFacade } from "../../../../../src/common/api/worker/facades/PQFacade.js" -import { KeyLoaderFacade } from "../../../../../src/common/api/worker/facades/KeyLoaderFacade.js" +import { checkKeyVersionConstraints, KeyLoaderFacade, parseKeyVersion } from "../../../../../src/common/api/worker/facades/KeyLoaderFacade.js" import { CacheManagementFacade } from "../../../../../src/common/api/worker/facades/lazy/CacheManagementFacade.js" import { AsymmetricCryptoFacade } from "../../../../../src/common/api/worker/crypto/AsymmetricCryptoFacade.js" import { matchers, object, verify, when } from "testdouble" -import { AesKey, EccPublicKey, PQKeyPairs } from "@tutao/tutanota-crypto" +import { AesKey, EccPublicKey, MacTag, PQKeyPairs } from "@tutao/tutanota-crypto" import { createTestEntity } from "../../../TestUtils.js" import { - AdministratedGroupsRefTypeRef, - AdministratedGroupTypeRef, - CustomerTypeRef, Group, - GroupInfo, - GroupInfoTypeRef, - GroupMembershipTypeRef, + GroupKey, + GroupKeysRefTypeRef, + GroupKeyTypeRef, GroupTypeRef, - LocalAdminRemovalPostIn, + KeyMac, + KeyMacTypeRef, PubEncKeyDataTypeRef, - UserTypeRef, } from "../../../../../src/common/api/entities/sys/TypeRefs.js" import { CryptoWrapper, VersionedKey } from "../../../../../src/common/api/worker/crypto/CryptoWrapper.js" import { assertThrows } from "@tutao/tutanota-test-utils" import { ProgrammingError } from "../../../../../src/common/api/common/error/ProgrammingError.js" import { CryptoProtocolVersion, GroupType, PublicKeyIdentifierType } from "../../../../../src/common/api/common/TutanotaConstants.js" -import { LocalAdminRemovalService } from "../../../../../src/common/api/entities/sys/Services.js" +import { brandKeyMac, KeyAuthenticationFacade, UserGroupKeyAuthenticationParams } from "../../../../../src/common/api/worker/facades/KeyAuthenticationFacade.js" +import { TutanotaError } from "@tutao/tutanota-error" +import { CryptoError } from "@tutao/tutanota-crypto/error.js" + +const { anything, argThat, captor } = matchers o.spec("GroupManagementFacadeTest", function () { let userFacade: UserFacade @@ -40,6 +41,7 @@ o.spec("GroupManagementFacadeTest", function () { let cacheManagementFacade: CacheManagementFacade let asymmetricCryptoFacade: AsymmetricCryptoFacade let cryptoWrapper: CryptoWrapper + let keyAuthenticationFacade: KeyAuthenticationFacade let groupManagementFacade: GroupManagementFacade @@ -57,6 +59,7 @@ o.spec("GroupManagementFacadeTest", function () { cacheManagementFacade = object() asymmetricCryptoFacade = object() cryptoWrapper = object() + keyAuthenticationFacade = object() groupManagementFacade = new GroupManagementFacade( userFacade, @@ -68,15 +71,18 @@ o.spec("GroupManagementFacadeTest", function () { cacheManagementFacade, asymmetricCryptoFacade, cryptoWrapper, + keyAuthenticationFacade, ) }) o.spec("getCurrentGroupKeyViaAdminEncGKey", function () { const adminGroupKeyVersion = 2 + const previousAdminGroupKeyVersion = 1 const adminGroupKeyBytes = object() const adminGroupKeyPair = object() - const groupKeyVersion = 1 + const groupKeyVersion = 2 + const pubUserGroupEccKey = object() const groupKeyBytes = object() const adminGroupEncGKey = object() @@ -84,10 +90,15 @@ o.spec("GroupManagementFacadeTest", function () { const pubAdminGroupEncGKey = createTestEntity(PubEncKeyDataTypeRef, { pubEncSymKey: pubAdminGroupEncSymKey, protocolVersion: CryptoProtocolVersion.TUTA_CRYPT, - recipientIdentifier: groupId, + recipientIdentifier: adminGroupId, recipientIdentifierType: PublicKeyIdentifierType.GROUP_ID, recipientKeyVersion: adminGroupKeyVersion.toString(), senderKeyVersion: groupKeyVersion.toString(), + symKeyMac: createTestEntity(KeyMacTypeRef, { + taggedKeyVersion: "2", + tag: object(), + taggingKeyVersion: "1", + }), }) o.beforeEach(function () { @@ -98,6 +109,7 @@ o.spec("GroupManagementFacadeTest", function () { adminGroupEncGKey: null, pubAdminGroupEncGKey: null, admin: adminGroupId, + type: GroupType.User, }) when(userFacade.hasGroup(groupId)).thenReturn(false) when(userFacade.hasGroup(adminGroupId)).thenReturn(true) @@ -132,24 +144,232 @@ o.spec("GroupManagementFacadeTest", function () { o(groupKey.version).equals(groupKeyVersion) o(groupKey.object).deepEquals(groupKeyBytes) verify(keyLoaderFacade.loadSymGroupKey(adminGroupId, adminGroupKeyVersion)) - verify(asymmetricCryptoFacade.decryptSymKeyWithKeyPairAndAuthenticate(matchers.anything(), matchers.anything(), matchers.anything()), { times: 0 }) + verify(asymmetricCryptoFacade.decryptSymKeyWithKeyPairAndAuthenticate(anything(), anything(), anything()), { times: 0 }) }) - o("asymmetric decryption", async function () { - group.pubAdminGroupEncGKey = pubAdminGroupEncGKey + o.spec("asymmetric decryption", function () { + const formerGroupKeyListId = "formerGroupKeysList" + + o("user group key - successful - former group key is symmetrically encrypted for the admin", async function () { + /* + Scenario: + Current group key version is 2, and it is asymmetrically encrypted for the admin with admin group key version 2. + Group key version 1 is symmetrically encrypted for the admin with admin group key version 1. + */ + + group.pubAdminGroupEncGKey = pubAdminGroupEncGKey + + const taggingKeyVersion = "1" + group.formerGroupKeys = createTestEntity(GroupKeysRefTypeRef, { list: formerGroupKeyListId }) + + const formerGroupKeysV1 = createTestEntity(GroupKeyTypeRef, { + adminGroupEncGKey: object(), + adminGroupKeyVersion: "1", + }) + const formerGroupSymKeyV1 = object() + when(cryptoWrapper.decryptKey(anything(), formerGroupKeysV1.adminGroupEncGKey!)).thenReturn(formerGroupSymKeyV1) + + when(keyLoaderFacade.loadFormerGroupKeyInstance(group, parseKeyVersion(taggingKeyVersion))).thenResolve(formerGroupKeysV1) + + const groupKey = await groupManagementFacade.getCurrentGroupKeyViaAdminEncGKey(groupId) + + o(groupKey.object).equals(groupKeyBytes) + o(groupKey.version).equals(groupKeyVersion) + + const formerUserGroupKey: VersionedKey = { + object: formerGroupSymKeyV1, + version: checkKeyVersionConstraints(groupKeyVersion - 1), + } + // noinspection JSVoidFunctionReturnValueUsed + verify( + keyAuthenticationFacade.verifyTag( + { + tagType: "USER_GROUP_KEY_TAG", + sourceOfTrust: { currentUserGroupKey: formerUserGroupKey.object }, + untrustedKey: { newUserGroupKey: groupKeyBytes }, + bindingData: { + adminGroupId, + userGroupId: groupId, + currentUserGroupKeyVersion: formerUserGroupKey.version, + newAdminGroupKeyVersion: adminGroupKeyVersion, + newUserGroupKeyVersion: groupKeyVersion, + }, + }, + brandKeyMac(pubAdminGroupEncGKey.symKeyMac!).tag, + ), + ) + }) - const groupKey = await groupManagementFacade.getCurrentGroupKeyViaAdminEncGKey(groupId) + o.spec("former group key is asymmetrically encrypted for the admin", function () { + /* + The setup for this case should be as follows: + The admin wants to use userGroupKeyV2. + The userGroupKeyV2 is asymmetrically encrypted for the admin with adminGroupPubKeyV2, therefore it must be authenticated after decryption. + It is authenticated using userGroupKeyV1. + The userGroupKeyV1 itself is asymmetrically encrypted for the admin with adminGroupPubKeyV1, therefore it must be authenticated after decryption too. + It is authenticated using userGroupKeyV0. + The userGroupKeyV0 is symmetrically encrypted for/by the admin with adminGroupSymKeyV0, therefore it is already trusted. + */ + let userGroupSymKeyV0: AesKey + let groupKeysV0: GroupKey + let groupKeysV1: GroupKey + let userGroupSymKeyV1: AesKey + + o.beforeEach(async function () { + group.formerGroupKeys = createTestEntity(GroupKeysRefTypeRef, { list: formerGroupKeyListId }) + + // Prepare V2 + pubAdminGroupEncGKey.symKeyMac = createTestEntity(KeyMacTypeRef, { + tag: object(), + taggingKeyVersion: "1", + taggedKeyVersion: "2", + }) + group.pubAdminGroupEncGKey = pubAdminGroupEncGKey + + // Prepare V1 + groupKeysV1 = createTestEntity(GroupKeyTypeRef, { + pubAdminGroupEncGKey: createTestEntity(PubEncKeyDataTypeRef, { + symKeyMac: createTestEntity(KeyMacTypeRef, { + tag: new Uint8Array([1, 1, 1]), + taggedKeyVersion: "1", + taggingKeyVersion: "0", + }), + pubEncSymKey: object(), + recipientKeyVersion: "1", + recipientIdentifier: adminGroupId, + }), + adminGroupKeyVersion: "1", + }) + userGroupSymKeyV1 = object() + const adminKeyPairV1 = object() + when(keyLoaderFacade.loadKeypair(adminGroupId, 1)).thenResolve(adminKeyPairV1) + when( + asymmetricCryptoFacade.decryptSymKeyWithKeyPairAndAuthenticate(adminKeyPairV1, groupKeysV1.pubAdminGroupEncGKey!, { + identifier: group._id, + identifierType: PublicKeyIdentifierType.GROUP_ID, + }), + ).thenResolve({ + decryptedAesKey: userGroupSymKeyV1, + senderIdentityPubKey: object(), + }) + when(keyLoaderFacade.loadFormerGroupKeyInstance(group, 1)).thenResolve(groupKeysV1) + + // Prepare V0 + groupKeysV0 = createTestEntity(GroupKeyTypeRef, { + adminGroupEncGKey: object(), + adminGroupKeyVersion: "0", + }) + const adminSymKeyV0 = object() + when(keyLoaderFacade.loadSymGroupKey(adminGroupId, 0)).thenResolve(adminSymKeyV0) + userGroupSymKeyV0 = object() + when(cryptoWrapper.decryptKey(adminSymKeyV0, anything())).thenReturn(userGroupSymKeyV0) + }) + + o("successful asym decryption", async function () { + // Prepare V0 + when(keyLoaderFacade.loadFormerGroupKeyInstance(group, 0)).thenResolve(groupKeysV0) + + const returnedGroupKey = await groupManagementFacade.getCurrentGroupKeyViaAdminEncGKey(groupId) + + o(returnedGroupKey.object).equals(groupKeyBytes) + o(returnedGroupKey.version).equals(groupKeyVersion) + + let paramsCaptor = captor() + let paramsTagCaptor = captor() + // noinspection JSVoidFunctionReturnValueUsed + verify(keyAuthenticationFacade.verifyTag(paramsCaptor.capture(), paramsTagCaptor.capture())) + o(paramsCaptor.values?.length).equals(2) + + // check v1 + let params: UserGroupKeyAuthenticationParams = paramsCaptor.values![0] + o(params).deepEquals({ + tagType: "USER_GROUP_KEY_TAG", + sourceOfTrust: { currentUserGroupKey: userGroupSymKeyV0 }, + untrustedKey: { newUserGroupKey: userGroupSymKeyV1 }, + bindingData: { + adminGroupId, + userGroupId: groupId, + newAdminGroupKeyVersion: previousAdminGroupKeyVersion, + currentUserGroupKeyVersion: 0, + newUserGroupKeyVersion: 1, + }, + }) + let tagParam = paramsTagCaptor.values![0] + o(tagParam).equals(brandKeyMac(groupKeysV1.pubAdminGroupEncGKey!.symKeyMac!).tag) + + // verify v2 + params = paramsCaptor.values![1] + o(params).deepEquals({ + tagType: "USER_GROUP_KEY_TAG", + untrustedKey: { + newUserGroupKey: groupKeyBytes, + }, + sourceOfTrust: { + currentUserGroupKey: userGroupSymKeyV1, + }, + bindingData: { + adminGroupId, + userGroupId: groupId, + newAdminGroupKeyVersion: adminGroupKeyVersion, + newUserGroupKeyVersion: 2, + currentUserGroupKeyVersion: 1, + }, + }) + tagParam = paramsTagCaptor.values![1] + o(tagParam).equals(brandKeyMac(pubAdminGroupEncGKey.symKeyMac as KeyMac).tag) + }) + + o("user group key mac is invalid", async function () { + // Prepare V1 + // noinspection JSVoidFunctionReturnValueUsed + when(keyAuthenticationFacade.verifyTag(anything(), pubAdminGroupEncGKey.symKeyMac!.tag as MacTag)).thenThrow(new CryptoError("invalid mac")) + + // Prepare V0 + when(keyLoaderFacade.loadFormerGroupKeyInstance(group, 0)).thenResolve(groupKeysV0) + + await assertThrows(CryptoError, () => groupManagementFacade.getCurrentGroupKeyViaAdminEncGKey(groupId)) + }) + + o("user group key - no symmetrically encrypted former group key", async function () { + // Prepare V0 + groupKeysV0 = createTestEntity(GroupKeyTypeRef, { + adminGroupEncGKey: null, + pubAdminGroupEncGKey: createTestEntity(PubEncKeyDataTypeRef, { + symKeyMac: createTestEntity(KeyMacTypeRef, { + taggedKeyVersion: "0", + }), + }), + adminGroupKeyVersion: "0", + }) + when(keyLoaderFacade.loadFormerGroupKeyInstance(group, 0)).thenResolve(groupKeysV0) + + const error = await assertThrows(TutanotaError, () => groupManagementFacade.getCurrentGroupKeyViaAdminEncGKey(groupId)) + o(error.name).equals("UserGroupKeyNotTrustedError") + }) + }) - o(groupKey.version).equals(groupKeyVersion) - o(groupKey.object).deepEquals(groupKeyBytes) - verify(keyLoaderFacade.loadKeypair(adminGroupId, adminGroupKeyVersion)) - verify( - asymmetricCryptoFacade.decryptSymKeyWithKeyPairAndAuthenticate(adminGroupKeyPair, pubAdminGroupEncGKey, { - identifier: groupId, - identifierType: PublicKeyIdentifierType.GROUP_ID, - }), - { times: 1 }, - ) + o("user group key mac is invalid - former group key is symmetrically encrypted for the admin", async function () { + group.pubAdminGroupEncGKey = pubAdminGroupEncGKey + + pubAdminGroupEncGKey.symKeyMac = createTestEntity(KeyMacTypeRef, { + tag: object(), + taggingKeyVersion: "1", + taggedKeyVersion: "1", + taggingGroup: adminGroupId, + }) + group.formerGroupKeys = createTestEntity(GroupKeysRefTypeRef, { list: formerGroupKeyListId }) + + const formerGroupKeysV1 = createTestEntity(GroupKeyTypeRef, { + adminGroupEncGKey: object(), + adminGroupKeyVersion: "1", + }) + when(cryptoWrapper.decryptKey(anything(), formerGroupKeysV1.adminGroupEncGKey!)).thenReturn(object()) + + when(keyLoaderFacade.loadFormerGroupKeyInstance(group, 1)).thenResolve(formerGroupKeysV1) + // noinspection JSVoidFunctionReturnValueUsed + when(keyAuthenticationFacade.verifyTag(anything(), brandKeyMac(pubAdminGroupEncGKey.symKeyMac!).tag)).thenThrow(new CryptoError("invalid mac")) + await assertThrows(CryptoError, async () => await groupManagementFacade.getCurrentGroupKeyViaAdminEncGKey(groupId)) + }) }) o("decrypt with the group membership key if the admin happens to be a member of the target group", async function () { @@ -166,7 +386,7 @@ o.spec("GroupManagementFacadeTest", function () { await assertThrows(ProgrammingError, async () => await groupManagementFacade.getCurrentGroupKeyViaAdminEncGKey(groupId)) }) - o("throws when the group only has a dummy(!) admin en" + "crypted group key", async function () { + o("throws when the group only has a dummy(!) admin encrypted group key", async function () { group.adminGroupEncGKey = new Uint8Array(0) group.pubAdminGroupEncGKey = null await assertThrows(ProgrammingError, async () => await groupManagementFacade.getCurrentGroupKeyViaAdminEncGKey(groupId)) @@ -177,170 +397,4 @@ o.spec("GroupManagementFacadeTest", function () { await assertThrows(Error, async () => await groupManagementFacade.getCurrentGroupKeyViaAdminEncGKey(groupId)) }) }) - - o("replace local admin enc group key with global admin enc group key", async function () { - const symGlobalAdminGroupKey: VersionedKey = { - version: 1, - object: object(), - } - - const symLocalAdminGroupKey: VersionedKey = { - version: 0, - object: object(), - } - - const userGroup: Group = createTestEntity(GroupTypeRef, { - type: GroupType.User, - adminGroupEncGKey: object(), - adminGroupKeyVersion: "0", - admin: "localAdmin", - }) - - const before = createTestEntity(GroupTypeRef, userGroup) - const decrypted = object() - when(cryptoWrapper.decryptKey(matchers.anything(), matchers.anything())).thenReturn(decrypted) - const reencrypted = object() - when(cryptoWrapper.encryptKey(matchers.anything(), decrypted)).thenReturn(reencrypted) - - const groupUpdate = await groupManagementFacade.replaceLocalAdminEncGroupKeyWithGlobalAdminEncGroupKey( - symGlobalAdminGroupKey, - symLocalAdminGroupKey.object, - userGroup, - ) - - o(groupUpdate.adminGroupKeyVersion).equals(String(symGlobalAdminGroupKey.version)) - o(groupUpdate.adminGroupEncGKey).equals(reencrypted) - - o(userGroup).deepEquals(before) - }) - - o("traverse local admin groups", async function () { - // prepare test data... - // -------------------- - const globalAdminGroup = createGroupAndGroupInfo(GroupType.Admin, "adminGroups", "globalAdminId", "globalAdminId", new Uint8Array()) - const adminGroupKey: VersionedKey = { - object: [1, 2, 3], - version: 0, - } - const globalAdminUser = createTestEntity(UserTypeRef, { - customer: "someCustomerId", - memberships: [ - createTestEntity(GroupMembershipTypeRef, { - group: globalAdminGroup.group._id, - groupType: GroupType.Admin, - }), - ], - }) - const customer = createTestEntity(CustomerTypeRef, { - _id: "someCustomerId", - adminGroup: globalAdminGroup.group._id, - teamGroups: "teamGroupsIds", - }) - - const administratedGroupsRefs = [ - createTestEntity(AdministratedGroupsRefTypeRef, { items: "xs1" }), - createTestEntity(AdministratedGroupsRefTypeRef, { items: "xs2" }), - ] - - const localAdminGroup1 = createGroupAndGroupInfo( - GroupType.LocalAdmin, - customer.teamGroups, - "localAdminGroup1Id", - globalAdminGroup.group._id, - new Uint8Array(), - ) - localAdminGroup1.group.administratedGroups = administratedGroupsRefs[0] - - const localAdminGroup2 = createGroupAndGroupInfo( - GroupType.LocalAdmin, - customer.teamGroups, - "localAdminGroup2Id", - globalAdminGroup.group._id, - new Uint8Array(), - ) - localAdminGroup2.group.administratedGroups = administratedGroupsRefs[1] - - const userGroup1 = createGroupAndGroupInfo(GroupType.User, customer.userGroups, "u1", localAdminGroup1.group._id, new Uint8Array([1])) - const userGroup2 = createGroupAndGroupInfo(GroupType.User, customer.userGroups, "u2", localAdminGroup1.group._id, new Uint8Array([1, 2])) - const userGroup3 = createGroupAndGroupInfo(GroupType.User, customer.userGroups, "u3", localAdminGroup2.group._id, new Uint8Array([1, 2, 3])) - - const administratedGroupsByLocalAdmins = [ - createTestEntity(AdministratedGroupTypeRef, { - _id: ["xs1", "1"], - localAdminGroup: localAdminGroup1.group._id, - groupInfo: userGroup1.groupInfo._id, - }), - createTestEntity(AdministratedGroupTypeRef, { - _id: ["xs1", "2"], - localAdminGroup: localAdminGroup1.group._id, - groupInfo: userGroup2.groupInfo._id, - }), - createTestEntity(AdministratedGroupTypeRef, { - _id: ["xs2", "1"], - localAdminGroup: localAdminGroup2.group._id, - groupInfo: userGroup3.groupInfo._id, - }), - ] - - // mock body of the function - // ------------------------- - when(userFacade.getLoggedInUser()).thenReturn(globalAdminUser) - when(entityClient.load(CustomerTypeRef, "someCustomerId")).thenResolve(customer) - when(entityClient.loadAll(GroupInfoTypeRef, "teamGroupsIds")).thenResolve([localAdminGroup1.groupInfo, localAdminGroup2.groupInfo]) - when(keyLoaderFacade.getCurrentSymGroupKey("globalAdminId")).thenResolve(adminGroupKey) // const adminGroupKey = await this.keyLoaderFacade.getCurrentSymGroupKey(adminGroupId) - - // inner loop loading administrated groups - // for the administrated groups of the first local admin - when(entityClient.loadAll(AdministratedGroupTypeRef, "xs1")).thenResolve([administratedGroupsByLocalAdmins[0], administratedGroupsByLocalAdmins[1]]) - // for the administrated groups of the second local admin - when(entityClient.loadAll(AdministratedGroupTypeRef, "xs2")).thenResolve([administratedGroupsByLocalAdmins[2]]) - - // stubbing - const save = groupManagementFacade.getCurrentGroupKeyViaAdminEncGKey - groupManagementFacade.getCurrentGroupKeyViaAdminEncGKey = () => { - return object() - } - // when(groupManagementFacade.getCurrentGroupKeyViaAdminEncGKey("localAdminGroup1Id")).thenResolve(object()) - // when(groupManagementFacade.getCurrentGroupKeyViaAdminEncGKey("localAdminGroup2Id")).thenResolve(object()) - - // now run mocked function - // ----------------------- - await groupManagementFacade.migrateLocalAdminsToGlobalAdmins() - - verify( - serviceExecutor.post( - LocalAdminRemovalService, - matchers.argThat((postIn: LocalAdminRemovalPostIn) => { - const userWithIds = postIn.groupUpdates.map((user) => user.groupId).sort() - o(userWithIds.sort()).deepEquals(["u1", "u2", "u3"]) - return true - }), - ), - ) - - groupManagementFacade.getCurrentGroupKeyViaAdminEncGKey = save - }) - - function createGroupAndGroupInfo( - groupType: GroupType, - groupInfoListId: string, - groupId: string, - adminGroup: string, - adminGroupEncGroupKey: Uint8Array, - ): { - group: Group - groupInfo: GroupInfo - } { - const groupInfo = createTestEntity(GroupInfoTypeRef, { _id: [groupInfoListId, `groupInfo${groupId}`], groupType: groupType, group: groupId }) - const group = createTestEntity(GroupTypeRef, { - type: groupType, - admin: adminGroup, - _id: groupId, - adminGroupEncGKey: adminGroupEncGroupKey, - }) - when(entityClient.load(GroupTypeRef, groupId)).thenResolve(group) - when(entityClient.load(GroupInfoTypeRef, groupInfo._id)).thenResolve(groupInfo) - - return { group, groupInfo } - } }) diff --git a/test/tests/api/worker/facades/KeyAuthenticationFacadeTest.ts b/test/tests/api/worker/facades/KeyAuthenticationFacadeTest.ts new file mode 100644 index 000000000000..e1a747666ee9 --- /dev/null +++ b/test/tests/api/worker/facades/KeyAuthenticationFacadeTest.ts @@ -0,0 +1,252 @@ +import o from "@tutao/otest" +import { + AdminSymKeyAuthenticationParams, + KeyAuthenticationFacade, + NewAdminPubKeyAuthenticationParams, + PubDistKeyAuthenticationParams, + UserGroupKeyAuthenticationParams, +} from "../../../../../src/common/api/worker/facades/KeyAuthenticationFacade.js" +import { Aes256Key, aes256RandomKey, EccPublicKey, KeyPairType, KyberPublicKey } from "@tutao/tutanota-crypto" +import { CryptoWrapper } from "../../../../../src/common/api/worker/crypto/CryptoWrapper.js" +import { assertThrows } from "@tutao/tutanota-test-utils" +import { CryptoError } from "@tutao/tutanota-crypto/error.js" +import { KeyVersion } from "@tutao/tutanota-utils" +import { checkKeyVersionConstraints } from "../../../../../src/common/api/worker/facades/KeyLoaderFacade.js" + +const WRONG_BYTES = new Uint8Array([255, 254, 253]) +const WRONG_ID: Id = "I_CLEARLY_MISSED_SOMETHING" // this must be base64 compatible + +function mergeParams(params, propertyName, value) { + return { ...params, bindingData: { ...params.bindingData, [propertyName]: value } } +} + +function nextKeyVersion(v: KeyVersion): KeyVersion { + return checkKeyVersionConstraints(v + 1) +} + +o.spec("KeyAuthenticationFacadeTest", function () { + let keyAuthenticationFacade: KeyAuthenticationFacade + let cryptoWrapper: CryptoWrapper + + let userGroupId: Id + let adminGroupId: Id + let currentUserGroupKey: Aes256Key + let currentUserGroupKeyVersion: KeyVersion + let newUserGroupKey: Aes256Key + let newUserGroupKeyVersion: KeyVersion + let currentAdminGroupKey: Aes256Key + let currentAdminGroupKeyVersion: KeyVersion + let newAdminGroupKey: Aes256Key + let newAdminGroupKeyVersion: KeyVersion + let eccPublicKey: EccPublicKey + let kyberPublicKey: KyberPublicKey + + o.beforeEach(async function () { + cryptoWrapper = new CryptoWrapper() + keyAuthenticationFacade = new KeyAuthenticationFacade(cryptoWrapper) + + userGroupId = "userGroupId" + adminGroupId = "adminGroupId" + + currentUserGroupKey = aes256RandomKey() + currentUserGroupKeyVersion = 0 as KeyVersion + currentAdminGroupKey = aes256RandomKey() + currentAdminGroupKeyVersion = 0 as KeyVersion + + newUserGroupKey = aes256RandomKey() + newUserGroupKeyVersion = 1 as KeyVersion + newAdminGroupKey = aes256RandomKey() + newAdminGroupKeyVersion = 1 as KeyVersion + + kyberPublicKey = { raw: new Uint8Array([1, 2, 3]) } + eccPublicKey = new Uint8Array([4, 5, 6]) + }) + + o.spec("user group key authentication system", function () { + o("should verify computed tag", async function () { + const params: UserGroupKeyAuthenticationParams = { + tagType: "USER_GROUP_KEY_TAG", + untrustedKey: { newUserGroupKey }, + sourceOfTrust: { currentUserGroupKey: currentUserGroupKey }, + bindingData: { + newAdminGroupKeyVersion, + adminGroupId, + userGroupId, + currentUserGroupKeyVersion, + newUserGroupKeyVersion, + }, + } + const tag = keyAuthenticationFacade.computeTag(params) + + keyAuthenticationFacade.verifyTag(params, tag) + + const wrongUserGroupId: UserGroupKeyAuthenticationParams = mergeParams(params, "userGroupId", WRONG_ID) + await assertThrows(CryptoError, async () => keyAuthenticationFacade.verifyTag(wrongUserGroupId, tag)) + + const wrongAdminGroupId: UserGroupKeyAuthenticationParams = mergeParams(params, "adminGroupId", WRONG_ID) + await assertThrows(CryptoError, async () => keyAuthenticationFacade.verifyTag(wrongAdminGroupId, tag)) + + const wrongNewAdminGroupKeyVersion: UserGroupKeyAuthenticationParams = mergeParams( + params, + "newAdminGroupKeyVersion", + nextKeyVersion(params.bindingData.newAdminGroupKeyVersion), + ) + await assertThrows(CryptoError, async () => keyAuthenticationFacade.verifyTag(wrongNewAdminGroupKeyVersion, tag)) + + const wrongCurrentUserGroupKey: UserGroupKeyAuthenticationParams = { ...params, sourceOfTrust: { currentUserGroupKey: aes256RandomKey() } } + await assertThrows(CryptoError, async () => keyAuthenticationFacade.verifyTag(wrongCurrentUserGroupKey, tag)) + + const wrongNewUserGroupKey: UserGroupKeyAuthenticationParams = { ...params, untrustedKey: { newUserGroupKey: aes256RandomKey() } } + await assertThrows(CryptoError, async () => keyAuthenticationFacade.verifyTag(wrongNewUserGroupKey, tag)) + }) + }) + + o.spec("new admin public key authentication system", function () { + o("should verify computed tag", async function () { + const params: NewAdminPubKeyAuthenticationParams = { + tagType: "NEW_ADMIN_PUB_KEY_TAG", + sourceOfTrust: { receivingUserGroupKey: currentUserGroupKey }, + untrustedKey: { + newAdminPubKey: { + keyPairType: KeyPairType.TUTA_CRYPT, + kyberPublicKey, + eccPublicKey, + }, + }, + bindingData: { + newAdminGroupKeyVersion, + currentReceivingUserGroupKeyVersion: currentUserGroupKeyVersion, + adminGroupId, + userGroupId, + }, + } + const tag = keyAuthenticationFacade.computeTag(params) + + keyAuthenticationFacade.verifyTag(params, tag) + + const wrongUserGroupId: NewAdminPubKeyAuthenticationParams = mergeParams(params, "userGroupId", WRONG_ID) + await assertThrows(CryptoError, async () => keyAuthenticationFacade.verifyTag(wrongUserGroupId, tag)) + + const wrongAdminGroupId: NewAdminPubKeyAuthenticationParams = mergeParams(params, "adminGroupId", WRONG_ID) + await assertThrows(CryptoError, async () => keyAuthenticationFacade.verifyTag(wrongAdminGroupId, tag)) + + const wrongNewAdminGroupKeyVersion: NewAdminPubKeyAuthenticationParams = mergeParams( + params, + "newAdminGroupKeyVersion", + nextKeyVersion(params.bindingData.newAdminGroupKeyVersion), + ) + + await assertThrows(CryptoError, async () => keyAuthenticationFacade.verifyTag(wrongNewAdminGroupKeyVersion, tag)) + + const wrongCurrentUserGroupKey: NewAdminPubKeyAuthenticationParams = { ...params, sourceOfTrust: { receivingUserGroupKey: aes256RandomKey() } } + await assertThrows(CryptoError, async () => keyAuthenticationFacade.verifyTag(wrongCurrentUserGroupKey, tag)) + + const wrongPubEccKey: NewAdminPubKeyAuthenticationParams = { + ...params, + untrustedKey: { newAdminPubKey: { ...params.untrustedKey.newAdminPubKey, eccPublicKey: WRONG_BYTES } }, + } + await assertThrows(CryptoError, async () => keyAuthenticationFacade.verifyTag(wrongPubEccKey, tag)) + + const wrongPubKyberKey: NewAdminPubKeyAuthenticationParams = { + ...params, + untrustedKey: { newAdminPubKey: { ...params.untrustedKey.newAdminPubKey, kyberPublicKey: { raw: WRONG_BYTES } } }, + } + await assertThrows(CryptoError, async () => keyAuthenticationFacade.verifyTag(wrongPubKyberKey, tag)) + }) + }) + + o.spec("public distribution key authentication system", function () { + o("should verify computed tag", async function () { + const params: PubDistKeyAuthenticationParams = { + tagType: "PUB_DIST_KEY_TAG", + sourceOfTrust: { currentAdminGroupKey }, + untrustedKey: { distPubKey: { keyPairType: KeyPairType.TUTA_CRYPT, kyberPublicKey, eccPublicKey } }, + bindingData: { + adminGroupId, + userGroupId, + currentUserGroupKeyVersion, + currentAdminGroupKeyVersion, + }, + } + const tag = keyAuthenticationFacade.computeTag(params) + + keyAuthenticationFacade.verifyTag(params, tag) + + const wrongUserGroupId: PubDistKeyAuthenticationParams = mergeParams(params, "userGroupId", WRONG_ID) + await assertThrows(CryptoError, async () => keyAuthenticationFacade.verifyTag(wrongUserGroupId, tag)) + + const wrongAdminGroupId: PubDistKeyAuthenticationParams = mergeParams(params, "adminGroupId", WRONG_ID) + await assertThrows(CryptoError, async () => keyAuthenticationFacade.verifyTag(wrongAdminGroupId, tag)) + + const wrongCurrentUserGroupKeyVersion: PubDistKeyAuthenticationParams = mergeParams( + params, + "currentUserGroupKeyVersion", + nextKeyVersion(params.bindingData.currentUserGroupKeyVersion), + ) + await assertThrows(CryptoError, async () => keyAuthenticationFacade.verifyTag(wrongCurrentUserGroupKeyVersion, tag)) + + const wrongCurrentAdminGroupKey: PubDistKeyAuthenticationParams = { ...params, sourceOfTrust: { currentAdminGroupKey: aes256RandomKey() } } + await assertThrows(CryptoError, async () => keyAuthenticationFacade.verifyTag(wrongCurrentAdminGroupKey, tag)) + + const wrongPubEccKey: PubDistKeyAuthenticationParams = { + ...params, + untrustedKey: { distPubKey: { ...params.untrustedKey.distPubKey, eccPublicKey: WRONG_BYTES } }, + } + + await assertThrows(CryptoError, async () => keyAuthenticationFacade.verifyTag(wrongPubEccKey, tag)) + + const wrongPubKyberKey: PubDistKeyAuthenticationParams = { + ...params, + untrustedKey: { + distPubKey: { + ...params.untrustedKey.distPubKey, + kyberPublicKey: { raw: WRONG_BYTES }, + }, + }, + } + await assertThrows(CryptoError, async () => keyAuthenticationFacade.verifyTag(wrongPubKyberKey, tag)) + }) + }) + + o.spec("admin group symmetric key authentication system", function () { + o("should verify computed tag", async function () { + const params: AdminSymKeyAuthenticationParams = { + tagType: "ADMIN_SYM_KEY_TAG", + sourceOfTrust: { currentReceivingUserGroupKey: currentUserGroupKey }, + untrustedKey: { newAdminGroupKey }, + bindingData: { + adminGroupId, + userGroupId, + currentReceivingUserGroupKeyVersion: currentUserGroupKeyVersion, + newAdminGroupKeyVersion, + }, + } + const tag = keyAuthenticationFacade.computeTag(params) + + keyAuthenticationFacade.verifyTag(params, tag) + + const wrongUserGroupId: AdminSymKeyAuthenticationParams = mergeParams(params, "userGroupId", WRONG_ID) + await assertThrows(CryptoError, async () => keyAuthenticationFacade.verifyTag(wrongUserGroupId, tag)) + + const wrongAdminGroupId: AdminSymKeyAuthenticationParams = mergeParams(params, "adminGroupId", WRONG_ID) + await assertThrows(CryptoError, async () => keyAuthenticationFacade.verifyTag(wrongAdminGroupId, tag)) + + const wrongCurrentReceivingUserGroupKey: AdminSymKeyAuthenticationParams = { + ...params, + sourceOfTrust: { + currentReceivingUserGroupKey: aes256RandomKey(), + }, + } + await assertThrows(CryptoError, async () => keyAuthenticationFacade.verifyTag(wrongCurrentReceivingUserGroupKey, tag)) + + const wrongNewAdminGroupKeyVersion: AdminSymKeyAuthenticationParams = mergeParams(params, "newAdminGroupKeyVersion", 2) + await assertThrows(CryptoError, async () => keyAuthenticationFacade.verifyTag(wrongNewAdminGroupKeyVersion, tag)) + + const wrongAdminSymKey: AdminSymKeyAuthenticationParams = { + ...params, + untrustedKey: { newAdminGroupKey: aes256RandomKey() }, + } + await assertThrows(CryptoError, async () => keyAuthenticationFacade.verifyTag(wrongAdminSymKey, tag)) + }) + }) +}) diff --git a/test/tests/api/worker/facades/KeyCacheTest.ts b/test/tests/api/worker/facades/KeyCacheTest.ts index 604cc54db37f..966026469b3c 100644 --- a/test/tests/api/worker/facades/KeyCacheTest.ts +++ b/test/tests/api/worker/facades/KeyCacheTest.ts @@ -4,74 +4,97 @@ import { KeyCache } from "../../../../../src/common/api/worker/facades/KeyCache. import { createTestEntity } from "../../../TestUtils.js" import { aes256RandomKey } from "@tutao/tutanota-crypto" import { NotAuthorizedError } from "../../../../../src/common/api/common/error/RestError.js" +import { object } from "testdouble" +import { KeyVersion } from "@tutao/tutanota-utils" +import { VersionedKey } from "../../../../../src/common/api/worker/crypto/CryptoWrapper.js" +import { assertThrows } from "@tutao/tutanota-test-utils" +import { CryptoError } from "@tutao/tutanota-crypto/error.js" o.spec("KeyCacheTest", function () { let keyCache: KeyCache o.beforeEach(function () { keyCache = new KeyCache() - keyCache.setCurrentUserGroupKey({ version: 0, object: aes256RandomKey() }) }) - o("removeOutdatedGroupKeys - new group key version for cached key", async function () { - let groupId = "groupId" - const user = createTestEntity(UserTypeRef, { - userGroup: createTestEntity(GroupMembershipTypeRef), - memberships: [createTestEntity(GroupMembershipTypeRef, { group: groupId, groupKeyVersion: "1" })], + o.spec("removeOutdatedGroupKeys", function () { + o.beforeEach(function () { + keyCache.setCurrentUserGroupKey({ version: 0, object: aes256RandomKey() }) }) - // add version 0 tp cache - await keyCache.getCurrentGroupKey(groupId, () => Promise.resolve({ version: 0, object: aes256RandomKey() })) - await keyCache.removeOutdatedGroupKeys(user) - const cachedKey = await keyCache.getCurrentGroupKey(groupId, async () => { - return { version: 1, object: aes256RandomKey() } - }) - o(cachedKey.version).equals(1) - }) + o("new group key version for cached key", async function () { + let groupId = "groupId" + const user = createTestEntity(UserTypeRef, { + userGroup: createTestEntity(GroupMembershipTypeRef), + memberships: [createTestEntity(GroupMembershipTypeRef, { group: groupId, groupKeyVersion: "1" })], + }) + // add version 0 tp cache + await keyCache.getCurrentGroupKey(groupId, () => Promise.resolve({ version: 0, object: aes256RandomKey() })) - o("removeOutdatedGroupKeys - no version update for cached key", async function () { - let groupId = "groupId" - const user = createTestEntity(UserTypeRef, { - userGroup: createTestEntity(GroupMembershipTypeRef), - memberships: [createTestEntity(GroupMembershipTypeRef, { group: groupId, groupKeyVersion: "0" })], + await keyCache.removeOutdatedGroupKeys(user) + const cachedKey = await keyCache.getCurrentGroupKey(groupId, async () => { + return { version: 1, object: aes256RandomKey() } + }) + o(cachedKey.version).equals(1) }) - await keyCache.getCurrentGroupKey(groupId, () => Promise.resolve({ version: 0, object: aes256RandomKey() })) - await keyCache.removeOutdatedGroupKeys(user) - const cachedKey = await keyCache.getCurrentGroupKey(groupId, async () => { - throw new Error("unexpected call to key loader") + o("no version update for cached key", async function () { + let groupId = "groupId" + const user = createTestEntity(UserTypeRef, { + userGroup: createTestEntity(GroupMembershipTypeRef), + memberships: [createTestEntity(GroupMembershipTypeRef, { group: groupId, groupKeyVersion: "0" })], + }) + await keyCache.getCurrentGroupKey(groupId, () => Promise.resolve({ version: 0, object: aes256RandomKey() })) + + await keyCache.removeOutdatedGroupKeys(user) + const cachedKey = await keyCache.getCurrentGroupKey(groupId, async () => { + throw new Error("unexpected call to key loader") + }) + o(cachedKey.version).equals(0) }) - o(cachedKey.version).equals(0) - }) - o("removeOutdatedGroupKeys - removed membership for cached key", async function () { - let groupId = "groupId" - const user = createTestEntity(UserTypeRef, { - userGroup: createTestEntity(GroupMembershipTypeRef), - memberships: [], + o("removed membership for cached key", async function () { + let groupId = "groupId" + const user = createTestEntity(UserTypeRef, { + userGroup: createTestEntity(GroupMembershipTypeRef), + memberships: [], + }) + await keyCache.getCurrentGroupKey(groupId, () => Promise.resolve({ version: 0, object: aes256RandomKey() })) + + await keyCache.removeOutdatedGroupKeys(user) + + // We expect that there is no cached entry for that group id and therefore the key loader will be invoked. + o(async () => + keyCache.getCurrentGroupKey(groupId, async () => { + throw new NotAuthorizedError("unexpected call to key loader") + }), + ).asyncThrows(NotAuthorizedError) }) - await keyCache.getCurrentGroupKey(groupId, () => Promise.resolve({ version: 0, object: aes256RandomKey() })) - await keyCache.removeOutdatedGroupKeys(user) + o("ignore user group key update", async function () { + let groupId = "groupId" + const user = createTestEntity(UserTypeRef, { + userGroup: createTestEntity(GroupMembershipTypeRef, { group: "userGroupId", groupKeyVersion: "1" }), + memberships: [createTestEntity(GroupMembershipTypeRef, { group: groupId, groupKeyVersion: "0" })], + }) - // We expect that there is no cached entry for that group id and therefore the key loader will be invoked. - o(async () => - keyCache.getCurrentGroupKey(groupId, async () => { - throw new NotAuthorizedError("unexpected call to key loader") - }), - ).asyncThrows(NotAuthorizedError) + await keyCache.removeOutdatedGroupKeys(user) + const cachedUserGroupKey = keyCache.getCurrentUserGroupKey() + // @ts-ignore + o(cachedUserGroupKey.version).equals(0) + }) }) - o("removeOutdatedGroupKeys - ignore user group key update", async function () { - let groupId = "groupId" - const user = createTestEntity(UserTypeRef, { - userGroup: createTestEntity(GroupMembershipTypeRef, { group: "userGroupId", groupKeyVersion: "1" }), - memberships: [createTestEntity(GroupMembershipTypeRef, { group: groupId, groupKeyVersion: "0" })], + o.spec("enforce version constraints", function () { + const groupId = "groupId" + const invalidVersionedKey: VersionedKey = { version: -1 as KeyVersion, object: object() } + + o("setCurrentUserGroupKey", function () { + o(() => keyCache.setCurrentUserGroupKey(invalidVersionedKey)).throws(CryptoError) }) - await keyCache.removeOutdatedGroupKeys(user) - const cachedUserGroupKey = keyCache.getCurrentUserGroupKey() - // @ts-ignore - o(cachedUserGroupKey.version).equals(0) + o("getCurrentGroupKey", async function () { + await assertThrows(CryptoError, async () => keyCache.getCurrentGroupKey(groupId, async () => invalidVersionedKey)) + }) }) }) diff --git a/test/tests/api/worker/facades/KeyLoaderFacadeTest.ts b/test/tests/api/worker/facades/KeyLoaderFacadeTest.ts index 2542125e044e..eac512fa3022 100644 --- a/test/tests/api/worker/facades/KeyLoaderFacadeTest.ts +++ b/test/tests/api/worker/facades/KeyLoaderFacadeTest.ts @@ -9,11 +9,15 @@ import { AesKey, encryptEccKey, encryptKey, + encryptRsaKey, kyberPrivateKeyToBytes, kyberPublicKeyToBytes, PQKeyPairs, + RsaKeyPair, + rsaPublicKeyToHex, } from "@tutao/tutanota-crypto" import { + createKeyPair, Group, GroupKey, GroupKeysRefTypeRef, @@ -29,13 +33,16 @@ import { import { createTestEntity } from "../../../TestUtils.js" import { EntityClient } from "../../../../../src/common/api/common/EntityClient.js" import { matchers, object, reset, verify, when } from "testdouble" -import { KeyLoaderFacade } from "../../../../../src/common/api/worker/facades/KeyLoaderFacade.js" +import { checkKeyVersionConstraints, KeyLoaderFacade, parseKeyVersion } from "../../../../../src/common/api/worker/facades/KeyLoaderFacade.js" import { stringToCustomId } from "../../../../../src/common/api/common/utils/EntityUtils.js" -import { assertNotNull, freshVersioned } from "@tutao/tutanota-utils" +import { assertNotNull, freshVersioned, hexToUint8Array } from "@tutao/tutanota-utils" import { KeyCache } from "../../../../../src/common/api/worker/facades/KeyCache.js" import { assertThrows } from "@tutao/tutanota-test-utils" import { CacheManagementFacade } from "../../../../../src/common/api/worker/facades/lazy/CacheManagementFacade.js" import { VersionedKey } from "../../../../../src/common/api/worker/crypto/CryptoWrapper.js" +import { KeyVersion } from "@tutao/tutanota-utils/dist/Utils.js" +import { CryptoError } from "@tutao/tutanota-crypto/error.js" +import { RSA_TEST_KEYPAIR } from "./RsaPqPerformanceTest.js" o.spec("KeyLoaderFacadeTest", function () { let keyCache: KeyCache @@ -52,7 +59,7 @@ o.spec("KeyLoaderFacadeTest", function () { let formerKeysDecrypted: AesKey[] let currentGroupKey: VersionedKey let userGroupKey: VersionedKey - let currentGroupKeyVersion: number + let currentGroupKeyVersion: KeyVersion let formerKeyPairsDecrypted: PQKeyPairs[] const FORMER_KEYS = 2 let currentKeyPair: PQKeyPairs @@ -74,8 +81,8 @@ o.spec("KeyLoaderFacadeTest", function () { formerKeyPairsDecrypted.push(await pqFacade.generateKeyPairs()) } - currentGroupKeyVersion = formerKeysDecrypted.length - currentGroupKey = { object: aes256RandomKey(), version: Number(currentGroupKeyVersion) } + currentGroupKeyVersion = formerKeysDecrypted.length as KeyVersion + currentGroupKey = { object: aes256RandomKey(), version: currentGroupKeyVersion } let lastKey = currentGroupKey.object @@ -137,7 +144,7 @@ o.spec("KeyLoaderFacadeTest", function () { o.spec("getCurrentSymGroupKey", function () { o("getting userGroup key", async function () { const currentUserGroupKey = await keyLoaderFacade.getCurrentSymGroupKey(userGroup._id) - o(currentUserGroupKey.version).equals(Number(userGroup.groupKeyVersion)) + o(currentUserGroupKey.version).equals(parseKeyVersion(userGroup.groupKeyVersion)) o(currentUserGroupKey.object).deepEquals(userGroupKey.object) verify(userFacade.getMembership(matchers.anything()), { times: 0 }) await keyLoaderFacade.getCurrentSymGroupKey(userGroup._id) @@ -146,7 +153,7 @@ o.spec("KeyLoaderFacadeTest", function () { o("getting non-userGroup key", async function () { const groupKey = await keyLoaderFacade.getCurrentSymGroupKey(group._id) - o(groupKey.version).equals(Number(group.groupKeyVersion)) + o(groupKey.version).equals(parseKeyVersion(group.groupKeyVersion)) o(groupKey.object).deepEquals(currentGroupKey.object) verify(userFacade.getMembership(group._id)) reset() @@ -167,14 +174,14 @@ o.spec("KeyLoaderFacadeTest", function () { o("loads former key.", async function (): Promise { for (let i = 0; i < FORMER_KEYS; i++) { - const keypair = (await keyLoaderFacade.loadKeypair(group._id, i)) as PQKeyPairs + const keypair = (await keyLoaderFacade.loadKeypair(group._id, i as KeyVersion)) as PQKeyPairs o(keypair).deepEquals(formerKeyPairsDecrypted[i]) } verify(cacheManagementFacade.refreshKeyCache(matchers.anything()), { times: 0 }) }) o("load key pair when group is updated in cache but key cache still has the old sym key", async function () { - const requestedVersion = currentGroupKeyVersion - 1 + const requestedVersion = checkKeyVersionConstraints(currentGroupKeyVersion - 1) when(entityClient.load(GroupKeyTypeRef, [assertNotNull(group.formerGroupKeys).list, stringToCustomId(String(requestedVersion))])).thenResolve( formerKeys[requestedVersion], ) @@ -183,6 +190,46 @@ o.spec("KeyLoaderFacadeTest", function () { o(keypair).deepEquals(formerKeyPairsDecrypted[requestedVersion]) verify(cacheManagementFacade.refreshKeyCache(matchers.anything()), { times: 0 }) }) + + o("rsa key pair in version > 0 is rejected", async function () { + currentGroupKey.version = 1 + group.groupKeyVersion = String(currentGroupKey.version) + group.currentKeys = createKeyPair({ + pubEccKey: currentKeyPair.eccKeyPair.publicKey, + symEncPrivEccKey: encryptEccKey(currentGroupKey.object, currentKeyPair.eccKeyPair.privateKey), + pubKyberKey: null, + symEncPrivKyberKey: null, + symEncPrivRsaKey: encryptRsaKey(currentGroupKey.object, RSA_TEST_KEYPAIR.privateKey), + pubRsaKey: hexToUint8Array(rsaPublicKeyToHex(RSA_TEST_KEYPAIR.publicKey)), + }) + keyCache = object() + keyLoaderFacade = new KeyLoaderFacade(keyCache, userFacade, entityClient, async () => cacheManagementFacade) + when(entityClient.load(GroupTypeRef, group._id)).thenResolve(group) + when(keyCache.getCurrentGroupKey(group._id, matchers.anything())).thenResolve(currentGroupKey) + + await assertThrows(CryptoError, async () => keyLoaderFacade.loadKeypair(group._id, currentGroupKey.version)) + }) + + o("rsa key pair in version 0 is loaded", async function () { + currentGroupKey.version = 0 + group.groupKeyVersion = String(currentGroupKey.version) + group.currentKeys = createKeyPair({ + pubEccKey: currentKeyPair.eccKeyPair.publicKey, + symEncPrivEccKey: encryptEccKey(currentGroupKey.object, currentKeyPair.eccKeyPair.privateKey), + pubKyberKey: null, + symEncPrivKyberKey: null, + symEncPrivRsaKey: encryptRsaKey(currentGroupKey.object, RSA_TEST_KEYPAIR.privateKey), + pubRsaKey: hexToUint8Array(rsaPublicKeyToHex(RSA_TEST_KEYPAIR.publicKey)), + }) + keyCache = object() + keyLoaderFacade = new KeyLoaderFacade(keyCache, userFacade, entityClient, async () => cacheManagementFacade) + when(entityClient.load(GroupTypeRef, group._id)).thenResolve(group) + when(keyCache.getCurrentGroupKey(group._id, matchers.anything())).thenResolve(currentGroupKey) + + const loadedKeypair: RsaKeyPair = (await keyLoaderFacade.loadKeypair(group._id, currentGroupKey.version)) as RsaKeyPair + o(loadedKeypair.publicKey).deepEquals(RSA_TEST_KEYPAIR.publicKey) + o(loadedKeypair.privateKey).deepEquals(RSA_TEST_KEYPAIR.privateKey) + }) }) o.spec("loadCurrentKeyPair", function () { @@ -191,12 +238,31 @@ o.spec("KeyLoaderFacadeTest", function () { o(loadedCurrentKeyPair.object).deepEquals(currentKeyPair) o(loadedCurrentKeyPair.version).equals(currentGroupKeyVersion) }) + + o("rsa key pair in version > 0 is rejected", async function () { + currentGroupKey.version = 1 + group.groupKeyVersion = String(currentGroupKey.version) + group.currentKeys = createKeyPair({ + pubEccKey: currentKeyPair.eccKeyPair.publicKey, + symEncPrivEccKey: encryptEccKey(currentGroupKey.object, currentKeyPair.eccKeyPair.privateKey), + pubKyberKey: null, + symEncPrivKyberKey: null, + symEncPrivRsaKey: encryptRsaKey(currentGroupKey.object, RSA_TEST_KEYPAIR.privateKey), + pubRsaKey: hexToUint8Array(rsaPublicKeyToHex(RSA_TEST_KEYPAIR.publicKey)), + }) + keyCache = object() + keyLoaderFacade = new KeyLoaderFacade(keyCache, userFacade, entityClient, async () => cacheManagementFacade) + when(entityClient.load(GroupTypeRef, group._id)).thenResolve(group) + when(keyCache.getCurrentGroupKey(group._id, matchers.anything())).thenResolve(currentGroupKey) + + await assertThrows(CryptoError, async () => keyLoaderFacade.loadCurrentKeyPair(group._id)) + }) }) o.spec("loadSymGroupKey", function () { o("loads and decrypts former keys.", async function () { for (let i = 0; i < FORMER_KEYS; i++) { - const loadedGroupKey = await keyLoaderFacade.loadSymGroupKey(group._id, i) + const loadedGroupKey = await keyLoaderFacade.loadSymGroupKey(group._id, i as KeyVersion) o(loadedGroupKey).deepEquals(formerKeysDecrypted[i]) } verify(cacheManagementFacade.refreshKeyCache(matchers.anything()), { times: 0 }) @@ -208,7 +274,7 @@ o.spec("KeyLoaderFacadeTest", function () { }) o("outdated currentGroupKey throws", async function () { - const outdatedCurrentGroupKeyVersion = currentGroupKeyVersion - 1 + const outdatedCurrentGroupKeyVersion = checkKeyVersionConstraints(currentGroupKeyVersion - 1) await assertThrows(Error, () => keyLoaderFacade.loadSymGroupKey(group._id, currentGroupKeyVersion, { object: formerKeysDecrypted[outdatedCurrentGroupKeyVersion], @@ -221,7 +287,7 @@ o.spec("KeyLoaderFacadeTest", function () { o.spec("loadSymUserGroupKey", function () { o("key cache is outdated and refreshes", async function () { - const requestedGroupKeyVersion = Number(userGroup.groupKeyVersion) + 1 + const requestedGroupKeyVersion = checkKeyVersionConstraints(Number(userGroup.groupKeyVersion) + 1) const refreshedUserGroupKey = { version: requestedGroupKeyVersion, object: aes256RandomKey() } when(cacheManagementFacade.refreshKeyCache(userGroup._id)).thenDo(() => { // cached key version is less than the requested one, but we can refresh successfully @@ -281,7 +347,7 @@ o.spec("KeyLoaderFacadeTest", function () { }) o("loadKeyPair", async function () { - const loadedKeyPair = await keyLoaderFacade.loadKeypair(group._id, Number(membership.groupKeyVersion)) + const loadedKeyPair = await keyLoaderFacade.loadKeypair(group._id, parseKeyVersion(membership.groupKeyVersion)) o(loadedKeyPair).deepEquals(currentKeyPair) verify(cacheManagementFacade.refreshKeyCache(group._id), { times: 1 }) @@ -311,10 +377,22 @@ o.spec("KeyLoaderFacadeTest", function () { }) o("loadKeyPair", async function () { - await assertThrows(Error, () => keyLoaderFacade.loadKeypair(group._id, Number(membership.groupKeyVersion))) + await assertThrows(Error, () => keyLoaderFacade.loadKeypair(group._id, parseKeyVersion(membership.groupKeyVersion))) verify(cacheManagementFacade.refreshKeyCache(group._id), { times: 1 }) }) }) }) }) + +o.spec("checkKeyVersionConstraints", function () { + o("is an integer", function () { + o(checkKeyVersionConstraints(0)).equals(0) + }) + o("is negative", function () { + o(() => checkKeyVersionConstraints(-1)).throws(CryptoError) + }) + o("is not an integer", function () { + o(() => checkKeyVersionConstraints(1.5)).throws(CryptoError) + }) +}) diff --git a/test/tests/api/worker/facades/KeyRotationFacadeTest.ts b/test/tests/api/worker/facades/KeyRotationFacadeTest.ts index aa12157310a0..1eb4c4ccb78f 100644 --- a/test/tests/api/worker/facades/KeyRotationFacadeTest.ts +++ b/test/tests/api/worker/facades/KeyRotationFacadeTest.ts @@ -1,13 +1,14 @@ import o from "@tutao/otest" -import { KeyRotationFacade } from "../../../../../src/common/api/worker/facades/KeyRotationFacade.js" +import { KeyRotationFacade, MultiAdminGroupKeyAdminActionPath } from "../../../../../src/common/api/worker/facades/KeyRotationFacade.js" import { EntityClient } from "../../../../../src/common/api/common/EntityClient.js" import { instance, matchers, object, verify, when } from "testdouble" import { createTestEntity } from "../../../TestUtils.js" import { - AdminGroupKeyAuthenticationData, - AdminGroupKeyAuthenticationDataTypeRef, + AdminGroupKeyRotationGetOutTypeRef, AdminGroupKeyRotationPostIn, - createPublicKeyGetOut, + AdminGroupKeyRotationPutIn, + createKeyPair, + createPubEncKeyData, Customer, CustomerTypeRef, Group, @@ -20,12 +21,14 @@ import { GroupMembershipTypeRef, GroupMemberTypeRef, GroupTypeRef, + KeyMac, + KeyMacTypeRef, KeyPair, KeyPairTypeRef, KeyRotation, KeyRotationsRefTypeRef, KeyRotationTypeRef, - PublicKeyGetIn, + PubDistributionKeyTypeRef, RecoverCodeData, SentGroupInvitationTypeRef, User, @@ -44,10 +47,11 @@ import { KEY_LENGTH_BYTES_AES_256, KyberPrivateKey, KyberPublicKey, + MacTag, PQKeyPairs, uint8ArrayToBitArray, } from "@tutao/tutanota-crypto" -import type { KeyLoaderFacade } from "../../../../../src/common/api/worker/facades/KeyLoaderFacade.js" +import { checkKeyVersionConstraints, KeyLoaderFacade, parseKeyVersion } from "../../../../../src/common/api/worker/facades/KeyLoaderFacade.js" import type { PQFacade } from "../../../../../src/common/api/worker/facades/PQFacade.js" import { IServiceExecutor } from "../../../../../src/common/api/common/ServiceRequest.js" import { ServiceExecutor } from "../../../../../src/common/api/worker/rest/ServiceExecutor.js" @@ -62,11 +66,10 @@ import { AdminGroupKeyRotationService, GroupKeyRotationInfoService, GroupKeyRotationService, - PublicKeyService, UserGroupKeyRotationService, } from "../../../../../src/common/api/entities/sys/Services.js" import { CryptoFacade } from "../../../../../src/common/api/worker/crypto/CryptoFacade.js" -import { assertNotNull, findAllAndRemove, lazyAsync, lazyMemoized } from "@tutao/tutanota-utils" +import { assertNotNull, concat, findAllAndRemove, lazyAsync, lazyMemoized } from "@tutao/tutanota-utils" import type { CryptoWrapper, VersionedEncryptedKey, VersionedKey } from "../../../../../src/common/api/worker/crypto/CryptoWrapper.js" import { RecoverCodeFacade, RecoverData } from "../../../../../src/common/api/worker/facades/lazy/RecoverCodeFacade.js" import { UserFacade } from "../../../../../src/common/api/worker/facades/UserFacade.js" @@ -76,7 +79,17 @@ import { GroupInvitationPostData, InternalRecipientKeyDataTypeRef } from "../../ import { RecipientsNotFoundError } from "../../../../../src/common/api/common/error/RecipientsNotFoundError.js" import { assertThrows, mockAttribute, spy } from "@tutao/tutanota-test-utils" import { LockedError } from "../../../../../src/common/api/common/error/RestError.js" -import { AsymmetricCryptoFacade, convertToVersionedPublicKeys } from "../../../../../src/common/api/worker/crypto/AsymmetricCryptoFacade.js" +import { AsymmetricCryptoFacade, PubEncSymKey } from "../../../../../src/common/api/worker/crypto/AsymmetricCryptoFacade.js" +import { CryptoError } from "@tutao/tutanota-crypto/error.js" +import { TutanotaError } from "@tutao/tutanota-error" +import { + AdminSymKeyAuthenticationParams, + asPQPublicKeys, + brandKeyMac, + KeyAuthenticationFacade, + PubDistKeyAuthenticationParams, +} from "../../../../../src/common/api/worker/facades/KeyAuthenticationFacade.js" +import { PublicKeyProvider, PublicKeys } from "../../../../../src/common/api/worker/facades/PublicKeyProvider.js" const { anything } = matchers const PQ_SAFE_BITARRAY_KEY_LENGTH = KEY_LENGTH_BYTES_AES_256 / 4 @@ -147,6 +160,9 @@ const NEW_ADMIN_GROUP_ENC_NEW_USER_GROUP_KEY: VersionedEncryptedKey = { key: new Uint8Array(NEW_ADMIN_GROUP_KEY.object.concat(NEW_USER_GROUP_KEY.object)), encryptingKeyVersion: 1, } + +const PUB_ADMIN_ENC_NEW_USER_GROUP_KEY: Uint8Array = new Uint8Array([123]) + const NEW_ADMIN_GROUP_ENC_NEW_ADMIN_GROUP_KEY: VersionedEncryptedKey = { key: new Uint8Array(NEW_ADMIN_GROUP_KEY.object.concat(NEW_ADMIN_GROUP_KEY.object)), encryptingKeyVersion: 1, @@ -197,6 +213,8 @@ const OTHER_USER_GROUP_ENC_NEW_SHARED_GROUP_KEY: VersionedEncryptedKey = { encryptingKeyVersion: 0, } +const NEW_USER_GROUP_KEY_TAG = new Uint8Array([124]) as MacTag + const userId = "userId" const userGroupId = "userGroupId" const adminGroupId = "adminGroupId" @@ -234,50 +252,156 @@ function prepareUserKeyRotation( cryptoWrapper: CryptoWrapper entityClient: EntityClient asymmetricCryptoFacade: AsymmetricCryptoFacade + keyAuthenticationFacade: KeyAuthenticationFacade + publicKeyProvider: PublicKeyProvider }, keyRotationFacade: KeyRotationFacade, userGroup: Group, ) { - const commonHash = new Uint8Array([1, 2]) - const adminGeneratedHash = new Uint8Array([1, 2, 3]) - const adminPubEccKey = new Uint8Array([0, 9, 9]) - const pubEncSymKeyBytes = new Uint8Array([7, 7, 7]) + const newAdminPubKeyTag = object() + const adminPubEccKey = new Uint8Array([0, 9, 9]) const adminPubKyberKey = new Uint8Array([8, 8, 8]) keyRotationFacade.setPendingKeyRotations({ pwKey: PW_KEY, adminOrUserGroupKeyRotation: createTestEntity(KeyRotationTypeRef, { _id: [keyRotationsListId, userGroupId], - targetKeyVersion: String(Number(userGroup.groupKeyVersion) + 1), + targetKeyVersion: String(parseKeyVersion(userGroup.groupKeyVersion) + 1), groupKeyRotationType: GroupKeyRotationType.User, - adminGroupKeyAuthenticationData: createTestEntity(AdminGroupKeyAuthenticationDataTypeRef, { - authKeyEncAdminRotationHash: adminGeneratedHash, - version: "1", - userGroup: "userGroup", + distEncAdminGroupSymKey: null, + adminPubKeyMac: createTestEntity(KeyMacTypeRef, { + tag: newAdminPubKeyTag, + taggedKeyVersion: "1", + taggingGroup: "userGroup", + taggingKeyVersion: "0", }), }), teamOrCustomerGroupKeyRotations: [], userAreaGroupsKeyRotations: [], }) - when(mocks.cryptoWrapper.aesDecrypt(matchers.anything(), matchers.anything(), true)).thenReturn(commonHash) - when(mocks.cryptoWrapper.sha256Hash(matchers.anything())).thenReturn(commonHash) + when( + mocks.keyAuthenticationFacade.computeTag( + matchers.argThat((params) => { + return params.tagType === "NEW_ADMIN_PUB_KEY_TAG" + }), + ), + ).thenReturn(newAdminPubKeyTag) + + when( + mocks.keyAuthenticationFacade.computeTag( + matchers.argThat((params) => { + return params.tagType === "USER_GROUP_KEY_TAG" + }), + ), + ).thenReturn(NEW_USER_GROUP_KEY_TAG) + // public key service request to get the admin keys - when(mocks.serviceExecutor.get(PublicKeyService, matchers.anything())).thenResolve({ - pubEccKey: adminPubEccKey, - pubKyberKey: adminPubKyberKey, + const newUserGroupKeyTag = object() + when(mocks.cryptoWrapper.hmacSha256(anything(), newUserGroupKeyTag)).thenReturn(NEW_USER_GROUP_KEY_TAG) + + when(mocks.publicKeyProvider.loadCurrentPubKey(matchers.anything())).thenResolve({ + version: 1, // admin is rotated + object: { + pubEccKey: adminPubEccKey, + pubKyberKey: adminPubKyberKey, + pubRsaKey: null, + }, }) const customer = createTestEntity(CustomerTypeRef, { adminGroup: "adminGroupId" }) when(mocks.entityClient.load(CustomerTypeRef, matchers.anything())).thenResolve(customer) when(mocks.asymmetricCryptoFacade.tutaCryptEncryptSymKey(matchers.anything(), matchers.anything(), matchers.anything())).thenResolve({ - pubEncSymKeyBytes, + pubEncSymKeyBytes: PUB_ADMIN_ENC_NEW_USER_GROUP_KEY, cryptoProtocolVersion: CryptoProtocolVersion.TUTA_CRYPT, senderKeyVersion: 1, recipientKeyVersion: 1, }) + + return { adminPubKyberKey, adminPubEccKey } +} + +function prepareMultiAdminUserKeyRotation( + mocks: { + serviceExecutor: IServiceExecutor + cryptoWrapper: CryptoWrapper + entityClient: EntityClient + asymmetricCryptoFacade: AsymmetricCryptoFacade + keyLoaderFacade: KeyLoaderFacade + }, + keyRotationFacade: KeyRotationFacade, + userGroup: Group, +) { + const pubEncNewAdminGroupKey = new Uint8Array([9, 9, 9, 9]) + + const userEncNewAdminGroupKeyHash = object() + + const userEncAdminSymKeyHash = createTestEntity(KeyMacTypeRef, { + tag: userEncNewAdminGroupKeyHash, + taggedKeyVersion: String(NEW_ADMIN_GROUP_KEY.version), + taggingGroup: userGroupId, + taggingKeyVersion: String(CURRENT_USER_GROUP_KEY.version), + }) + const distEncAdminGroupSymKey = createPubEncKeyData({ + recipientIdentifierType: PublicKeyIdentifierType.KEY_ROTATION_ID, + recipientIdentifier: userGroupId, + recipientKeyVersion: "0", + protocolVersion: CryptoProtocolVersion.TUTA_CRYPT, + pubEncSymKey: pubEncNewAdminGroupKey, + senderIdentifier: userGroup._id, + senderIdentifierType: PublicKeyIdentifierType.GROUP_ID, + senderKeyVersion: "1", + symKeyMac: userEncAdminSymKeyHash, + }) + + const encryptedAdminDistKeyPair = createKeyPair({ + pubEccKey: object(), + symEncPrivEccKey: object(), + pubKyberKey: object(), + symEncPrivKyberKey: object(), + pubRsaKey: null, + symEncPrivRsaKey: null, + }) + const adminDistPqKeyPair = object() + const adminGroupDistributionKeyPairKey = object() + + const userGroupKeyRotation = createTestEntity(KeyRotationTypeRef, { + _id: [keyRotationsListId, userGroupId], + targetKeyVersion: String(parseKeyVersion(userGroup.groupKeyVersion) + 1), + groupKeyRotationType: GroupKeyRotationType.User, + distEncAdminGroupSymKey, + adminDistKeyPair: encryptedAdminDistKeyPair, + adminPubKeyMac: null, + }) + keyRotationFacade.setPendingKeyRotations({ + pwKey: PW_KEY, + adminOrUserGroupKeyRotation: userGroupKeyRotation, + teamOrCustomerGroupKeyRotations: [], + userAreaGroupsKeyRotations: [], + }) + + when(mocks.keyLoaderFacade.getCurrentSymGroupKey(adminGroupId)).thenResolve(CURRENT_ADMIN_GROUP_KEY) + + when(mocks.cryptoWrapper.decryptKeyPair(adminGroupDistributionKeyPairKey, encryptedAdminDistKeyPair as EncryptedPqKeyPairs)).thenReturn(adminDistPqKeyPair) + when(mocks.asymmetricCryptoFacade.decryptSymKeyWithKeyPairAndAuthenticate(adminDistPqKeyPair, distEncAdminGroupSymKey, anything())).thenResolve({ + decryptedAesKey: NEW_ADMIN_GROUP_KEY.object, + }) + + const newAdminGroupHashData = concat(Uint8Array.from([0, NEW_ADMIN_GROUP_KEY.version]), Uint8Array.from(NEW_ADMIN_GROUP_KEY.object)) + const newAdminGroupSymKeyHash = object() + when(mocks.cryptoWrapper.sha256Hash(newAdminGroupHashData)).thenReturn(newAdminGroupSymKeyHash) + // public key service request to get the admin keys + + const targetUserGroupKeyAuthKey = object() + + when(mocks.cryptoWrapper.deriveKeyWithHkdf(matchers.anything())).thenReturn(adminGroupDistributionKeyPairKey, targetUserGroupKeyAuthKey) + + when(mocks.cryptoWrapper.aesDecrypt(targetUserGroupKeyAuthKey, userEncAdminSymKeyHash.tag, true)).thenReturn(newAdminGroupSymKeyHash) + + when(mocks.cryptoWrapper.encryptKeyWithVersionedKey(NEW_ADMIN_GROUP_KEY, NEW_USER_GROUP_KEY.object)).thenReturn(NEW_ADMIN_GROUP_ENC_NEW_USER_GROUP_KEY) + when(mocks.cryptoWrapper.encryptKeyWithVersionedKey(NEW_USER_GROUP_KEY, NEW_ADMIN_GROUP_KEY.object)).thenReturn(NEW_USER_GROUP_ENC_NEW_ADMIN_GROUP_KEY) } o.spec("KeyRotationFacadeTest", function () { @@ -292,6 +416,8 @@ o.spec("KeyRotationFacadeTest", function () { let shareFacade: ShareFacade let groupManagementFacade: GroupManagementFacade let asymmetricCryptoFacade: AsymmetricCryptoFacade + let keyAuthenticationFacade: KeyAuthenticationFacade + let publicKeyProvider: PublicKeyProvider let user: User const pwKey = uint8ArrayToBitArray(new Uint8Array(Array(KEY_LENGTH_BYTES_AES_256).keys())) @@ -317,6 +443,8 @@ o.spec("KeyRotationFacadeTest", function () { shareFacade = object() groupManagementFacade = object() asymmetricCryptoFacade = object() + keyAuthenticationFacade = object() + publicKeyProvider = object() keyRotationFacade = new KeyRotationFacade( entityClientMock, keyLoaderFacadeMock, @@ -329,6 +457,8 @@ o.spec("KeyRotationFacadeTest", function () { async () => shareFacade, async () => groupManagementFacade, asymmetricCryptoFacade, + keyAuthenticationFacade, + publicKeyProvider, ) user = await makeUser(userId, { key: userEncAdminKey, encryptingKeyVersion: 0 }) const customerId = "customerId" @@ -418,7 +548,7 @@ o.spec("KeyRotationFacadeTest", function () { userAreaGroupsKeyRotations: makeKeyRotation(keyRotationsListId, GroupKeyRotationType.UserArea, groupId), }) - const { userEncNewGroupKey, newGroupKeyEncPreviousGroupKey, adminEncNewGroupKey } = prepareKeyMocks(cryptoWrapperMock) + const { userEncNewGroupKey, newGroupKeyEncPreviousGroupKey } = prepareKeyMocks(cryptoWrapperMock) await keyRotationFacade.processPendingKeyRotation(user) @@ -482,7 +612,7 @@ o.spec("KeyRotationFacadeTest", function () { group.currentKeys = createTestEntity(KeyPairTypeRef) - const { userEncNewGroupKey, newGroupKeyEncPreviousGroupKey, newKey, adminEncNewGroupKey } = prepareKeyMocks(cryptoWrapperMock) + const { userEncNewGroupKey, newGroupKeyEncPreviousGroupKey, newKey } = prepareKeyMocks(cryptoWrapperMock) const generated = mockGenerateKeyPairs(pqFacadeMock, cryptoWrapperMock, newKey.object) const { newKeyPairs, encryptedEccPrivKey, encryptedKyberPrivKey, kyberPublicKeyBytes } = generated.get(newKey.object)! @@ -511,6 +641,9 @@ o.spec("KeyRotationFacadeTest", function () { o(update.groupMembershipUpdateData[0].userId).equals(userId) o(update.groupMembershipUpdateData[0].userEncGroupKey).deepEquals(userEncNewGroupKey.key) o(update.groupMembershipUpdateData[0].userKeyVersion).equals("0") + + const groupIds = await keyRotationFacade.getGroupIdsThatPerformedKeyRotations() + o(groupIds).deepEquals([groupId]) }) o.spec("Rotated group is a shared group", function () { @@ -762,6 +895,9 @@ o.spec("KeyRotationFacadeTest", function () { const secondUpdate = sentData.groupKeyUpdates[1] o(secondUpdate.group).equals(secondGroupId) o(secondUpdate.groupKeyVersion).equals("1") + + const groupIds = await keyRotationFacade.getGroupIdsThatPerformedKeyRotations() + o(groupIds.sort()).deepEquals([groupId, secondGroupId].sort()) }) o("Rotate group user area group of non admin", async function () { @@ -775,7 +911,7 @@ o.spec("KeyRotationFacadeTest", function () { // remove admin group membership findAllAndRemove(user.memberships, (m) => m.groupType === GroupType.Admin) - const { userEncNewGroupKey, newGroupKeyEncPreviousGroupKey, adminEncNewGroupKey } = prepareKeyMocks(cryptoWrapperMock) + const { userEncNewGroupKey, newGroupKeyEncPreviousGroupKey } = prepareKeyMocks(cryptoWrapperMock) await keyRotationFacade.processPendingKeyRotation(user) @@ -817,11 +953,11 @@ o.spec("KeyRotationFacadeTest", function () { prepareRecoverData(recoverData, recoverCodeFacade) when(groupManagementFacade.hasAdminEncGKey(userGroup)).thenReturn(true) when(groupManagementFacade.hasAdminEncGKey(adminGroup)).thenReturn(true) - when(userFacade.deriveUserGroupKeyDistributionKey(userGroupId, PW_KEY)).thenReturn(DISTRIBUTION_KEY) + when(userFacade.deriveLegacyUserDistKey(userGroupId, PW_KEY)).thenReturn(DISTRIBUTION_KEY) const encryptingKeyCaptor = matchers.captor() const keyCaptor = matchers.captor() when(cryptoWrapperMock.encryptKey(DISTRIBUTION_KEY, NEW_USER_GROUP_KEY.object)).thenReturn(DISTRIBUTION_KEY_ENC_NEW_USER_GROUP_KEY) - when(cryptoWrapperMock.encryptKeyWithVersionedKey(encryptingKeyCaptor.capture(), keyCaptor.capture())).thenDo((arg) => ({ + when(cryptoWrapperMock.encryptKeyWithVersionedKey(encryptingKeyCaptor.capture(), keyCaptor.capture())).thenDo((_) => ({ encryptingKeyVersion: encryptingKeyCaptor.value.version, key: new Uint8Array(encryptingKeyCaptor.value.object.concat(keyCaptor.value)), })) @@ -835,7 +971,7 @@ o.spec("KeyRotationFacadeTest", function () { pwKey: PW_KEY, adminOrUserGroupKeyRotation: createTestEntity(KeyRotationTypeRef, { _id: [keyRotationsListId, adminGroupId], - targetKeyVersion: String(Number(adminGroup.groupKeyVersion) + 1), + targetKeyVersion: String(parseKeyVersion(adminGroup.groupKeyVersion) + 1), groupKeyRotationType: GroupKeyRotationType.AdminGroupKeyRotationSingleUserAccount, }), teamOrCustomerGroupKeyRotations: [], @@ -872,9 +1008,13 @@ o.spec("KeyRotationFacadeTest", function () { }), ), ) + verify(serviceExecutorMock.put(AdminGroupKeyRotationService, anything()), { times: 0 }) o(keyRotationFacade.pendingKeyRotations.adminOrUserGroupKeyRotation).equals(null) o(keyRotationFacade.pendingKeyRotations.pwKey).equals(null) + + const groupIds = await keyRotationFacade.getGroupIdsThatPerformedKeyRotations() + o(groupIds).deepEquals([userGroupId]) }) o("Successful rotation - no recover code", async function () { @@ -882,7 +1022,7 @@ o.spec("KeyRotationFacadeTest", function () { pwKey: PW_KEY, adminOrUserGroupKeyRotation: createTestEntity(KeyRotationTypeRef, { _id: [keyRotationsListId, adminGroupId], - targetKeyVersion: String(Number(adminGroup.groupKeyVersion) + 1), + targetKeyVersion: String(parseKeyVersion(adminGroup.groupKeyVersion) + 1), groupKeyRotationType: GroupKeyRotationType.AdminGroupKeyRotationSingleUserAccount, }), teamOrCustomerGroupKeyRotations: [], @@ -910,13 +1050,14 @@ o.spec("KeyRotationFacadeTest", function () { verify(recoverCodeFacade.encryptRecoveryCode(anything(), anything()), { times: 0 }) }) - o("Successful rotation with multiple users - sends encrypted new key hash", async function () { + o("Successful rotation with multiple users - sends new key tag", async function () { + const newAdminGroupKeyVersion = checkKeyVersionConstraints(parseKeyVersion(adminGroup.groupKeyVersion) + 1) keyRotationFacade.setPendingKeyRotations({ pwKey: PW_KEY, adminOrUserGroupKeyRotation: createTestEntity(KeyRotationTypeRef, { _id: [keyRotationsListId, adminGroupId], - targetKeyVersion: String(Number(adminGroup.groupKeyVersion) + 1), - groupKeyRotationType: GroupKeyRotationType.AdminGroupKeyRotationSingleUserAccount, + targetKeyVersion: String(newAdminGroupKeyVersion), + groupKeyRotationType: GroupKeyRotationType.AdminGroupKeyRotationMultipleUserAccount, }), teamOrCustomerGroupKeyRotations: [], userAreaGroupsKeyRotations: [], @@ -927,13 +1068,11 @@ o.spec("KeyRotationFacadeTest", function () { const additionalUserGroupInfo = createTestEntity(GroupInfoTypeRef, { group: additionalUserGroupId }) when(entityClientMock.loadAll(GroupInfoTypeRef, customer.userGroups)).thenResolve([adminUserGroupInfo, additionalUserGroupInfo]) when(keyLoaderFacadeMock.getCurrentSymGroupKey(groupId)).thenResolve({ version: 0, object: groupKeyVersion0 }) - when(keyLoaderFacadeMock.getCurrentSymGroupKey(additionalUserGroupId)).thenResolve({ version: 0, object: groupKeyVersion0 }) - const cleartextHash = object() - when(cryptoWrapperMock.sha256Hash(anything())).thenReturn(cleartextHash) - const encHash = object() - when(cryptoWrapperMock.aesEncrypt(anything(), cleartextHash)).thenReturn(encHash) - - when(groupManagementFacade.getCurrentGroupKeyViaAdminEncGKey(additionalUserGroupInfo.group)).thenResolve(object()) + let additionalUserGroupKey: VersionedKey = { version: 0, object: groupKeyVersion0 } + when(keyLoaderFacadeMock.getCurrentSymGroupKey(additionalUserGroupId)).thenResolve(additionalUserGroupKey) + const macTag = object() + when(keyAuthenticationFacade.computeTag(anything())).thenReturn(macTag) + when(groupManagementFacade.getCurrentGroupKeyViaAdminEncGKey(additionalUserGroupInfo.group)).thenResolve(additionalUserGroupKey) await keyRotationFacade.processPendingKeyRotation(user) @@ -941,27 +1080,338 @@ o.spec("KeyRotationFacadeTest", function () { serviceExecutorMock.post( AdminGroupKeyRotationService, matchers.argThat((arg: AdminGroupKeyRotationPostIn) => { - o(arg.adminGroupKeyAuthenticationDataList).notEquals(null) - o(arg.adminGroupKeyAuthenticationDataList.length).equals(1) - const adminGroupKeyAuthenticationData: AdminGroupKeyAuthenticationData = arg.adminGroupKeyAuthenticationDataList[0] - o(adminGroupKeyAuthenticationData.userGroup).equals(additionalUserGroupId) - o(adminGroupKeyAuthenticationData.version).equals("1") - o(adminGroupKeyAuthenticationData.authKeyEncAdminRotationHash).equals(encHash) + o(arg.adminPubKeyMacList).notEquals(null) + o(arg.adminPubKeyMacList.length).equals(1) + const adminPubKeyMac: KeyMac = arg.adminPubKeyMacList[0] + o(adminPubKeyMac.taggingGroup).equals(additionalUserGroupId) + o(adminPubKeyMac.taggedKeyVersion).equals("1") + o(adminPubKeyMac.tag).equals(macTag) + o(adminPubKeyMac.taggingKeyVersion).equals(String(additionalUserGroupKey.version)) return true }), ), ) + verify(serviceExecutorMock.put(AdminGroupKeyRotationService, anything()), { times: 0 }) + const newAdminKeyPair = generatedKeyPairs.get(NEW_ADMIN_GROUP_KEY.object) + verify(cryptoWrapperMock.kyberPublicKeyToBytes(newAdminKeyPair?.newKeyPairs.kyberKeyPair.publicKey!)) verify( - cryptoWrapperMock.deriveKeyWithHkdf( - matchers.argThat((arg) => { - o(arg.context).equals("adminGroupKeyRotationHash") - o(arg.salt).equals(additionalUserGroupId) - return true - }), - ), + keyAuthenticationFacade.computeTag({ + tagType: "NEW_ADMIN_PUB_KEY_TAG", + sourceOfTrust: { receivingUserGroupKey: additionalUserGroupKey.object }, + untrustedKey: { + newAdminPubKey: asPQPublicKeys({ + pubKyberKey: newAdminKeyPair?.kyberPublicKeyBytes, + pubEccKey: newAdminKeyPair?.newKeyPairs.eccKeyPair.publicKey!, + } as PublicKeys), + }, + bindingData: { + userGroupId: additionalUserGroupId, + adminGroupId, + currentReceivingUserGroupKeyVersion: additionalUserGroupKey.version, + newAdminGroupKeyVersion, + }, + }), ) }) + + o.spec("AdminGroupKeyRotationMultipleAdminAccount", function () { + o("the distribution key pair is generated and uploaded", async function () { + keyRotationFacade.setPendingKeyRotations({ + pwKey: PW_KEY, + adminOrUserGroupKeyRotation: createTestEntity(KeyRotationTypeRef, { + _id: [keyRotationsListId, adminGroupId], + targetKeyVersion: String(parseKeyVersion(adminGroup.groupKeyVersion) + 1), + groupKeyRotationType: GroupKeyRotationType.AdminGroupKeyRotationMultipleAdminAccount, + }), + teamOrCustomerGroupKeyRotations: [], + userAreaGroupsKeyRotations: [], + }) + + const adminDistKeyPairDistributionKey = object() + when(cryptoWrapperMock.deriveKeyWithHkdf(anything())).thenReturn(adminDistKeyPairDistributionKey) + + const mockedDistKeyPair = mockGenerateKeyPairs(pqFacadeMock, cryptoWrapperMock, adminDistKeyPairDistributionKey).get( + adminDistKeyPairDistributionKey, + ) + + const distKeyTag = object() + when( + keyAuthenticationFacade.computeTag( + matchers.argThat((params: PubDistKeyAuthenticationParams) => { + o(params.tagType).equals("PUB_DIST_KEY_TAG") + o(params.untrustedKey.distPubKey.eccPublicKey).equals(mockedDistKeyPair?.newKeyPairs.eccKeyPair.publicKey!) + o(params.untrustedKey.distPubKey.kyberPublicKey.raw).equals(mockedDistKeyPair?.kyberPublicKeyBytes!) + return true + }), + ), + ).thenReturn(distKeyTag) + + const distributionKeys = [] + const userGroupIdsMissingDistributionKeys = ["missing"] + when(serviceExecutorMock.get(AdminGroupKeyRotationService, anything())).thenResolve( + createTestEntity(AdminGroupKeyRotationGetOutTypeRef, { distributionKeys, userGroupIdsMissingDistributionKeys }), + ) + + await keyRotationFacade.processPendingKeyRotation(user) + + verify( + serviceExecutorMock.put( + AdminGroupKeyRotationService, + matchers.argThat((arg: AdminGroupKeyRotationPutIn) => { + o(arg.distKeyMac.taggedKeyVersion).equals("0") + o(arg.distKeyMac.taggingKeyVersion).equals(CURRENT_ADMIN_GROUP_KEY.version.toString()) + o(arg.distKeyMac.taggingGroup).equals(adminGroupId) + o(arg.distKeyMac.tag).deepEquals(distKeyTag) + + o(arg.adminDistKeyPair.pubRsaKey).equals(null) + o(arg.adminDistKeyPair.symEncPrivRsaKey).equals(null) + o(arg.adminDistKeyPair.pubEccKey!).deepEquals(mockedDistKeyPair?.newKeyPairs.eccKeyPair.publicKey!) + o(arg.adminDistKeyPair.symEncPrivEccKey).deepEquals(mockedDistKeyPair?.encryptedEccPrivKey!) + o(arg.adminDistKeyPair.pubKyberKey).deepEquals(mockedDistKeyPair?.kyberPublicKeyBytes!) + o(arg.adminDistKeyPair.symEncPrivKyberKey).deepEquals(mockedDistKeyPair?.encryptedKyberPrivKey!) + return true + }), + ), + ) + const keyDerivationCaptor = matchers.captor() + verify(cryptoWrapperMock.deriveKeyWithHkdf(keyDerivationCaptor.capture())) + + const values = keyDerivationCaptor.values! + o(values.length).equals(1) + o(values[0]).deepEquals({ + salt: `adminGroup: ${adminGroupId}, userGroup: ${userGroupId}, currentUserGroupKeyVersion: ${CURRENT_USER_GROUP_KEY.version}, currentAdminGroupKeyVersion: ${CURRENT_ADMIN_GROUP_KEY.version}`, + key: PW_KEY, + context: "adminGroupDistributionKeyPairEncryptionKey", + }) + }) + + o("does not upload a distribution key pair if there is already one", async function () { + keyRotationFacade.setPendingKeyRotations({ + pwKey: PW_KEY, + adminOrUserGroupKeyRotation: createTestEntity(KeyRotationTypeRef, { + _id: [keyRotationsListId, adminGroupId], + targetKeyVersion: String(parseKeyVersion(adminGroup.groupKeyVersion) + 1), + groupKeyRotationType: GroupKeyRotationType.AdminGroupKeyRotationMultipleAdminAccount, + distKeyMac: createTestEntity(KeyMacTypeRef), + adminDistKeyPair: createTestEntity(KeyPairTypeRef), + adminPubKeyMac: null, + }), + teamOrCustomerGroupKeyRotations: [], + userAreaGroupsKeyRotations: [], + }) + + const distributionKeys = [createTestEntity(PubDistributionKeyTypeRef, { userGroupId })] + const userGroupIdsMissingDistributionKeys = ["missing"] + when(serviceExecutorMock.get(AdminGroupKeyRotationService, anything())).thenResolve( + createTestEntity(AdminGroupKeyRotationGetOutTypeRef, { distributionKeys, userGroupIdsMissingDistributionKeys }), + ) + + await keyRotationFacade.processPendingKeyRotation(user) + + verify(serviceExecutorMock.put(AdminGroupKeyRotationService, anything()), { times: 0 }) + }) + + o("distributes new admin group key to other admins", async function () { + const targetAdminKeyVersion = String(parseKeyVersion(adminGroup.groupKeyVersion) + 1) + keyRotationFacade.setPendingKeyRotations({ + pwKey: PW_KEY, + adminOrUserGroupKeyRotation: createTestEntity(KeyRotationTypeRef, { + _id: [keyRotationsListId, adminGroupId], + targetKeyVersion: targetAdminKeyVersion, + groupKeyRotationType: GroupKeyRotationType.AdminGroupKeyRotationMultipleAdminAccount, + distKeyMac: createTestEntity(KeyMacTypeRef), + adminDistKeyPair: createTestEntity(KeyPairTypeRef), + adminPubKeyMac: null, + }), + teamOrCustomerGroupKeyRotations: [], + userAreaGroupsKeyRotations: [], + }) + + const otherAdmin = "otherAdmin" + const distributionKeys = [ + createTestEntity(PubDistributionKeyTypeRef, { userGroupId: otherAdmin }), + createTestEntity(PubDistributionKeyTypeRef, { userGroupId: user.userGroup.group }), + ] + const userGroupIdsMissingDistributionKeys = [] + when(serviceExecutorMock.get(AdminGroupKeyRotationService, anything())).thenResolve( + createTestEntity(AdminGroupKeyRotationGetOutTypeRef, { distributionKeys, userGroupIdsMissingDistributionKeys }), + ) + + const encryptedAdminGroupKeyForThisAdmin = object() + encryptedAdminGroupKeyForThisAdmin.pubEncSymKeyBytes = object() + when(asymmetricCryptoFacade.tutaCryptEncryptSymKey(anything(), anything(), anything())).thenResolve(encryptedAdminGroupKeyForThisAdmin) + + const currentAdminGroupKey: VersionedKey = { + object: object(), + version: 12, + } + when(keyLoaderFacadeMock.getCurrentSymGroupKey(anything())).thenResolve(currentAdminGroupKey) + + const otherAdminUserGroupKey: VersionedKey = { + object: object(), + version: 12, + } + + const macTag = object() + when( + keyAuthenticationFacade.computeTag( + matchers.argThat((params: AdminSymKeyAuthenticationParams) => { + o(params.tagType).equals("ADMIN_SYM_KEY_TAG") + o(params.untrustedKey.newAdminGroupKey).deepEquals(NEW_ADMIN_GROUP_KEY.object) + o(params.bindingData.adminGroupId).equals(adminGroupId) + o(params.bindingData.userGroupId).equals(otherAdmin) + o(params.sourceOfTrust.currentReceivingUserGroupKey).deepEquals(otherAdminUserGroupKey.object) + o(params.bindingData.newAdminGroupKeyVersion).equals(NEW_ADMIN_GROUP_KEY.version) + return true + }), + ), + ).thenReturn(macTag) + + when(groupManagementFacade.getCurrentGroupKeyViaAdminEncGKey(otherAdmin)).thenResolve(otherAdminUserGroupKey) + + await keyRotationFacade.processPendingKeyRotation(user) + + verify( + serviceExecutorMock.post( + AdminGroupKeyRotationService, + matchers.argThat((arg: AdminGroupKeyRotationPostIn) => { + // verify that for admin performing rotation we make sure the new membership + // was encrypted with the new admingroupkey AND for its usergroupid + + o(arg.adminGroupKeyData.groupMembershipUpdateData.length).equals(1) + o(arg.adminGroupKeyData.groupMembershipUpdateData[0].userId).equals(userId) + o(arg.adminGroupKeyData.groupMembershipUpdateData[0].userEncGroupKey).deepEquals( + new Uint8Array(NEW_USER_GROUP_KEY.object.concat(NEW_ADMIN_GROUP_KEY.object)), + ) + + o(arg.distribution.length).equals(1) // this checks that we don't distribute to ourselves + const distributionElement = arg.distribution[0] + o(distributionElement.userGroupId).equals(otherAdmin) // this checks that we don't distribute to ourselves + const distEncAdminGroupKey = distributionElement.distEncAdminGroupKey + o(distEncAdminGroupKey.pubEncSymKey).equals(encryptedAdminGroupKeyForThisAdmin.pubEncSymKeyBytes) + o(distEncAdminGroupKey.symKeyMac!.taggingGroup).equals(adminGroupId) + o(distEncAdminGroupKey.symKeyMac!.taggedKeyVersion).equals(targetAdminKeyVersion) + o(distEncAdminGroupKey.symKeyMac!.taggingKeyVersion).equals(String(currentAdminGroupKey.version)) + o(distEncAdminGroupKey.symKeyMac!.tag).equals(macTag) + + return true + }), + ), + ) + + const groupIds = await keyRotationFacade.getGroupIdsThatPerformedKeyRotations() + o(groupIds).deepEquals([userGroupId]) + }) + + o("should abort key rotation if one of the hashes has been encrypted with an unvalid key", async function () { + const targetAdminKeyVersion = String(parseKeyVersion(adminGroup.groupKeyVersion) + 1) + keyRotationFacade.setPendingKeyRotations({ + pwKey: PW_KEY, + adminOrUserGroupKeyRotation: createTestEntity(KeyRotationTypeRef, { + _id: [keyRotationsListId, adminGroupId], + targetKeyVersion: targetAdminKeyVersion, + groupKeyRotationType: GroupKeyRotationType.AdminGroupKeyRotationMultipleAdminAccount, + distKeyMac: createTestEntity(KeyMacTypeRef), + adminDistKeyPair: createTestEntity(KeyPairTypeRef), + adminPubKeyMac: null, + }), + teamOrCustomerGroupKeyRotations: [], + userAreaGroupsKeyRotations: [], + }) + + const otherAdmin = "otherAdmin" + const distributionKeys = [createTestEntity(PubDistributionKeyTypeRef, { userGroupId: otherAdmin })] + const userGroupIdsMissingDistributionKeys = [user.userGroup.group] + when(serviceExecutorMock.get(AdminGroupKeyRotationService, anything())).thenResolve( + createTestEntity(AdminGroupKeyRotationGetOutTypeRef, { distributionKeys, userGroupIdsMissingDistributionKeys }), + ) + + const currentAdminGroupKey: VersionedKey = { + object: object(), + version: 12, + } + + when(keyLoaderFacadeMock.getCurrentSymGroupKey(anything())).thenResolve(currentAdminGroupKey) + when(cryptoWrapperMock.aesDecrypt(anything(), anything(), anything())).thenThrow(new CryptoError("unable to decrypt")) + await assertThrows(CryptoError, async () => await keyRotationFacade.processPendingKeyRotation(user)) + }) + + o("should abort key rotation if one of the hashes of the public distribution key doesn't match", async function () { + const targetAdminKeyVersion = String(parseKeyVersion(adminGroup.groupKeyVersion) + 1) + let distKeyMac = brandKeyMac(createTestEntity(KeyMacTypeRef)) + keyRotationFacade.setPendingKeyRotations({ + pwKey: PW_KEY, + adminOrUserGroupKeyRotation: createTestEntity(KeyRotationTypeRef, { + _id: [keyRotationsListId, adminGroupId], + targetKeyVersion: targetAdminKeyVersion, + groupKeyRotationType: GroupKeyRotationType.AdminGroupKeyRotationMultipleAdminAccount, + distKeyMac, + adminDistKeyPair: createTestEntity(KeyPairTypeRef), + adminPubKeyMac: null, + }), + teamOrCustomerGroupKeyRotations: [], + userAreaGroupsKeyRotations: [], + }) + + const otherAdmin = "otherAdmin" + const distributionKeys = [createTestEntity(PubDistributionKeyTypeRef, { userGroupId: otherAdmin })] + const userGroupIdsMissingDistributionKeys = [user.userGroup.group] + when(serviceExecutorMock.get(AdminGroupKeyRotationService, anything())).thenResolve( + createTestEntity(AdminGroupKeyRotationGetOutTypeRef, { distributionKeys, userGroupIdsMissingDistributionKeys }), + ) + + when(keyLoaderFacadeMock.getCurrentSymGroupKey(anything())).thenResolve(CURRENT_ADMIN_GROUP_KEY) + + // mock return of client computed hash when reproducing the encrypted one given by the server rotations + + const otherAdminUserGroupKey: VersionedKey = { + object: object(), + version: 0, + } + when(groupManagementFacade.getCurrentGroupKeyViaAdminEncGKey(otherAdmin)).thenResolve(otherAdminUserGroupKey) + + // noinspection JSVoidFunctionReturnValueUsed + when(keyAuthenticationFacade.verifyTag(anything(), anything())).thenThrow(new CryptoError("test error")) + const encryptedAdminGroupKeyForThisAdmin = object() + + encryptedAdminGroupKeyForThisAdmin.pubEncSymKeyBytes = object() + when(asymmetricCryptoFacade.tutaCryptEncryptSymKey(anything(), anything(), anything())).thenResolve(encryptedAdminGroupKeyForThisAdmin) + + await assertThrows(TutanotaError, async () => await keyRotationFacade.processPendingKeyRotation(user)) + }) + }) + + o.spec("shouldAdminWaitCreateOrDistribute", function () { + o("should wait for the others admins", function () { + const missingDistributionKeys = ["stillMissingAnotherAdmin"] + const distributionKeys = [ + // I have my distribution key + createTestEntity(PubDistributionKeyTypeRef, { userGroupId: user.userGroup.group }), + // and another too + createTestEntity(PubDistributionKeyTypeRef, { userGroupId: "otherAdmin" }), + ] + const nextPathOfAction = keyRotationFacade.decideMultiAdminGroupKeyRotationNextPathOfAction(missingDistributionKeys, user, distributionKeys) + + o(nextPathOfAction).equals(MultiAdminGroupKeyAdminActionPath.WAIT_FOR_OTHER_ADMINS) + }) + + o("should create their distribution keys", function () { + const missingDistributionKeys = [user.userGroup.group, "someOtherAdminToo"] + const distributionKeys = [] + const nextPathOfAction = keyRotationFacade.decideMultiAdminGroupKeyRotationNextPathOfAction(missingDistributionKeys, user, distributionKeys) + + o(nextPathOfAction).equals(MultiAdminGroupKeyAdminActionPath.CREATE_DISTRIBUTION_KEYS) + }) + + o("should perform the admin group key rotation", function () { + const missingDistributionKeys = [user.userGroup.group] + const distributionKeys = [createTestEntity(PubDistributionKeyTypeRef, { userGroupId: "otherAdmin" })] + const nextPathOfAction = keyRotationFacade.decideMultiAdminGroupKeyRotationNextPathOfAction(missingDistributionKeys, user, distributionKeys) + + o(nextPathOfAction).equals(MultiAdminGroupKeyAdminActionPath.PERFORM_KEY_ROTATION) + }) + }) }) o.spec("User group key rotation", function () { @@ -979,53 +1429,27 @@ o.spec("KeyRotationFacadeTest", function () { prepareRecoverData(recoverData, recoverCodeFacade) when(groupManagementFacade.hasAdminEncGKey(userGroup)).thenReturn(true) - when(userFacade.deriveUserGroupKeyDistributionKey(userGroupId, PW_KEY)).thenReturn(DISTRIBUTION_KEY) + when(userFacade.deriveLegacyUserDistKey(userGroupId, PW_KEY)).thenReturn(DISTRIBUTION_KEY) const encryptingKeyCaptor = matchers.captor() const keyCaptor = matchers.captor() when(cryptoWrapperMock.aes256RandomKey()).thenReturn(NEW_USER_GROUP_KEY.object) - when(cryptoWrapperMock.encryptKeyWithVersionedKey(encryptingKeyCaptor.capture(), keyCaptor.capture())).thenDo((arg) => ({ + when(cryptoWrapperMock.encryptKeyWithVersionedKey(encryptingKeyCaptor.capture(), keyCaptor.capture())).thenDo((_) => ({ encryptingKeyVersion: encryptingKeyCaptor.value.version, key: new Uint8Array(encryptingKeyCaptor.value.object.concat(keyCaptor.value)), })) when(cryptoWrapperMock.encryptKey(DISTRIBUTION_KEY, NEW_USER_GROUP_KEY.object)).thenReturn(DISTRIBUTION_KEY_ENC_NEW_USER_GROUP_KEY) generatedKeyPairs = mockGenerateKeyPairs(pqFacadeMock, cryptoWrapperMock, NEW_USER_GROUP_KEY.object) - const newUserPqKeyPair = generatedKeyPairs.get(NEW_USER_GROUP_KEY.object)!.newKeyPairs - const latestAdminKeyVersion = 1 - const publicKeyGetOut = createPublicKeyGetOut({ - pubKeyVersion: latestAdminKeyVersion.toString(), - pubRsaKey: null, - pubEccKey: object(), - pubKyberKey: object(), - }) - const adminPubKeys = convertToVersionedPublicKeys(publicKeyGetOut) - when( - serviceExecutorMock.get( - PublicKeyService, - matchers.argThat((arg: PublicKeyGetIn) => { - return arg.version == null && arg.identifierType === PublicKeyIdentifierType.GROUP_ID && arg.identifier === adminGroupId - }), - ), - ).thenResolve(publicKeyGetOut) - when( - asymmetricCryptoFacade.tutaCryptEncryptSymKey(NEW_USER_GROUP_KEY.object, adminPubKeys, { - version: NEW_USER_GROUP_KEY.version, - object: newUserPqKeyPair.eccKeyPair, - }), - ).thenResolve({ - pubEncSymKeyBytes: object(), - senderKeyVersion: NEW_USER_GROUP_KEY.version, - recipientKeyVersion: latestAdminKeyVersion, - cryptoProtocolVersion: CryptoProtocolVersion.TUTA_CRYPT, - }) }) - o("Successful rotation", async function () { - prepareUserKeyRotation( + o("Successful user group key rotation", async function () { + const { adminPubKyberKey, adminPubEccKey } = prepareUserKeyRotation( { serviceExecutor: serviceExecutorMock, cryptoWrapper: cryptoWrapperMock, entityClient: entityClientMock, asymmetricCryptoFacade: asymmetricCryptoFacade, + keyAuthenticationFacade: keyAuthenticationFacade, + publicKeyProvider, }, keyRotationFacade, userGroup, @@ -1044,7 +1468,13 @@ o.spec("KeyRotationFacadeTest", function () { o(userGroupKeyData.adminGroupKeyVersion).deepEquals(String(NEW_ADMIN_GROUP_ENC_NEW_USER_GROUP_KEY.encryptingKeyVersion)) const pubAdminGroupEncUserGroupKey = userGroupKeyData.pubAdminGroupEncUserGroupKey o(pubAdminGroupEncUserGroupKey).notEquals(null) - o(pubAdminGroupEncUserGroupKey?.pubEncSymKey) + o(pubAdminGroupEncUserGroupKey?.pubEncSymKey).equals(PUB_ADMIN_ENC_NEW_USER_GROUP_KEY) + const symKeyMac = pubAdminGroupEncUserGroupKey?.symKeyMac + o(symKeyMac).notEquals(null) + o(symKeyMac?.taggedKeyVersion).equals(String(NEW_USER_GROUP_KEY.version)) + o(symKeyMac?.taggingKeyVersion).equals(String(CURRENT_USER_GROUP_KEY.version)) + o(symKeyMac?.taggingGroup).equals(userGroupId) + o(symKeyMac?.tag).equals(NEW_USER_GROUP_KEY_TAG) verifyUserGroupKeyDataExceptAdminKey(userGroupKeyData, generatedKeyPairs) @@ -1052,18 +1482,35 @@ o.spec("KeyRotationFacadeTest", function () { }), ), ) + + // noinspection JSVoidFunctionReturnValueUsed verify( - cryptoWrapperMock.deriveKeyWithHkdf( - matchers.argThat((arg) => { - o(arg.context).equals("adminGroupKeyRotationHash") - o(arg.salt).equals(userGroupId) - return true - }), + keyAuthenticationFacade.verifyTag( + { + tagType: "NEW_ADMIN_PUB_KEY_TAG", + sourceOfTrust: { receivingUserGroupKey: CURRENT_USER_GROUP_KEY.object }, + untrustedKey: { + newAdminPubKey: asPQPublicKeys({ + pubEccKey: adminPubEccKey, + pubKyberKey: adminPubKyberKey, + } as PublicKeys), + }, + bindingData: { + userGroupId, + adminGroupId, + newAdminGroupKeyVersion: NEW_ADMIN_GROUP_KEY.version, + currentReceivingUserGroupKeyVersion: CURRENT_USER_GROUP_KEY.version, + }, + }, + anything(), ), ) o(keyRotationFacade.pendingKeyRotations.adminOrUserGroupKeyRotation).equals(null) o(keyRotationFacade.pendingKeyRotations.pwKey).equals(null) + + const groupIds = await keyRotationFacade.getGroupIdsThatPerformedKeyRotations() + o(groupIds).deepEquals([userGroupId]) }) o("Successful rotation - no recover code", async function () { @@ -1073,6 +1520,8 @@ o.spec("KeyRotationFacadeTest", function () { cryptoWrapper: cryptoWrapperMock, entityClient: entityClientMock, asymmetricCryptoFacade: asymmetricCryptoFacade, + keyAuthenticationFacade: keyAuthenticationFacade, + publicKeyProvider, }, keyRotationFacade, userGroup, @@ -1097,18 +1546,21 @@ o.spec("KeyRotationFacadeTest", function () { verify(recoverCodeFacade.encryptRecoveryCode(anything(), anything()), { times: 0 }) }) - o("Fails if admin public key hashes do not match", async function () { + o("Fails if admin public key mac tag does not match", async function () { prepareUserKeyRotation( { serviceExecutor: serviceExecutorMock, cryptoWrapper: cryptoWrapperMock, entityClient: entityClientMock, asymmetricCryptoFacade: asymmetricCryptoFacade, + keyAuthenticationFacade: keyAuthenticationFacade, + publicKeyProvider, }, keyRotationFacade, userGroup, ) - when(cryptoWrapperMock.sha256Hash(matchers.anything())).thenReturn(new Uint8Array([9, 8, 7])) + // noinspection JSVoidFunctionReturnValueUsed + when(keyAuthenticationFacade.verifyTag(anything(), anything())).thenThrow(new CryptoError("test error")) await assertThrows(Error, async () => keyRotationFacade.processPendingKeyRotation(user)) }) @@ -1119,6 +1571,8 @@ o.spec("KeyRotationFacadeTest", function () { cryptoWrapper: cryptoWrapperMock, entityClient: entityClientMock, asymmetricCryptoFacade: asymmetricCryptoFacade, + keyAuthenticationFacade: keyAuthenticationFacade, + publicKeyProvider, }, keyRotationFacade, userGroup, @@ -1128,9 +1582,9 @@ o.spec("KeyRotationFacadeTest", function () { pwKey: PW_KEY, adminOrUserGroupKeyRotation: createTestEntity(KeyRotationTypeRef, { _id: [keyRotationsListId, userGroupId], - targetKeyVersion: String(Number(userGroup.groupKeyVersion) + 1), + targetKeyVersion: String(parseKeyVersion(userGroup.groupKeyVersion) + 1), groupKeyRotationType: GroupKeyRotationType.User, - adminGroupKeyAuthenticationData: null, // we set it to null so values are null and will make our code throw + adminPubKeyMac: null, // we set it to null so values are null and will make our code throw }), teamOrCustomerGroupKeyRotations: [], userAreaGroupsKeyRotations: [], @@ -1148,12 +1602,21 @@ o.spec("KeyRotationFacadeTest", function () { cryptoWrapper: cryptoWrapperMock, entityClient: entityClientMock, asymmetricCryptoFacade: asymmetricCryptoFacade, + keyAuthenticationFacade: keyAuthenticationFacade, + publicKeyProvider, }, keyRotationFacade, userGroup, ) - when(serviceExecutorMock.get(PublicKeyService, matchers.anything())).thenResolve({}) + when(publicKeyProvider.loadCurrentPubKey(matchers.anything())).thenResolve({ + version: 1, + object: { + pubKyberKey: null, + pubEccKey: null, + pubRsaKey: object(), + }, + }) await assertThrows(Error, async function () { await keyRotationFacade.processPendingKeyRotation(user) @@ -1161,6 +1624,126 @@ o.spec("KeyRotationFacadeTest", function () { }) }) + o.spec("User group key rotation - multiple admin", function () { + let userGroup: Group + let generatedKeyPairs: Map + let recoverData: RecoverData + + let adminGroup: Group + + o.beforeEach(function () { + userGroup = makeGroupWithMembership(userGroupId, user).group + userGroup.adminGroupEncGKey = CURRENT_ADMIN_GROUP_ENC_CURRENT_USER_GROUP_KEY.key + userGroup.adminGroupKeyVersion = String(CURRENT_ADMIN_GROUP_ENC_CURRENT_USER_GROUP_KEY.encryptingKeyVersion) + userGroup.type = GroupType.User + userGroup.currentKeys = object() + adminGroup = makeGroupWithMembership(adminGroupId, user).group + adminGroup.adminGroupEncGKey = CURRENT_ADMIN_GROUP_ENC_CURRENT_ADMIN_GROUP_KEY.key + adminGroup.adminGroupKeyVersion = String(CURRENT_ADMIN_GROUP_ENC_CURRENT_ADMIN_GROUP_KEY.encryptingKeyVersion) + adminGroup.type = GroupType.Admin + adminGroup.currentKeys = object() + + prepareRecoverData(recoverData, recoverCodeFacade) + + when(groupManagementFacade.hasAdminEncGKey(userGroup)).thenReturn(true) + when(userFacade.deriveLegacyUserDistKey(userGroupId, PW_KEY)).thenReturn(DISTRIBUTION_KEY) + + const encryptingKeyCaptor = matchers.captor() + const keyCaptor = matchers.captor() + when(cryptoWrapperMock.aes256RandomKey()).thenReturn(NEW_USER_GROUP_KEY.object) + when(cryptoWrapperMock.encryptKeyWithVersionedKey(encryptingKeyCaptor.capture(), keyCaptor.capture())).thenDo((_) => ({ + encryptingKeyVersion: encryptingKeyCaptor.value.version, + key: new Uint8Array(encryptingKeyCaptor.value.object.concat(keyCaptor.value)), + })) + + when(cryptoWrapperMock.encryptKey(DISTRIBUTION_KEY, NEW_USER_GROUP_KEY.object)).thenReturn(DISTRIBUTION_KEY_ENC_NEW_USER_GROUP_KEY) + + generatedKeyPairs = mockGenerateKeyPairs(pqFacadeMock, cryptoWrapperMock, NEW_USER_GROUP_KEY.object) + }) + + o("Successful rotation - user group key rotation as admin", async function () { + prepareMultiAdminUserKeyRotation( + { + serviceExecutor: serviceExecutorMock, + cryptoWrapper: cryptoWrapperMock, + entityClient: entityClientMock, + asymmetricCryptoFacade: asymmetricCryptoFacade, + keyLoaderFacade: keyLoaderFacadeMock, + }, + keyRotationFacade, + userGroup, + ) + + await keyRotationFacade.processPendingKeyRotation(user) + + verify( + serviceExecutorMock.post( + UserGroupKeyRotationService, + matchers.argThat((arg) => { + const userGroupKeyData: UserGroupKeyRotationData = arg.userGroupKeyData + verifyRecoverCodeData(userGroupKeyData) + o(userGroupKeyData.adminGroupEncUserGroupKey).deepEquals(NEW_ADMIN_GROUP_ENC_NEW_USER_GROUP_KEY.key) + o(userGroupKeyData.adminGroupKeyVersion).deepEquals(String(NEW_ADMIN_GROUP_KEY.version)) + o(userGroupKeyData.pubAdminGroupEncUserGroupKey).equals(null) + o(userGroupKeyData.userGroupEncAdminGroupKey).deepEquals(NEW_USER_GROUP_ENC_NEW_ADMIN_GROUP_KEY.key) + o(userGroupKeyData.userGroupKeyVersion).deepEquals(String(NEW_USER_GROUP_KEY.version)) + verifyUserGroupKeyDataExceptAdminKey(userGroupKeyData, generatedKeyPairs) + return true + }), + ), + ) + + const kdfCaptor = matchers.captor() + verify(cryptoWrapperMock.deriveKeyWithHkdf(kdfCaptor.capture())) + const values = kdfCaptor.values! + o(values.length).equals(1) + o(values[0]).deepEquals({ + salt: `adminGroup: ${adminGroupId}, userGroup: ${userGroupId}, currentUserGroupKeyVersion: ${CURRENT_USER_GROUP_KEY.version}, currentAdminGroupKeyVersion: ${CURRENT_ADMIN_GROUP_KEY.version}`, + key: PW_KEY, + context: "adminGroupDistributionKeyPairEncryptionKey", + }) + + // noinspection JSVoidFunctionReturnValueUsed + verify( + keyAuthenticationFacade.verifyTag( + { + tagType: "ADMIN_SYM_KEY_TAG", + sourceOfTrust: { currentReceivingUserGroupKey: CURRENT_USER_GROUP_KEY.object }, + untrustedKey: { newAdminGroupKey: NEW_ADMIN_GROUP_KEY.object }, + bindingData: { + adminGroupId, + userGroupId, + newAdminGroupKeyVersion: NEW_ADMIN_GROUP_KEY.version, + currentReceivingUserGroupKeyVersion: CURRENT_USER_GROUP_KEY.version, + }, + }, + anything(), + ), + ) + + o(keyRotationFacade.pendingKeyRotations.adminOrUserGroupKeyRotation).equals(null) + o(keyRotationFacade.pendingKeyRotations.pwKey).equals(null) + }) + + o("fails if admin sym key mac tag does not match", async function () { + prepareMultiAdminUserKeyRotation( + { + serviceExecutor: serviceExecutorMock, + cryptoWrapper: cryptoWrapperMock, + entityClient: entityClientMock, + asymmetricCryptoFacade: asymmetricCryptoFacade, + keyLoaderFacade: keyLoaderFacadeMock, + }, + keyRotationFacade, + userGroup, + ) + + // noinspection JSVoidFunctionReturnValueUsed + when(keyAuthenticationFacade.verifyTag(anything(), anything())).thenThrow(new CryptoError("test error")) + await assertThrows(Error, async () => keyRotationFacade.processPendingKeyRotation(user)) + }) + }) + o.spec("Ignore currently unsupported cases", function () { o("If the user group key is not quantum-safe yet, the user area group key rotations are ignored", async function () { keyRotationFacade.setPendingKeyRotations({ @@ -1184,6 +1767,7 @@ o.spec("KeyRotationFacadeTest", function () { verify(serviceExecutorMock.post(anything(), anything()), { times: 0 }) }) }) + o.spec("Key rotation for customer or team group", function () { o("Successful rotation, single member group", async function () { keyRotationFacade.setPendingKeyRotations({ @@ -1393,6 +1977,9 @@ o.spec("KeyRotationFacadeTest", function () { const thirdUpdate = sentData.groupKeyUpdates[2] o(thirdUpdate.group).equals(thirdGroupId) o(thirdUpdate.groupKeyVersion).equals("1") + + const groupIds = await keyRotationFacade.getGroupIdsThatPerformedKeyRotations() + o(groupIds.sort()).deepEquals([groupId, secondGroupId, thirdGroupId].sort()) }) }) o.spec("processPendingKeyRotationsAndUpdates error handling", function () { @@ -1409,7 +1996,6 @@ o.spec("KeyRotationFacadeTest", function () { o("loadPendingKeyRotations other Errors are thrown", async function () { const terror = new Error("test error") when(entityClientMock.load(UserGroupRootTypeRef, anything())).thenReject(terror) - const log = (console.log = spy(console.log)) await assertThrows(Error, async () => keyRotationFacade.processPendingKeyRotationsAndUpdates(object())) }) @@ -1436,7 +2022,6 @@ o.spec("KeyRotationFacadeTest", function () { mockAttribute(keyRotationFacade, keyRotationFacade.processPendingKeyRotation, () => { throw terror }) - const log = (console.log = spy(console.log)) await assertThrows(Error, async () => keyRotationFacade.processPendingKeyRotationsAndUpdates(object())) }) @@ -1468,8 +2053,6 @@ o.spec("KeyRotationFacadeTest", function () { throw terror }) - const log = (console.log = spy(console.log)) - await assertThrows(Error, async () => keyRotationFacade.processPendingKeyRotationsAndUpdates(object())) }) }) @@ -1570,7 +2153,7 @@ function prepareKeyMocks(cryptoWrapperMock: CryptoWrapper) { const encryptingKeyCaptor = matchers.captor() const keyCaptor = matchers.captor() - when(cryptoWrapperMock.encryptKeyWithVersionedKey(encryptingKeyCaptor.capture(), keyCaptor.capture())).thenDo((arg) => ({ + when(cryptoWrapperMock.encryptKeyWithVersionedKey(encryptingKeyCaptor.capture(), keyCaptor.capture())).thenDo((_) => ({ encryptingKeyVersion: encryptingKeyCaptor.value.version, key: new Uint8Array(encryptingKeyCaptor.value.object.concat(keyCaptor.value)), })) @@ -1585,14 +2168,14 @@ function prepareKeyMocks(cryptoWrapperMock: CryptoWrapper) { } function mockPrepareKeyForOtherMembers(user: User, groupManagementFacadeMock: GroupManagementFacade, cryptoWrapperMock: CryptoWrapper) { - when(groupManagementFacadeMock.getGroupKeyViaAdminEncGKey(user.userGroup.group, Number(user.userGroup.groupKeyVersion))).thenResolve( + when(groupManagementFacadeMock.getGroupKeyViaAdminEncGKey(user.userGroup.group, parseKeyVersion(user.userGroup.groupKeyVersion))).thenResolve( OTHER_MEMBER_USER_GROUP_KEY.object, ) // when(cryptoWrapperMock.encryptKey(OTHER_MEMBER_USER_GROUP_KEY.object, newGroupKey.object)) const encryptingKeyCaptor = matchers.captor() const keyCaptor = matchers.captor() when(cryptoWrapperMock.encryptKey(encryptingKeyCaptor.capture(), keyCaptor.capture())).thenDo( - (arg) => new Uint8Array(encryptingKeyCaptor.value.concat(keyCaptor.value)), + (_) => new Uint8Array(encryptingKeyCaptor.value.concat(keyCaptor.value)), ) return OTHER_USER_GROUP_ENC_NEW_SHARED_GROUP_KEY } diff --git a/test/tests/api/worker/facades/MailFacadeTest.ts b/test/tests/api/worker/facades/MailFacadeTest.ts index c254a662ca6f..502e22255fe8 100644 --- a/test/tests/api/worker/facades/MailFacadeTest.ts +++ b/test/tests/api/worker/facades/MailFacadeTest.ts @@ -23,6 +23,7 @@ import { downcast } from "@tutao/tutanota-utils" import { ProgrammingError } from "../../../../../src/common/api/common/error/ProgrammingError.js" import { createTestEntity } from "../../../TestUtils.js" import { KeyLoaderFacade } from "../../../../../src/common/api/worker/facades/KeyLoaderFacade.js" +import { PublicKeyProvider } from "../../../../../src/common/api/worker/facades/PublicKeyProvider.js" o.spec("MailFacade test", function () { let facade: MailFacade @@ -34,6 +35,7 @@ o.spec("MailFacade test", function () { let fileApp: NativeFileApp let loginFacade: LoginFacade let keyLoaderFacade: KeyLoaderFacade + let publicKeyProvider: PublicKeyProvider o.beforeEach(function () { userFacade = object() @@ -44,7 +46,8 @@ o.spec("MailFacade test", function () { fileApp = object() loginFacade = object() keyLoaderFacade = object() - facade = new MailFacade(userFacade, entity, cryptoFacade, serviceExecutor, blobFacade, fileApp, loginFacade, keyLoaderFacade) + publicKeyProvider = object() + facade = new MailFacade(userFacade, entity, cryptoFacade, serviceExecutor, blobFacade, fileApp, loginFacade, keyLoaderFacade, publicKeyProvider) }) o.spec("checkMailForPhishing", function () { diff --git a/test/tests/api/worker/facades/PublicKeyProviderTest.ts b/test/tests/api/worker/facades/PublicKeyProviderTest.ts new file mode 100644 index 000000000000..7b26309afd42 --- /dev/null +++ b/test/tests/api/worker/facades/PublicKeyProviderTest.ts @@ -0,0 +1,112 @@ +import o from "@tutao/otest" +import { matchers, object, when } from "testdouble" +import { KeyVersion } from "@tutao/tutanota-utils" +import { PublicKeyIdentifier, PublicKeyProvider } from "../../../../../src/common/api/worker/facades/PublicKeyProvider.js" +import { ServiceExecutor } from "../../../../../src/common/api/worker/rest/ServiceExecutor.js" +import { PublicKeyService } from "../../../../../src/common/api/entities/sys/Services.js" +import { createPublicKeyGetOut } from "../../../../../src/common/api/entities/sys/TypeRefs.js" +import { assertThrows } from "@tutao/tutanota-test-utils" +import { CryptoError } from "@tutao/tutanota-crypto/error.js" +import { InvalidDataError } from "../../../../../src/common/api/common/error/RestError.js" + +o.spec("PublicKeyProviderTest", function () { + let serviceExecutor: ServiceExecutor + let publicKeyProvider: PublicKeyProvider + + let publicKeyIdentifier: PublicKeyIdentifier + let currentVersion: KeyVersion + + o.beforeEach(function () { + serviceExecutor = object() + publicKeyProvider = new PublicKeyProvider(serviceExecutor) + + publicKeyIdentifier = object() + currentVersion = 2 + }) + + o.spec("loadCurrentPubKey", function () { + o("success pq keys", async function () { + const pubKyberKey = object() + const pubEccKey = object() + when(serviceExecutor.get(PublicKeyService, matchers.anything())).thenResolve( + createPublicKeyGetOut({ pubKeyVersion: String(currentVersion), pubRsaKey: null, pubKyberKey, pubEccKey }), + ) + const pubKeys = await publicKeyProvider.loadCurrentPubKey(publicKeyIdentifier) + o(pubKeys.version).equals(currentVersion) + o(pubKeys.object).deepEquals({ pubRsaKey: null, pubKyberKey, pubEccKey }) + }) + + o("success rsa keys", async function () { + currentVersion = 0 + const pubRsaKey = object() + when(serviceExecutor.get(PublicKeyService, matchers.anything())).thenResolve( + createPublicKeyGetOut({ pubKeyVersion: String(currentVersion), pubRsaKey, pubKyberKey: null, pubEccKey: null }), + ) + const pubKeys = await publicKeyProvider.loadCurrentPubKey(publicKeyIdentifier) + o(pubKeys.version).equals(currentVersion) + o(pubKeys.object).deepEquals({ pubRsaKey, pubKyberKey: null, pubEccKey: null }) + }) + + o("rsa key in version other than 0", async function () { + const pubRsaKey = object() + currentVersion = 1 + when(serviceExecutor.get(PublicKeyService, matchers.anything())).thenResolve( + createPublicKeyGetOut({ pubKeyVersion: String(currentVersion), pubRsaKey, pubKyberKey: null, pubEccKey: null }), + ) + await assertThrows(CryptoError, async () => publicKeyProvider.loadCurrentPubKey(publicKeyIdentifier)) + }) + }) + + o.spec("loadVersionedPubKey", function () { + const requestedVersion = 1 + + o("success", async function () { + const pubKyberKey = object() + const pubEccKey = object() + when(serviceExecutor.get(PublicKeyService, matchers.anything())).thenResolve( + createPublicKeyGetOut({ pubKeyVersion: String(requestedVersion), pubRsaKey: null, pubKyberKey, pubEccKey }), + ) + const pubKeys = await publicKeyProvider.loadVersionedPubKey(publicKeyIdentifier, requestedVersion) + o(pubKeys).deepEquals({ pubRsaKey: null, pubKyberKey, pubEccKey }) + }) + + o("invalid Version returned", async function () { + const pubKyberKey = object() + const pubEccKey = object() + when(serviceExecutor.get(PublicKeyService, matchers.anything())).thenResolve( + createPublicKeyGetOut({ pubKeyVersion: String(currentVersion), pubRsaKey: null, pubKyberKey, pubEccKey }), + ) + o(currentVersion).notEquals(requestedVersion) + await assertThrows(InvalidDataError, async () => publicKeyProvider.loadVersionedPubKey(publicKeyIdentifier, requestedVersion)) + }) + + o("rsa key in version other than 0", async function () { + const pubRsaKey = object() + currentVersion = 1 + when(serviceExecutor.get(PublicKeyService, matchers.anything())).thenResolve( + createPublicKeyGetOut({ pubKeyVersion: String(currentVersion), pubRsaKey, pubKyberKey: null, pubEccKey: null }), + ) + await assertThrows(CryptoError, async () => publicKeyProvider.loadVersionedPubKey(publicKeyIdentifier, currentVersion)) + }) + }) + + o.spec("version validation", function () { + o("throws if the version is negative", async function () { + when(serviceExecutor.get(PublicKeyService, matchers.anything())).thenResolve( + createPublicKeyGetOut({ pubKeyVersion: "-1", pubRsaKey: object(), pubKyberKey: null, pubEccKey: null }), + ) + + const e = await assertThrows(CryptoError, async () => publicKeyProvider.loadCurrentPubKey(publicKeyIdentifier)) + o(e.message).equals("key version is not a non-negative integer") + }) + + o("throws if the version is not an integer", async function () { + when(serviceExecutor.get(PublicKeyService, matchers.anything())).thenResolve( + createPublicKeyGetOut({ pubKeyVersion: "1.5", pubRsaKey: object(), pubKyberKey: null, pubEccKey: null }), + ) + + const e = await assertThrows(CryptoError, async () => publicKeyProvider.loadCurrentPubKey(publicKeyIdentifier)) + o(e.message).equals("key version is not a non-negative integer") + }) + }) +}) diff --git a/test/tests/api/worker/facades/UserFacadeTest.ts b/test/tests/api/worker/facades/UserFacadeTest.ts index 624de93856fc..da47f0789342 100644 --- a/test/tests/api/worker/facades/UserFacadeTest.ts +++ b/test/tests/api/worker/facades/UserFacadeTest.ts @@ -42,7 +42,7 @@ o.spec("UserFacadeTest", function () { distributionEncUserGroupKey, userGroupKeyVersion: "1", }) - when(keyCache.getUserGroupKeyDistributionKey()).thenReturn(distributionKey) + when(keyCache.getUserDistKey()).thenReturn(distributionKey) facade.updateUserGroupKey(distributionUpdate) verify(keyCache.setCurrentUserGroupKey({ version: 1, object: newUserGroupKey })) }) @@ -56,7 +56,7 @@ o.spec("UserFacadeTest", function () { distributionEncUserGroupKey, userGroupKeyVersion: "1", }) - when(keyCache.getUserGroupKeyDistributionKey()).thenReturn(null) + when(keyCache.getUserDistKey()).thenReturn(null) facade.updateUserGroupKey(distributionUpdate) verify(keyCache.setCurrentUserGroupKey(matchers.anything()), { times: 0 }) }) @@ -70,8 +70,42 @@ o.spec("UserFacadeTest", function () { distributionEncUserGroupKey, userGroupKeyVersion: "1", }) - when(keyCache.getUserGroupKeyDistributionKey()).thenReturn(distributionKey) + when(keyCache.getUserDistKey()).thenReturn(distributionKey) facade.updateUserGroupKey(distributionUpdate) verify(keyCache.setCurrentUserGroupKey(matchers.anything()), { times: 0 }) }) + + o("updateUserGroupKey - fall back to legacy user distribution key if regular one fails to decrypt", function () { + const legacyDistributionKey = aes256RandomKey() + const distributionKey = aes256RandomKey() + const newUserGroupKey = aes256RandomKey() + + const legacyDistributionEncUserGroupKey = encryptKey(legacyDistributionKey, newUserGroupKey) + const distributionUpdate = createTestEntity(UserGroupKeyDistributionTypeRef, { + _id: "userGroupId", + distributionEncUserGroupKey: legacyDistributionEncUserGroupKey, + userGroupKeyVersion: "1", + }) + when(keyCache.getUserDistKey()).thenReturn(distributionKey) + facade.updateUserGroupKey(distributionUpdate) + verify(keyCache.getLegacyUserDistKey(), { times: 1 }) + }) + + o("updateUserGroupKey - do not fall back to legacy user distribution key if regular one is able to decrypt", function () { + const distributionKey = aes256RandomKey() + const newUserGroupKey = aes256RandomKey() + + const distributionEncUserGroupKey = encryptKey(distributionKey, newUserGroupKey) + const distributionUpdate = createTestEntity(UserGroupKeyDistributionTypeRef, { + _id: "userGroupId", + distributionEncUserGroupKey: distributionEncUserGroupKey, + userGroupKeyVersion: "1", + }) + when(keyCache.getUserDistKey()).thenReturn(distributionKey) + facade.updateUserGroupKey(distributionUpdate) + verify(keyCache.getLegacyUserDistKey(), { times: 0 }) + + // make sure we reach the end of the function and do not return earlier + verify(keyCache.setCurrentUserGroupKey(matchers.anything())) + }) }) diff --git a/test/tests/misc/RecipientsModelTest.ts b/test/tests/misc/RecipientsModelTest.ts index 13167236284f..cbe623f5affa 100644 --- a/test/tests/misc/RecipientsModelTest.ts +++ b/test/tests/misc/RecipientsModelTest.ts @@ -4,7 +4,7 @@ import { LoginController } from "../../../src/common/api/main/LoginController.js import { MailFacade } from "../../../src/common/api/worker/facades/lazy/MailFacade.js" import { EntityClient } from "../../../src/common/api/common/EntityClient.js" import { func, instance, object, when } from "testdouble" -import { GroupInfoTypeRef, GroupMembershipTypeRef, PublicKeyGetOutTypeRef, UserTypeRef } from "../../../src/common/api/entities/sys/TypeRefs.js" +import { GroupInfoTypeRef, GroupMembershipTypeRef, UserTypeRef } from "../../../src/common/api/entities/sys/TypeRefs.js" import { Recipient, RecipientType } from "../../../src/common/api/common/recipients/Recipient.js" import { ContactMailAddressTypeRef, ContactTypeRef } from "../../../src/common/api/entities/tutanota/TypeRefs.js" import { UserController } from "../../../src/common/api/main/UserController.js" @@ -114,7 +114,7 @@ o.spec("RecipientsModel", function () { o("correctly resolves type for non tutanota addresses", async function () { const internalAddress = "internal@email.com" const externalAddress = "external@email.com" - when(mailFacadeMock.getRecipientKeyData(internalAddress)).thenResolve(createTestEntity(PublicKeyGetOutTypeRef)) + when(mailFacadeMock.getRecipientKeyData(internalAddress)).thenResolve(object()) when(mailFacadeMock.getRecipientKeyData(externalAddress)).thenResolve(null) const internal = await model.resolve({ address: internalAddress }, ResolveMode.Eager).resolved() diff --git a/tuta-sdk/rust/sdk/src/crypto.rs b/tuta-sdk/rust/sdk/src/crypto.rs index 8499aa787655..a3b88f2c7483 100644 --- a/tuta-sdk/rust/sdk/src/crypto.rs +++ b/tuta-sdk/rust/sdk/src/crypto.rs @@ -14,6 +14,7 @@ pub use sha::sha256; pub use tuta_crypt::PQKeyPairs; pub mod aes; +pub mod hmac; mod sha; @@ -28,6 +29,8 @@ pub(crate) mod rsa; mod tuta_crypt; pub mod asymmetric_crypto_facade; +pub mod public_key_provider; + #[cfg(test)] pub mod compatibility_test_utils; pub mod crypto_facade; diff --git a/tuta-sdk/rust/sdk/src/crypto/aes.rs b/tuta-sdk/rust/sdk/src/crypto/aes.rs index 7559e2cf4d13..05d9ef348f1e 100644 --- a/tuta-sdk/rust/sdk/src/crypto/aes.rs +++ b/tuta-sdk/rust/sdk/src/crypto/aes.rs @@ -1,5 +1,7 @@ //! Contains code to handle AES128/AES256 encryption and decryption +use crate::crypto::hmac::{HmacError, HMAC_SHA256_SIZE}; +use crate::crypto::key::GenericAesKey; use crate::crypto::randomizer_facade::RandomizerFacade; use crate::join_slices; use crate::util::{array_cast_size, array_cast_slice, ArrayCastingError}; @@ -7,6 +9,7 @@ use aes::cipher::block_padding::Pkcs7; use aes::cipher::{BlockCipher, BlockSizeUser}; use cbc::cipher::block_padding::UnpadError; use cbc::cipher::{BlockDecrypt, BlockDecryptMut, BlockEncrypt, BlockEncryptMut, KeyIvInit}; +use std::fmt::Debug; use zeroize::ZeroizeOnDrop; /// Denotes whether a text is/should be padded @@ -148,6 +151,8 @@ trait AesKey: Clone { } /// An initialisation vector for AES encryption +#[derive(Eq, PartialEq)] +#[cfg_attr(test, derive(Debug))] // only allow Debug in tests because this prints the iv pub struct Iv([u8; IV_BYTE_SIZE]); impl Clone for Iv { @@ -179,6 +184,11 @@ impl Iv { pub fn get_inner(&self) -> &[u8; IV_BYTE_SIZE] { &self.0 } + + #[must_use] + pub fn to_vec(&self) -> Vec { + self.0.to_vec() + } } #[derive(thiserror::Error, Debug)] @@ -231,7 +241,7 @@ pub enum AesDecryptError { #[error("PaddingError")] PaddingError(#[from] UnpadError), #[error("HmacError")] - HmacError, + HmacError(#[from] HmacError), } /// Result of decryption operation. @@ -239,7 +249,7 @@ pub enum AesDecryptError { pub struct PlaintextAndIv { pub data: Vec, // IV is small enough that a copy is the same size as a reference - pub iv: [u8; IV_BYTE_SIZE], + pub iv: Iv, } /// Decrypt using AES-128-CBC using prepended IV with PKCS7 padding and optional HMAC-SHA-256 @@ -302,9 +312,6 @@ pub const AES_256_KEY_SIZE: usize = 32; /// The size of an AES initialisation vector in bytes pub const IV_BYTE_SIZE: usize = 16; -/// Size of HMAC authentication added to the ciphertext -const MAC_SIZE: usize = 32; - /// Encrypts a plaintext without adding padding and returns the encrypted text as a vector fn encrypt_unpadded_vec_mut( encryptor: &mut cbc::Encryptor, @@ -332,14 +339,25 @@ type Aes128SubKeys = AesSubKeys; type Aes256SubKeys = AesSubKeys; impl AesSubKeys { - fn compute_mac(&self, iv: &[u8], ciphertext: &[u8]) -> [u8; MAC_SIZE] { - use hmac::Mac; - use sha2::Sha256; - - let mut hmac = hmac::Hmac::::new_from_slice(self.m_key.get_bytes()).unwrap(); - hmac.update(iv); - hmac.update(ciphertext); - hmac.finalize().into_bytes().into() + fn compute_mac(&self, iv_and_ciphertext: &[u8]) -> [u8; HMAC_SHA256_SIZE] { + use crate::crypto::hmac::hmac_sha256; + let generic_aes_key = + GenericAesKey::from_bytes(self.m_key.get_bytes()).expect("unimplemented key length"); + hmac_sha256(&generic_aes_key, iv_and_ciphertext) + } + + fn verify_mac( + &self, + ciphertext_with_authentication: &CiphertextWithAuthentication, + ) -> Result<(), HmacError> { + use crate::crypto::hmac::verify_hmac_sha256; + let generic_aes_key = + GenericAesKey::from_bytes(self.m_key.get_bytes()).expect("unimplemented key length"); + verify_hmac_sha256( + &generic_aes_key, + ciphertext_with_authentication.iv_and_ciphertext, + ciphertext_with_authentication.mac, + ) } } @@ -383,15 +401,16 @@ fn aes_encrypt( PaddingMode::WithPadding => encryptor.encrypt_padded_vec_mut::(plaintext), }; + let iv_and_ciphertext = join_slices!(iv.0.as_slice(), &encrypted_data); if let Some(subkeys) = sub_keys { let ciphertext_with_auth = - CiphertextWithAuthentication::compute(&encrypted_data, &iv.0, &subkeys); + CiphertextWithAuthentication::compute(&iv_and_ciphertext, &subkeys); Ok(ciphertext_with_auth.serialize()) } else { // without HMAC it is just // - iv // - encrypted data - Ok(join_slices!(iv.0.as_slice(), &encrypted_data)) + Ok(iv_and_ciphertext) } } @@ -416,13 +435,16 @@ const FIXED_IV: [u8; IV_BYTE_SIZE] = [0x88; IV_BYTE_SIZE]; #[derive(Debug)] struct CiphertextWithAuthentication<'a> { - iv: &'a [u8], - ciphertext: &'a [u8], + iv_and_ciphertext: &'a [u8], // it's smol enough to just copy it around - mac: [u8; MAC_SIZE], + mac: [u8; HMAC_SHA256_SIZE], } impl<'a> CiphertextWithAuthentication<'a> { + fn split_iv_and_ciphertext(&self) -> (&'a [u8], &'a [u8]) { + self.iv_and_ciphertext.split_at(IV_BYTE_SIZE) + } + fn parse(bytes: &'a [u8]) -> Result>, AesDecryptError> { // No MAC if !has_mac(bytes) { @@ -430,43 +452,35 @@ impl<'a> CiphertextWithAuthentication<'a> { } // Incorrect size for Hmac - if bytes.len() <= IV_BYTE_SIZE + MAC_SIZE { - return Err(AesDecryptError::HmacError); + if bytes.len() <= IV_BYTE_SIZE + HMAC_SHA256_SIZE { + return Err(AesDecryptError::HmacError(HmacError)); } // Split `bytes` into the MAC and combined ciphertext with iv let encrypted_bytes_without_marker = &bytes[1..]; - let end_of_ciphertext = encrypted_bytes_without_marker.len() - MAC_SIZE; + let end_of_ciphertext = encrypted_bytes_without_marker.len() - HMAC_SHA256_SIZE; let (ciphertext_without_mac, provided_mac_bytes) = encrypted_bytes_without_marker.split_at(end_of_ciphertext); // Extract the iv from the ciphertext and return the extracted components - let (iv, ciphertext) = ciphertext_without_mac.split_at(IV_BYTE_SIZE); - let mac: [u8; MAC_SIZE] = - array_cast_slice(provided_mac_bytes, "MAC").map_err(|_| AesDecryptError::HmacError)?; + let mac: [u8; HMAC_SHA256_SIZE] = array_cast_slice(provided_mac_bytes, "MAC") + .map_err(|_| AesDecryptError::HmacError(HmacError))?; Ok(Some(CiphertextWithAuthentication { - iv, - ciphertext, + iv_and_ciphertext: ciphertext_without_mac, mac, })) } fn compute( - ciphertext: &'a [u8], - iv: &'a [u8], + iv_and_ciphertext: &'a [u8], subkeys: &AesSubKeys, ) -> CiphertextWithAuthentication<'a> { CiphertextWithAuthentication { - iv, - ciphertext, - mac: subkeys.compute_mac(iv, ciphertext), + iv_and_ciphertext, + mac: subkeys.compute_mac(iv_and_ciphertext), } } - fn matches(&self, subkeys: &AesSubKeys) -> bool { - self.mac == subkeys.compute_mac(self.iv, self.ciphertext) - } - fn serialize(&self) -> Vec { // - marker that HMAC is there (a single byte with "1" in the front, this makes the length // un-even) @@ -474,7 +488,7 @@ impl<'a> CiphertextWithAuthentication<'a> { // - encrypted data // - HMAC bytes - join_slices!(&[1u8; 1], self.iv, self.ciphertext, &self.mac) + join_slices!(&[1u8; 1], self.iv_and_ciphertext, &self.mac) } } @@ -499,17 +513,13 @@ fn aes_decrypt( let (key, iv_bytes, encrypted_bytes) = if let Some(ciphertext_with_auth) = CiphertextWithAuthentication::parse(encrypted_bytes)? { let subkeys = key.derive_subkeys(); - if !ciphertext_with_auth.matches(&subkeys) { - return Err(AesDecryptError::HmacError); - } - ( - subkeys.c_key, - ciphertext_with_auth.iv, - ciphertext_with_auth.ciphertext, - ) + let (iv_bytes, ciphertext) = ciphertext_with_auth.split_iv_and_ciphertext(); + subkeys.verify_mac(&ciphertext_with_auth)?; + + (subkeys.c_key, iv_bytes, ciphertext) } else if enforce_mac == EnforceMac::EnforceMac { - return Err(AesDecryptError::HmacError); + return Err(AesDecryptError::HmacError(HmacError)); } else { // Separate and check both the initialisation vector let (iv_bytes, cipher_text) = encrypted_bytes.split_at(IV_BYTE_SIZE); @@ -520,7 +530,7 @@ fn aes_decrypt( if encrypted_bytes.is_empty() { return Ok(PlaintextAndIv { data: vec![], - iv: iv_bytes.try_into().expect("iv is correct size"), + iv: Iv(iv_bytes.try_into().expect("iv is correct size")), }); } @@ -534,7 +544,7 @@ fn aes_decrypt( Ok(PlaintextAndIv { data: plaintext_data, - iv: iv_bytes.try_into().expect("iv is correct size"), + iv: Iv(iv_bytes.try_into().expect("iv is correct size")), }) } diff --git a/tuta-sdk/rust/sdk/src/crypto/asymmetric_crypto_facade.rs b/tuta-sdk/rust/sdk/src/crypto/asymmetric_crypto_facade.rs index a22a0ade730d..f5fcc572b52b 100644 --- a/tuta-sdk/rust/sdk/src/crypto/asymmetric_crypto_facade.rs +++ b/tuta-sdk/rust/sdk/src/crypto/asymmetric_crypto_facade.rs @@ -4,11 +4,14 @@ use crate::crypto::key::{ AsymmetricKeyPair, AsymmetricPublicKey, GenericAesKey, KeyLoadError, VersionedAesKey, }; use crate::crypto::kyber::{KyberKeyError, KyberPublicKey}; +#[cfg_attr(test, mockall_double::double)] +use crate::crypto::public_key_provider::PublicKeyProvider; +use crate::crypto::public_key_provider::{PublicKeyIdentifier, PublicKeyLoadingError, PublicKeys}; use crate::crypto::randomizer_facade::RandomizerFacade; use crate::crypto::rsa::{RSAEccKeyPair, RSAEncryptionError, RSAKeyError, RSAPublicKey}; use crate::crypto::tuta_crypt::{PQError, PQMessage, TutaCryptPublicKeys}; use crate::crypto::Aes256Key; -use crate::entities::generated::sys::{PubEncKeyData, PublicKeyGetIn, PublicKeyPutIn}; +use crate::entities::generated::sys::{PubEncKeyData, PublicKeyPutIn}; #[cfg_attr(test, mockall_double::double)] use crate::key_loader_facade::KeyLoaderFacade; use crate::services::generated::sys::PublicKeyService; @@ -16,9 +19,9 @@ use crate::services::generated::sys::PublicKeyService; use crate::services::service_executor::ServiceExecutor; use crate::services::ExtraServiceParams; use crate::tutanota_constants::CryptoProtocolVersion; -use crate::tutanota_constants::{EncryptionAuthStatus, PublicKeyIdentifierType}; +use crate::tutanota_constants::EncryptionAuthStatus; use crate::util::ArrayCastingError; -use crate::util::Versioned; +use crate::util::{convert_version_to_u64, Versioned}; use crate::ApiCallError; use crate::GeneratedId; use std::sync::Arc; @@ -29,22 +32,11 @@ pub struct DecapsulatedAesKey { pub sender_identity_pub_key: Option, // for authentication: None for rsa only } -pub struct PublicKeyIdentifier { - pub identifier: String, - pub identifier_type: PublicKeyIdentifierType, -} - pub struct PubEncSymKey { pub_enc_sym_key_bytes: Vec, crypto_protocol_version: CryptoProtocolVersion, - sender_key_version: Option, - recipient_key_version: i64, -} - -pub struct PublicKeys { - pub_rsa_key: Option>, - pub_ecc_key: Option>, - pub_kyber_key: Option>, + sender_key_version: Option, + recipient_key_version: u64, } #[derive(thiserror::Error, Debug)] @@ -64,12 +56,14 @@ pub enum AsymmetricCryptoError { AesEncrypt(#[from] AesEncryptError), ApiCall(#[from] ApiCallError), AuthenticationError(EncryptionAuthStatus), + PublicKeyLoadingError(#[from] PublicKeyLoadingError), } pub struct AsymmetricCryptoFacade { key_loader_facade: Arc, randomizer_facade: RandomizerFacade, service_executor: Arc, + public_key_provider: Arc, } #[cfg_attr(test, mockall::automock)] @@ -79,11 +73,13 @@ impl AsymmetricCryptoFacade { key_loader_facade: Arc, randomizer_facade: RandomizerFacade, service_executor: Arc, + public_key_provider: Arc, ) -> Self { Self { key_loader_facade, randomizer_facade, service_executor, + public_key_provider, } } @@ -97,20 +93,15 @@ impl AsymmetricCryptoFacade { &self, identifier: PublicKeyIdentifier, sender_identity_pub_key: &[u8], - sender_key_version: i64, + sender_key_version: u64, ) -> Result { - let key_data = PublicKeyGetIn { - _format: 0, - identifier: identifier.identifier, - identifierType: identifier.identifier_type as i64, - version: Some(sender_key_version), - }; - let public_key_get_out = self - .service_executor - .get::(key_data, ExtraServiceParams::default()) + let pub_keys = self + .public_key_provider + .load_versioned_pub_key(&identifier, sender_key_version) .await?; - if Option::is_some(&public_key_get_out.pubEccKey) - && public_key_get_out.pubEccKey.unwrap() == sender_identity_pub_key + + if Option::is_some(&pub_keys.pub_ecc_key) + && pub_keys.pub_ecc_key.unwrap() == sender_identity_pub_key { Ok(EncryptionAuthStatus::TutacryptAuthenticationSucceeded) } else { @@ -147,7 +138,7 @@ impl AsymmetricCryptoFacade { .authenticate_sender( sender_identifier, sender_identity_pub_key_from_pq_message, - pub_enc_key_data.senderKeyVersion.unwrap(), + convert_version_to_u64(pub_enc_key_data.senderKeyVersion.unwrap()), ) .await?; if encryption_auth_status != EncryptionAuthStatus::TutacryptAuthenticationSucceeded { @@ -211,7 +202,7 @@ impl AsymmetricCryptoFacade { pub async fn load_key_pair_and_decrypt_sym_key( &self, recipient_key_pair_group_id: &GeneratedId, - recipient_key_version: i64, + recipient_key_version: u64, crypto_protocol_version: &CryptoProtocolVersion, pub_enc_sym_key: &[u8], ) -> Result { @@ -407,8 +398,8 @@ impl AsymmetricCryptoFacade { #[cfg(test)] mod tests { use crate::crypto::asymmetric_crypto_facade::AsymmetricCryptoFacade; + use crate::crypto::public_key_provider::{MockPublicKeyProvider, PublicKeyIdentifier}; use crate::crypto::randomizer_facade::test_util::make_thread_rng_facade; - use crate::entities::generated::sys::PublicKeyGetIn; use crate::key_loader_facade::MockKeyLoaderFacade; use crate::services::service_executor::MockServiceExecutor; use crate::tutanota_constants::PublicKeyIdentifierType; @@ -416,39 +407,36 @@ mod tests { fn make_asymmetric_crypto_facade( service_executor: MockServiceExecutor, + public_key_provider: MockPublicKeyProvider, ) -> AsymmetricCryptoFacade { let key_loader_facade = MockKeyLoaderFacade::default(); AsymmetricCryptoFacade::new( Arc::new(key_loader_facade), make_thread_rng_facade(), Arc::new(service_executor), + Arc::new(public_key_provider), ) } fn setup_authentication_test() -> ( - i64, - String, - PublicKeyIdentifierType, - PublicKeyGetIn, + u64, + PublicKeyIdentifier, MockServiceExecutor, + MockPublicKeyProvider, ) { - let sender_key_version = 0i64; - let identifier = String::from("sender_id"); - let identifier_type = PublicKeyIdentifierType::MailAddress; - let first_service_executor_invocation = PublicKeyGetIn { - _format: 0, - identifier: identifier.clone(), - identifierType: identifier_type.clone() as i64, - version: Some(sender_key_version), + let sender_key_version = 0u64; + let public_key_identifier = PublicKeyIdentifier { + identifier: String::from("sender_id"), + identifier_type: PublicKeyIdentifierType::GroupId, }; let service_executor = MockServiceExecutor::default(); + let public_key_provider = MockPublicKeyProvider::default(); ( sender_key_version, - identifier, - identifier_type, - first_service_executor_invocation, + public_key_identifier, service_executor, + public_key_provider, ) } @@ -456,45 +444,42 @@ mod tests { use crate::crypto::asymmetric_crypto_facade::tests::{ make_asymmetric_crypto_facade, setup_authentication_test, }; - use crate::crypto::asymmetric_crypto_facade::PublicKeyIdentifier; - use crate::entities::generated::sys::PublicKeyGetOut; + use crate::crypto::public_key_provider::PublicKeys; use crate::services::generated::sys::PublicKeyService; use crate::tutanota_constants::EncryptionAuthStatus; - use mockall::predicate::{always, eq}; + use mockall::predicate::eq; #[tokio::test] async fn should_return_tutacrypt_authentication_succeeded_if_the_key_matches() { let ( sender_key_version, - identifier, - identifier_type, - first_service_executor_invocation, + public_key_identifier, mut service_executor, + mut public_key_provider, ) = setup_authentication_test(); let sender_identity_pub_key = vec![9, 8, 7]; let pub_key = sender_identity_pub_key.clone(); - service_executor - .expect_get::() - .with(eq(first_service_executor_invocation), always()) + + service_executor.expect_get::().never(); + service_executor.expect_put::().never(); + public_key_provider + .expect_load_versioned_pub_key() + .with(eq(public_key_identifier.clone()), eq(sender_key_version)) .returning(move |_, _| { - Ok(PublicKeyGetOut { - _format: 0, - pubEccKey: Some(pub_key.clone()), - pubKeyVersion: 0i64, - pubKyberKey: Some(vec![1, 2, 3]), - pubRsaKey: None, + Ok(PublicKeys { + pub_ecc_key: Some(pub_key.clone()), + pub_kyber_key: Some(vec![1, 2, 3]), + pub_rsa_key: None, }) }); - let asymmetric_crypto_facade = make_asymmetric_crypto_facade(service_executor); + let asymmetric_crypto_facade = + make_asymmetric_crypto_facade(service_executor, public_key_provider); let result = asymmetric_crypto_facade .authenticate_sender( - PublicKeyIdentifier { - identifier, - identifier_type, - }, + public_key_identifier, &sender_identity_pub_key, sender_key_version, ) @@ -511,34 +496,32 @@ mod tests { ) { let ( sender_key_version, - identifier, - identifier_type, - first_service_executor_invocation, + public_key_identifier, mut service_executor, + mut public_key_provider, ) = setup_authentication_test(); let sender_identity_pub_key = vec![9, 8, 7]; let pub_key = sender_identity_pub_key.clone(); - service_executor - .expect_get::() - .with(eq(first_service_executor_invocation), always()) + + service_executor.expect_get::().never(); + service_executor.expect_put::().never(); + public_key_provider + .expect_load_versioned_pub_key() + .with(eq(public_key_identifier.clone()), eq(sender_key_version)) .returning(move |_, _| { - Ok(PublicKeyGetOut { - _format: 0, - pubEccKey: None, - pubKeyVersion: 0i64, - pubKyberKey: None, - pubRsaKey: Some(pub_key.clone()), + Ok(PublicKeys { + pub_ecc_key: None, + pub_kyber_key: None, + pub_rsa_key: Some(pub_key.clone()), }) }); - let asymmetric_crypto_facade = make_asymmetric_crypto_facade(service_executor); + let asymmetric_crypto_facade = + make_asymmetric_crypto_facade(service_executor, public_key_provider); let result = asymmetric_crypto_facade .authenticate_sender( - PublicKeyIdentifier { - identifier, - identifier_type, - }, + public_key_identifier, &sender_identity_pub_key, sender_key_version, ) @@ -552,34 +535,31 @@ mod tests { async fn should_return_tutacrypt_authentication_failed_if_the_key_does_not_match() { let ( sender_key_version, - identifier, - identifier_type, - first_service_executor_invocation, + public_key_identifier, mut service_executor, + mut public_key_provider, ) = setup_authentication_test(); let sender_identity_pub_key = vec![9, 8, 7]; - service_executor - .expect_get::() - .with(eq(first_service_executor_invocation), always()) + service_executor.expect_get::().never(); + service_executor.expect_put::().never(); + public_key_provider + .expect_load_versioned_pub_key() + .with(eq(public_key_identifier.clone()), eq(sender_key_version)) .returning(move |_, _| { - Ok(PublicKeyGetOut { - _format: 0, - pubEccKey: Some(vec![5, 5, 5, 1]), // not matching the sender_identity_pub_key - pubKeyVersion: 0i64, - pubKyberKey: Some(vec![1, 2, 3]), - pubRsaKey: None, + Ok(PublicKeys { + pub_ecc_key: Some(vec![5, 5, 5, 1]), // not matching the sender_identity_pub_key + pub_kyber_key: Some(vec![1, 2, 3]), + pub_rsa_key: None, }) }); - let asymmetric_crypto_facade = make_asymmetric_crypto_facade(service_executor); + let asymmetric_crypto_facade = + make_asymmetric_crypto_facade(service_executor, public_key_provider); let result = asymmetric_crypto_facade .authenticate_sender( - PublicKeyIdentifier { - identifier, - identifier_type, - }, + public_key_identifier, &sender_identity_pub_key, sender_key_version, ) @@ -595,43 +575,44 @@ mod tests { use crate::crypto::asymmetric_crypto_facade::tests::{ make_asymmetric_crypto_facade, setup_authentication_test, }; - use crate::crypto::asymmetric_crypto_facade::{AsymmetricCryptoError, PublicKeyIdentifier}; + use crate::crypto::asymmetric_crypto_facade::AsymmetricCryptoError; use crate::crypto::ecc::EccKeyPair; use crate::crypto::key::{AsymmetricKeyPair, GenericAesKey}; + use crate::crypto::public_key_provider::PublicKeys; use crate::crypto::randomizer_facade::test_util::make_thread_rng_facade; use crate::crypto::rsa::RSAKeyPair; use crate::crypto::tuta_crypt::PQMessage; use crate::crypto::{Aes256Key, PQKeyPairs}; - use crate::entities::generated::sys::{PubEncKeyData, PublicKeyGetOut}; + use crate::entities::generated::sys::PubEncKeyData; use crate::services::generated::sys::PublicKeyService; use crate::tutanota_constants::CryptoProtocolVersion; use crate::tutanota_constants::PublicKeyIdentifierType; - use mockall::predicate::{always, eq}; + use mockall::predicate::eq; #[tokio::test] async fn error_if_authentication_fails() { let ( sender_key_version, sender_identifier, - sender_identifier_type, - first_service_executor_invocation, mut service_executor, + mut public_key_provider, ) = setup_authentication_test(); - service_executor - .expect_get::() - .with(eq(first_service_executor_invocation), always()) + service_executor.expect_get::().never(); + service_executor.expect_put::().never(); + public_key_provider + .expect_load_versioned_pub_key() + .with(eq(sender_identifier.clone()), eq(sender_key_version)) .returning(move |_, _| { - Ok(PublicKeyGetOut { - _format: 0, - pubEccKey: Some(vec![5, 5, 5, 1]), // not matching the sender_identity_pub_key - pubKeyVersion: 0i64, - pubKyberKey: Some(vec![1, 2, 3]), - pubRsaKey: None, + Ok(PublicKeys { + pub_ecc_key: Some(vec![5, 5, 5, 1]), // not matching the sender_identity_pub_key + pub_kyber_key: Some(vec![1, 2, 3]), + pub_rsa_key: None, }) }); - let asymmetric_crypto_facade = make_asymmetric_crypto_facade(service_executor); + let asymmetric_crypto_facade = + make_asymmetric_crypto_facade(service_executor, public_key_provider); let randomizer_facade = make_thread_rng_facade(); let recipient_key_pair = PQKeyPairs::generate(&randomizer_facade); @@ -655,17 +636,17 @@ mod tests { recipientIdentifier: recipient_identifier, recipientIdentifierType: recipient_identifier_type as i64, recipientKeyVersion: 0, - senderKeyVersion: Some(sender_key_version), + senderKeyVersion: Some(sender_key_version as i64), + senderIdentifier: Some(sender_identifier.identifier.clone()), + senderIdentifierType: Some(sender_identifier.identifier_type.clone() as i64), + symKeyMac: None, }; let result = asymmetric_crypto_facade .decrypt_sym_key_with_key_pair_and_authenticate( AsymmetricKeyPair::PQKeyPairs(recipient_key_pair), pub_enc_key_data, - PublicKeyIdentifier { - identifier: sender_identifier, - identifier_type: sender_identifier_type, - }, + sender_identifier, ) .await; assert!(result.is_err()); @@ -677,17 +658,13 @@ mod tests { #[tokio::test] async fn should_not_try_authentication_when_protocol_is_not_tuta_crypt() { - let ( - _sender_key_version, - sender_identifier, - sender_identifier_type, - _first_service_executor_invocation, - mut service_executor, - ) = setup_authentication_test(); + let (_sender_key_version, sender_identifier, mut service_executor, public_key_provider) = + setup_authentication_test(); service_executor.expect_get::().never(); - let asymmetric_crypto_facade = make_asymmetric_crypto_facade(service_executor); + let asymmetric_crypto_facade = + make_asymmetric_crypto_facade(service_executor, public_key_provider); let randomizer_facade = make_thread_rng_facade(); let recipient_key_pair = RSAKeyPair::generate(&randomizer_facade); @@ -705,16 +682,16 @@ mod tests { recipientKeyVersion: 0, protocolVersion: CryptoProtocolVersion::Rsa as i64, senderKeyVersion: None, + senderIdentifier: Some(sender_identifier.identifier.clone()), + senderIdentifierType: Some(sender_identifier.identifier_type.clone() as i64), + symKeyMac: None, }; let result = asymmetric_crypto_facade .decrypt_sym_key_with_key_pair_and_authenticate( AsymmetricKeyPair::RSAKeyPair(recipient_key_pair), pub_enc_key_data, - PublicKeyIdentifier { - identifier: sender_identifier, - identifier_type: sender_identifier_type, - }, + sender_identifier, ) .await .unwrap(); @@ -857,8 +834,9 @@ mod tests { // when(keyLoaderFacade.loadCurrentKeyPair(senderGroupId)).thenResolve(senderPqKeyPair) // }) - use crate::crypto::asymmetric_crypto_facade::{AsymmetricCryptoFacade, PublicKeys}; + use crate::crypto::asymmetric_crypto_facade::AsymmetricCryptoFacade; use crate::crypto::key::{AsymmetricKeyPair, GenericAesKey}; + use crate::crypto::public_key_provider::{MockPublicKeyProvider, PublicKeys}; use crate::crypto::randomizer_facade::test_util::make_thread_rng_facade; use crate::crypto::rsa::RSAKeyPair; use crate::crypto::{Aes256Key, PQKeyPairs}; @@ -875,10 +853,11 @@ mod tests { #[tokio::test] async fn encrypt_the_sym_key_with_the_recipient_pq_public_key() { - let sender_key_version = 1i64; + let sender_key_version = 1u64; let sender_group_id = GeneratedId::test_random(); let mut service_executor = MockServiceExecutor::default(); + let public_key_provider = MockPublicKeyProvider::default(); service_executor.expect_get::().never(); let mut key_loader_facade = MockKeyLoaderFacade::default(); @@ -900,11 +879,12 @@ mod tests { Arc::new(key_loader_facade), make_thread_rng_facade(), Arc::new(service_executor), + Arc::new(public_key_provider), ); let sym_key = Aes256Key::generate(&randomizer_facade); let recipient_key_pair = PQKeyPairs::generate(&randomizer_facade); - let recipient_key_version = 3i64; + let recipient_key_version = 3u64; let versioned_recipient_public_keys: Versioned = Versioned { version: recipient_key_version, object: PublicKeys { @@ -943,11 +923,12 @@ mod tests { #[tokio::test] async fn recipient_has_pq_public_key_and_sender_has_only_rsa_key_pair_then_put_sender_ecc_key( ) { - let sender_key_version = 1i64; + let sender_key_version = 1u64; let sender_group_id = GeneratedId::test_random(); let sender_group_id_clone = sender_group_id.clone(); let mut service_executor = MockServiceExecutor::default(); + let public_key_provider = MockPublicKeyProvider::default(); service_executor.expect_get::().never(); service_executor .expect_put::() @@ -990,11 +971,12 @@ mod tests { Arc::new(key_loader_facade), make_thread_rng_facade(), Arc::new(service_executor), + Arc::new(public_key_provider), ); let sym_key = Aes256Key::generate(&randomizer_facade); let recipient_key_pair = PQKeyPairs::generate(&randomizer_facade); - let recipient_key_version = 3i64; + let recipient_key_version = 3u64; let versioned_recipient_public_keys: Versioned = Versioned { version: recipient_key_version, object: PublicKeys { @@ -1035,6 +1017,7 @@ mod tests { let sender_group_id = GeneratedId::test_random(); let mut service_executor = MockServiceExecutor::default(); + let public_key_provider = MockPublicKeyProvider::default(); service_executor.expect_put::().never(); service_executor.expect_get::().never(); @@ -1046,11 +1029,12 @@ mod tests { Arc::new(key_loader_facade), make_thread_rng_facade(), Arc::new(service_executor), + Arc::new(public_key_provider), ); let sym_key = Aes256Key::generate(&randomizer_facade); let recipient_key_pair = RSAKeyPair::generate(&randomizer_facade); - let recipient_key_version = 3i64; + let recipient_key_version = 3u64; let versioned_recipient_public_keys: Versioned = Versioned { version: recipient_key_version, object: PublicKeys { @@ -1079,8 +1063,9 @@ mod tests { } mod tuta_crypt_encrypt_sym_key { use crate::crypto::asymmetric_crypto_facade::tests::make_asymmetric_crypto_facade; - use crate::crypto::asymmetric_crypto_facade::{AsymmetricCryptoError, PublicKeys}; + use crate::crypto::asymmetric_crypto_facade::AsymmetricCryptoError; use crate::crypto::ecc::EccKeyPair; + use crate::crypto::public_key_provider::{MockPublicKeyProvider, PublicKeys}; use crate::crypto::randomizer_facade::test_util::make_thread_rng_facade; use crate::crypto::rsa::RSAKeyPair; use crate::crypto::Aes256Key; @@ -1090,17 +1075,19 @@ mod tests { #[tokio::test] async fn error_when_passing_an_rsa_public_key() { - let sender_key_version = 1i64; + let sender_key_version = 1u64; let mut service_executor = MockServiceExecutor::default(); + let public_key_provider = MockPublicKeyProvider::default(); service_executor.expect_get::().never(); let randomizer_facade = make_thread_rng_facade(); - let asymmetric_crypto_facade = make_asymmetric_crypto_facade(service_executor); + let asymmetric_crypto_facade = + make_asymmetric_crypto_facade(service_executor, public_key_provider); let sym_key = Aes256Key::generate(&randomizer_facade); let recipient_key_pair = RSAKeyPair::generate(&randomizer_facade); - let recipient_key_version = 3i64; + let recipient_key_version = 3u64; let versioned_recipient_public_keys: Versioned = Versioned { version: recipient_key_version, object: PublicKeys { diff --git a/tuta-sdk/rust/sdk/src/crypto/compatibility_test_utils.rs b/tuta-sdk/rust/sdk/src/crypto/compatibility_test_utils.rs index 82159fe5c2e7..e43f842c9df0 100644 --- a/tuta-sdk/rust/sdk/src/crypto/compatibility_test_utils.rs +++ b/tuta-sdk/rust/sdk/src/crypto/compatibility_test_utils.rs @@ -49,6 +49,17 @@ pub struct HkdfTest { pub length_in_bytes: usize, } +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct HmacTest { + #[serde(with = "const_hex")] + pub key_hex: Vec, + #[serde(with = "const_hex")] + pub data_hex: Vec, + #[serde(with = "const_hex")] + pub hmac_sha256_tag_hex: Vec, +} + #[derive(Deserialize)] #[serde(rename_all = "camelCase")] pub struct Argon2Test { @@ -152,6 +163,7 @@ pub struct CompatibilityTestData { pub aes128_mac_tests: Vec, pub aes256_tests: Vec, pub hkdf_tests: Vec, + pub hmac_sha256_tests: Vec, pub argon2id_tests: Vec, pub x25519_tests: Vec, pub kyber_encryption_tests: Vec, diff --git a/tuta-sdk/rust/sdk/src/crypto/crypto_facade.rs b/tuta-sdk/rust/sdk/src/crypto/crypto_facade.rs index 0ffa719d5017..3d2229795894 100644 --- a/tuta-sdk/rust/sdk/src/crypto/crypto_facade.rs +++ b/tuta-sdk/rust/sdk/src/crypto/crypto_facade.rs @@ -18,7 +18,7 @@ use crate::instance_mapper::InstanceMapper; use crate::key_loader_facade::KeyLoaderFacade; use crate::metamodel::TypeModel; use crate::tutanota_constants::{CryptoProtocolVersion, EncryptionAuthStatus}; -use crate::util::ArrayCastingError; +use crate::util::{convert_version_to_u64, ArrayCastingError}; use crate::GeneratedId; use crate::IdTupleGenerated; use base64::prelude::BASE64_URL_SAFE_NO_PAD; @@ -39,7 +39,7 @@ pub struct CryptoFacade { pub struct ResolvedSessionKey { pub session_key: GenericAesKey, pub owner_enc_session_key: Vec, - pub owner_key_version: i64, + pub owner_key_version: u64, } #[cfg_attr(test, mockall::automock)] @@ -155,7 +155,7 @@ impl CryptoFacade { self.asymmetric_crypto_facade .load_key_pair_and_decrypt_sym_key( key_group, - bucket_key.recipientKeyVersion, + convert_version_to_u64(bucket_key.recipientKeyVersion), &CryptoProtocolVersion::try_from(bucket_key.protocolVersion).unwrap(), pub_enc_bucket_key, ) @@ -233,7 +233,7 @@ fn parse_generated_id_field( struct EntityOwnerKeyData<'a> { owner_enc_session_key: Option<&'a Vec>, - owner_key_version: Option, + owner_key_version: Option, owner_group: Option<&'a GeneratedId>, } @@ -253,8 +253,10 @@ impl<'a> EntityOwnerKeyData<'a> { let owner_enc_session_key = get_nullable_field!(entity, OWNER_ENC_SESSION_KEY_FIELD, Bytes)?; - let owner_key_version = + + let owner_key_version_i64 = get_nullable_field!(entity, OWNER_KEY_VERSION_FIELD, Number)?.copied(); + let owner_key_version: Option = owner_key_version_i64.map(convert_version_to_u64); let owner_group = get_nullable_field!(entity, OWNER_GROUP_FIELD, IdGeneratedId)?; Ok(EntityOwnerKeyData { @@ -467,8 +469,8 @@ mod test { bucket_key: Aes256Key, bucket_key_generic: GenericAesKey, bucket_enc_session_key: Vec, - sender_key_version: i64, - recipient_key_version: i64, + sender_key_version: u64, + recipient_key_version: u64, pub_enc_bucket_key: Vec, } @@ -508,7 +510,7 @@ mod test { fn make_crypto_facade( randomizer_facade: RandomizerFacade, group_key: GenericAesKey, - sender_key_version: i64, + sender_key_version: u64, asymmetric_crypto_facade: Option, ) -> CryptoFacade { let mut key_loader = MockKeyLoaderFacade::default(); @@ -537,7 +539,7 @@ mod test { } fn make_bucket_key( - recipient_key_version: i64, + recipient_key_version: u64, pub_enc_bucket_key: Vec, instance_id: &GeneratedId, instance_list: &GeneratedId, @@ -545,18 +547,19 @@ mod test { bucket_enc_session_key: Vec, protocol_version: i64, ) -> BucketKey { + let recipient_key_version_i64 = recipient_key_version as i64; BucketKey { groupEncBucketKey: None, protocolVersion: protocol_version, pubEncBucketKey: Some(pub_enc_bucket_key), - recipientKeyVersion: recipient_key_version, + recipientKeyVersion: recipient_key_version_i64, senderKeyVersion: None, bucketEncSessionKeys: vec![InstanceSessionKey { encryptionAuthStatus: None, instanceId: instance_id.clone(), instanceList: instance_list.clone(), symEncSessionKey: bucket_enc_session_key.clone(), - symKeyVersion: recipient_key_version, + symKeyVersion: recipient_key_version_i64, ..create_test_entity() }], keyGroup: Some(key_group.clone()), diff --git a/tuta-sdk/rust/sdk/src/crypto/hmac.rs b/tuta-sdk/rust/sdk/src/crypto/hmac.rs new file mode 100644 index 000000000000..20e6cfe746fe --- /dev/null +++ b/tuta-sdk/rust/sdk/src/crypto/hmac.rs @@ -0,0 +1,76 @@ +use crate::crypto::key::GenericAesKey; +use hmac::Mac; +use sha2::Sha256; + +/// Size of HMAC authentication added to the ciphertext +pub const HMAC_SHA256_SIZE: usize = 32; + +#[derive(thiserror::Error, Debug)] +#[error("HmacError")] +pub struct HmacError; + +#[must_use] +pub fn hmac_sha256(key: &GenericAesKey, data: &[u8]) -> [u8; HMAC_SHA256_SIZE] { + let mut hmac = hmac::Hmac::::new_from_slice(key.as_bytes()).unwrap(); + hmac.update(data); + hmac.finalize().into_bytes().into() +} + +pub fn verify_hmac_sha256( + key: &GenericAesKey, + data: &[u8], + tag: [u8; HMAC_SHA256_SIZE], +) -> Result<(), HmacError> { + if tag != hmac_sha256(key, data) { + Err(HmacError) + } else { + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use crate::crypto::compatibility_test_utils::get_compatibility_test_data; + use crate::crypto::hmac::hmac_sha256; + use crate::crypto::hmac::{verify_hmac_sha256, HMAC_SHA256_SIZE}; + use crate::crypto::key::GenericAesKey; + use crate::crypto::Aes256Key; + use crate::util::test_utils::random_aes256_key; + + #[test] + fn compatibility_test() { + for td in get_compatibility_test_data().hmac_sha256_tests { + let key = GenericAesKey::Aes256(Aes256Key::from_bytes(td.key_hex.as_slice()).unwrap()); + let data = td.data_hex; + let tag: [u8; HMAC_SHA256_SIZE] = td.hmac_sha256_tag_hex.as_slice().try_into().unwrap(); + let result = hmac_sha256(&key, &data); + assert_eq!(tag, result); + // sneak round trip test as well + verify_hmac_sha256(&key, &data, tag).unwrap(); + } + } + + #[test] + fn bad_key() { + let key = GenericAesKey::Aes256(random_aes256_key()); + let data = b"some data"; + let tag = hmac_sha256(&key, data); + + let bad_key = GenericAesKey::Aes256(random_aes256_key()); + let result = verify_hmac_sha256(&bad_key, data, tag); + + assert!(result.is_err()); + } + + #[test] + fn bad_data() { + let key = GenericAesKey::Aes256(random_aes256_key()); + let data = b"some data"; + let tag = hmac_sha256(&key, data); + + let bad_data = b"bad data"; + let result = verify_hmac_sha256(&key, bad_data, tag); + + assert!(result.is_err()); + } +} diff --git a/tuta-sdk/rust/sdk/src/crypto/public_key_provider.rs b/tuta-sdk/rust/sdk/src/crypto/public_key_provider.rs new file mode 100644 index 000000000000..a11d33a10a47 --- /dev/null +++ b/tuta-sdk/rust/sdk/src/crypto/public_key_provider.rs @@ -0,0 +1,387 @@ +use crate::entities::generated::sys::{PublicKeyGetIn, PublicKeyGetOut}; +use crate::services::generated::sys::PublicKeyService; +#[cfg_attr(test, mockall_double::double)] +use crate::services::service_executor::ServiceExecutor; +use crate::services::ExtraServiceParams; +use crate::tutanota_constants::PublicKeyIdentifierType; +use crate::util::{convert_version_to_i64, convert_version_to_u64, Versioned}; +use crate::ApiCallError; +use std::sync::Arc; + +#[derive(Debug, Clone, PartialEq)] +pub struct PublicKeyIdentifier { + pub identifier: String, + pub identifier_type: PublicKeyIdentifierType, +} + +pub struct PublicKeys { + pub pub_rsa_key: Option>, + pub pub_ecc_key: Option>, + pub pub_kyber_key: Option>, +} + +pub struct PublicKeyProvider { + service_executor: Arc, +} + +#[derive(thiserror::Error, Debug, Clone)] +#[error("PublicKeyLoadingError")] +pub enum PublicKeyLoadingError { + KeyValidationError(String), + KeyLoadingError(#[from] ApiCallError), +} + +#[cfg_attr(test, mockall::automock)] +impl PublicKeyProvider { + #[must_use] + pub fn new(service_executor: Arc) -> Self { + Self { service_executor } + } + + pub async fn load_current_pub_key( + &self, + pub_key_identifier: &PublicKeyIdentifier, + ) -> Result, PublicKeyLoadingError> { + self.load_pub_key(pub_key_identifier, None).await + } + + pub async fn load_versioned_pub_key( + &self, + pub_key_identifier: &PublicKeyIdentifier, + version: u64, + ) -> Result { + Ok(self + .load_pub_key(pub_key_identifier, Some(version)) + .await? + .object) + } + + async fn load_pub_key( + &self, + pub_key_identifier: &PublicKeyIdentifier, + version: Option, + ) -> Result, PublicKeyLoadingError> { + let request_data = PublicKeyGetIn { + version: version.map(convert_version_to_i64), + identifier: pub_key_identifier.identifier.clone(), + identifierType: pub_key_identifier.identifier_type.clone() as i64, + _format: 0, + }; + let public_key_get_out: PublicKeyGetOut = self + .service_executor + .get::(request_data, ExtraServiceParams::default()) + .await?; + + let pub_keys = Self::convert_to_versioned_public_keys(public_key_get_out); + Self::enforce_rsa_key_version_letraint(&pub_keys)?; + if version.is_some() && pub_keys.version != version.unwrap() { + Err(PublicKeyLoadingError::KeyValidationError( + "the server returned a key version that was not requested".to_string(), + )) + } else { + Ok(pub_keys) + } + } + + /// RSA keys were only created before introducing key versions, i.e. they always have version 0. + /// Receiving a higher version would indicate a protocol downgrade/ MITM attack, and we reject such keys. + fn enforce_rsa_key_version_letraint( + pub_keys: &Versioned, + ) -> Result<(), PublicKeyLoadingError> { + if pub_keys.version != 0 && pub_keys.object.pub_rsa_key.is_some() { + Err(PublicKeyLoadingError::KeyValidationError( + "rsa key in a version that is not 0".to_string(), + )) + } else { + Ok(()) + } + } + + fn convert_to_versioned_public_keys( + public_key_get_out: PublicKeyGetOut, + ) -> Versioned { + Versioned { + object: PublicKeys { + pub_rsa_key: public_key_get_out.pubRsaKey, + pub_kyber_key: public_key_get_out.pubKyberKey, + pub_ecc_key: public_key_get_out.pubEccKey, + }, + version: convert_version_to_u64(public_key_get_out.pubKeyVersion), + } + } +} + +#[cfg(test)] +mod tests { + use crate::crypto::public_key_provider::{PublicKeyIdentifier, PublicKeyProvider}; + use crate::entities::generated::sys::PublicKeyGetIn; + use crate::services::service_executor::MockServiceExecutor; + use crate::tutanota_constants::PublicKeyIdentifierType; + use std::sync::Arc; + + fn make_public_key_provider(service_executor: MockServiceExecutor) -> PublicKeyProvider { + PublicKeyProvider::new(Arc::new(service_executor)) + } + + fn setup_test() -> ( + u64, + PublicKeyIdentifier, + PublicKeyGetIn, + MockServiceExecutor, + ) { + let current_key_version = 2u64; + let public_key_identifier = PublicKeyIdentifier { + identifier: "myMailAddress".to_string(), + identifier_type: PublicKeyIdentifierType::MailAddress, + }; + let first_service_executor_invocation = PublicKeyGetIn { + _format: 0, + identifier: public_key_identifier.identifier.clone(), + identifierType: public_key_identifier.identifier_type.clone() as i64, + version: None, + }; + + let service_executor = MockServiceExecutor::default(); + ( + current_key_version, + public_key_identifier, + first_service_executor_invocation, + service_executor, + ) + } + + mod load_current_pub_key { + use crate::crypto::public_key_provider::tests::{make_public_key_provider, setup_test}; + use crate::crypto::public_key_provider::PublicKeyLoadingError; + use crate::entities::generated::sys::PublicKeyGetOut; + use crate::services::generated::sys::PublicKeyService; + use mockall::predicate::{always, eq}; + + #[tokio::test] + async fn success() { + let ( + current_key_version, + public_key_identifier, + first_service_executor_invocation, + mut service_executor, + ) = setup_test(); + + let pub_key = vec![9, 8, 7]; + let pub_key_for_mock = pub_key.clone(); + + service_executor + .expect_get::() + .with(eq(first_service_executor_invocation), always()) + .returning(move |_, _| { + Ok(PublicKeyGetOut { + _format: 0, + pubEccKey: Some(pub_key_for_mock.clone()), + pubKeyVersion: current_key_version as i64, + pubKyberKey: Some(pub_key_for_mock.clone()), + pubRsaKey: None, + }) + }); + let public_key_provider = make_public_key_provider(service_executor); + let pub_keys = public_key_provider + .load_current_pub_key(&public_key_identifier) + .await + .unwrap(); + assert_eq!(pub_keys.version, current_key_version); + assert_eq!(pub_keys.object.pub_rsa_key, None); + assert_eq!(pub_keys.object.pub_kyber_key, Some(pub_key.clone())); + assert_eq!(pub_keys.object.pub_ecc_key, Some(pub_key.clone())); + } + + #[tokio::test] + async fn rsa_key_in_version_other_than_0() { + let (_, public_key_identifier, first_service_executor_invocation, mut service_executor) = + setup_test(); + let current_key_version = 1u64; + + let pub_key = vec![9, 8, 7]; + let pub_key_for_mock = pub_key.clone(); + + service_executor + .expect_get::() + .with(eq(first_service_executor_invocation), always()) + .returning(move |_, _| { + Ok(PublicKeyGetOut { + _format: 0, + pubEccKey: None, + pubKeyVersion: current_key_version as i64, + pubKyberKey: None, + pubRsaKey: Some(pub_key_for_mock.clone()), + }) + }); + let public_key_provider = make_public_key_provider(service_executor); + assert_ne!(0u64, current_key_version); // !0 is important for what we are testing here + + let result = public_key_provider + .load_current_pub_key(&public_key_identifier) + .await; + assert!(result.is_err()); + assert!(matches!( + result.err().unwrap(), + PublicKeyLoadingError::KeyValidationError { .. } + )) + } + } + + mod load_version_pub_key { + use crate::crypto::public_key_provider::tests::{make_public_key_provider, setup_test}; + use crate::crypto::public_key_provider::PublicKeyLoadingError; + use crate::entities::generated::sys::PublicKeyGetOut; + use crate::services::generated::sys::PublicKeyService; + use mockall::predicate::{always, eq}; + + #[tokio::test] + async fn success() { + let ( + _, + public_key_identifier, + mut first_service_executor_invocation, + mut service_executor, + ) = setup_test(); + let requested_version = 1u64; + first_service_executor_invocation.version = Some(requested_version as i64); + + let pub_key = vec![9, 8, 7]; + let pub_key_for_mock = pub_key.clone(); + + service_executor + .expect_get::() + .with(eq(first_service_executor_invocation), always()) + .returning(move |_, _| { + Ok(PublicKeyGetOut { + _format: 0, + pubEccKey: Some(pub_key_for_mock.clone()), + pubKeyVersion: requested_version as i64, + pubKyberKey: Some(pub_key_for_mock.clone()), + pubRsaKey: None, + }) + }); + let public_key_provider = make_public_key_provider(service_executor); + let pub_keys = public_key_provider + .load_versioned_pub_key(&public_key_identifier, requested_version) + .await + .unwrap(); + assert_eq!(pub_keys.pub_rsa_key, None); + assert_eq!(pub_keys.pub_kyber_key, Some(pub_key.clone())); + assert_eq!(pub_keys.pub_ecc_key, Some(pub_key.clone())); + } + + #[tokio::test] + async fn invalid_version_returned() { + // await assertThrows(InvalidDataError, async () => publicKeyProvider.loadVersionedPubKey(publicKeyIdentifier, requestedVersion)) + let ( + current_key_version, + public_key_identifier, + mut first_service_executor_invocation, + mut service_executor, + ) = setup_test(); + let requested_version = 1u64; + first_service_executor_invocation.version = Some(requested_version as i64); + + let pub_key = vec![9, 8, 7]; + let pub_key_for_mock = pub_key.clone(); + + assert_ne!(requested_version, current_key_version); + service_executor + .expect_get::() + .with(eq(first_service_executor_invocation), always()) + .returning(move |_, _| { + Ok(PublicKeyGetOut { + _format: 0, + pubEccKey: Some(pub_key_for_mock.clone()), + pubKeyVersion: current_key_version as i64, + pubKyberKey: Some(pub_key_for_mock.clone()), + pubRsaKey: None, + }) + }); + let public_key_provider = make_public_key_provider(service_executor); + let result = public_key_provider + .load_versioned_pub_key(&public_key_identifier, requested_version) + .await; + assert!(result.is_err()); + assert!(matches!( + result.err().unwrap(), + PublicKeyLoadingError::KeyValidationError { .. } + )) + } + + #[tokio::test] + async fn rsa_key_in_version_other_than_0() { + let ( + _, + public_key_identifier, + mut first_service_executor_invocation, + mut service_executor, + ) = setup_test(); + let requested_version = 1u64; + first_service_executor_invocation.version = Some(requested_version as i64); + + let pub_key = vec![9, 8, 7]; + let pub_key_for_mock = pub_key.clone(); + + service_executor + .expect_get::() + .with(eq(first_service_executor_invocation), always()) + .returning(move |_, _| { + Ok(PublicKeyGetOut { + _format: 0, + pubEccKey: None, + pubKeyVersion: requested_version as i64, + pubKyberKey: None, + pubRsaKey: Some(pub_key_for_mock.clone()), + }) + }); + let public_key_provider = make_public_key_provider(service_executor); + assert_ne!(0u64, requested_version); // !0 is important for what we are testing here + + let result = public_key_provider + .load_versioned_pub_key(&public_key_identifier, requested_version) + .await; + assert!(result.is_err()); + assert!(matches!( + result.err().unwrap(), + PublicKeyLoadingError::KeyValidationError { .. } + )) + } + } + + mod version_validation { + use crate::crypto::public_key_provider::tests::{make_public_key_provider, setup_test}; + use crate::entities::generated::sys::PublicKeyGetOut; + use crate::services::generated::sys::PublicKeyService; + use mockall::predicate::{always, eq}; + + #[tokio::test] + #[should_panic] + async fn panics_if_the_version_is_negative() { + let (_, public_key_identifier, first_service_executor_invocation, mut service_executor) = + setup_test(); + let bad_version_from_server = -1i64; + + let pub_key = vec![9, 8, 7]; + let pub_key_for_mock = pub_key.clone(); + + service_executor + .expect_get::() + .with(eq(first_service_executor_invocation), always()) + .returning(move |_, _| { + Ok(PublicKeyGetOut { + _format: 0, + pubEccKey: Some(pub_key_for_mock.clone()), + pubKeyVersion: bad_version_from_server, + pubKyberKey: Some(pub_key_for_mock.clone()), + pubRsaKey: None, + }) + }); + let public_key_provider = make_public_key_provider(service_executor); + // this is expected to panic! + let _ = public_key_provider + .load_current_pub_key(&public_key_identifier) + .await; + } + } +} diff --git a/tuta-sdk/rust/sdk/src/crypto_entity_client.rs b/tuta-sdk/rust/sdk/src/crypto_entity_client.rs index 4de56f684be0..0ec6709fb9c6 100644 --- a/tuta-sdk/rust/sdk/src/crypto_entity_client.rs +++ b/tuta-sdk/rust/sdk/src/crypto_entity_client.rs @@ -298,7 +298,7 @@ mod tests { Ok(Some(ResolvedSessionKey { session_key: sk.clone(), owner_enc_session_key: vec![1, 2, 3], - owner_key_version: 0i64, + owner_key_version: 0u64, })) }); diff --git a/tuta-sdk/rust/sdk/src/entities/entity_facade.rs b/tuta-sdk/rust/sdk/src/entities/entity_facade.rs index 629cd0c6fbd2..064e758d59b0 100644 --- a/tuta-sdk/rust/sdk/src/entities/entity_facade.rs +++ b/tuta-sdk/rust/sdk/src/entities/entity_facade.rs @@ -631,7 +631,7 @@ impl EntityFacade for EntityFacadeImpl { ); mapped_decrypted.insert( OWNER_KEY_VERSION_FIELD.to_owned(), - ElementValue::Number(resolved_session_key.owner_key_version), + ElementValue::Number(resolved_session_key.owner_key_version as i64), ); Ok(mapped_decrypted) } @@ -776,7 +776,7 @@ mod tests { fn test_decrypt_mail() { let sk = GenericAesKey::Aes256(Aes256Key::from_bytes(KNOWN_SK.as_slice()).unwrap()); let owner_enc_session_key = vec![0, 1, 2]; - let owner_key_version = 0i64; + let owner_key_version = 0u64; let type_model_provider = Arc::new(init_type_model_provider()); let raw_entity: RawEntity = make_json_entity(); let json_serializer = JsonSerializer::new(type_model_provider.clone()); @@ -1104,7 +1104,7 @@ mod tests { fn encrypt_and_map_instance() { let sk = GenericAesKey::Aes256(Aes256Key::from_bytes(KNOWN_SK.as_slice()).unwrap()); let owner_enc_session_key = [0, 1, 2]; - let owner_key_version = 0i64; + let owner_key_version = 0u64; let deterministic_rng = DeterministicRng(20); let random = RandomizerFacade::from_core(deterministic_rng.clone()); @@ -1221,7 +1221,9 @@ mod tests { ); decrypted_mail.insert(OWNER_ENC_SESSION_KEY_FIELD.to_string(), ElementValue::Null); assert_eq!( - Some(&ElementValue::Number(owner_key_version)), + Some(&ElementValue::Number( + owner_key_version as i64 // we know it is 0 + )), decrypted_mail.get(OWNER_KEY_VERSION_FIELD), ); decrypted_mail.insert(OWNER_KEY_VERSION_FIELD.to_string(), ElementValue::Null); @@ -1327,7 +1329,7 @@ mod tests { Ok("Hello, world!".to_string()), String::from_utf8(subject_and_iv.data) ); - assert_eq!(new_iv.get_inner(), &subject_and_iv.iv); + assert_eq!(new_iv, subject_and_iv.iv); // other fields should be encrypted with origin_iv let encrypted_recipient_name = encrypted_mail @@ -1339,7 +1341,7 @@ mod tests { .assert_bytes() .to_vec(); let recipient_and_iv = sk.decrypt_data_and_iv(&encrypted_recipient_name).unwrap(); - assert_eq!(original_iv.get_inner().to_vec(), recipient_and_iv.iv) + assert_eq!(original_iv, recipient_and_iv.iv) } #[test] diff --git a/tuta-sdk/rust/sdk/src/entities/generated/sys.rs b/tuta-sdk/rust/sdk/src/entities/generated/sys.rs index 2090040c388e..d1ab2ee8ef87 100644 --- a/tuta-sdk/rust/sdk/src/entities/generated/sys.rs +++ b/tuta-sdk/rust/sdk/src/entities/generated/sys.rs @@ -45,74 +45,70 @@ impl Entity for AccountingInfo { #[derive(uniffi::Record, Clone, Serialize, Deserialize)] #[cfg_attr(any(test, feature = "testing"), derive(PartialEq, Debug))] -pub struct AdminGroupKeyAuthenticationData { +pub struct AdminGroupKeyDistributionElement { pub _id: Option, - #[serde(with = "serde_bytes")] - pub authKeyEncAdminRotationHash: Vec, - pub version: i64, - pub userGroup: GeneratedId, + pub distEncAdminGroupKey: PubEncKeyData, + pub userGroupId: GeneratedId, } -impl Entity for AdminGroupKeyAuthenticationData { +impl Entity for AdminGroupKeyDistributionElement { fn type_ref() -> TypeRef { TypeRef { app: "sys", - type_: "AdminGroupKeyAuthenticationData", + type_: "AdminGroupKeyDistributionElement", } } } #[derive(uniffi::Record, Clone, Serialize, Deserialize)] #[cfg_attr(any(test, feature = "testing"), derive(PartialEq, Debug))] -pub struct AdminGroupKeyRotationPostIn { +pub struct AdminGroupKeyRotationGetOut { pub _format: i64, - pub adminGroupKeyAuthenticationDataList: Vec, - pub adminGroupKeyData: GroupKeyRotationData, - pub userGroupKeyData: UserGroupKeyRotationData, + pub distributionKeys: Vec, + pub userGroupIdsMissingDistributionKeys: Vec, } -impl Entity for AdminGroupKeyRotationPostIn { +impl Entity for AdminGroupKeyRotationGetOut { fn type_ref() -> TypeRef { TypeRef { app: "sys", - type_: "AdminGroupKeyRotationPostIn", + type_: "AdminGroupKeyRotationGetOut", } } } #[derive(uniffi::Record, Clone, Serialize, Deserialize)] #[cfg_attr(any(test, feature = "testing"), derive(PartialEq, Debug))] -pub struct AdministratedGroup { +pub struct AdminGroupKeyRotationPostIn { pub _format: i64, - pub _id: Option, - pub _ownerGroup: Option, - pub _permissions: GeneratedId, - pub groupType: i64, - pub groupInfo: IdTupleGenerated, - pub localAdminGroup: GeneratedId, + pub adminGroupKeyData: GroupKeyRotationData, + pub adminPubKeyMacList: Vec, + pub distribution: Vec, + pub userGroupKeyData: UserGroupKeyRotationData, } -impl Entity for AdministratedGroup { +impl Entity for AdminGroupKeyRotationPostIn { fn type_ref() -> TypeRef { TypeRef { app: "sys", - type_: "AdministratedGroup", + type_: "AdminGroupKeyRotationPostIn", } } } #[derive(uniffi::Record, Clone, Serialize, Deserialize)] #[cfg_attr(any(test, feature = "testing"), derive(PartialEq, Debug))] -pub struct AdministratedGroupsRef { - pub _id: Option, - pub items: GeneratedId, +pub struct AdminGroupKeyRotationPutIn { + pub _format: i64, + pub adminDistKeyPair: KeyPair, + pub distKeyMac: KeyMac, } -impl Entity for AdministratedGroupsRef { +impl Entity for AdminGroupKeyRotationPutIn { fn type_ref() -> TypeRef { TypeRef { app: "sys", - type_: "AdministratedGroupsRef", + type_: "AdminGroupKeyRotationPutIn", } } } @@ -1697,7 +1693,6 @@ pub struct Group { #[serde(rename = "type")] pub r#type: i64, pub admin: Option, - pub administratedGroups: Option, pub archives: Vec, pub currentKeys: Option, pub customer: Option, @@ -1737,7 +1732,6 @@ pub struct GroupInfo { pub mailAddress: Option, pub name: String, pub group: GeneratedId, - pub localAdmin: Option, pub mailAddressAliases: Vec, pub _errors: Option, pub _finalIvs: HashMap, @@ -2224,6 +2218,26 @@ impl Entity for InvoiceItem { } } +#[derive(uniffi::Record, Clone, Serialize, Deserialize)] +#[cfg_attr(any(test, feature = "testing"), derive(PartialEq, Debug))] +pub struct KeyMac { + pub _id: Option, + #[serde(with = "serde_bytes")] + pub tag: Vec, + pub taggedKeyVersion: i64, + pub taggingKeyVersion: i64, + pub taggingGroup: GeneratedId, +} + +impl Entity for KeyMac { + fn type_ref() -> TypeRef { + TypeRef { + app: "sys", + type_: "KeyMac", + } + } +} + #[derive(uniffi::Record, Clone, Serialize, Deserialize)] #[cfg_attr(any(test, feature = "testing"), derive(PartialEq, Debug))] pub struct KeyPair { @@ -2260,7 +2274,10 @@ pub struct KeyRotation { pub _permissions: GeneratedId, pub groupKeyRotationType: i64, pub targetKeyVersion: i64, - pub adminGroupKeyAuthenticationData: Option, + pub adminDistKeyPair: Option, + pub adminPubKeyMac: Option, + pub distEncAdminGroupSymKey: Option, + pub distKeyMac: Option, } impl Entity for KeyRotation { @@ -2288,42 +2305,6 @@ impl Entity for KeyRotationsRef { } } -#[derive(uniffi::Record, Clone, Serialize, Deserialize)] -#[cfg_attr(any(test, feature = "testing"), derive(PartialEq, Debug))] -pub struct LocalAdminGroupReplacementData { - pub _id: Option, - #[serde(with = "serde_bytes")] - pub adminGroupEncGKey: Vec, - pub adminGroupKeyVersion: i64, - pub groupKeyVersion: i64, - pub groupId: GeneratedId, -} - -impl Entity for LocalAdminGroupReplacementData { - fn type_ref() -> TypeRef { - TypeRef { - app: "sys", - type_: "LocalAdminGroupReplacementData", - } - } -} - -#[derive(uniffi::Record, Clone, Serialize, Deserialize)] -#[cfg_attr(any(test, feature = "testing"), derive(PartialEq, Debug))] -pub struct LocalAdminRemovalPostIn { - pub _format: i64, - pub groupUpdates: Vec, -} - -impl Entity for LocalAdminRemovalPostIn { - fn type_ref() -> TypeRef { - TypeRef { - app: "sys", - type_: "LocalAdminRemovalPostIn", - } - } -} - #[derive(uniffi::Record, Clone, Serialize, Deserialize)] #[cfg_attr(any(test, feature = "testing"), derive(PartialEq, Debug))] pub struct LocationServiceGetReturn { @@ -3003,6 +2984,28 @@ impl Entity for PriceServiceReturn { } } +#[derive(uniffi::Record, Clone, Serialize, Deserialize)] +#[cfg_attr(any(test, feature = "testing"), derive(PartialEq, Debug))] +pub struct PubDistributionKey { + pub _id: Option, + #[serde(with = "serde_bytes")] + pub pubEccKey: Vec, + #[serde(with = "serde_bytes")] + pub pubKeyMac: Vec, + #[serde(with = "serde_bytes")] + pub pubKyberKey: Vec, + pub userGroupId: GeneratedId, +} + +impl Entity for PubDistributionKey { + fn type_ref() -> TypeRef { + TypeRef { + app: "sys", + type_: "PubDistributionKey", + } + } +} + #[derive(uniffi::Record, Clone, Serialize, Deserialize)] #[cfg_attr(any(test, feature = "testing"), derive(PartialEq, Debug))] pub struct PubEncKeyData { @@ -3013,7 +3016,10 @@ pub struct PubEncKeyData { pub recipientIdentifier: String, pub recipientIdentifierType: i64, pub recipientKeyVersion: i64, + pub senderIdentifier: Option, + pub senderIdentifierType: Option, pub senderKeyVersion: Option, + pub symKeyMac: Option, } impl Entity for PubEncKeyData { @@ -4248,6 +4254,8 @@ pub struct UserGroupKeyRotationData { #[serde(with = "serde_bytes")] pub passphraseEncUserGroupKey: Vec, #[serde(with = "serde_bytes")] + pub userGroupEncAdminGroupKey: Option>, + #[serde(with = "serde_bytes")] pub userGroupEncPreviousGroupKey: Vec, pub userGroupKeyVersion: i64, pub group: GeneratedId, diff --git a/tuta-sdk/rust/sdk/src/id/id_tuple.rs b/tuta-sdk/rust/sdk/src/id/id_tuple.rs index 383f93f2bc30..109f44932c34 100644 --- a/tuta-sdk/rust/sdk/src/id/id_tuple.rs +++ b/tuta-sdk/rust/sdk/src/id/id_tuple.rs @@ -41,7 +41,7 @@ impl TryFrom for IdTupleGenerated { type Error = (); fn try_from(value: String) -> Result { - let mut ids: Vec<_> = value.split("/").collect(); + let mut ids: Vec<_> = value.split('/').collect(); let element_id = ids.pop().ok_or(())?; let list_id = ids.pop().ok_or(())?; Ok(IdTupleGenerated::new( diff --git a/tuta-sdk/rust/sdk/src/instance_mapper.rs b/tuta-sdk/rust/sdk/src/instance_mapper.rs index 7bc3fd1d954f..64a9f1811da2 100644 --- a/tuta-sdk/rust/sdk/src/instance_mapper.rs +++ b/tuta-sdk/rust/sdk/src/instance_mapper.rs @@ -1387,7 +1387,6 @@ mod tests { mailAddress: None, name: "encName".to_owned(), group: GeneratedId::test_random(), - localAdmin: None, mailAddressAliases: vec![], _errors: Default::default(), _finalIvs: Default::default(), diff --git a/tuta-sdk/rust/sdk/src/key_loader_facade.rs b/tuta-sdk/rust/sdk/src/key_loader_facade.rs index 054610237b05..36cb6444f677 100644 --- a/tuta-sdk/rust/sdk/src/key_loader_facade.rs +++ b/tuta-sdk/rust/sdk/src/key_loader_facade.rs @@ -5,7 +5,7 @@ use crate::entities::generated::sys::{Group, GroupKey, KeyPair}; use crate::typed_entity_client::TypedEntityClient; #[cfg_attr(test, mockall_double::double)] use crate::user_facade::UserFacade; -use crate::util::Versioned; +use crate::util::{convert_version_to_u64, Versioned}; use crate::CustomId; use crate::GeneratedId; use crate::IdTupleCustom; @@ -33,7 +33,7 @@ impl KeyLoaderFacade { pub async fn load_sym_group_key( &self, group_id: &GeneratedId, - version: i64, + version: u64, current_group_key: Option, ) -> Result { let group_key = match current_group_key { @@ -68,7 +68,7 @@ impl KeyLoaderFacade { group: &Group, // TODO: why do we take it by ref if we are cloning it anyway current_group_key: &VersionedAesKey, - target_key_version: i64, + target_key_version: u64, ) -> Result { let list_id = group.formerGroupKeys.clone().unwrap().list; @@ -138,7 +138,7 @@ impl KeyLoaderFacade { }) } - fn decode_group_key_version(&self, element_id: &CustomId) -> Result { + fn decode_group_key_version(&self, element_id: &CustomId) -> Result { element_id .to_custom_string() .parse() @@ -188,9 +188,9 @@ impl KeyLoaderFacade { ); let group_membership = self.user_facade.get_membership(group_id)?; let required_user_group_key = self - .load_sym_user_group_key(group_membership.symKeyVersion) + .load_sym_user_group_key(convert_version_to_u64(group_membership.symKeyVersion)) .await?; - let version = group_membership.groupKeyVersion; + let version = convert_version_to_u64(group_membership.groupKeyVersion); let object = required_user_group_key .decrypt_aes_key(&group_membership.symEncGKey) .map_err(|e| KeyLoadError { @@ -201,7 +201,7 @@ impl KeyLoaderFacade { async fn load_sym_user_group_key( &self, - user_group_key_version: i64, + user_group_key_version: u64, ) -> Result { // TODO: check for the version and refresh cache if needed self.load_sym_group_key( @@ -225,7 +225,7 @@ impl KeyLoaderFacade { pub async fn load_key_pair( &self, key_pair_group_id: &GeneratedId, - requested_version: i64, + requested_version: u64, ) -> Result { let group: Group = self.entity_client.load(key_pair_group_id).await?; let current_group_key = self @@ -252,7 +252,7 @@ impl KeyLoaderFacade { let group: Group = self.entity_client.load(group_id).await?; let current_group_key = self.get_current_sym_group_key(group_id).await?; - if group.groupKeyVersion != current_group_key.version { + if convert_version_to_u64(group.groupKeyVersion) != current_group_key.version { // There is a race condition after rotating the group key were the group entity in the cache is not in sync with current key version in the key cache. // group.groupKeyVersion might be newer than current_group_key.version. // We reload group and user and refresh entity and key cache to synchronize both caches. @@ -268,33 +268,30 @@ impl KeyLoaderFacade { reason: "not yet implemented".to_string(), }); } - let key_pair = Self::validate_and_decrypt_key_pair( - group.currentKeys, - group_id, - current_group_key.object, - )?; + let key_pair = + Self::validate_and_decrypt_key_pair(group.currentKeys, group_id, ¤t_group_key)?; Ok(Versioned { object: key_pair, - version: group.groupKeyVersion, + version: convert_version_to_u64(group.groupKeyVersion), }) } async fn load_key_pair_impl( &self, group: Group, - requested_version: i64, + requested_version: u64, current_group_key: VersionedAesKey, ) -> Result { let key_pair_group_id = &group._id.clone().unwrap(); let key_pair: Option; - let sym_group_key: GenericAesKey; + let sym_group_key: VersionedAesKey; match requested_version.cmp(¤t_group_key.version) { Ordering::Greater => { - return Err(KeyLoadError{reason: format!("Not possible to get newer key version than is cached for group {key_pair_group_id}")}); + return Err(KeyLoadError { reason: format!("Not possible to get newer key version than is cached for group {key_pair_group_id}") }); }, Ordering::Equal => { - sym_group_key = current_group_key.object; - if group.groupKeyVersion == current_group_key.version { + sym_group_key = current_group_key; + if convert_version_to_u64(group.groupKeyVersion) == sym_group_key.version { key_pair = group.currentKeys } else { let former_keys_list = group.formerGroupKeys.unwrap().list; @@ -303,7 +300,7 @@ impl KeyLoaderFacade { .entity_client .load(&IdTupleCustom::new( former_keys_list, - CustomId::from_custom_string(¤t_group_key.version.to_string()), + CustomId::from_custom_string(&sym_group_key.version.to_string()), )) .await?; key_pair = former_group_key.keyPair @@ -317,23 +314,42 @@ impl KeyLoaderFacade { } = self .find_former_group_key(&group, ¤t_group_key, requested_version) .await?; - sym_group_key = symmetric_group_key; + sym_group_key = VersionedAesKey { + object: symmetric_group_key, + version: requested_version, + }; key_pair = group_key_instance.keyPair; }, } - KeyLoaderFacade::validate_and_decrypt_key_pair(key_pair, key_pair_group_id, sym_group_key) + KeyLoaderFacade::validate_and_decrypt_key_pair(key_pair, key_pair_group_id, &sym_group_key) } pub fn validate_and_decrypt_key_pair( key_pair: Option, group_id: &GeneratedId, - group_key: GenericAesKey, + group_key: &VersionedAesKey, ) -> Result { match key_pair { None => Err(KeyLoadError { reason: format!("no key pair on group {group_id}"), }), - Some(kp) => Ok(decrypt_key_pair(&group_key, &kp)?), + Some(kp) => { + let decrypted_key_pair = decrypt_key_pair(&group_key.object, &kp)?; + match decrypted_key_pair { + AsymmetricKeyPair::RSAEccKeyPair(_) | AsymmetricKeyPair::RSAKeyPair(_) => { + if group_key.version != 0 { + return Err(KeyLoadError { + reason: format!( + "received an rsa key pair in a version other than 0: {}", + group_key.version + ), + }); + } + }, + AsymmetricKeyPair::PQKeyPairs(_) => {}, + } + Ok(decrypted_key_pair) + }, } } } @@ -348,19 +364,20 @@ mod tests { use super::*; use crate::crypto::randomizer_facade::test_util::make_thread_rng_facade; use crate::crypto::randomizer_facade::RandomizerFacade; + use crate::crypto::rsa::RSAKeyPair; use crate::crypto::{aes::Iv, Aes256Key, PQKeyPairs}; use crate::entities::generated::sys::{GroupKeysRef, GroupMembership, KeyPair}; use crate::key_cache::MockKeyCache; use crate::typed_entity_client::MockTypedEntityClient; use crate::user_facade::MockUserFacade; - use crate::util::get_vec_reversed; use crate::util::test_utils::{generate_random_group, random_aes256_key}; + use crate::util::{convert_version_to_i64, get_vec_reversed}; use crate::CustomId; use crate::{IdTupleCustom, IdTupleGenerated}; use mockall::predicate; use std::array::from_fn; - fn generate_group_key(version: i64) -> VersionedAesKey { + fn generate_group_key(version: u64) -> VersionedAesKey { VersionedAesKey { object: random_aes256_key().into(), version, @@ -372,42 +389,65 @@ mod tests { } fn generate_group_with_keys( - current_key_pair: &PQKeyPairs, + current_key_pair: &AsymmetricKeyPair, current_group_key: &VersionedAesKey, randomizer_facade: &RandomizerFacade, ) -> Group { - let PQKeyPairs { - ecc_keys, - kyber_keys, - } = current_key_pair; let group_key = ¤t_group_key.object; - let sym_enc_priv_ecc_key = group_key - .encrypt_data( - ecc_keys.private_key.as_bytes(), - Iv::generate(randomizer_facade), - ) - .unwrap(); - let sync_enc_priv_kyber_key = group_key - .encrypt_data( - &kyber_keys.private_key.serialize(), - Iv::generate(randomizer_facade), - ) - .unwrap(); - generate_random_group( - Some(KeyPair { - _id: Default::default(), - pubEccKey: Some(ecc_keys.public_key.as_bytes().to_vec()), - pubKyberKey: Some(kyber_keys.public_key.serialize()), - pubRsaKey: None, - symEncPrivEccKey: Some(sym_enc_priv_ecc_key), - symEncPrivKyberKey: Some(sync_enc_priv_kyber_key), - symEncPrivRsaKey: None, - }), + let mut current_keys = KeyPair { + _id: Default::default(), + pubEccKey: None, + pubKyberKey: None, + pubRsaKey: None, + symEncPrivEccKey: None, + symEncPrivKyberKey: None, + symEncPrivRsaKey: None, + }; + match current_key_pair { + AsymmetricKeyPair::RSAEccKeyPair(_) => { + panic!("not implemented") + }, + AsymmetricKeyPair::RSAKeyPair(rsa_kp) => { + let sym_enc_priv_rsa_key = group_key + .encrypt_data( + rsa_kp.private_key.serialize().as_slice(), + Iv::generate(randomizer_facade), + ) + .unwrap(); + current_keys.pubRsaKey = Some(rsa_kp.public_key.serialize()); + current_keys.symEncPrivRsaKey = Some(sym_enc_priv_rsa_key); + }, + AsymmetricKeyPair::PQKeyPairs(pq_key_pairs) => { + let ecc_keys = &pq_key_pairs.ecc_keys; + let kyber_keys = &pq_key_pairs.kyber_keys; + let sym_enc_priv_ecc_key = group_key + .encrypt_data( + ecc_keys.private_key.as_bytes(), + Iv::generate(randomizer_facade), + ) + .unwrap(); + let sync_enc_priv_kyber_key = group_key + .encrypt_data( + &kyber_keys.private_key.serialize(), + Iv::generate(randomizer_facade), + ) + .unwrap(); + current_keys.pubEccKey = Some(ecc_keys.public_key.as_bytes().to_vec()); + current_keys.pubKyberKey = Some(kyber_keys.public_key.serialize()); + current_keys.symEncPrivEccKey = Some(sym_enc_priv_ecc_key); + current_keys.symEncPrivKyberKey = Some(sync_enc_priv_kyber_key); + }, + } + + let mut group = generate_random_group( + Some(current_keys), Some(GroupKeysRef { _id: Default::default(), list: GeneratedId("list".to_owned()), // Refers to `former_keys` }), - ) + ); + group.groupKeyVersion = current_group_key.version as i64; + group } const FORMER_KEYS: usize = 2; @@ -562,10 +602,10 @@ mod tests { _id: Some(CustomId(user_group_id.clone().unwrap().to_string())), admin: false, capability: None, - groupKeyVersion: current_group_key.clone().version, + groupKeyVersion: convert_version_to_i64(current_group_key.clone().version), groupType: None, symEncGKey: sym_enc_g_key.clone(), - symKeyVersion: user_group_key.version, + symKeyVersion: convert_version_to_i64(user_group_key.version), group: user_group_id.clone().unwrap(), groupInfo: IdTupleGenerated { list_id: Default::default(), @@ -626,7 +666,10 @@ mod tests { .get_current_sym_group_key(user_group._id.as_ref().unwrap()) .await .unwrap(); - assert_eq!(current_user_group_key.version, user_group.groupKeyVersion); + assert_eq!( + current_user_group_key.version, + convert_version_to_u64(user_group.groupKeyVersion) + ); assert_eq!(current_user_group_key.object, user_group_key.object); let _ = key_loader_facade @@ -663,7 +706,10 @@ mod tests { .get_current_sym_group_key(group._id.as_ref().unwrap()) .await .unwrap(); - assert_eq!(group_key.version, group.groupKeyVersion); + assert_eq!( + group_key.version, + convert_version_to_u64(group.groupKeyVersion) + ); assert_eq!(group_key.object, current_group_key.object) } @@ -672,11 +718,15 @@ mod tests { let randomizer = make_thread_rng_facade(); // Same as the length of former_keys_deprecated - let current_group_key_version = FORMER_KEYS as i64; + let current_group_key_version = FORMER_KEYS as u64; let current_group_key = generate_group_key(current_group_key_version); let current_key_pair = PQKeyPairs::generate(&randomizer); - let group = generate_group_with_keys(¤t_key_pair, ¤t_group_key, &randomizer); + let group = generate_group_with_keys( + &AsymmetricKeyPair::PQKeyPairs(current_key_pair), + ¤t_group_key, + &randomizer, + ); let (former_keys, former_key_pairs_decrypted, _) = generate_former_keys(¤t_group_key, &randomizer); @@ -686,7 +736,7 @@ mod tests { for i in 0..FORMER_KEYS { let keypair = key_loader_facade - .load_key_pair(group._id.as_ref().unwrap(), i as i64) + .load_key_pair(group._id.as_ref().unwrap(), i as u64) .await .unwrap(); match keypair { @@ -704,7 +754,9 @@ mod tests { let user_group_key = generate_group_key(1); let randomizer = make_thread_rng_facade(); let current_key_pair = PQKeyPairs::generate(&randomizer); - let user_group = generate_group_with_keys(¤t_key_pair, &user_group_key, &randomizer); + let asymmetric_key_pair = AsymmetricKeyPair::PQKeyPairs(current_key_pair.clone()); + let user_group = + generate_group_with_keys(&asymmetric_key_pair, &user_group_key, &randomizer); let mut user_facade_mock = MockUserFacade::default(); { @@ -736,7 +788,10 @@ mod tests { ); let loaded_current_key_pair = key_loader_facade - .load_key_pair(&user_group._id.unwrap(), user_group.groupKeyVersion) + .load_key_pair( + &user_group._id.unwrap(), + convert_version_to_u64(user_group.groupKeyVersion), + ) .await .unwrap(); @@ -749,24 +804,187 @@ mod tests { } } + #[tokio::test] + async fn load_current_key_pair_acceptss_rsa_key_version_0() { + let user_group_key = generate_group_key(0); + let randomizer = make_thread_rng_facade(); + let current_key_pair = RSAKeyPair::generate(&randomizer); + let user_group = generate_group_with_keys( + &AsymmetricKeyPair::RSAKeyPair(current_key_pair.clone()), + &user_group_key, + &randomizer, + ); + + let mut user_facade_mock = MockUserFacade::default(); + { + let user_group_id = user_group._id.clone(); + user_facade_mock + .expect_get_user_group_id() + .returning(move || user_group_id.clone().unwrap()); + } + { + let user_group_key = user_group_key.clone(); + user_facade_mock + .expect_get_current_user_group_key() + .returning(move || Some(user_group_key.clone())); + } + + let mut typed_entity_client_mock = MockTypedEntityClient::default(); + { + let user_group = user_group.clone(); + let group_id = user_group._id.clone(); + typed_entity_client_mock + .expect_load::() + .withf(move |id| *id == group_id.clone().unwrap()) + .returning(move |_| Ok(user_group.clone())); + } + + let key_loader_facade = KeyLoaderFacade::new( + Arc::new(user_facade_mock), + Arc::new(typed_entity_client_mock), + ); + + let result = key_loader_facade + .load_current_key_pair(&user_group._id.unwrap()) + .await + .unwrap(); + assert_eq!(result.version, user_group_key.version); + match result.object { + AsymmetricKeyPair::RSAKeyPair(loaded_current_key_pair) => { + assert_eq!(loaded_current_key_pair, current_key_pair); + }, + AsymmetricKeyPair::RSAEccKeyPair(_) | AsymmetricKeyPair::PQKeyPairs(_) => { + panic!("Expected RSA key pair!") + }, + } + } + + #[tokio::test] + async fn load_current_key_pair_rejects_rsa_key_not_0() { + let user_group_key = generate_group_key(1); + let randomizer = make_thread_rng_facade(); + let current_key_pair = RSAKeyPair::generate(&randomizer); + let user_group = generate_group_with_keys( + &AsymmetricKeyPair::RSAKeyPair(current_key_pair), + &user_group_key, + &randomizer, + ); + + let mut user_facade_mock = MockUserFacade::default(); + { + let user_group_id = user_group._id.clone(); + user_facade_mock + .expect_get_user_group_id() + .returning(move || user_group_id.clone().unwrap()); + } + { + let user_group_key = user_group_key.clone(); + user_facade_mock + .expect_get_current_user_group_key() + .returning(move || Some(user_group_key.clone())); + } + + let mut typed_entity_client_mock = MockTypedEntityClient::default(); + { + let user_group = user_group.clone(); + let group_id = user_group._id.clone(); + typed_entity_client_mock + .expect_load::() + .withf(move |id| *id == group_id.clone().unwrap()) + .returning(move |_| Ok(user_group.clone())); + } + + let key_loader_facade = KeyLoaderFacade::new( + Arc::new(user_facade_mock), + Arc::new(typed_entity_client_mock), + ); + + let result = key_loader_facade + .load_current_key_pair(&user_group._id.unwrap()) + .await; + assert!(result.is_err()); + let err = result.err().unwrap(); + assert!(matches!(err, KeyLoadError { .. })); + assert_eq!( + err.reason, + "received an rsa key pair in a version other than 0: 1" + ); + } + + #[tokio::test] + async fn load_key_pair_rejects_rsa_key_not_0() { + let user_group_key = generate_group_key(1); + let randomizer = make_thread_rng_facade(); + let current_key_pair = RSAKeyPair::generate(&randomizer); + let user_group = generate_group_with_keys( + &AsymmetricKeyPair::RSAKeyPair(current_key_pair), + &user_group_key, + &randomizer, + ); + + let mut user_facade_mock = MockUserFacade::default(); + { + let user_group_id = user_group._id.clone(); + user_facade_mock + .expect_get_user_group_id() + .returning(move || user_group_id.clone().unwrap()); + } + { + let user_group_key = user_group_key.clone(); + user_facade_mock + .expect_get_current_user_group_key() + .returning(move || Some(user_group_key.clone())); + } + + let mut typed_entity_client_mock = MockTypedEntityClient::default(); + { + let user_group = user_group.clone(); + let group_id = user_group._id.clone(); + typed_entity_client_mock + .expect_load::() + .withf(move |id| *id == group_id.clone().unwrap()) + .returning(move |_| Ok(user_group.clone())); + } + + let key_loader_facade = KeyLoaderFacade::new( + Arc::new(user_facade_mock), + Arc::new(typed_entity_client_mock), + ); + + let result = key_loader_facade + .load_key_pair(&user_group._id.unwrap(), user_group_key.version) + .await; + assert!(result.is_err()); + let err = result.err().unwrap(); + assert!(matches!(err, KeyLoadError { .. })); + assert_eq!( + err.reason, + "received an rsa key pair in a version other than 0: 1" + ); + } + #[tokio::test] async fn load_and_decrypt_former_group_key() { let randomizer = make_thread_rng_facade(); // Same as the length of former_keys_deprecated - let current_group_key_version = FORMER_KEYS as i64; + let current_group_key_version = FORMER_KEYS as u64; let current_group_key = generate_group_key(current_group_key_version); let (former_keys, _, former_keys_decrypted) = generate_former_keys(¤t_group_key, &randomizer); let current_key_pair = PQKeyPairs::generate(&randomizer); - let group = generate_group_with_keys(¤t_key_pair, ¤t_group_key, &randomizer); + let group = generate_group_with_keys( + &AsymmetricKeyPair::PQKeyPairs(current_key_pair), + ¤t_group_key, + &randomizer, + ); let key_loader_facade = make_mocks_with_former_keys(&group, ¤t_group_key, &randomizer, &former_keys); for i in 0..FORMER_KEYS { let keypair = key_loader_facade - .load_sym_group_key(group._id.as_ref().expect("no id on group!"), i as i64, None) + .load_sym_group_key(group._id.as_ref().expect("no id on group!"), i as u64, None) .await .unwrap(); match keypair { @@ -783,11 +1001,15 @@ mod tests { let randomizer = make_thread_rng_facade(); // Same as the length of former_keys_deprecated - let current_group_key_version = FORMER_KEYS as i64; + let current_group_key_version = FORMER_KEYS as u64; let current_group_key = generate_group_key(current_group_key_version); let current_key_pair = PQKeyPairs::generate(&randomizer); - let group = generate_group_with_keys(¤t_key_pair, ¤t_group_key, &randomizer); + let group = generate_group_with_keys( + &AsymmetricKeyPair::PQKeyPairs(current_key_pair), + ¤t_group_key, + &randomizer, + ); let (user_facade_mock, typed_entity_client_mock) = make_mocks(&group, ¤t_group_key, &randomizer); @@ -813,11 +1035,15 @@ mod tests { let randomizer = make_thread_rng_facade(); // Same as the length of former_keys_deprecated - let current_group_key_version = FORMER_KEYS as i64; + let current_group_key_version = FORMER_KEYS as u64; let current_group_key = generate_group_key(current_group_key_version); let current_key_pair = PQKeyPairs::generate(&randomizer); - let group = generate_group_with_keys(¤t_key_pair, ¤t_group_key, &randomizer); + let group = generate_group_with_keys( + &AsymmetricKeyPair::PQKeyPairs(current_key_pair), + ¤t_group_key, + &randomizer, + ); let (_, _, former_keys_decrypted) = generate_former_keys(¤t_group_key, &randomizer); diff --git a/tuta-sdk/rust/sdk/src/lib.rs b/tuta-sdk/rust/sdk/src/lib.rs index 4883c330506a..1f8d8434368e 100644 --- a/tuta-sdk/rust/sdk/src/lib.rs +++ b/tuta-sdk/rust/sdk/src/lib.rs @@ -19,6 +19,8 @@ use crate::crypto::crypto_facade::create_auth_verifier; #[cfg_attr(test, mockall_double::double)] use crate::crypto::crypto_facade::CryptoFacade; use crate::crypto::key::{GenericAesKey, VersionedAesKey}; +#[cfg_attr(test, mockall_double::double)] +use crate::crypto::public_key_provider::PublicKeyProvider; use crate::crypto::randomizer_facade::RandomizerFacade; use crate::crypto::{aes::Iv, Aes256Key}; #[cfg_attr(test, mockall_double::double)] @@ -222,10 +224,12 @@ impl Sdk { self.type_model_provider.clone(), self.base_url.clone(), )); + let public_key_provider = Arc::new(PublicKeyProvider::new(service_executor.clone())); let asymmetric_crypto_facade = Arc::new(AsymmetricCryptoFacade::new( key_loader.clone(), RandomizerFacade::from_core(rand_core::OsRng), - service_executor, + service_executor.clone(), + public_key_provider.clone(), )); let crypto_facade: Arc = Arc::new(CryptoFacade::new( key_loader.clone(), diff --git a/tuta-sdk/rust/sdk/src/services/generated/sys.rs b/tuta-sdk/rust/sdk/src/services/generated/sys.rs index 054ea774da96..f27f76978e7d 100644 --- a/tuta-sdk/rust/sdk/src/services/generated/sys.rs +++ b/tuta-sdk/rust/sdk/src/services/generated/sys.rs @@ -6,6 +6,8 @@ use crate::services::{PostService, GetService, PutService, DeleteService, Servic use crate::bindings::rest_client::HttpMethod; use crate::services::hidden::Nothing; use crate::entities::generated::sys::AdminGroupKeyRotationPostIn; +use crate::entities::generated::sys::AdminGroupKeyRotationGetOut; +use crate::entities::generated::sys::AdminGroupKeyRotationPutIn; use crate::entities::generated::sys::AffiliatePartnerKpiServiceGetOut; use crate::entities::generated::sys::AlarmServicePost; use crate::entities::generated::sys::AppStoreSubscriptionGetIn; @@ -44,7 +46,6 @@ use crate::entities::generated::sys::GroupKeyRotationInfoGetOut; use crate::entities::generated::sys::GroupKeyRotationPostIn; use crate::entities::generated::sys::InvoiceDataGetIn; use crate::entities::generated::sys::InvoiceDataGetOut; -use crate::entities::generated::sys::LocalAdminRemovalPostIn; use crate::entities::generated::sys::LocationServiceGetReturn; use crate::entities::generated::sys::MailAddressAliasServiceData; use crate::entities::generated::sys::MailAddressAliasGetIn; @@ -100,31 +101,33 @@ use crate::entities::generated::sys::VersionData; use crate::entities::generated::sys::VersionReturn; pub struct AdminGroupKeyRotationService; -crate::service_impl!(declare, AdminGroupKeyRotationService, "sys/admingroupkeyrotationservice", 117); +crate::service_impl!(declare, AdminGroupKeyRotationService, "sys/admingroupkeyrotationservice", 118); crate::service_impl!(POST, AdminGroupKeyRotationService, AdminGroupKeyRotationPostIn, ()); +crate::service_impl!(GET, AdminGroupKeyRotationService, (), AdminGroupKeyRotationGetOut); +crate::service_impl!(PUT, AdminGroupKeyRotationService, AdminGroupKeyRotationPutIn, ()); pub struct AffiliatePartnerKpiService; -crate::service_impl!(declare, AffiliatePartnerKpiService, "sys/affiliatepartnerkpiservice", 117); +crate::service_impl!(declare, AffiliatePartnerKpiService, "sys/affiliatepartnerkpiservice", 118); crate::service_impl!(GET, AffiliatePartnerKpiService, (), AffiliatePartnerKpiServiceGetOut); pub struct AlarmService; -crate::service_impl!(declare, AlarmService, "sys/alarmservice", 117); +crate::service_impl!(declare, AlarmService, "sys/alarmservice", 118); crate::service_impl!(POST, AlarmService, AlarmServicePost, ()); pub struct AppStoreSubscriptionService; -crate::service_impl!(declare, AppStoreSubscriptionService, "sys/appstoresubscriptionservice", 117); +crate::service_impl!(declare, AppStoreSubscriptionService, "sys/appstoresubscriptionservice", 118); crate::service_impl!(GET, AppStoreSubscriptionService, AppStoreSubscriptionGetIn, AppStoreSubscriptionGetOut); pub struct AutoLoginService; -crate::service_impl!(declare, AutoLoginService, "sys/autologinservice", 117); +crate::service_impl!(declare, AutoLoginService, "sys/autologinservice", 118); crate::service_impl!(POST, AutoLoginService, AutoLoginDataReturn, AutoLoginPostReturn); crate::service_impl!(GET, AutoLoginService, AutoLoginDataGet, AutoLoginDataReturn); crate::service_impl!(DELETE, AutoLoginService, AutoLoginDataDelete, ()); @@ -132,7 +135,7 @@ crate::service_impl!(DELETE, AutoLoginService, AutoLoginDataDelete, ()); pub struct BrandingDomainService; -crate::service_impl!(declare, BrandingDomainService, "sys/brandingdomainservice", 117); +crate::service_impl!(declare, BrandingDomainService, "sys/brandingdomainservice", 118); crate::service_impl!(POST, BrandingDomainService, BrandingDomainData, ()); crate::service_impl!(GET, BrandingDomainService, (), BrandingDomainGetReturn); crate::service_impl!(PUT, BrandingDomainService, BrandingDomainData, ()); @@ -141,37 +144,37 @@ crate::service_impl!(DELETE, BrandingDomainService, BrandingDomainDeleteData, () pub struct ChangeKdfService; -crate::service_impl!(declare, ChangeKdfService, "sys/changekdfservice", 117); +crate::service_impl!(declare, ChangeKdfService, "sys/changekdfservice", 118); crate::service_impl!(POST, ChangeKdfService, ChangeKdfPostIn, ()); pub struct ChangePasswordService; -crate::service_impl!(declare, ChangePasswordService, "sys/changepasswordservice", 117); +crate::service_impl!(declare, ChangePasswordService, "sys/changepasswordservice", 118); crate::service_impl!(POST, ChangePasswordService, ChangePasswordPostIn, ()); pub struct CloseSessionService; -crate::service_impl!(declare, CloseSessionService, "sys/closesessionservice", 117); +crate::service_impl!(declare, CloseSessionService, "sys/closesessionservice", 118); crate::service_impl!(POST, CloseSessionService, CloseSessionServicePost, ()); pub struct CreateCustomerServerProperties; -crate::service_impl!(declare, CreateCustomerServerProperties, "sys/createcustomerserverproperties", 117); +crate::service_impl!(declare, CreateCustomerServerProperties, "sys/createcustomerserverproperties", 118); crate::service_impl!(POST, CreateCustomerServerProperties, CreateCustomerServerPropertiesData, CreateCustomerServerPropertiesReturn); pub struct CustomDomainCheckService; -crate::service_impl!(declare, CustomDomainCheckService, "sys/customdomaincheckservice", 117); +crate::service_impl!(declare, CustomDomainCheckService, "sys/customdomaincheckservice", 118); crate::service_impl!(GET, CustomDomainCheckService, CustomDomainCheckGetIn, CustomDomainCheckGetOut); pub struct CustomDomainService; -crate::service_impl!(declare, CustomDomainService, "sys/customdomainservice", 117); +crate::service_impl!(declare, CustomDomainService, "sys/customdomainservice", 118); crate::service_impl!(POST, CustomDomainService, CustomDomainData, CustomDomainReturn); crate::service_impl!(PUT, CustomDomainService, CustomDomainData, ()); crate::service_impl!(DELETE, CustomDomainService, CustomDomainData, ()); @@ -179,50 +182,50 @@ crate::service_impl!(DELETE, CustomDomainService, CustomDomainData, ()); pub struct CustomerAccountTerminationService; -crate::service_impl!(declare, CustomerAccountTerminationService, "sys/customeraccountterminationservice", 117); +crate::service_impl!(declare, CustomerAccountTerminationService, "sys/customeraccountterminationservice", 118); crate::service_impl!(POST, CustomerAccountTerminationService, CustomerAccountTerminationPostIn, CustomerAccountTerminationPostOut); pub struct CustomerPublicKeyService; -crate::service_impl!(declare, CustomerPublicKeyService, "sys/customerpublickeyservice", 117); +crate::service_impl!(declare, CustomerPublicKeyService, "sys/customerpublickeyservice", 118); crate::service_impl!(GET, CustomerPublicKeyService, (), PublicKeyGetOut); pub struct CustomerService; -crate::service_impl!(declare, CustomerService, "sys/customerservice", 117); +crate::service_impl!(declare, CustomerService, "sys/customerservice", 118); crate::service_impl!(DELETE, CustomerService, DeleteCustomerData, ()); pub struct DebitService; -crate::service_impl!(declare, DebitService, "sys/debitservice", 117); +crate::service_impl!(declare, DebitService, "sys/debitservice", 118); crate::service_impl!(PUT, DebitService, DebitServicePutData, ()); pub struct DomainMailAddressAvailabilityService; -crate::service_impl!(declare, DomainMailAddressAvailabilityService, "sys/domainmailaddressavailabilityservice", 117); +crate::service_impl!(declare, DomainMailAddressAvailabilityService, "sys/domainmailaddressavailabilityservice", 118); crate::service_impl!(GET, DomainMailAddressAvailabilityService, DomainMailAddressAvailabilityData, DomainMailAddressAvailabilityReturn); pub struct ExternalPropertiesService; -crate::service_impl!(declare, ExternalPropertiesService, "sys/externalpropertiesservice", 117); +crate::service_impl!(declare, ExternalPropertiesService, "sys/externalpropertiesservice", 118); crate::service_impl!(GET, ExternalPropertiesService, (), ExternalPropertiesReturn); pub struct GiftCardRedeemService; -crate::service_impl!(declare, GiftCardRedeemService, "sys/giftcardredeemservice", 117); +crate::service_impl!(declare, GiftCardRedeemService, "sys/giftcardredeemservice", 118); crate::service_impl!(POST, GiftCardRedeemService, GiftCardRedeemData, ()); crate::service_impl!(GET, GiftCardRedeemService, GiftCardRedeemData, GiftCardRedeemGetReturn); pub struct GiftCardService; -crate::service_impl!(declare, GiftCardService, "sys/giftcardservice", 117); +crate::service_impl!(declare, GiftCardService, "sys/giftcardservice", 118); crate::service_impl!(POST, GiftCardService, GiftCardCreateData, GiftCardCreateReturn); crate::service_impl!(GET, GiftCardService, (), GiftCardGetReturn); crate::service_impl!(DELETE, GiftCardService, GiftCardDeleteData, ()); @@ -230,37 +233,31 @@ crate::service_impl!(DELETE, GiftCardService, GiftCardDeleteData, ()); pub struct GroupKeyRotationInfoService; -crate::service_impl!(declare, GroupKeyRotationInfoService, "sys/groupkeyrotationinfoservice", 117); +crate::service_impl!(declare, GroupKeyRotationInfoService, "sys/groupkeyrotationinfoservice", 118); crate::service_impl!(GET, GroupKeyRotationInfoService, (), GroupKeyRotationInfoGetOut); pub struct GroupKeyRotationService; -crate::service_impl!(declare, GroupKeyRotationService, "sys/groupkeyrotationservice", 117); +crate::service_impl!(declare, GroupKeyRotationService, "sys/groupkeyrotationservice", 118); crate::service_impl!(POST, GroupKeyRotationService, GroupKeyRotationPostIn, ()); pub struct InvoiceDataService; -crate::service_impl!(declare, InvoiceDataService, "sys/invoicedataservice", 117); +crate::service_impl!(declare, InvoiceDataService, "sys/invoicedataservice", 118); crate::service_impl!(GET, InvoiceDataService, InvoiceDataGetIn, InvoiceDataGetOut); -pub struct LocalAdminRemovalService; - -crate::service_impl!(declare, LocalAdminRemovalService, "sys/localadminremovalservice", 117); -crate::service_impl!(POST, LocalAdminRemovalService, LocalAdminRemovalPostIn, ()); - - pub struct LocationService; -crate::service_impl!(declare, LocationService, "sys/locationservice", 117); +crate::service_impl!(declare, LocationService, "sys/locationservice", 118); crate::service_impl!(GET, LocationService, (), LocationServiceGetReturn); pub struct MailAddressAliasService; -crate::service_impl!(declare, MailAddressAliasService, "sys/mailaddressaliasservice", 117); +crate::service_impl!(declare, MailAddressAliasService, "sys/mailaddressaliasservice", 118); crate::service_impl!(POST, MailAddressAliasService, MailAddressAliasServiceData, ()); crate::service_impl!(GET, MailAddressAliasService, MailAddressAliasGetIn, MailAddressAliasServiceReturn); crate::service_impl!(DELETE, MailAddressAliasService, MailAddressAliasServiceDataDelete, ()); @@ -268,7 +265,7 @@ crate::service_impl!(DELETE, MailAddressAliasService, MailAddressAliasServiceDat pub struct MembershipService; -crate::service_impl!(declare, MembershipService, "sys/membershipservice", 117); +crate::service_impl!(declare, MembershipService, "sys/membershipservice", 118); crate::service_impl!(POST, MembershipService, MembershipAddData, ()); crate::service_impl!(PUT, MembershipService, MembershipPutIn, ()); crate::service_impl!(DELETE, MembershipService, MembershipRemoveData, ()); @@ -276,13 +273,13 @@ crate::service_impl!(DELETE, MembershipService, MembershipRemoveData, ()); pub struct MultipleMailAddressAvailabilityService; -crate::service_impl!(declare, MultipleMailAddressAvailabilityService, "sys/multiplemailaddressavailabilityservice", 117); +crate::service_impl!(declare, MultipleMailAddressAvailabilityService, "sys/multiplemailaddressavailabilityservice", 118); crate::service_impl!(GET, MultipleMailAddressAvailabilityService, MultipleMailAddressAvailabilityData, MultipleMailAddressAvailabilityReturn); pub struct PaymentDataService; -crate::service_impl!(declare, PaymentDataService, "sys/paymentdataservice", 117); +crate::service_impl!(declare, PaymentDataService, "sys/paymentdataservice", 118); crate::service_impl!(POST, PaymentDataService, PaymentDataServicePostData, ()); crate::service_impl!(GET, PaymentDataService, PaymentDataServiceGetData, PaymentDataServiceGetReturn); crate::service_impl!(PUT, PaymentDataService, PaymentDataServicePutData, PaymentDataServicePutReturn); @@ -290,71 +287,71 @@ crate::service_impl!(PUT, PaymentDataService, PaymentDataServicePutData, Payment pub struct PlanService; -crate::service_impl!(declare, PlanService, "sys/planservice", 117); +crate::service_impl!(declare, PlanService, "sys/planservice", 118); crate::service_impl!(GET, PlanService, (), PlanServiceGetOut); pub struct PriceService; -crate::service_impl!(declare, PriceService, "sys/priceservice", 117); +crate::service_impl!(declare, PriceService, "sys/priceservice", 118); crate::service_impl!(GET, PriceService, PriceServiceData, PriceServiceReturn); pub struct PublicKeyService; -crate::service_impl!(declare, PublicKeyService, "sys/publickeyservice", 117); +crate::service_impl!(declare, PublicKeyService, "sys/publickeyservice", 118); crate::service_impl!(GET, PublicKeyService, PublicKeyGetIn, PublicKeyGetOut); crate::service_impl!(PUT, PublicKeyService, PublicKeyPutIn, ()); pub struct ReferralCodeService; -crate::service_impl!(declare, ReferralCodeService, "sys/referralcodeservice", 117); +crate::service_impl!(declare, ReferralCodeService, "sys/referralcodeservice", 118); crate::service_impl!(POST, ReferralCodeService, ReferralCodePostIn, ReferralCodePostOut); crate::service_impl!(GET, ReferralCodeService, ReferralCodeGetIn, ()); pub struct RegistrationCaptchaService; -crate::service_impl!(declare, RegistrationCaptchaService, "sys/registrationcaptchaservice", 117); +crate::service_impl!(declare, RegistrationCaptchaService, "sys/registrationcaptchaservice", 118); crate::service_impl!(POST, RegistrationCaptchaService, RegistrationCaptchaServiceData, ()); crate::service_impl!(GET, RegistrationCaptchaService, RegistrationCaptchaServiceGetData, RegistrationCaptchaServiceReturn); pub struct RegistrationService; -crate::service_impl!(declare, RegistrationService, "sys/registrationservice", 117); +crate::service_impl!(declare, RegistrationService, "sys/registrationservice", 118); crate::service_impl!(POST, RegistrationService, RegistrationServiceData, RegistrationReturn); crate::service_impl!(GET, RegistrationService, (), RegistrationServiceData); pub struct ResetFactorsService; -crate::service_impl!(declare, ResetFactorsService, "sys/resetfactorsservice", 117); +crate::service_impl!(declare, ResetFactorsService, "sys/resetfactorsservice", 118); crate::service_impl!(DELETE, ResetFactorsService, ResetFactorsDeleteData, ()); pub struct ResetPasswordService; -crate::service_impl!(declare, ResetPasswordService, "sys/resetpasswordservice", 117); +crate::service_impl!(declare, ResetPasswordService, "sys/resetpasswordservice", 118); crate::service_impl!(POST, ResetPasswordService, ResetPasswordPostIn, ()); pub struct SaltService; -crate::service_impl!(declare, SaltService, "sys/saltservice", 117); +crate::service_impl!(declare, SaltService, "sys/saltservice", 118); crate::service_impl!(GET, SaltService, SaltData, SaltReturn); pub struct SecondFactorAuthAllowedService; -crate::service_impl!(declare, SecondFactorAuthAllowedService, "sys/secondfactorauthallowedservice", 117); +crate::service_impl!(declare, SecondFactorAuthAllowedService, "sys/secondfactorauthallowedservice", 118); crate::service_impl!(GET, SecondFactorAuthAllowedService, (), SecondFactorAuthAllowedReturn); pub struct SecondFactorAuthService; -crate::service_impl!(declare, SecondFactorAuthService, "sys/secondfactorauthservice", 117); +crate::service_impl!(declare, SecondFactorAuthService, "sys/secondfactorauthservice", 118); crate::service_impl!(POST, SecondFactorAuthService, SecondFactorAuthData, ()); crate::service_impl!(GET, SecondFactorAuthService, SecondFactorAuthGetData, SecondFactorAuthGetReturn); crate::service_impl!(DELETE, SecondFactorAuthService, SecondFactorAuthDeleteData, ()); @@ -362,71 +359,71 @@ crate::service_impl!(DELETE, SecondFactorAuthService, SecondFactorAuthDeleteData pub struct SessionService; -crate::service_impl!(declare, SessionService, "sys/sessionservice", 117); +crate::service_impl!(declare, SessionService, "sys/sessionservice", 118); crate::service_impl!(POST, SessionService, CreateSessionData, CreateSessionReturn); pub struct SignOrderProcessingAgreementService; -crate::service_impl!(declare, SignOrderProcessingAgreementService, "sys/signorderprocessingagreementservice", 117); +crate::service_impl!(declare, SignOrderProcessingAgreementService, "sys/signorderprocessingagreementservice", 118); crate::service_impl!(POST, SignOrderProcessingAgreementService, SignOrderProcessingAgreementData, ()); pub struct SwitchAccountTypeService; -crate::service_impl!(declare, SwitchAccountTypeService, "sys/switchaccounttypeservice", 117); +crate::service_impl!(declare, SwitchAccountTypeService, "sys/switchaccounttypeservice", 118); crate::service_impl!(POST, SwitchAccountTypeService, SwitchAccountTypePostIn, ()); pub struct SystemKeysService; -crate::service_impl!(declare, SystemKeysService, "sys/systemkeysservice", 117); +crate::service_impl!(declare, SystemKeysService, "sys/systemkeysservice", 118); crate::service_impl!(GET, SystemKeysService, (), SystemKeysReturn); pub struct TakeOverDeletedAddressService; -crate::service_impl!(declare, TakeOverDeletedAddressService, "sys/takeoverdeletedaddressservice", 117); +crate::service_impl!(declare, TakeOverDeletedAddressService, "sys/takeoverdeletedaddressservice", 118); crate::service_impl!(POST, TakeOverDeletedAddressService, TakeOverDeletedAddressData, ()); pub struct UpdatePermissionKeyService; -crate::service_impl!(declare, UpdatePermissionKeyService, "sys/updatepermissionkeyservice", 117); +crate::service_impl!(declare, UpdatePermissionKeyService, "sys/updatepermissionkeyservice", 118); crate::service_impl!(POST, UpdatePermissionKeyService, UpdatePermissionKeyData, ()); pub struct UpdateSessionKeysService; -crate::service_impl!(declare, UpdateSessionKeysService, "sys/updatesessionkeysservice", 117); +crate::service_impl!(declare, UpdateSessionKeysService, "sys/updatesessionkeysservice", 118); crate::service_impl!(POST, UpdateSessionKeysService, UpdateSessionKeysPostIn, ()); pub struct UpgradePriceService; -crate::service_impl!(declare, UpgradePriceService, "sys/upgradepriceservice", 117); +crate::service_impl!(declare, UpgradePriceService, "sys/upgradepriceservice", 118); crate::service_impl!(GET, UpgradePriceService, UpgradePriceServiceData, UpgradePriceServiceReturn); pub struct UserGroupKeyRotationService; -crate::service_impl!(declare, UserGroupKeyRotationService, "sys/usergroupkeyrotationservice", 117); +crate::service_impl!(declare, UserGroupKeyRotationService, "sys/usergroupkeyrotationservice", 118); crate::service_impl!(POST, UserGroupKeyRotationService, UserGroupKeyRotationPostIn, ()); pub struct UserService; -crate::service_impl!(declare, UserService, "sys/userservice", 117); +crate::service_impl!(declare, UserService, "sys/userservice", 118); crate::service_impl!(DELETE, UserService, UserDataDelete, ()); pub struct VerifierTokenService; -crate::service_impl!(declare, VerifierTokenService, "sys/verifiertokenservice", 117); +crate::service_impl!(declare, VerifierTokenService, "sys/verifiertokenservice", 118); crate::service_impl!(POST, VerifierTokenService, VerifierTokenServiceIn, VerifierTokenServiceOut); pub struct VersionService; -crate::service_impl!(declare, VersionService, "sys/versionservice", 117); +crate::service_impl!(declare, VersionService, "sys/versionservice", 118); crate::service_impl!(GET, VersionService, VersionData, VersionReturn); diff --git a/tuta-sdk/rust/sdk/src/services/service_executor.rs b/tuta-sdk/rust/sdk/src/services/service_executor.rs index fdff2915e857..544843a522cb 100644 --- a/tuta-sdk/rust/sdk/src/services/service_executor.rs +++ b/tuta-sdk/rust/sdk/src/services/service_executor.rs @@ -669,7 +669,7 @@ mod tests { .unwrap(); } let owner_enc_session_key = [rand::random(); 32].to_vec(); - let owner_key_version = 0i64; + let owner_key_version = 0u64; rest_client .expect_request_binary() diff --git a/tuta-sdk/rust/sdk/src/tutanota_constants.rs b/tuta-sdk/rust/sdk/src/tutanota_constants.rs index a88283f01890..482ab26f584c 100644 --- a/tuta-sdk/rust/sdk/src/tutanota_constants.rs +++ b/tuta-sdk/rust/sdk/src/tutanota_constants.rs @@ -4,11 +4,12 @@ The type of the identifier to look up the public key for a group. use num_enum::TryFromPrimitive; #[allow(dead_code)] -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq)] #[repr(i64)] pub enum PublicKeyIdentifierType { MailAddress = 0, // the default to retrieve public keys. identify the group by mail address. GroupId = 1, // e.g. needed if a user's needs the admin groups public key. identify by groupId. + KeyRotationId = 2, // used for distribution key pairs during multi admin key rotation. } #[repr(i64)] pub enum GroupType { diff --git a/tuta-sdk/rust/sdk/src/type_models/sys.json b/tuta-sdk/rust/sdk/src/type_models/sys.json index 53d0ed74ee18..510ef9d23d26 100644 --- a/tuta-sdk/rust/sdk/src/type_models/sys.json +++ b/tuta-sdk/rust/sdk/src/type_models/sys.json @@ -212,59 +212,95 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, - "AdminGroupKeyAuthenticationData": { - "name": "AdminGroupKeyAuthenticationData", - "since": 111, + "AdminGroupKeyDistributionElement": { + "name": "AdminGroupKeyDistributionElement", + "since": 118, "type": "AGGREGATED_TYPE", - "id": 2477, - "rootId": "A3N5cwAJrQ", + "id": 2525, + "rootId": "A3N5cwAJ3Q", "versioned": false, "encrypted": false, "values": { "_id": { "final": true, "name": "_id", - "id": 2478, - "since": 111, + "id": 2526, + "since": 118, "type": "CustomId", "cardinality": "One", "encrypted": false - }, - "authKeyEncAdminRotationHash": { + } + }, + "associations": { + "distEncAdminGroupKey": { "final": false, - "name": "authKeyEncAdminRotationHash", - "id": 2481, - "since": 111, - "type": "Bytes", + "name": "distEncAdminGroupKey", + "id": 2528, + "since": 118, + "type": "AGGREGATION", "cardinality": "One", - "encrypted": false + "refType": "PubEncKeyData", + "dependency": null }, - "version": { + "userGroupId": { "final": false, - "name": "version", - "id": 2480, - "since": 111, + "name": "userGroupId", + "id": 2527, + "since": 118, + "type": "ELEMENT_ASSOCIATION", + "cardinality": "One", + "refType": "Group", + "dependency": null + } + }, + "app": "sys", + "version": "118" + }, + "AdminGroupKeyRotationGetOut": { + "name": "AdminGroupKeyRotationGetOut", + "since": 118, + "type": "DATA_TRANSFER_TYPE", + "id": 2540, + "rootId": "A3N5cwAJ7A", + "versioned": false, + "encrypted": false, + "values": { + "_format": { + "final": false, + "name": "_format", + "id": 2541, + "since": 118, "type": "Number", "cardinality": "One", "encrypted": false } }, "associations": { - "userGroup": { + "distributionKeys": { "final": false, - "name": "userGroup", - "id": 2479, - "since": 111, + "name": "distributionKeys", + "id": 2543, + "since": 118, + "type": "AGGREGATION", + "cardinality": "Any", + "refType": "PubDistributionKey", + "dependency": null + }, + "userGroupIdsMissingDistributionKeys": { + "final": false, + "name": "userGroupIdsMissingDistributionKeys", + "id": 2542, + "since": 118, "type": "ELEMENT_ASSOCIATION", - "cardinality": "One", + "cardinality": "Any", "refType": "Group", "dependency": null } }, "app": "sys", - "version": "117" + "version": "118" }, "AdminGroupKeyRotationPostIn": { "name": "AdminGroupKeyRotationPostIn", @@ -286,24 +322,34 @@ } }, "associations": { - "adminGroupKeyAuthenticationDataList": { + "adminGroupKeyData": { "final": false, - "name": "adminGroupKeyAuthenticationDataList", + "name": "adminGroupKeyData", + "id": 2366, + "since": 101, + "type": "AGGREGATION", + "cardinality": "One", + "refType": "GroupKeyRotationData", + "dependency": null + }, + "adminPubKeyMacList": { + "final": false, + "name": "adminPubKeyMacList", "id": 2483, "since": 111, "type": "AGGREGATION", "cardinality": "Any", - "refType": "AdminGroupKeyAuthenticationData", + "refType": "KeyMac", "dependency": null }, - "adminGroupKeyData": { + "distribution": { "final": false, - "name": "adminGroupKeyData", - "id": 2366, - "since": 101, + "name": "distribution", + "id": 2529, + "since": 118, "type": "AGGREGATION", - "cardinality": "One", - "refType": "GroupKeyRotationData", + "cardinality": "Any", + "refType": "AdminGroupKeyDistributionElement", "dependency": null }, "userGroupKeyData": { @@ -318,121 +364,51 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, - "AdministratedGroup": { - "name": "AdministratedGroup", - "since": 27, - "type": "LIST_ELEMENT_TYPE", - "id": 1294, - "rootId": "A3N5cwAFDg", + "AdminGroupKeyRotationPutIn": { + "name": "AdminGroupKeyRotationPutIn", + "since": 118, + "type": "DATA_TRANSFER_TYPE", + "id": 2530, + "rootId": "A3N5cwAJ4g", "versioned": false, "encrypted": false, "values": { "_format": { "final": false, "name": "_format", - "id": 1298, - "since": 27, - "type": "Number", - "cardinality": "One", - "encrypted": false - }, - "_id": { - "final": true, - "name": "_id", - "id": 1296, - "since": 27, - "type": "GeneratedId", - "cardinality": "One", - "encrypted": false - }, - "_ownerGroup": { - "final": true, - "name": "_ownerGroup", - "id": 1299, - "since": 27, - "type": "GeneratedId", - "cardinality": "ZeroOrOne", - "encrypted": false - }, - "_permissions": { - "final": true, - "name": "_permissions", - "id": 1297, - "since": 27, - "type": "GeneratedId", - "cardinality": "One", - "encrypted": false - }, - "groupType": { - "final": true, - "name": "groupType", - "id": 1300, - "since": 27, + "id": 2531, + "since": 118, "type": "Number", "cardinality": "One", "encrypted": false } }, "associations": { - "groupInfo": { + "adminDistKeyPair": { "final": false, - "name": "groupInfo", - "id": 1301, - "since": 27, - "type": "LIST_ELEMENT_ASSOCIATION_GENERATED", + "name": "adminDistKeyPair", + "id": 2533, + "since": 118, + "type": "AGGREGATION", "cardinality": "One", - "refType": "GroupInfo", + "refType": "KeyPair", "dependency": null }, - "localAdminGroup": { + "distKeyMac": { "final": false, - "name": "localAdminGroup", - "id": 1302, - "since": 27, - "type": "ELEMENT_ASSOCIATION", - "cardinality": "One", - "refType": "Group", - "dependency": null - } - }, - "app": "sys", - "version": "117" - }, - "AdministratedGroupsRef": { - "name": "AdministratedGroupsRef", - "since": 27, - "type": "AGGREGATED_TYPE", - "id": 1303, - "rootId": "A3N5cwAFFw", - "versioned": false, - "encrypted": false, - "values": { - "_id": { - "final": true, - "name": "_id", - "id": 1304, - "since": 27, - "type": "CustomId", - "cardinality": "One", - "encrypted": false - } - }, - "associations": { - "items": { - "final": true, - "name": "items", - "id": 1305, - "since": 27, - "type": "LIST_ASSOCIATION", + "name": "distKeyMac", + "id": 2532, + "since": 118, + "type": "AGGREGATION", "cardinality": "One", - "refType": "AdministratedGroup", + "refType": "KeyMac", "dependency": null } }, "app": "sys", - "version": "117" + "version": "118" }, "AffiliatePartnerKpiMonthSummary": { "name": "AffiliatePartnerKpiMonthSummary", @@ -509,7 +485,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "AffiliatePartnerKpiServiceGetOut": { "name": "AffiliatePartnerKpiServiceGetOut", @@ -570,7 +546,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "AlarmInfo": { "name": "AlarmInfo", @@ -622,7 +598,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "AlarmNotification": { "name": "AlarmNotification", @@ -722,7 +698,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "AlarmServicePost": { "name": "AlarmServicePost", @@ -756,7 +732,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "AppStoreSubscriptionGetIn": { "name": "AppStoreSubscriptionGetIn", @@ -788,7 +764,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "AppStoreSubscriptionGetOut": { "name": "AppStoreSubscriptionGetOut", @@ -820,7 +796,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "ArchiveRef": { "name": "ArchiveRef", @@ -852,7 +828,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "ArchiveType": { "name": "ArchiveType", @@ -906,7 +882,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "AuditLogEntry": { "name": "AuditLogEntry", @@ -1040,7 +1016,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "AuditLogRef": { "name": "AuditLogRef", @@ -1074,7 +1050,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "AuthenticatedDevice": { "name": "AuthenticatedDevice", @@ -1124,7 +1100,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "Authentication": { "name": "Authentication", @@ -1185,7 +1161,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "AutoLoginDataDelete": { "name": "AutoLoginDataDelete", @@ -1217,7 +1193,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "AutoLoginDataGet": { "name": "AutoLoginDataGet", @@ -1260,7 +1236,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "AutoLoginDataReturn": { "name": "AutoLoginDataReturn", @@ -1292,7 +1268,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "AutoLoginPostReturn": { "name": "AutoLoginPostReturn", @@ -1324,7 +1300,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "Blob": { "name": "Blob", @@ -1374,7 +1350,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "BlobReferenceTokenWrapper": { "name": "BlobReferenceTokenWrapper", @@ -1406,7 +1382,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "Booking": { "name": "Booking", @@ -1530,7 +1506,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "BookingItem": { "name": "BookingItem", @@ -1616,7 +1592,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "BookingsRef": { "name": "BookingsRef", @@ -1650,7 +1626,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "BootstrapFeature": { "name": "BootstrapFeature", @@ -1682,7 +1658,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "Braintree3ds2Request": { "name": "Braintree3ds2Request", @@ -1732,7 +1708,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "Braintree3ds2Response": { "name": "Braintree3ds2Response", @@ -1773,7 +1749,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "BrandingDomainData": { "name": "BrandingDomainData", @@ -1850,7 +1826,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "BrandingDomainDeleteData": { "name": "BrandingDomainDeleteData", @@ -1882,7 +1858,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "BrandingDomainGetReturn": { "name": "BrandingDomainGetReturn", @@ -1916,7 +1892,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "Bucket": { "name": "Bucket", @@ -1950,7 +1926,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "BucketKey": { "name": "BucketKey", @@ -2039,7 +2015,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "BucketPermission": { "name": "BucketPermission", @@ -2181,7 +2157,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "CalendarEventRef": { "name": "CalendarEventRef", @@ -2222,7 +2198,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "CertificateInfo": { "name": "CertificateInfo", @@ -2283,7 +2259,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "Challenge": { "name": "Challenge", @@ -2336,7 +2312,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "ChangeKdfPostIn": { "name": "ChangeKdfPostIn", @@ -2413,7 +2389,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "ChangePasswordPostIn": { "name": "ChangePasswordPostIn", @@ -2508,7 +2484,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "Chat": { "name": "Chat", @@ -2558,7 +2534,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "CloseSessionServicePost": { "name": "CloseSessionServicePost", @@ -2601,7 +2577,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "CreateCustomerServerPropertiesData": { "name": "CreateCustomerServerPropertiesData", @@ -2642,7 +2618,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "CreateCustomerServerPropertiesReturn": { "name": "CreateCustomerServerPropertiesReturn", @@ -2676,7 +2652,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "CreateSessionData": { "name": "CreateSessionData", @@ -2764,7 +2740,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "CreateSessionReturn": { "name": "CreateSessionReturn", @@ -2817,7 +2793,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "CreditCard": { "name": "CreditCard", @@ -2885,7 +2861,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "CustomDomainCheckGetIn": { "name": "CustomDomainCheckGetIn", @@ -2928,7 +2904,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "CustomDomainCheckGetOut": { "name": "CustomDomainCheckGetOut", @@ -2991,7 +2967,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "CustomDomainData": { "name": "CustomDomainData", @@ -3034,7 +3010,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "CustomDomainReturn": { "name": "CustomDomainReturn", @@ -3077,7 +3053,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "Customer": { "name": "Customer", @@ -3334,7 +3310,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "CustomerAccountTerminationPostIn": { "name": "CustomerAccountTerminationPostIn", @@ -3377,7 +3353,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "CustomerAccountTerminationPostOut": { "name": "CustomerAccountTerminationPostOut", @@ -3411,7 +3387,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "CustomerAccountTerminationRequest": { "name": "CustomerAccountTerminationRequest", @@ -3490,7 +3466,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "CustomerInfo": { "name": "CustomerInfo", @@ -3803,7 +3779,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "CustomerProperties": { "name": "CustomerProperties", @@ -3911,7 +3887,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "CustomerServerProperties": { "name": "CustomerServerProperties", @@ -4027,7 +4003,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "DateWrapper": { "name": "DateWrapper", @@ -4059,7 +4035,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "DebitServicePutData": { "name": "DebitServicePutData", @@ -4093,7 +4069,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "DeleteCustomerData": { "name": "DeleteCustomerData", @@ -4173,7 +4149,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "DnsRecord": { "name": "DnsRecord", @@ -4223,7 +4199,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "DomainInfo": { "name": "DomainInfo", @@ -4285,7 +4261,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "DomainMailAddressAvailabilityData": { "name": "DomainMailAddressAvailabilityData", @@ -4317,7 +4293,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "DomainMailAddressAvailabilityReturn": { "name": "DomainMailAddressAvailabilityReturn", @@ -4349,7 +4325,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "EmailSenderListElement": { "name": "EmailSenderListElement", @@ -4408,7 +4384,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "EntityEventBatch": { "name": "EntityEventBatch", @@ -4469,7 +4445,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "EntityUpdate": { "name": "EntityUpdate", @@ -4537,7 +4513,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "Exception": { "name": "Exception", @@ -4578,7 +4554,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "ExternalPropertiesReturn": { "name": "ExternalPropertiesReturn", @@ -4640,7 +4616,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "ExternalUserReference": { "name": "ExternalUserReference", @@ -4711,7 +4687,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "Feature": { "name": "Feature", @@ -4743,7 +4719,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "File": { "name": "File", @@ -4793,7 +4769,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "GeneratedIdWrapper": { "name": "GeneratedIdWrapper", @@ -4825,7 +4801,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "GiftCard": { "name": "GiftCard", @@ -4938,7 +4914,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "GiftCardCreateData": { "name": "GiftCardCreateData", @@ -5006,7 +4982,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "GiftCardCreateReturn": { "name": "GiftCardCreateReturn", @@ -5040,7 +5016,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "GiftCardDeleteData": { "name": "GiftCardDeleteData", @@ -5074,7 +5050,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "GiftCardGetReturn": { "name": "GiftCardGetReturn", @@ -5126,7 +5102,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "GiftCardOption": { "name": "GiftCardOption", @@ -5158,7 +5134,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "GiftCardRedeemData": { "name": "GiftCardRedeemData", @@ -5210,7 +5186,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "GiftCardRedeemGetReturn": { "name": "GiftCardRedeemGetReturn", @@ -5262,7 +5238,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "GiftCardsRef": { "name": "GiftCardsRef", @@ -5296,7 +5272,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "Group": { "name": "Group", @@ -5409,16 +5385,6 @@ "refType": "Group", "dependency": null }, - "administratedGroups": { - "final": true, - "name": "administratedGroups", - "id": 1306, - "since": 27, - "type": "AGGREGATION", - "cardinality": "ZeroOrOne", - "refType": "AdministratedGroupsRef", - "dependency": null - }, "archives": { "final": true, "name": "archives", @@ -5521,7 +5487,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "GroupInfo": { "name": "GroupInfo", @@ -5652,16 +5618,6 @@ "refType": "Group", "dependency": null }, - "localAdmin": { - "final": true, - "name": "localAdmin", - "id": 1287, - "since": 27, - "type": "ELEMENT_ASSOCIATION", - "cardinality": "ZeroOrOne", - "refType": "Group", - "dependency": null - }, "mailAddressAliases": { "final": true, "name": "mailAddressAliases", @@ -5674,7 +5630,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "GroupKey": { "name": "GroupKey", @@ -5781,7 +5737,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "GroupKeyRotationData": { "name": "GroupKeyRotationData", @@ -5881,7 +5837,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "GroupKeyRotationInfoGetOut": { "name": "GroupKeyRotationInfoGetOut", @@ -5924,7 +5880,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "GroupKeyRotationPostIn": { "name": "GroupKeyRotationPostIn", @@ -5958,7 +5914,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "GroupKeyUpdate": { "name": "GroupKeyUpdate", @@ -6055,7 +6011,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "GroupKeyUpdateData": { "name": "GroupKeyUpdateData", @@ -6116,7 +6072,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "GroupKeyUpdatesRef": { "name": "GroupKeyUpdatesRef", @@ -6150,7 +6106,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "GroupKeysRef": { "name": "GroupKeysRef", @@ -6184,7 +6140,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "GroupMember": { "name": "GroupMember", @@ -6274,7 +6230,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "GroupMembership": { "name": "GroupMembership", @@ -6382,7 +6338,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "GroupMembershipKeyData": { "name": "GroupMembershipKeyData", @@ -6443,7 +6399,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "GroupMembershipUpdateData": { "name": "GroupMembershipUpdateData", @@ -6495,7 +6451,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "GroupRoot": { "name": "GroupRoot", @@ -6576,7 +6532,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "IdTupleWrapper": { "name": "IdTupleWrapper", @@ -6617,7 +6573,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "InstanceSessionKey": { "name": "InstanceSessionKey", @@ -6696,7 +6652,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "Invoice": { "name": "Invoice", @@ -6912,7 +6868,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "InvoiceDataGetIn": { "name": "InvoiceDataGetIn", @@ -6944,7 +6900,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "InvoiceDataGetOut": { "name": "InvoiceDataGetOut", @@ -7086,7 +7042,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "InvoiceDataItem": { "name": "InvoiceDataItem", @@ -7163,7 +7119,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "InvoiceInfo": { "name": "InvoiceInfo", @@ -7342,7 +7298,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "InvoiceItem": { "name": "InvoiceItem", @@ -7428,7 +7384,68 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" + }, + "KeyMac": { + "name": "KeyMac", + "since": 111, + "type": "AGGREGATED_TYPE", + "id": 2477, + "rootId": "A3N5cwAJrQ", + "versioned": false, + "encrypted": false, + "values": { + "_id": { + "final": true, + "name": "_id", + "id": 2478, + "since": 111, + "type": "CustomId", + "cardinality": "One", + "encrypted": false + }, + "tag": { + "final": false, + "name": "tag", + "id": 2481, + "since": 111, + "type": "Bytes", + "cardinality": "One", + "encrypted": false + }, + "taggedKeyVersion": { + "final": false, + "name": "taggedKeyVersion", + "id": 2480, + "since": 111, + "type": "Number", + "cardinality": "One", + "encrypted": false + }, + "taggingKeyVersion": { + "final": false, + "name": "taggingKeyVersion", + "id": 2521, + "since": 118, + "type": "Number", + "cardinality": "One", + "encrypted": false + } + }, + "associations": { + "taggingGroup": { + "final": false, + "name": "taggingGroup", + "id": 2479, + "since": 111, + "type": "ELEMENT_ASSOCIATION", + "cardinality": "One", + "refType": "Group", + "dependency": null + } + }, + "app": "sys", + "version": "118" }, "KeyPair": { "name": "KeyPair", @@ -7505,7 +7522,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "KeyRotation": { "name": "KeyRotation", @@ -7572,19 +7589,49 @@ } }, "associations": { - "adminGroupKeyAuthenticationData": { + "adminDistKeyPair": { "final": false, - "name": "adminGroupKeyAuthenticationData", + "name": "adminDistKeyPair", + "id": 2524, + "since": 118, + "type": "AGGREGATION", + "cardinality": "ZeroOrOne", + "refType": "KeyPair", + "dependency": null + }, + "adminPubKeyMac": { + "final": false, + "name": "adminPubKeyMac", "id": 2482, "since": 111, "type": "AGGREGATION", "cardinality": "ZeroOrOne", - "refType": "AdminGroupKeyAuthenticationData", + "refType": "KeyMac", + "dependency": null + }, + "distEncAdminGroupSymKey": { + "final": false, + "name": "distEncAdminGroupSymKey", + "id": 2522, + "since": 118, + "type": "AGGREGATION", + "cardinality": "ZeroOrOne", + "refType": "PubEncKeyData", + "dependency": null + }, + "distKeyMac": { + "final": false, + "name": "distKeyMac", + "id": 2523, + "since": 118, + "type": "AGGREGATION", + "cardinality": "ZeroOrOne", + "refType": "KeyMac", "dependency": null } }, "app": "sys", - "version": "117" + "version": "118" }, "KeyRotationsRef": { "name": "KeyRotationsRef", @@ -7618,102 +7665,7 @@ } }, "app": "sys", - "version": "117" - }, - "LocalAdminGroupReplacementData": { - "name": "LocalAdminGroupReplacementData", - "since": 113, - "type": "AGGREGATED_TYPE", - "id": 2484, - "rootId": "A3N5cwAJtA", - "versioned": false, - "encrypted": false, - "values": { - "_id": { - "final": true, - "name": "_id", - "id": 2485, - "since": 113, - "type": "CustomId", - "cardinality": "One", - "encrypted": false - }, - "adminGroupEncGKey": { - "final": false, - "name": "adminGroupEncGKey", - "id": 2487, - "since": 113, - "type": "Bytes", - "cardinality": "One", - "encrypted": false - }, - "adminGroupKeyVersion": { - "final": false, - "name": "adminGroupKeyVersion", - "id": 2489, - "since": 113, - "type": "Number", - "cardinality": "One", - "encrypted": false - }, - "groupKeyVersion": { - "final": false, - "name": "groupKeyVersion", - "id": 2488, - "since": 113, - "type": "Number", - "cardinality": "One", - "encrypted": false - } - }, - "associations": { - "groupId": { - "final": false, - "name": "groupId", - "id": 2486, - "since": 113, - "type": "ELEMENT_ASSOCIATION", - "cardinality": "One", - "refType": "Group", - "dependency": null - } - }, - "app": "sys", - "version": "117" - }, - "LocalAdminRemovalPostIn": { - "name": "LocalAdminRemovalPostIn", - "since": 113, - "type": "DATA_TRANSFER_TYPE", - "id": 2490, - "rootId": "A3N5cwAJug", - "versioned": false, - "encrypted": false, - "values": { - "_format": { - "final": false, - "name": "_format", - "id": 2491, - "since": 113, - "type": "Number", - "cardinality": "One", - "encrypted": false - } - }, - "associations": { - "groupUpdates": { - "final": false, - "name": "groupUpdates", - "id": 2492, - "since": 113, - "type": "AGGREGATION", - "cardinality": "Any", - "refType": "LocalAdminGroupReplacementData", - "dependency": null - } - }, - "app": "sys", - "version": "117" + "version": "118" }, "LocationServiceGetReturn": { "name": "LocationServiceGetReturn", @@ -7745,7 +7697,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "Login": { "name": "Login", @@ -7804,7 +7756,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "MailAddressAlias": { "name": "MailAddressAlias", @@ -7845,7 +7797,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "MailAddressAliasGetIn": { "name": "MailAddressAliasGetIn", @@ -7879,7 +7831,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "MailAddressAliasServiceData": { "name": "MailAddressAliasServiceData", @@ -7922,7 +7874,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "MailAddressAliasServiceDataDelete": { "name": "MailAddressAliasServiceDataDelete", @@ -7974,7 +7926,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "MailAddressAliasServiceReturn": { "name": "MailAddressAliasServiceReturn", @@ -8033,7 +7985,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "MailAddressAvailability": { "name": "MailAddressAvailability", @@ -8074,7 +8026,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "MailAddressToGroup": { "name": "MailAddressToGroup", @@ -8135,7 +8087,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "MembershipAddData": { "name": "MembershipAddData", @@ -8206,7 +8158,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "MembershipPutIn": { "name": "MembershipPutIn", @@ -8240,7 +8192,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "MembershipRemoveData": { "name": "MembershipRemoveData", @@ -8284,7 +8236,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "MissedNotification": { "name": "MissedNotification", @@ -8400,7 +8352,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "MultipleMailAddressAvailabilityData": { "name": "MultipleMailAddressAvailabilityData", @@ -8434,7 +8386,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "MultipleMailAddressAvailabilityReturn": { "name": "MultipleMailAddressAvailabilityReturn", @@ -8468,7 +8420,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "NotificationInfo": { "name": "NotificationInfo", @@ -8520,7 +8472,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "NotificationMailTemplate": { "name": "NotificationMailTemplate", @@ -8570,7 +8522,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "NotificationSessionKey": { "name": "NotificationSessionKey", @@ -8613,7 +8565,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "OrderProcessingAgreement": { "name": "OrderProcessingAgreement", @@ -8729,7 +8681,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "OtpChallenge": { "name": "OtpChallenge", @@ -8763,7 +8715,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "PaymentDataServiceGetData": { "name": "PaymentDataServiceGetData", @@ -8795,7 +8747,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "PaymentDataServiceGetReturn": { "name": "PaymentDataServiceGetReturn", @@ -8827,7 +8779,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "PaymentDataServicePostData": { "name": "PaymentDataServicePostData", @@ -8861,7 +8813,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "PaymentDataServicePutData": { "name": "PaymentDataServicePutData", @@ -8976,7 +8928,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "PaymentDataServicePutReturn": { "name": "PaymentDataServicePutReturn", @@ -9019,7 +8971,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "PaymentErrorInfo": { "name": "PaymentErrorInfo", @@ -9069,7 +9021,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "Permission": { "name": "Permission", @@ -9221,7 +9173,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "PlanConfiguration": { "name": "PlanConfiguration", @@ -9343,7 +9295,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "PlanPrices": { "name": "PlanPrices", @@ -9485,7 +9437,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "PlanServiceGetOut": { "name": "PlanServiceGetOut", @@ -9519,7 +9471,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "PriceData": { "name": "PriceData", @@ -9580,7 +9532,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "PriceItemData": { "name": "PriceItemData", @@ -9639,7 +9591,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "PriceRequestData": { "name": "PriceRequestData", @@ -9716,7 +9668,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "PriceServiceData": { "name": "PriceServiceData", @@ -9759,7 +9711,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "PriceServiceReturn": { "name": "PriceServiceReturn", @@ -9831,7 +9783,68 @@ } }, "app": "sys", - "version": "117" + "version": "118" + }, + "PubDistributionKey": { + "name": "PubDistributionKey", + "since": 118, + "type": "AGGREGATED_TYPE", + "id": 2534, + "rootId": "A3N5cwAJ5g", + "versioned": false, + "encrypted": false, + "values": { + "_id": { + "final": true, + "name": "_id", + "id": 2535, + "since": 118, + "type": "CustomId", + "cardinality": "One", + "encrypted": false + }, + "pubEccKey": { + "final": true, + "name": "pubEccKey", + "id": 2538, + "since": 118, + "type": "Bytes", + "cardinality": "One", + "encrypted": false + }, + "pubKeyMac": { + "final": false, + "name": "pubKeyMac", + "id": 2537, + "since": 118, + "type": "Bytes", + "cardinality": "One", + "encrypted": false + }, + "pubKyberKey": { + "final": true, + "name": "pubKyberKey", + "id": 2539, + "since": 118, + "type": "Bytes", + "cardinality": "One", + "encrypted": false + } + }, + "associations": { + "userGroupId": { + "final": false, + "name": "userGroupId", + "id": 2536, + "since": 118, + "type": "ELEMENT_ASSOCIATION", + "cardinality": "One", + "refType": "Group", + "dependency": null + } + }, + "app": "sys", + "version": "118" }, "PubEncKeyData": { "name": "PubEncKeyData", @@ -9896,6 +9909,24 @@ "cardinality": "One", "encrypted": false }, + "senderIdentifier": { + "final": true, + "name": "senderIdentifier", + "id": 2545, + "since": 118, + "type": "String", + "cardinality": "ZeroOrOne", + "encrypted": false + }, + "senderIdentifierType": { + "final": true, + "name": "senderIdentifierType", + "id": 2546, + "since": 118, + "type": "Number", + "cardinality": "ZeroOrOne", + "encrypted": false + }, "senderKeyVersion": { "final": true, "name": "senderKeyVersion", @@ -9906,9 +9937,20 @@ "encrypted": false } }, - "associations": {}, + "associations": { + "symKeyMac": { + "final": false, + "name": "symKeyMac", + "id": 2547, + "since": 118, + "type": "AGGREGATION", + "cardinality": "ZeroOrOne", + "refType": "KeyMac", + "dependency": null + } + }, "app": "sys", - "version": "117" + "version": "118" }, "PublicKeyGetIn": { "name": "PublicKeyGetIn", @@ -9958,7 +10000,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "PublicKeyGetOut": { "name": "PublicKeyGetOut", @@ -10017,7 +10059,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "PublicKeyPutIn": { "name": "PublicKeyPutIn", @@ -10069,7 +10111,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "PushIdentifier": { "name": "PushIdentifier", @@ -10227,7 +10269,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "PushIdentifierList": { "name": "PushIdentifierList", @@ -10261,7 +10303,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "ReceivedGroupInvitation": { "name": "ReceivedGroupInvitation", @@ -10422,7 +10464,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "RecoverCode": { "name": "RecoverCode", @@ -10508,7 +10550,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "RecoverCodeData": { "name": "RecoverCodeData", @@ -10567,7 +10609,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "ReferralCodeGetIn": { "name": "ReferralCodeGetIn", @@ -10601,7 +10643,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "ReferralCodePostIn": { "name": "ReferralCodePostIn", @@ -10624,7 +10666,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "ReferralCodePostOut": { "name": "ReferralCodePostOut", @@ -10658,7 +10700,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "RegistrationCaptchaServiceData": { "name": "RegistrationCaptchaServiceData", @@ -10699,7 +10741,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "RegistrationCaptchaServiceGetData": { "name": "RegistrationCaptchaServiceGetData", @@ -10767,7 +10809,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "RegistrationCaptchaServiceReturn": { "name": "RegistrationCaptchaServiceReturn", @@ -10808,7 +10850,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "RegistrationReturn": { "name": "RegistrationReturn", @@ -10840,7 +10882,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "RegistrationServiceData": { "name": "RegistrationServiceData", @@ -10890,7 +10932,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "RejectedSender": { "name": "RejectedSender", @@ -10985,7 +11027,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "RejectedSendersRef": { "name": "RejectedSendersRef", @@ -11019,7 +11061,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "RepeatRule": { "name": "RepeatRule", @@ -11098,7 +11140,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "ResetFactorsDeleteData": { "name": "ResetFactorsDeleteData", @@ -11148,7 +11190,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "ResetPasswordPostIn": { "name": "ResetPasswordPostIn", @@ -11227,7 +11269,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "RootInstance": { "name": "RootInstance", @@ -11286,7 +11328,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "SaltData": { "name": "SaltData", @@ -11318,7 +11360,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "SaltReturn": { "name": "SaltReturn", @@ -11359,7 +11401,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "SecondFactor": { "name": "SecondFactor", @@ -11447,7 +11489,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "SecondFactorAuthAllowedReturn": { "name": "SecondFactorAuthAllowedReturn", @@ -11479,7 +11521,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "SecondFactorAuthData": { "name": "SecondFactorAuthData", @@ -11551,7 +11593,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "SecondFactorAuthDeleteData": { "name": "SecondFactorAuthDeleteData", @@ -11585,7 +11627,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "SecondFactorAuthGetData": { "name": "SecondFactorAuthGetData", @@ -11617,7 +11659,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "SecondFactorAuthGetReturn": { "name": "SecondFactorAuthGetReturn", @@ -11649,7 +11691,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "SecondFactorAuthentication": { "name": "SecondFactorAuthentication", @@ -11735,7 +11777,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "SendRegistrationCodeData": { "name": "SendRegistrationCodeData", @@ -11794,7 +11836,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "SendRegistrationCodeReturn": { "name": "SendRegistrationCodeReturn", @@ -11826,7 +11868,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "SentGroupInvitation": { "name": "SentGroupInvitation", @@ -11915,7 +11957,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "Session": { "name": "Session", @@ -12058,7 +12100,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "SignOrderProcessingAgreementData": { "name": "SignOrderProcessingAgreementData", @@ -12099,7 +12141,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "SseConnectData": { "name": "SseConnectData", @@ -12142,7 +12184,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "StringConfigValue": { "name": "StringConfigValue", @@ -12183,7 +12225,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "StringWrapper": { "name": "StringWrapper", @@ -12215,7 +12257,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "SurveyData": { "name": "SurveyData", @@ -12274,7 +12316,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "SwitchAccountTypePostIn": { "name": "SwitchAccountTypePostIn", @@ -12372,7 +12414,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "SystemKeysReturn": { "name": "SystemKeysReturn", @@ -12488,7 +12530,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "TakeOverDeletedAddressData": { "name": "TakeOverDeletedAddressData", @@ -12547,7 +12589,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "TypeInfo": { "name": "TypeInfo", @@ -12588,7 +12630,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "U2fChallenge": { "name": "U2fChallenge", @@ -12631,7 +12673,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "U2fKey": { "name": "U2fKey", @@ -12683,7 +12725,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "U2fRegisteredDevice": { "name": "U2fRegisteredDevice", @@ -12751,7 +12793,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "U2fResponseData": { "name": "U2fResponseData", @@ -12801,7 +12843,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "UpdatePermissionKeyData": { "name": "UpdatePermissionKeyData", @@ -12863,7 +12905,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "UpdateSessionKeysPostIn": { "name": "UpdateSessionKeysPostIn", @@ -12897,7 +12939,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "UpgradePriceServiceData": { "name": "UpgradePriceServiceData", @@ -12949,7 +12991,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "UpgradePriceServiceReturn": { "name": "UpgradePriceServiceReturn", @@ -13120,7 +13162,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "User": { "name": "User", @@ -13335,7 +13377,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "UserAlarmInfo": { "name": "UserAlarmInfo", @@ -13414,7 +13456,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "UserAlarmInfoListType": { "name": "UserAlarmInfoListType", @@ -13448,7 +13490,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "UserAreaGroups": { "name": "UserAreaGroups", @@ -13482,7 +13524,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "UserAuthentication": { "name": "UserAuthentication", @@ -13536,7 +13578,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "UserDataDelete": { "name": "UserDataDelete", @@ -13588,7 +13630,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "UserExternalAuthInfo": { "name": "UserExternalAuthInfo", @@ -13658,7 +13700,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "UserGroupKeyDistribution": { "name": "UserGroupKeyDistribution", @@ -13726,7 +13768,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "UserGroupKeyRotationData": { "name": "UserGroupKeyRotationData", @@ -13791,6 +13833,15 @@ "cardinality": "One", "encrypted": false }, + "userGroupEncAdminGroupKey": { + "final": false, + "name": "userGroupEncAdminGroupKey", + "id": 2544, + "since": 118, + "type": "Bytes", + "cardinality": "ZeroOrOne", + "encrypted": false + }, "userGroupEncPreviousGroupKey": { "final": false, "name": "userGroupEncPreviousGroupKey", @@ -13853,7 +13904,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "UserGroupKeyRotationPostIn": { "name": "UserGroupKeyRotationPostIn", @@ -13887,7 +13938,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "UserGroupRoot": { "name": "UserGroupRoot", @@ -13968,7 +14019,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "VariableExternalAuthInfo": { "name": "VariableExternalAuthInfo", @@ -14072,7 +14123,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "VerifierTokenServiceIn": { "name": "VerifierTokenServiceIn", @@ -14104,7 +14155,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "VerifierTokenServiceOut": { "name": "VerifierTokenServiceOut", @@ -14136,7 +14187,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "VerifyRegistrationCodeData": { "name": "VerifyRegistrationCodeData", @@ -14177,7 +14228,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "Version": { "name": "Version", @@ -14248,7 +14299,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "VersionData": { "name": "VersionData", @@ -14307,7 +14358,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "VersionInfo": { "name": "VersionInfo", @@ -14432,7 +14483,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "VersionReturn": { "name": "VersionReturn", @@ -14466,7 +14517,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "WebauthnResponseData": { "name": "WebauthnResponseData", @@ -14525,7 +14576,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "WebsocketCounterData": { "name": "WebsocketCounterData", @@ -14568,7 +14619,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "WebsocketCounterValue": { "name": "WebsocketCounterValue", @@ -14609,7 +14660,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "WebsocketEntityData": { "name": "WebsocketEntityData", @@ -14661,7 +14712,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "WebsocketLeaderStatus": { "name": "WebsocketLeaderStatus", @@ -14693,7 +14744,7 @@ }, "associations": {}, "app": "sys", - "version": "117" + "version": "118" }, "WhitelabelChild": { "name": "WhitelabelChild", @@ -14808,7 +14859,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "WhitelabelChildrenRef": { "name": "WhitelabelChildrenRef", @@ -14842,7 +14893,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "WhitelabelConfig": { "name": "WhitelabelConfig", @@ -14977,7 +15028,7 @@ } }, "app": "sys", - "version": "117" + "version": "118" }, "WhitelabelParent": { "name": "WhitelabelParent", @@ -15021,6 +15072,6 @@ } }, "app": "sys", - "version": "117" + "version": "118" } } diff --git a/tuta-sdk/rust/sdk/src/user_facade.rs b/tuta-sdk/rust/sdk/src/user_facade.rs index 8ca3331ab25b..ce140444df3b 100644 --- a/tuta-sdk/rust/sdk/src/user_facade.rs +++ b/tuta-sdk/rust/sdk/src/user_facade.rs @@ -7,7 +7,7 @@ use crate::entities::generated::sys::{GroupMembership, User}; use crate::groups::GroupType; #[cfg_attr(test, mockall_double::double)] use crate::key_cache::KeyCache; -use crate::util::Versioned; +use crate::util::{convert_version_to_u64, Versioned}; use crate::ApiCallError; use crate::GeneratedId; use base64::prelude::BASE64_STANDARD; @@ -52,7 +52,7 @@ impl UserFacade { .map_err(|e| ApiCallError::InternalSdkError { error_message: e.to_string(), })?, - user_group_membership.groupKeyVersion, + convert_version_to_u64(user_group_membership.groupKeyVersion), ); self.key_cache .set_current_user_group_key(current_user_group_key); diff --git a/tuta-sdk/rust/sdk/src/util.rs b/tuta-sdk/rust/sdk/src/util.rs index ce08a5dbc4dd..73aee59f6629 100644 --- a/tuta-sdk/rust/sdk/src/util.rs +++ b/tuta-sdk/rust/sdk/src/util.rs @@ -17,15 +17,23 @@ pub fn get_vec_reversed(vec: Vec) -> Vec { #[derive(Clone)] pub struct Versioned { pub object: T, - pub version: i64, + pub version: u64, } impl Versioned { - pub fn new(object: T, version: i64) -> Versioned { + pub fn new(object: T, version: u64) -> Versioned { Versioned { object, version } } } +pub fn convert_version_to_u64(version: i64) -> u64 { + version.try_into().expect("got an invalid version number") +} + +pub fn convert_version_to_i64(version: u64) -> i64 { + version.try_into().expect("got an invalid version number") +} + /// Alphabet for encoding/decoding a base64ext string. /// Base64ext uses another character set than base64 in order to make it sortable. /// @@ -244,4 +252,30 @@ mod test { let decoded = decode_byte_arrays::<2>(&encoded).unwrap(); assert_eq!(decoded_byte_arrays, decoded); } + + #[tokio::test] + #[should_panic] + async fn negative_version_to_u64() { + let version = -1; + convert_version_to_u64(version); + } + + #[tokio::test] + async fn good_version_to_u64() { + let version = 0; + convert_version_to_u64(version); + } + + #[tokio::test] + #[should_panic] + async fn to_large_version_to_i64() { + let version = 3 << 62; + convert_version_to_i64(version); + } + + #[tokio::test] + async fn good_version_to_i64() { + let version = 0; + convert_version_to_i64(version); + } } diff --git a/tuta-sdk/rust/sdk/src/util/test_utils.rs b/tuta-sdk/rust/sdk/src/util/test_utils.rs index e6de47850b61..fa36a988c966 100644 --- a/tuta-sdk/rust/sdk/src/util/test_utils.rs +++ b/tuta-sdk/rust/sdk/src/util/test_utils.rs @@ -33,13 +33,13 @@ pub fn generate_random_group( current_keys: Option, former_keys: Option, ) -> Group { + let group_id = GeneratedId::test_random(); Group { _format: 0, - _id: Some(GeneratedId::test_random()), + _id: Some(group_id.clone()), _ownerGroup: None, _permissions: GeneratedId::test_random(), groupInfo: IdTupleGenerated::new(GeneratedId::test_random(), GeneratedId::test_random()), - administratedGroups: None, archives: vec![ArchiveType { _id: Some(CustomId::test_random()), active: ArchiveRef { @@ -73,6 +73,9 @@ pub fn generate_random_group( pubEncSymKey: vec![1, 2, 3], recipientKeyVersion: 0, senderKeyVersion: Some(0), + senderIdentifier: Some(group_id.clone().to_string()), + senderIdentifierType: Some(PublicKeyIdentifierType::GroupId as i64), + symKeyMac: None, }), storageCounter: None, user: None, diff --git a/tuta-sdk/rust/sdk/tests/can_manipulate_remote_instances.rs b/tuta-sdk/rust/sdk/tests/can_manipulate_remote_instances.rs index fb6cc2cbad24..7b325d932359 100644 --- a/tuta-sdk/rust/sdk/tests/can_manipulate_remote_instances.rs +++ b/tuta-sdk/rust/sdk/tests/can_manipulate_remote_instances.rs @@ -45,7 +45,7 @@ async fn can_create_remote_instance() { _owner: user_group_id.clone(), _ownerGroup: Some(user_group_id), _ownerEncSessionKey: Some(_owner_enc_session_key.object), - _ownerKeyVersion: Some(_owner_enc_session_key.version), + _ownerKeyVersion: Some(_owner_enc_session_key.version as i64), _id: Some(IdTupleGenerated { list_id: user_push_identifier_list_id.clone(), element_id: Default::default(),