From d51f5bf7cec1e99780ae2bf9295a17c0d62ddd5c Mon Sep 17 00:00:00 2001 From: Jon Griffiths Date: Tue, 13 Aug 2024 21:03:00 +1200 Subject: [PATCH] tx: add support for computing an elements transaction discount As specified in ELIP 0200. The discount is computed as the difference between the actual tx weight and the weight if the tx had only non-confidential outputs, i.e. it makes confidential txs cost the same as non-confidential ones. --- include/wally.hpp | 6 ++++ include/wally_transaction.h | 14 +++++++++ src/data/elip200_vectors.json | 52 +++++++++++++++++++++++++++++++ src/swig_java/swig.i | 1 + src/test/test_elements.py | 12 +++++++ src/test/util.py | 1 + src/transaction.c | 43 +++++++++++++++++++++++++ src/wasm_package/src/functions.js | 1 + src/wasm_package/src/index.d.ts | 1 + tools/wasm_exports.sh | 1 + 10 files changed, 132 insertions(+) create mode 100644 src/data/elip200_vectors.json diff --git a/include/wally.hpp b/include/wally.hpp index 2a5bd8cf0..9479665b6 100644 --- a/include/wally.hpp +++ b/include/wally.hpp @@ -3102,6 +3102,12 @@ inline int tx_get_elements_signature_hash(const TX& tx, size_t index, const SCRI return detail::check_ret(__FUNCTION__, ret); } +template +inline int tx_get_elements_weight_discount(const TX& tx, uint32_t flags, size_t* written) { + int ret = ::wally_tx_get_elements_weight_discount(detail::get_p(tx), flags, written); + return detail::check_ret(__FUNCTION__, ret); +} + template inline int tx_is_elements(const TX& tx, size_t* written) { int ret = ::wally_tx_is_elements(detail::get_p(tx), written); diff --git a/include/wally_transaction.h b/include/wally_transaction.h index 347c4fdfa..416c0a114 100644 --- a/include/wally_transaction.h +++ b/include/wally_transaction.h @@ -873,6 +873,20 @@ WALLY_CORE_API int wally_tx_is_coinbase( size_t *written); #ifndef WALLY_ABI_NO_ELEMENTS +/** + * Calculate any applicable transaction weight discount for an Elements transaction. + * + * :param tx: The transaction to compute the weight discount for. + * :param flags: Unused, must be 0. + * :param written: Destination for the weight discount. + * + * .. note:: The discount may be 0 if the transaction has no confidential outputs. + */ +WALLY_CORE_API int wally_tx_get_elements_weight_discount( + const struct wally_tx *tx, + uint32_t flags, + size_t *written); + /** * Set issuance data on an input. * diff --git a/src/data/elip200_vectors.json b/src/data/elip200_vectors.json new file mode 100644 index 000000000..d0f102e1c --- /dev/null +++ b/src/data/elip200_vectors.json @@ -0,0 +1,52 @@ +{ + "cases": [ + { + "comment": "Transaction with 1 input and 2 outputs", + "tx": "0200000001017b85545c658d507ff56f315c77f910dd19cc9ceb7d5e1e4d3a3f8be4a91fe7440000000000fdffffff020bb6478c61c8f5f024ded219c967314685257f0ded894eaf626a00843a6ab80412091ee78237e38fb36c8be564ecd76e65f743065522f38f838367680ed7287b459103aabd97d4c8f3eac9555edfd2a709370b802335da478b6578501f72a4d100482716001455f4f701eec6059f956a40335e317a96a5e87ab5016d521c38ec1ea15734ae22b7c46064412829c0d0579f0a713d1c04ede979026f01000000000000000e00000000000000000347304402205d62bc013832eb6a631fe0285c49b7e27846e03189a245bec8f86346382282a702206c6e839b4b1d79d74662e432b724671402a6cfa2287911677c7061a3a32abe34012042c6504afda18a302bbf935f1dc646f71872a9a2fb5ed9e0cffb64588fd0d0a865a9141243397ee5e188bdcd17c9529c1382c7f8bc0fe987632102a3cd0d865794542994737e776dc3827a046c02ea2693f1d1f64315b3557bbb8b670395f72bb17521034a2e0343a515cf7d4a583d05bec3ee9fc16758cae791c10064fa92d65672d1fe68ac004301000177ce2a14a4f9e556fc846219827e1bc584caf9ef35e761dbf1f961a89b8285bde8fbe242c6984dd28719a792cd2e63535287db9a3b1fc4e4c5ae28cc5e8973d0fd4e10603300000000000000014cf45a01f0036bec883cdd4d5d8de1d7b3f2ec125733ce2e123ef3ff0085c50fd1b8cd3101c24fd8fff0bab803cda813aad9645ca6714ce768da75da09b58851585551c425e729d6faf4186a6659ea107f4ef35cc458dae565f1337af46cde218563eb3a756dc5d532717cc775fc0d04fbf4492070eb3cd9943a12fd07939d69a71090871e1ddf8fe716e2bc3f3364783cdb1d6a704325ca6c4334171563ae7bfcc9766ab848a65f47973753b2758b4404f17e54527080cfb980d1227f70cc0e77212d06aea909c7f2ac38f4a75c387464f8b70e33061f017a6fbbccf0673d08aebae2a1ce6cf9dd8c98791b1f4d653788b2ed6dd65cf9795eac568744e386d68c89d973ca079298f8d292b6bee71fad94a0f83aaf070ccfeb6c6de20baf8c6f1083dcdd539fae6ed74832100ea7c07296c0af2201523c3abf8b784ca8a235556d5bae668f17d9a353fd49dbae623ca44830a8fc4963419e49a9dc99bf87ea0414be3b43a6eab8ce54695d66887b261c08252a501d0c78d30be1ae3fc10f557f4d228ef38da496b22c5fa79d92e2c190b9d31f286dc0e3c8489fcb8e0603f8b93a6eb1ec726a7e0015e70407da186d85b290b054747276a8928443e1108cb67738d156787d20553c39fa0449f95addbf42170fdab8107d1f93fcd841964b6e6c4c140d0c4ed1463835e603f5012a4aafd5b038ceb9b4a5b7e2688cfd8c4f2bfafaf0bb5bb1aa7a7f13bd47ff3da57c4c88b741fd9ff97abc23d4047f690d59c4c67494f47125fe0f626ad409a92d72907ad0b1762b5271f474fa552d9139fcb1103db24f7a29726a5e41a6dbc43590c14a62eb1b2aa0f160134c42c6c87c696e7c42546bb72f9f531729555d01c529570553aeec70709c3a4f9aacf810d5018f776af48b93eff8e120242105c06a32e64bfc825fde488c99d5845adba2cf349717f64e488852cca73cc5813b7872f7e89d24b4bfafdf75faa368375d5bfdd8b8a7ad641703cbff131616c77e79d8f78c5fe63810781db44fb1fa5cc9387cf0de6807d1a3d5e3d8f9ec7418bbb1d4e10b1fcdb300abd8625b4e24842f1f4c4e567fe9f8c6e9d314757d4568889bccc740fb36f0270804cc11c0044093ab9586ed034cd1eb70bacdedd573750794f0286dfb91c91308e507147ea8e8534c655b931f4e68543e93c57cf2f2159e021739943e40c0dbc8a68193218d40d71e0956b00b4a01fa9c06e67ea55e0213fab48a8dfcf3a047e8c438e7c94fc195026cec82ad532e2aa5970a9fe6c03d9088d0ab45e0b9c7bf9597bd2db93ef7d7f139c291f59e03cda1a5f9a793eb7ec6d50fa9482b712500b5e5a780319769836f7053e3c5a3276a7d65467578a7fbf9079fb5c6bb1b0558acbf3cd896644d42a7b0fd87b12b571b3d8122b1c254750bf9b097d0ec5ed31f9af7db9571f706f5909f0ef2fdcdb255a0795f5c28b70fd1d25b74eb2524ae8f47756875ff439a2b2769adc844312c4ac7bde16b561e62ee3069d25718bf6c2e11ffbb83c863a51c52ff4ead581dd6b1ff0913905163683b97ecbad003a1c71469050eed5ad79e9bb44179b90b8e6b0e6a61a0ed4e919cb96c2615b61cf93905adc3e6e2a127bd661f05e928a45bc1c0599c41450dea0182043b977fcfcf3620f765d3aab13cbe684028dc78a4bd02324427379735934ab4cb821623f49e3af05391c1b7acfe8be33c9201efeded50838ff216d6744d61e8d1d600260c8f7275a46764ac9392132f0b3661e5e92e9daa87b9329d9c89353f40a130bcf8611cce25335f9f1c1208ae1bdc47d96c3f83170a7d27367a043debdfd0e43776d330d1f7a806b32c4363d1dca14715dae4f4d1c99a92673954094e61387080353974097adfde15de4009caa28d42703fdb56fcdac47bd9c5e3bad2fbf90b4a3fab4d89a9933e445ba85f759cc149101f5045a6f3a6d741424318249d96277cea3dc0c4814763d727c72a1867618ac05e5ff103b985cc6f78829bae92794680a51c4b7f7f8b88e39ddd4471890914594f3f03ae668d501732ea77b3eb1fb38b5ad9efdac8775e0995c60a3949e84d2298ea3463aaa16d5ff633da654463e90004915ccc19663c87e006fcd05e904b85b71428d79913e3afdecb7ad51a66f7dcb738d028b62b307025d524320dbe064330da5cbd70467635cf492197c7be3513363b4000bf176827011b2894d33dc9d806b2526a6e91cc1cf0582c5330484b8d48be4855c1859a5b20cab6d08d95b42b57fc709dcb637ba9c6e70b72c473af88ebe8723fe94a0d5ee5d483f19c3b2aade19bafed774b786c0d24383fe0f71c085655f4bd78cb36da83b5429576576c0718b4549efe5b8f602c543c3a8e3d86f19b70d6be1fb39b7cbbac6fcf6d80d69c00ed44dbed1b8555593bd6dcf9ddd519f9325f6faa146d4b631cc6ee418ef9d07a0036fb26a792e7733ec0b58d9f0ebba9ea9493fa026bab62f70381e534c8c3b349be651e9fd5d472b3cbf8f7e912b7030a1992df35e17f4c5aa54f1632464a7c3b0dd133da8d436205bf45d8ded924e35b366803ee52a3d1c85d9f4f976785270dafb63d2cd5052328ed2e5381e9a6e9d8409675c2a9a43c74b07e8a3df8043b2b6d42832cabfcd495b8b30727346990fbc79e436d7ba4d7035603ab98532c5497ef493511e498b1b9c5ff413e919ab6f3cd6acc472f6a39ad0a8c9677ac9a5380a6bebbaaf13a114d097efbf140acad7edecc758bb070fa0b88bb0646d3bed911414a3f10b12bf8372d66f4525f9a8a66d7bf2b5d364119a687e5f416511c27659cf70969863ed7f80e80a4f2e55bf25721e1ab415305b66bfc25b9630a265b553d3e806807f23ec1e2a5f657dbd73a4a36e95e6616faa6aefc5143ca29b0e4bc9eb1042d99c74115d96a2eec5e7fb8c3f598d4df8fa8953e96689651a705dd3f385cd27e0173baca570ce53001cdb002e4476e6af47b9a891f84f7c1c472cce3cd4a70a40c298819f6d75e6adac193798c740c9f5f57fee4df5d140cce8ee4152c17784899003dc000cd2e7c7f23e74da085b254e0843d97d147e44ab3ba12e308925fc6ab0460c7ceb107b0900cef5ff939bc3fe5640f0bb11597c561be275fc8b5b85f5e38a3c12ea26b5b7b32e407685db70d16a3ce51043d4009a647fd3656a54adcbd4d1baa6d89881973fe32faf071123de1712e85db628bdd987566b362845d0c5f818547ec2d1f7c668cae44f0bec74c6663134dd0273c3363f31901903e4e976a447af96f6f521059fb6b892a0599cf7aae457df3aed72f1f55e145332c91430a2f8184bb917d317f8d9c4b6769b9a3a0ac5baea88b39b8f7662ecc16585e7166f61a948f48e6d30c2cfd82820cccdf5e722db2156bd848ea4d13c92544d1d9064414a305215a8271631ffebf08cdf0bcbbbd939f78eafec0d7238bdb90f211d6c44589187d1a501eef7d0b6118e028afcf76ffda95a43e2211206d9d50d34c3e33a6c991952ccd73e722802a14227692f037bba585e73cb9a6cd7556f9ec2158f197a51e3884afb8e59eaa8e7ac3568d88b27b2a5ab8cd72648193ff6068e4d481c58c117e2adda564d5a49f6b992ff6f938acb283e7baf704c71861d60b263f6c6684d7544878b7aca942af8b3a70ae0def309b68fac2aed2b11ba753d7b47f7369805e5b3b9b41d22196e2cc098ece59bdf5231b03fba8adae08fee227a582490b0db34c115620c72afb6fcb507397d1333ea19e7969b729bc2733e6546d2d9f3edb08f9c74201f9ed4e3fcb446cc3fd688b1345e97b32492c9173fa71df2772bd825506ddd6447e9f9e8ece0ffb860e1c755bcf2400deef094219795d4ee84acc34dedc9a3b3adf7fc81733bc511b8edcb54769400940b53471d8e82cb82d9967a97297bdd87f165968ea046291234da176efd20889aa4c07179df83cb500b40bdb96b0c27f2bfa57353268b776740432d29f1761fee77755c7b219def785a42b683e1f70240ec45cdf660e894d4fb541d0511547c9a2c503cf605d72ea7f2abaee4e8adc222a82f4b86c34ad8b25e2932df02f0090d2dbf8817c44659b1245d5579277ad406c538914f90dbaefdd110c5ca0d63a24706cd51096ec19f819c446c9fcb55b777ae633f0257dc4d1b293e6ef68ea7867d852058212a0a9ace9442422a638f73dfb14cc4354b6481ee6591037e7287e962037d963b38a7e4ec12b30e0f6e0ee4d8c30d288e99e22e43b4c795c51d66cc4225c5cab3685b1b3a6fd3a82dfc355634b347cc4f4e55413728fb67fb9f34d3f7e4ecce3254ea843ab361b0f652faa9e54470e3e414c1bb2593e36d88109c36dfab505a16c19152fe021de608c6b3d924c981231ea9cf1cf8c93e53f0df78033e81fdb578a45b7dc4f3f0f68feedc78ec7c347f91a0464bccd58aa2fc11016e88cbaddfb22112edad752792af12fa550be3e6f15d69a6a9d547ab5381b93c58c12753b8085d9e17ed1f2519cc5cb756e3777ea9f8e49a6141460f8f6ced8d12d13d950691479e1207ed35ab71554122beb215a0fb6b34b90784f4be6bd6fbf93daf9d3bc4640bc52a662e750ce361c12c1bfa2ca4e2c784cbf70c406587b2ebd69faa7a891aca63d600247ad7dde426c1ef4e3b22a072ff8eb69c1b1cb30c605112786546c48cf1c4821b5bc0d0bd44ba83b05656b6e19a3d1a76931d983dd39efcc64298e892858e847e99519c1fa25b1998839788c5852b94202d803639d69058604374f76769670a60269dbc0688cea2d9d8672212b93ca501fbf6f7dfefad058e4bd0e0da1cff41b2f408c980f29a49b03efa9e3edef091d7df7529b6b5e8f7d43d103681cd7c38d02a431b15d539e9a3cf44dc71621664e756ad6404ba185b5e20c82760c488fde4253fb52ab850484a082e7ca275f475012be9c8d16d6b4a2c9d863440d5e113d18bbf42f128462764a99ca90af4fde890aee138fe4cbb45658eacd9d38c8a1fb4499c043cc25af87e6a650f38149ab018cc49f50bbd085e2a0ba3eeecde5764f7997748a660593191977792d7176e4c2ff0113d67b9abe8fbc10f364c6fa68e52a455aa56ff15099c6efb6b5812972380d5b8e256b0feb1190835b7d076744c1b5b738c710a07a32676a15d96583e89e39eb4ff08cf02c6e2ad540c2b66299afe01bf2e50c81465a04d229a07c58ffd25a6cd9288110045526b376548d373273e6227d117d491020fd68e366ed697a0d30a5bdff25fa9a5800aa534a3669215dfa8f30960f142a8ae7ffcb654ca60aa7dc8a586670f9db37d05644ff5f934785c5433e605f3fbd0340e168511e209a0aedd8b18f3b948eb58051136d155f53b0e2e027361330e005f83f3a72dcc5d9161dd4b1e6abd16635dc0887dcc833a1fb59c10e0b8bea2536e7acd58d5e11179d13a24dc4292624c527266351b9a48893b956ffe545c8d2c1563805addef2a82134c9c686449d83471f22c1e14601895e854a5f854230e4fb4ed4f9a7ee22e83234be6c5bb19d200c16543468f186ae11cba84ae1aeda5136f7f5b380d02ddb9cbe2c5f5bb39138fa29b2ceb549d2e337eba10171fc237473351cf8e5989c193ef0100c75778ad0c05b64b614067c9a70680c818a566c4ba5e2991eedfe165199a55b0bef1333988f2add167e268db389c2d25bd85eedff9e6851e3df84c9e41128b5a76869c086fcf9275b1d51af02e4a92b66850785319dbf004a29594e32d12ca42da69fac69f886f963409ce1d4514d1ab9e915e071887e7f316b15014d083769afea374e0771f74f632db5ed7d7352546ed686e3ee161cd263dafc2acab74a67a5721f923f9b07c647c2a04f7d1c2f831d4319a60b16ed4c995e35ccbc291ff647a382976ba5a957547b0000", + "weight": 5330, + "vsize": 1333, + "discount_weight": 1031, + "discount_vsize": 258 + }, + { + "comment": "Transaction with 1 input and 3 outputs", + "tx": "0200000001016714c80ba611a345e8b7e47bf44bedbba5df9636badb1fecf44d37918151231f00000000171600142a5ffa945facb956a0735754ef229f0a3dbc507cfeffffff030adac3008948f64d4861dd09f4a162471c147355e9207ea2a1b9d85888818ba544095808635fe317c5a2d3c8f4f4f55cc2e15bbc7412580286176b219a2423ff35f402f7b410f20603645b24853b11c92e4fc4d2fbc29538e07414f718b57a94fa7809220020ead057aea19872f24e7bc87a7c4de7801d263f61702be1b96492164937934dd80af9266dc7ba531df4900b6df9fc83520973e1f27599ce83f082d9f9e1922773d109afcffbcfeafee86caf0c03394c63deb86310219b9b1f6a91c2f34fbf984a6a50030df0e697a8436f4720bc94c31bd0ae2436a799345b86b9ef4980e4061d86aded17a91480d0f3a425716fb15f51ad2e90fd7d3a73f34b8c87016d521c38ec1ea15734ae22b7c46064412829c0d0579f0a713d1c04ede979026f010000000000000105000000000000000002483045022100e9ac5c4a9ecacab3aeaa7066b4f6963130746cd44104590917d46b228fe3c5ce02201dedaaaea863dd5ec6a6ccc5730e319b31747d1931482d747e74a904652a35ee0121026c46c654b10e15a854ded29a6dd6f7b32273cadc4cc7492d5ef0a1115491abc60043010001a96741c758c602bc4068eb3164cb6589c4333b8d36d24f79c395311f1f881ac78f08884ba4a91bd7a8be574762074b1429f9eecdb1f1a07ac5b7547456de4a5efd4e106033000000000000000147df5d01a94c3f9b75091c2f44557ea253712e2b18c4817ab849090386719db2e485008f7c325a5281a405fad38ef2169a76b5567e58fb6d69a46372e51d9b6d73475e5505930687c65ed3dd0925ec05e64d19b9e482d359ddc9b559708a2dfc4a4820d8e9d2f9149fc8ba60769657d9bb0a6aca2a48bea530e22c4f92065f90d5c5ef811b7d79d031224add43d73d6c5c94cc3d45c21421537c090815a983dcd9b989c6caeb78e0b5f1fc526b68b5bd519873f85bd1c22a987681c43911c470ad817705eb8c308bba3e0c395eeff2a3aa85102b3b41fee94e34dd88f76d324e457e0e04ff9f7d00a14e67a9daac27bae3d2c8db35728249849022c5decf7c93093dc127bcc12430952d31bef6772b2817bb7f0b9ef77c06a9f5080d645c994df87b47e9c4c7d9794c2b9c5574e84be85be716bfcca298821ad1dbe794c2656b98b1326b29a2831cf99445caf48944bd6d728316817b5914653ec441ed4e4ecf5f5ec65fd2fbb4044541f9c719ad227c3b7705df1815f97003082a5374165b1e388073884c7e30da5ff40e88a84f9fc0aa678c896447ebf5ad3d7921d988184e66447951d9d9bfb182d2c36c7f02b65f8e265625bee3b0cc9e7208bb9605aec95e83b87e6a75ed7cee206cc323945c3979f74a317ce093b8284a22afa3bc612ad158c304daeb4d68fc9e08b83ea61ebdc49d47465756444f81e64b556833b433a9cd8c6e521aa2acd91e250b2b78f1bff1a9c246f4b8bd0a1c5af58ec877152fd7f5ca98150ea72c2e15f57fa0b80f472ab40b403e52ab5989f24288b968e808a07fd2942b1e1aba6e40ec8ca8ae8ebcf8d180cc481f8d563f6ec94b29e738b99ea9253c3e3aa4056647e0fdcd1dfbe22445044cfe4ac6c326d48dd440a35f4339b5b129fe40c2223afdc62f0aaa6bc9cc8f5a72e0c2ad94bcac54fd51f220c0352ab8fa56d54f49137c96437678dc1828ee5c0dd20ceb47d4637545b1665fb5b8382dabaf94a3a4e4103038fb06dd4bbc704f9a315800d07e93eeaecc0cfe13a0850e9de8c011c77b855dc7a35dd39c2ca1351607a36fe31451912ee0ce6b7d414de065b4353c333372fbf1682634e6c04e70996c4ffc12a471db9b81c948a16a79431fb5e3d9163e20cac91d0fa3f7d0a21ffbadf4cb5209b9e80e30d7da4b2ace05a3d12885c6e6d405fab48383a8fba96c58f9012b8aae42de29282b2fd05232d0c88646e3846d7c1281538dc67fe753483d6046ba966d03bc5dca62771117bd5a24fb5805dea7289069d823684fd238ff9ac8bfc88ad49e013ed3b368355ddd6b24c3028d9f0b27f90114c19c4c028d96c5ef9f364c077c629d02c7e19abab38e9b172f2524e436b826d22e91184420fd605aa17aa6076a411acd84f4f45766764af85741133e46610530b5a344e06ca8aae0530837dd1414cde35b49cdca86c9755363fabfe8a6b7ed213c5e1c237d6f50c7b5179c1f163bfed29235ba02312fe4390fbad2ac3db13051d957b86990747118d8ee82d29d6334658e534916389b448c1fe157704b30706a55f365347fefb8ff4240c1bfb26659e42dc92479256884479899573142c0f5fca3fc43ec5c8c437233a251ab735b815ea02d66e92dff42842e561e87e0f7265ccbd63e4e2854f7e3e796ed3d30410f259da52c39c0bd49dc3f0bb4d0af5a10d02c2128bbb9eb055646295b5391a3d3ae384d93f2d44827c60a98aac59afc15dd4b53c65d991207f32f102f553db1002123bb0ca73a7673a604eab9661932b687051d6873762083d1c520ee752d0eea972cb77077150dcb5cda905361ef5442b9f7f95380c42e9a69108f9ba4e761d596c2592587fd560e1232965e78ae004ee0a39d23d7535d60b1d426b34f010d8471816cad974af335a37cb738b1666aae00d5ff32c520726d989f7bcd8a66c6f2b8ebdb443e9082358fa9970bb8e599cebbf374c2daeb9dd966d98ffc930b1a58c812bafce12ce8674b3b5d28245060f53375f843b0dd0f4b559451e779bbae2f17348a9a53a4127da68180e72458a9534594f3470229b4b10dec83f17b389796f1e994842320faa41bde43e87b2448104e904ce9aaa8ae07a9101118f9fc6be12d475494e3e3b9d7bf29f38edc6b0ecc63c699bcf686eb89e1de501bd6687daeec6393993b7ace06a8cdbe2e0c70dcfcd793f407324111dd5b264229e6ebecb16a99ae41ae38154336cf2fd3f4f179d67accf0cd66f5a954746d86aca1ead9d2493bb18b0cf8f07b362e9fc1e8200ef7b2d26e1f37267589c0a4eda8e7613eb89c3d40789889bd8ef241ef3d0e971510768f0b99a31b4f1ba814dd633f5a046f214c0d87b93669165463593b2f7427ae2ca5f4acb77a35b881c2e18bf092607cd4e509cbb08e1a1704725c7d66cd2a80dfb8d28c9cde26d76b5ca4036a4083f0656a7f606978c2a1c9e92e67954cbceb9a61de421967589b1b2aaaf9ac6983d856fcaa4a38e468233194be9de495661fba53268acc8db686c6920e3e6a5b34528810bbdc786b1baca42b2d1c04263b5a46464810174aff683949597c63726f0d93a0809c122807f624f4b263a7e1dcc433db4c5a811b420f8882a026ec183fe3def024fad5fa159cca5a233284ac78045afe762c0d5fb520f384e0b59472195b5476922ab78b025aca0b31d0c5828bc9182e16fd977f2b23f8eecd2008369c567867053d0a33a3c2c8ea8bbf9aa6b2c0ec861c3141b8ee2d9064e3064d2daac2127149110bcec2e7477b391e049099bb2e3d334e1fce6f9b71f0f0292d8a5506a42e849a226d3b57f0677eea21ee104b3d346c023b8a13d144d6c88912b10cb954007cf564b29d7e126e50061450be650f94352f21e4fec787ea4d2f55fca13989caea2da7a1acc9419199a7c3a5db88ac1f0abf6b81efb5e5249a9905584193084ad42a2ab071831d0a5abf3c41f6cbbb7bdb20e3799857b1bd0b73db43c87a9ca7b331c2ee5ae8481d6709f879b91d4062e0f028ceedcae7dd13bd935eaf44a65c97a7bbbed7e04363ccd19ea2906992165c2611591764708c8d4386101bd53e4cc0197f678690d3291099db149fb58291280726731f0124d811a9d648486eb5d388ec1733b6c3a9b9ca9c22a77df1e606d59d083692cedbe8349ceb96b588b28d0f83c2c60066c08156796ffdab521763061a7c3bbfd9c1b4cf18a3bbe6e6b1120449ce9827642c820a3be2bd3f9d7b5a8fe466dcab42394e0efa387a7919baecfe7d260beeeb55c9b32fd9050cddb7214bc8f851a9d32b4f7ba91256ce4bdb596edad5276bb28162ed6d0ea62231b51b6977d3fc330570011b815b9953ecf61a49a5f0a1858d18ae2b069b548124733f4bdd20cf79afd33bf6083ce40745019a14605e24e67b27e35354e6557ce691610d3b5512a63405caf26a4eb59193900ab4a607f5970babd84acf9652002f14983e74c32c87377dd21da7854f044ffce21b3cfc2da2d3267db1f87051e873c7b68eb829af4a36f2d7822faab8779129dc5a813c38319d21b9bc7d6fb05b61f942fe9b08d26be4ac3f06da8b0e5bf1fdf8e18bbecc7810d2d9972b2f0e418b39ba3ddeece82d344da68e7bf78bb705fe34feda8337bc03258b20f01bff100adcadab12f5153c894b4642cd91749e692d7fe33250f369822cd427742c33b51001bc9bb80b3b2d2d920e8ba5bf3d42656bb65c23e9d918e67c1201e359797cf6eedeb91290b6a4fe8e70f88c8d0a478f2c7b0ea3d8391c288da0fc4f221ab4bf892dec3eb3c089970ea5a8e835721826dde07ac3af4288b35a6ae0255eb15c5b0f9e7d37edff6dbc47042cb8d62572eeafa5e9b56f2d8b73ff0f6fefbe1eafd99499f9dfabe0a127f95ff8439b1e0580be6a85ce65404c8dfb7cda89e8fa94070bed47e11fb8be0155e2d38b75745ef779137423374b0f0a0fd96d21952b9b20b2c63de8b8485be0aa08ef65c0fdd818ea74da982a85e8cbf845661ee6416d458a8c195978581d1de5fce070c10c0ced336212a30bf34d16945aab1b0068cdbaba40fc5cd26b9fa58098ee3966403c46fde00c2b07785d4bf85ecdb92ff3254944e775f8b185485d5407a8ca0811efb2ae4cdaa9509d850ea23f89106c0a901f4d6500c136694480356629a24f2cbe9a00b00a8df2187675f489df22c27c43e4484da560daedacbddf39aee457ca134bcf3e6b4b98ce1b613fe4261f3623d628f13804c55a40a38fc98d6f8febb361d56d9dead285b167a9acfec02c4ba9d4852da433a093cb54db17b1cc5965349278aaed8a6d06ca1a91d5cee0906a87eb37fe2fbc65820bf2426a712575ab943699204f10f37a40731e81538ca8b5472c164496a097c0abab1d108c4ce94b1f57f75582fb05248bc27e3fd883b6a8e4607fa20d857307c5b64f914c884355c36518e6ea2958470bd0f97e1bf1107d39c7ad22169349a84de024214d130af555ab3ab83c35d10787a405a31b5451b0d9fb6afd87620da7baa089d552185e164f44edde0555b0cdb31bc87dcae6236e34abf35729a930fcd48fe6aaa2fada35e62757e92e7a85b0938b1b994d498787a2cb2ca70224a64847d91d56ec17ef57750d3a859d4821639463327c09421c4fdbf18132e8eba8df31e8b9b4a01a43eddef90d87d5ae49bec54b0fd15ba861b7da008cbec064ba5a925b9086f12051bde436958878844841cb59eee9ba08ea5499de012895f298bef7d858fff8c1c58ce918f597b194dbb797e88b23d6d33b600d5a53adc59cb43624e37b40bdb7f13dbd94fa75518241ec27825ab977af108343d22217e4f19d319a97cfe2d0b2c9dfd28ff4f58e90ef8b79c33dd80c5fea5b4d8575c912c533aa866b4a84c6096534a99bc29a2bfc220d53d9c9b7541438c75ea563bb2af4494eaac363d543290a1d6f00d61302fc8eccb37bb942e0cff7c064db71d67cbfc8496be102cad007a7315ba6a6e1ab4a7125dceb0a781fa394e0d97bcfcc2e7f628f552084fa72a7957c4f4757efa8929c91e06b1252481bdc5dc6d5ac426d4ce8fbac6e390edaf289d46af2c1ee47eda7aa12312d94f8680c94a2b0c0da6cb4baf2e24c97e38568b3b611170181c4f7bd18ae92660897557cb0792552795150121ee4c69fadeeda7fdb6f34f171a5966b796371c9e77d888cb5624d7b8e736a16b3921e1a37f5dd5306ee6653731b6aed660f28d73bb0d07201fbcd20f78a867c42590ae86a435344a66309c2fc4915440b721c0a38c689e36f907d48cc3c7d9af57373b1087bf44ff2194ca1156ba1c97529849aec70c3bbbaf0b5c49fab7193fe15da3652675a8017d75c4d3bd12bf095d3444601eb564a9888433acdd893a42777cb3973d4874d4f2ac329c6373855ac7857ab1c683993c161f8be3269076ec4d4b1d434863a04807e1766d7c101c2593960508b4f5946b4b38ad05cc2b7f2194407349b46c2654c26cfb2116f81f873f65455ad0fed95bedc4297634663beefd5cb0fb666ba605d219abe226606cce518ab0f8cd8a703f3779127f8bce34bcc10410492245002f89426811a49752b653f3ca234aa2787114f6a107df312ee507e78e449ffd994d084e2413693fb48c95517ae7c16c393911c411d8f6b17f9805cab5947fdbbb0feeaa5dddcb005c74db03fcb52c726766028d509d135dc5bbecd0fdfe5f6bdaaf14f3af492c9686101c783fe8f2a82fd745a37e6939b2b54b0fcd6e80c9d178bbae73dead7efdf8f7e31367b36cb5b595faa62d3c057ec95aa92d5c7e943a527272f584fe1c4921db8e2740df6595647b6f986fee6ed0a30202fe24e65eb6a6b797fb222f2ebe878f7aa4378b119058006856c23e6856aba48b58460c30c0a5edab21a85041f10b552e3745143010001d7ce7cb6f8d1fc252b88732ef58d1df5413e7007d8713fc1c6b5039b8e0c8ff694089a9228b2552e47b8b187b84bf6242fe26b4107aadc2e049aefb8715bc95cfd4e1060330000000000000001f9bbbe010e89bb2c4dac2ebdebae56794540f76806ea1349aa76a66fd702a7f4b4b92cbd9f2e9bc62f2346c59af41242633c396830de1758d0e03939c1126c1dbeff9fe4a90157bd772a4ce87e1d8810c1e0f7ee4ff6d8d0ce6eb2a9d3b5e871e2f8176b4fe181d89098b707cbcf14d8a467258f50832db978be26e5135d14a22400b3b7277b9729be616be67be6cae4fad9849c22764f9d3a39c45ddb03a7e95f36d5a9d837c482ea32bc845ff8e1a807625e7b73e3bb38424c17ac501317936c4f3b809b6c5353ad397318b8f8400d4f208e2405d92dc77afe00d0a888f6a6b971aa430d9a11d706322c142cb325b09bd7f41182b05b661b8608dbff4ff5f4497ea856c5116964c364b0553b342fb9f0be2e996d815a0d16b9d0b3bf0bdfca3262753d85f88cf37c9b7cb86ed1d69251814441de5df1cf37741634c75a3132da99f8bf143028b05eddcdf2dffcf4f0627acdbbc138c388f79eb1f06e5f491b3ebbc7c289bd308d3bd623897e3e0ed49c1001c92b772a756d28733d7b28942bb9a41dd47614cc8497532f9b546e972babf9f579deefdc003254fd971bad54b9c87fb4fbaffee688b40ef4bc9742e24b9bb61e2084798e87f9e008aa7bcd9400e070293d7506a9185320617853c09149aee3d992d55255e1f1bcef765426f08008ae66921e791084df0721af1c45f69883a6689b4c5a98300df99972046b0007c462663fb57eb4ef64c5dd26621cf34b1e7618386b4c87153815781360870e5e1ca64f773f3f3aa9cd6d915b27654c373de5cb1cb4676dde04d73dd85a43f2f515912c82e42738a2be544a89fb24633998586972a7f530bca3ce898166dc6c28c80cfe2ad7d39a582265d252bfca25995ab3abaef335cc0c5f2487656974e34cddf7a9a6f1ede3ebd950c77fab95937db8fc1001b2e3f02fa82dca79d32f0257be92192c9f1ba8ca4fda92461c6c7263d464d5184c06069ba6db6b042b3b6402b56f22083fd6e128f41a44bf6f6e23261e876bf9673edf147d7759ff9a96e43e70a7f4c9cc60ccdc26bb8041b2c203e4a47131d72eb2ec50d1dfdcd980c0a51fdbff1d58034686aa233b3b3d69e242bd97da453aa02ffcfa294f49a4b8ced98bae0048198bc1aecd192b508fad423055941de337b0b6a82b4e4fcad6f8207d1387d591cd187c5cea2c56bdd3aec6133e64ae7466fac6b55f2e7e8cb607e52d792a88feb0ad8478d63a91326e9ac84492b8923730dcd0d8f992d070e38fa6de5ea93250319ca944bd8c5f20a49d346ac033487378d45ad4e33bae4f33cfc77b66dfac5511b48aafe5589cced44d38f10baca4336c94f58a17a4a73a6e2bf753079d6d455abda49e25537aad5f519677d76ba8ddb4543602688a366d27a1ed8f5e440acc43b760ebc41f9741fa5ac82e01938fe4adaa3ea701dbb20c2041ca64ce36e0df480563e79da59da60d78fb3cef8080ea70616356b8cf672d5733f553dc53081ca892da7199626f8f09c1454a3cb2adb118e3b5ca913a32772451e8e43a279842ea086ac2d6e357e3d015912d31131ffd2b1e6658729e0f35465c7a3a5ddca9123e7ca11938a666bbe020ae9c61b9f6f99f2a30ff0bca8005979937acd37c50ca92ae944b16ea1862347fa20654c3b4bb101dbad9017b933f74aba60de4197abcf3cb51ee25a9d7bab89fb0b960fb83a9daf92026cdca4eaecdefda20839d6bcbd189253d6723a771a803ff02657edfbe95eaf5296c1e769225f81d923bb2845dc3d88c9b1dbef0e32fca748f0163f3c479e24a8611733fd9cdc869802c65eb3a0e67d2a3d4edeb4ed0e589d6ddbfc4dabde817bcae78970d22a0ce406a980bbd8d79d0d124b64db7f6d5417cf07e830f1e077a2b1f472a7cf72a8319c96d6741ae439f17fd1ad2768c19fb63aa44fb04292389182d5647c45316e890826bda82662458b98b463da5877a216be043af6904220c4ec04ad6182bafe2b85df717b79ca1d8eb77b8789b3cf7ac88d0bfbe524d239da519fd089de92c2002ff5e1fb5ed60bce5768d8fc15e6eb1daa00285971103e0cb64b17a899a8092f2e4fba083807a48e8636be5b635ca6282e2cba851c1331b05e64be368321e4865ec1638a73d6ad4e80bd3479864624ba9228285ad5ff642b049b0a7c6ab89c2cad10ddd5bcd6e40261eb5267762358b862314cefcf6ed799f687d25b44a1465f3ae8e5e646bdb139db73bc542a4b72a9c11e841e59358de0aaeca7b4a2811dab0d6d8b3c507270d1c7cad2f89cbbe5a52bf1e72ce5d8a58550aa3b79c37b47986ac28f7da1fbb9048c30a96a2fa842e043999c9f756049e4e592367cd5f62b44161501b93282d8d10b2494958bbff98f4bbac18b9f0e6d11725dedb360565fc655c4d955fbf364a9ee0b5d771011bab931b0651900d18a16362377d75f1acdf8073913d5e841860d14820e99299cac4423a1bf6d592b95c6816d8ac55e6c191deb0a69dc1cfe54e188cfc4a1d258c2e88e644a91142c7f211adaa666c04ccbe58fac9d845b1a91453f066dab43695cf018bc4a6269c5428dc3e2e9514cd0b8c179bb21ed62496ea01f6003198d4ffd3ceef59b25ba462e3f0b782bddcad07c029eec707398b20853e695c99e69e7be96e3de4f771d2a3fcc4525ac6d5214fcc60939f8d6a6d7a8842aefecc064ac400c581a0d863655998b42260e52a00d3ee8faf34fadf0f9b7bfdca07c5d3f1e062007537cac635dd0360cab09fdd42ffb7329384989d70de128667e5ab54b61b302690661770149184c1f2c8897aa9e70185bccc9378d49c9b3b394d8239f01a60d0a7055cee64d4b284991d791ea691b7d57c68208920173da8965a9ee518267c8e2a287de61849af9e4752a7d9fdec144ed2cd0b2aa473b775b8ef7b66179248f1c96d48d58ab0f7cdd1a4654ce2086c35af5cf33f1f8b5c8f9e2bfbee0220bf9f0c168bfb0668e12b5dff52a7de766a139593e03ecc82245712965255dda69e0622fc66f84b503e96b0b0fada0fcd32b81cff21f0743ad7b345f20902c3c5832e7bd2333e6097eaef995006b580f5f94244b7f068296b4ec77e2c2fbdc0073afc8bd01c0148c6758347a2b67daee28d53ecd9b875ddffee7fa2d0dbf5ac4ca6e8ecdc64ac7a64b216fb0b7e4b484c8a08c6d19e37ec249478e2fa752505b6bb189ed56f75c49e679506f91dcbab0ee3b08abbd3cabee59dd2a401523674164fb78b4bdc6c73065b8989e18835566c8eb43b629a5b8ed9d416aa7441855caa42beec8e5f0222f6ad13a92e3f6f98256f2e4476db83051ae35a35cef1967d121ce15379be1565a647be720378d7c44c29c7dc112f31a35ade12e14b58784c6edfb5706cbd1d281c5a967a9084aaa23171ff2d41314fea8d1f719c075dac8ad4462f7c75249fed9d1cf58ad19c2e7a634e387f42c745ae2e86f312b6f07db552a3edd69e46506df9436364b30c7eefd550a72d6f0ad67d8d4591e534c205a6dae42bbaf175c6df74dbbda47e60d3bd86714cc8a9053161dde969d4718b4986ec4dc666a321955aa8578a05877c5e43a8c40e19563fc1eafad08bb1a81e1185a0acf3b42d7b737e2a91de6d529631503f9a32a57ae86577dee07f5d2c39861f84a6cd9413f6164dcf2d0928fe99634c7b1f5659228b40bfde2942c23b3b5e3c467251a86bb6b058b93f86e62bdd80fa5e47287e0ae4f4906050623a4a9eba16e8944c87a20da858466a23d7480204a65fd109309a7cd3dedfab4635d69e78b12276b4d9b8aa324a8d62a8e3ab7d8ff6157369400170b06dee6cb976a0205d689b13520d181432e375ddfcdcd5164ab42aa38f0405d113b8659b7fbbc8b2855123cfbfca8c1cf4bae5eaa90561ff852ed5516f7b809eae77ba69057fd395322cdd36b091fc877d17a0c7cf6d632bdec0bc3750ae7c931f2585824613876555246c9f2437c785c7b872e958f5642ec25715a8f42087bd89b17f80bdcfdc57ee07986b3562c46e85be2721af764815e4a95f9b9a8ddc69749d39fa0de94bc3a93a53c5350830b1c234353c8daa0bca7cb5de404ee8af71e733b13b7fb82e334499047c3ce78b367216c6979c1d1c9eea242bbbbd1d6916a5e839c6885424cf391abd1516237c4a63f93ef93af62fbdf898724f01f8434f3f2281b5b935e1225f0b4d4f76b0d1bab5dec50bc69d1087553e909f665a65202da3747d454fc709a26ada8b913dc539ae5171e65b42c2288f6f1d9d77073f21719b1847a0e8ff6b13955cab941a497a4921a803ca8b2d2c9e33b46c4b466a7f161ab93d08dc200600c4d21db8cea3b43feebeeb73ca40a3999603f9c9d3ad46d37f0fbe75a8da2d0b1a45d9de3bfc865cd54660609ceb61d5a06b3e4997618f140e170540856caedb34dd30819760ac2e67466716da08ef0a53e147021c4450d39b9e407cf2fc9d71e2b89808d726265872a9a9a1e0397f5999e4e0b31d3f061d729270af4f67590c983757239dbaa08cae43989f05d419884829d48a68924fc7dffab41d61b7f619fc8d41a25e3eac9b6f8412cec89bec9844d11787c6cc4a4728e7fabf781764d56efbe8827f88cf290b4f6c1ff9e363175eafd37aa25fdfd4af4d9cb045bfa059ad6479a44522cf77b8549f7a7ec357f4193a9f5dff887fc5615e9501fe50abd4eba59e45df7c56c794792db1cd56527e13846e3a0a38400ebe4ae2afe755a72b9efa766ebd9bd9d230f9f5568d778649768807047f69146fa45c357f2a99672a656b5ad456dee255ef0c439893f12cdbef2aced2f5d2aed8ab7dd3ba257f5bf338014b8189fcb5b16ddd4ac34f4f6066b1e53f6f78b85d2541d861327f6724126ec9b9c980a708ec55dc17256f390fa90472ecdea76fa4ee948dbb4431faf18b686a27f1e5f4fd84eb287403a30456bb3279c041914dbbe03568646d576088ba934ed6e207ceb86f33d91180980e41e5e89d6840b8d54111b623392a06fd8af5242dd0a886f1a94a2d5a0b8a6a503d34009de3a262478680d0103ec3865d11fae2ec78ca45a14c9d05d3628e031f003b4915af66e5e9118e64681cb9ecae5387379a30ddfadc7ee51c00aca83c17a89419c78cb28b542c70663ebcca10414c91f73958007083c7b8bd3139cd18158f663acd558ac93ebffe9c665eb08aa3c5fb9f4c9bd2d731529be346abdc2deb7aeff08dbe8745be03fdfa3aa94c99a7975d334ce6a1468271530d9654c39d66d51451d14a56fbb43f4fa9bc9e517e77a1e529ac970f01bef7e79b76ae1e277cac98b26e93a5cde84ba7b127d5c4408d0191cf3f0d9dafe342bfbadcc3466cadd23af71ae99d56b0990c8896773829c807482ee8428d34e703e77b49e37a1daf22a493a00bdd7d2ca8bbb137ce8c09f4199d031f6b65978bff8ca44ca332443d7463f813ac9ddfb326b9ee652c6036e64236e7228e759193ef0f5408ffdd0ffe480b7eeaa54396b0f13736f47a122684a7c0ec99ee5f079fe0cf0d2df4e2de764a444de4dda010818bfdc199b51a5b6161dcd2a2957ed3929d3b59f0f7ac3c40dc688a861841bca3636d055de3fc509781a065b7071ce817460ede7bf2927031fc32589b94e9cca1abf7f9c822b81b64d9ca420ff125c49f7482f4c9e03e7bddd3ab9db6f15f244a3b820ba041cf0f1d54e6aef3cb48e29a65a2b6d13c4e79e78da0cbad083f09780fa303fac904a1264f8b3056fc09e257e21093dfc19b7d1a19105737451dc46bbbd0e48dfffa169380a30490a36c0a7393018f10cc2069e29689ee6f915fcd2ba63b405154b644f07e621afffc82557fb93e42900f549c01c124f5f5f2dfa5d09a5723ebf7c1ccaf684637295f102bb515c56679fb08dc3e1064683c6861a6842b43310000", + "weight": 10107, + "vsize": 2527, + "discount_weight": 1509, + "discount_vsize": 378 + }, + { + "comment": "Transaction with 2 inputs and 3 outputs", + "tx": "02000000010217f9ab321eeb3d20b3b4b77eab7ec8f82d7d934fca10623ad196c0d83ebf60b101000000171600140ec5c2bf1b6634baf5b248914dc771e925880861feffffff7dfb36ded4ca0b60ae010fef55041eb509b8bc2fb51f07ce11c9b64496c083fc0100000017160014f8e14524ce60a8a99c81af3cb198d850e987348afeffffff030b152e0211ffe01e5b71dc5724478b08d445e6c829cf1c869990b3476325ee0fec0911b724d78f2574615f38907efa9c33fa67ceb4cafdf2758c814e9ea69d12ccd503b082f3a6142ff3511f864e6e642532bbe6c95aa625411d42353c68c57659385a2200204d0fee512268b43486d5272695c561e5167e69294adb7fe318aa0ebb1ca98cf90add47e23aebc7fcaee45037be66d78be437e32813ddddc36766a1f7124ed5c314097bfb90ebae90d09023665d18111f70340aa5140882d553950121fba0090ccdad03ed1978d03af6fae91fde04d8d059b9ab4e39759cd7aae98c7794255c8960128317a914adfafed6b72fa2f433ca8063e45405438b5db95387016d521c38ec1ea15734ae22b7c46064412829c0d0579f0a713d1c04ede979026f01000000000000010e0000000000000000024730440220676794814f2fdee485d9510d3ece5566121002324a78f51db01d9eedb6b00a6902205aa904208d446d1cb3b324a60e9e5b06e1ffaec95dfc0b4c895dacccdcc086400121033f676428bffbdee2e9873e63b70b25192347b46da1e2e180ae669070e612bb0d0000000247304402204515f6d25efb8c9ea7281ac05cd01b23a0f35bfa83f2a9e443d2a7f688c76c1602203d786eb3ab4660414d72f1a8c60e6d2647108083781123654e5e190a8a73c3ed012102ff0d4be4c160982a304d98d1291732fe4ea6e3c5b8c8a0749a4d96cc446609cd0063020003fb25acce8790284a99bb80b3b2d3c07c8da7e51507b3817e3ce096ef6fd1f2b2913c7eb8b8af213992b176761d45bae0649a1ac145642ff3eff2bca99b0350a0ae33dd1915034f623a854dd66af2c88b0829d4128c37d526029e1348d4b892a1fd4e1060330000000000000001be05e100436e95d933ad51f847bf5556a648ae350820f8b30bed804adf84b2daf20bdcff9085c236208307d852064178a29bc2b633d5abbb30f1bf7f090ded4ef8895a817cfefe89661025903a94ee81befeb2401031d55849e66246922fb87692f6d0b147486c5d5b5c9139422ce5ca91c1569174f1845023415f9f66fd50bfbc9ebaeac40d89c49acaa26099d69f56e947badd3136b73d1a93871fb2913abaf810336a4a5ab481f3c5f98fcb7e14c7ee76391644323948258b50bc755e0158c3e867946deb044230df9a432b3b10d4f927adf055b10f45244a585c57990db8478de9a1ff8523a7987f8f5ca06c4f5b2462dcda977f60ed43595da10bb68b2d1d85a41e13dcad7a30762074286bc171a48f819996bc191a053dfa218e231ab7b0aeb4a1650108dfb2d81fa92e7d4a0195bc4450af9c13891903552a516580e02be6d4b1843712556dd50197bacf0d747df57d98b74987a78269b6f66b0f21684f15fce000cddfaaea5f45a0b56b40c26d413c68c42f181ead3db800038dffcac0b09607678ccd4cef5c2074e1df6a132af37148400aa4223c37c90bb8913e52bb6d72a27f45e209cb25a1ae79373bbdc4ad2ec4ee37dbce708124a5a1c2b2fc1d184976e7d46aa34344bc9f1634d04b454f5dd12be747674ec2560a178db30705a72ee82877f9f911cf4d7a46f4cdac8f1735670897add82386400c02984dc55533041eb3983fcb89acb7c2f44c37f266135756df3e7edc24550a351ac51e95663a79af6043a5a7089beede61540331b8cf36149a076c6a5cc097ae3c535c52cafdb600a991bbfe5f560bd31b2cc274ccb52662cd5e0d1e03ef597d3d753875f7fdb493838603c88a44e1002689c7623a15bbfc9b8c7ecb6be1c524caebea69d3ad864667e5e70e1acf13bb18b7b02d4db294131c49e5296856e3549a141e738afe4945584378f34d95cbccff1b3b74ce9608be2bcfb24e7460d88de57be0ff5239554effd9e47c38bb7b58edca6ce7f8df68303f97473bf521aec54cf323fd7fc2086dd399356d49d4163e612ee4f2cb89a5967cb5fff0ba094b58b04004ceff2e673c92f77efdcb86c49c746d5651a5604b9f4ae4d7290d2268efb49eb836524dbc22405a5e93411a8e72f69337ee8e7bfea3f17e4cc91d3e0b8b9d3eedbdeb4f381954ce2f882995f3e999eedd666a0df1cf7026ed74844f211c5763124d9dcde085fe3ee83ca4d7954020a0ced700d52dc6fc7cb9642b8cca330d7f360a822361d03868fc83cf380d618b268d5b74a3845bc7ea1c526a4012ba133319d5c6f1ba26c12a6da04202f8cdc4131875453cae87b0cd57316b84b5ad7641a8146a6074a3b9427826436c7f0904c8c0dcfc87bfa384da2bc7ad8b96091eaa5ce7c6dba9cc665c53b376f7f42db2126df88e07d747606b7b8f31c7fb5a4fb480e4e7635e212efe0df716e2b3108ffc27e1c48a604e7c9bdc3d118cc15b3ad236def1fe5db5e0e4caf1cb3e92421cd8011ca7b81a9c302d0ab1fee9033cc9b1478d6a9cc9a85d5449215eeb5a74b137ac2aa32498a712aef4adbcac4c90979682ecd856d4a5b8a49c6e36f9098dac5b34884226b5a38c31166f300b5767c0c5f495c055958c4f7852d947597c56594ccb74c68f06a3fefb92d66b8be038b1de56c0fb0e171db4bec78236f4ca3107c7830db2c3c18363cc5a4007a869b937324ad7defbf851bc6f42c60503a6d5e6b1c505072a4b280c24b264ab91a477dfb3c240e39171e505c7b0b8ee7b8047a08e47fc190a8437e20273443888817139c35362545855a68302bb5c9707926bb20c1817c52def878d32f1aa66cf58829d0b499fa98ecf2a993b27e5405fc8491ec2aa12cdd48c2e292889c5c9f11b311556ee5bddb6b29d31b1bd3a8b644971e0e06a40402229d2fbb52181f2c7829068e53a6b79db03cf48cba1f1f4be27ece8f4a5c03721249f0515447e2fd1d3c75350ce130fba2fcea3f07e40cbdb8dd3ac73bc388997dbdb45febe162bed18bca79ee89464470016eac4a27d73cbb71c63dbe3d1b01396ecc64f1f366a4f81a443dd9357299630a2ccddcedd4d2baac65879bec9b7edacfc8bcab0e77ab84a6c4b7ff59edc4ad54b5ac12d7d3a7b6fdd46d178dd93c843b7256592f72451cbeaac4271b3a971ba1d36f460b7698d0fb3d005ad2ef380396e0f284887a96ea868b9de1eb1502e38a650d343944b17cb26928b03a44e5d1af76e99b57f9ac4fe64a60499844ea4abde87e2e245f17eac1ee0f1c8207cf4001418b1228171084f5e81f2ab29b622075b09e15c06ad6797c2e4db07b9e92821cbd3be27f9c7ec77976b28cdab7a2a6fb5ff1047e293377df93011f0afb6639742f953df61a8c83ca4ab5dd0c934d74548ae77c9d59fd5beceb9b3d09857b669ebc5080bfaa8a0c6065310330963c139dcf605caf506b3d1aaf0cc4ba51f458c4ae8e59e0b46b8e82ff5f30c6f68a0815b1dbba2c116c2a7a109bb34514cd1dfdf03f6b40ee9734444023d67c66672e62161e5fd33bc652b021d7d69712e13322dcd1af690e4229f549fbed1e700e84124636b9eb7cbce7e3e8558aa901387f7bee550e16615e0c851d8c01930855c05256d89ccf366966686eb8f33756e3b29a9fc831cba20bf6e2299cb81124504f971a9ba3a9bc5747266dbe24c8a9449cfeb44b4608f80bad7a95387e7dec0059133818bdc48fb59e7fd275d445168bef3e2400a4a63bb542fbd1f601aaf74317716e3abdb9eb5c309d6296afc42789363973ac4a60a77c10a23d27352fb2018f19e74b1fc6ffca667c7fafadf52145980f39965caea0da883aa7848e8feae047204bfffe271685bc87ef15793aa1b65b179874ca9d4851a36cddd77e54245a10df23813f4381d4d3f079e59a7697b3c64cc8160ee63c050487bb83a42ff62624ecf02d22f7e39c9f7996e446923c7a6b4490bde4e7788ef5b1566f2cd96330bdba53e156d123321d6675b93994882143751c4f4092bfa3086cff66945cbfa8e2cafb1079790635fb055179f65b5a7c704d4844dd7f0d98a4a6481be8575a20ee4868e4f152f1013344396068f1515e8ca0ea92af11ef2267a0b15c4f26722d80ca404f014b5eac9f9a54f697fe5315a6282039ce6f14834fe6d1b7f9f3ab00df9a255c97c4db76cecc4652f711e9fba9d4194837b0c7f6daac6ce08ecef21b1fed92e6e6774073d5dd03cc42be5e401282096c3e761a83e982b2341ab79d3594cefb8196b58e2c36adc3976366b9bdc95dce90d699fa28a892f0abadc7abd8641ff4f176bd5a1660934d1a5e61765c7cd5783e3f4778772de4e681144b38116bd5b7ab98dd61f16f52abd5dbdc00197c193f416091ab84f48fa1950f9b30dd8ecf8ceab076c5b9ffdd271da649a81a4fd04609dfebd35583010fe4308825dde651c6722a5fbe709c08032f50254f95ff6b75d9966bbbedbc47abd9a00ce5afed301f918657702f6f096a5d6eddce794c35b3c1ecc7c32e2cc99d33fc60b399459596b204f714d229e0b2f518282e1141bbc853471b7556daf30ead21dd6ddfa10ecf47a0ca8cbdfe8818e74b3006b8b076d167dd958d0f411b79872e285498a50524b2a3046312c1ef86cbd1e3c0bec0a5203567c7469b9e42b2ca000e0f875cbb8cbb1fcd5aeea25a57710ab1e9e03d02e1600a0479702b39ab88cc850ea7cd260ebd8df9911877708a70397eda2754a84e75ff2df8d3c7db615091d213a96ac55884892f0614ae6640e70eaaa446739183b2b7f7f8551550b1aef6f42d9cf5e484fae611c6e2b5343c29dd7c002e8859c11db0c2c661d66884c5076bce50ffece8419a50daa6407da833bfd770c43cc7082407bf67982c050a42799567f91745e4f170e4e44115e55470ed4918e65bc80eaaa83282b4956f537a451c170b3eb58dca8f3ee59175d8406c96d7884ace20f077715ef7f31f137dceeb1885e0b1e83d9ae63930b3437fa9645f1c1190469853a3a05416ae141de70f187d1b3acb5c2f5e46ace2a7743d0e5163dd1319250aa12fa33724c571df3f2875a34c9a63f52e1a5b79be51ed02742cc933ecbbfbb7e01c9b5c140a07dc19f1b649a85498083e41e9172920c151aa31d93030cf65f712baeabd7116ea57f278d06dcb85aa848b6e52c81c938333d00bf12c5e9f18551e6d3fad9a942990b3a1e23aa8079e657342ed3a894c388ac0f91d3e50ca6bb4abef215ad803d9dd8432cf4d34ae3df7ee6fdfd00243b25c096f2d7b3aa2bc3ec81977e5c7e6278175516e4aab826d7c2d0e6d2f9c0174036ede82e18d9304db6fc339242333bc0c3eaa61f18be891cbf8a7c14f45cba31dd07d28df5526e9d6ee9bb2aea510ec08cfbd088e7b935c6fcbb62741acfa46279b912779434f7c7253746ed066a7523bde7318c712af2c17eba187a91f6ad7c23d6653a9e30b054f079fa9fce5306c61647d96694ca7453572cc23bae2fe2120b83b4229c488e944694a892220ce4f9ee7a7d2ebd0003522753fd6bfd87c7a57eb7e7d05404d98b571100add7aa5f0d6267d84eee81ce48a6fb73acadf5663a9883c5d5959e588d6615c2f84cafc98da92a4b9b4901c3fdc420c0b1468a1f402e0c75cf1dcd0e502a69936b8d709b534072fc8b6d78e1a89d02840278e7c849deffb18bf95260edc0df171e629fe9b01144ae8ca2c75d96ce7efe6cc3b5617f99b21dc45554aac3f3e62f037539c07f97859a228098465cd59e5ccaf112946b509d53960b30924e1605514e9365d7db5df87dee0c53f5659241c61e263ac39a04e2bf2d7c281c6361e3b3a5fa703b404c160ca1f9a063d9f9d7170ae83d0b08ab722c7f59d8a444a7fdfb601269342c859c55ed21b4bb6c9dfc64a05d2e206345ccd43cd3e0db41ad390108b9aad3b1c882c4db35f7ab23d3baf6c50501d509c89cb17ee679d052f28e47484b40ea835f5d0705961b669c11ba82eaf5c45b1ca93ea9a03308d77125a21f6516ee8e531ba7f12741afe529a41a31ee14394a5b684babedaf15ed9954a19a777057deb024a15eddbc1db22c6222ad0613392aadf99a6ac8d10bc607d077439c740c716c1dc212d8a71d258e10b683707eac9c35f6145fc76612969b5e74dce3093ee857eccf5ee174edeb80e8b79b149499a1e97ffe459f8fd9449f6e96a60d6a081535719cc0951049966755ac364833e1491ad14eabc516101d865a142d9db87ab7ab0be6d62f777c1bccd33263b7059bb1f3b5a497dd838af509c8c7e0b8edb10201f67da1192726653e6b3c60199896f4686f5a44f83b574b6ea17689f9fe47422c5c9d7fc22d241fc6d8f3593a4f0fbcdb236a6b038eab7538a39f708f5024ffae49cac72fff57b5cb67ee352c53a19a5ba569a21c1ed60c8c221092313843206670c9abdebbae77e891c679657469677bf34a45e47e900d7b06df7fa6ae04dc7f4c34dbf9f325d5b3862e1cce01ba14ee6733cb3404a06dbd505afb00f32c293faf4b37f4100564bd3d22e51d9e935cc0ea90ee58b29ea99b21ab9bdaec5091fc9b683d022f73def85bbbcb84e2a59972a1827f5d9048e0b03f0612ec2406eccd20bb6b2690cbd498c7798c26b9fb84ca3356fd7b6fa7d8911f19206a8ad5f43251346102b5410dfd4f87b963f3b357e31bd9123986a757d4dc91a666e94e0df40be508adece71a5e48e20a46dcaa692060a82e61c586a5396a7680971ba5bab6cb1c9c66f191440d72cbebfbbf6e8c686b7e24abf10bc037daebc4c2066e1252e504306f64f8f2971a90abe718d8dd02630408532bffbf7cca339a29de5de9684fbc28f713ac8b14ec65bf45005a39a5ea5f1566114b189bb43fec3ea4868f4c01ac2f638348e9ac4e63020003b1a6dc2e2c1fef35eeaa979b66cabdbcf24e275f63f3e6e4a61dcb6932e5b5ef45ff240d36a4a1d0905293ce915264a5e9760949e06614db5e654075604b61bd67afd7df5370c45f6ddb647388ea904866190ad5bf1ffd7cf95bfeca5ddae0bcfd4e106033000000000000000136625300649c5060e0b8fe8927a670438f3f68820df7f498747e0491d7506d1f39926c8f5800d2967a140a8d966d27eb6db814367f0498b1d9267a445bd7d5785f5e1dc5b5f70510476f2b401458bbc38ef81b57e2732c5890307a652f4859bcce19b036e9806158220079b63489074745fea1dcdec39b2860f9a0c4e5ed331a667bc258fd195ec4b8293d11adb0ff146cb3fd79bd0699fc1a430c3c903456e126e999d3c9cc0ea3ea9d4a3d0f4e25657d75a6c567458284f2d1db93171f1771cdb669df320fb0407f4fedf691b1e8098dc4501a40428ea7a305fa19f0c65567cbea656d3bf6b779cf86084d8cc4a6717aff3555ca8ed44e40d17d855660c00026ade5cacb07ec0d6c7e97d2c739bf5cf9c594a10a2c64ba5203a15f461791d825f6be2fc7997b7f3d7c7a80e6dcac08d81bd4b8326bd53374a22e76e42e171b10079da41ee7377aef1857b533f6163776d998c12d4df172f4fb2495287950e8794da3fd83268f5631f41f0ef7444c893901188d9c6048f832659bf3751f9b59b6a6e95a54222afa634caf6677a61e5e86d8c1180bd4fc28e4417541a9f8fed5b94ce04f0a0987471b4aecff7f20aef7d916109ba1084a017d431ad876a67ff5dabba2180557cd5a82c3448a4642256947aa3f492102d1012008b0b29df67afa78dab6bbf873efb5263b8aa14232e69adde835d8e8739e6ef83fbb65b6a0253e2fb8e5f3d934237a804113a275b172b9add23bd0f5aef2c27452ac2e99450370a6f61ed9764a24d9cb0f251667ffe3af2f52765478c355e910671537d9696d9db8b6ef6fa3cea313572cf2ee2b642c8d5673fcbc0673778b0a444c15240d0d30c4f0811cbd50092b31bfa67a4fef5cfc84ce23561be186bdd1836be43a6e070e808860b944448b3eb7dfdc0346e10b23d3dbf4db3edc335dc257c76672a4a06f6158631c99daafd24dea85895942b5e19c7fec6c927b6b3c43f8ba26de9f982ba068c3d42c632366e48def26a2f18bcdb808e24a51cc6419b06f83b3daa79365d81d6818debb158998285909033f11ca878ff427501cfe0d6f1c704fec0e4fe6663d43985b11547313ac59dd467783a54aa46a5affdc1cb5b3b97b3383d132e20510a444e4f17f64c9b99521b8ace7b4eaaa38e5904a3dc2dda123c4084cd05ba45f42d0aacda68424fc9593eabd775e10ccec6f7479a1c846b99a8001c1c575dcdebf6ba6f57c01c924d63a09c4e26770fb0e49b268bb921481966bb765398ecbc8bca3ca0c83faffe5adfbccac2dd1d10f1ce10899ddd432e4fd151fc16dd6c55f426e5b9ee0c5dbc84ad1803657e9f02328c2f2249a9a4e8a26b28882d6e652803ead9305c81a234761b143ef93ac110c255b8d61a584c1f1214956307b5c30440b8601348a6f3cb71a9cd8d6fa02459496fed0f79c1f2d994a4c887c04eb683b327e50aea7111224355934dc2c413fec9023bfe5106fa642c3764f29b4cc5ff83960d1682acecde138f4804545c6db9942d0633f7d8ce028448d93f55da185018e78d74668fbb80cd71c97c066a7da6884bcd1dffaecd537cf121f1ca4a52f684c480e40e7e9758d24aff58faeff8cd74906077917d24138205c388a8d0c180ab0f857d676a9ca3b7a24ee4894c91ed14c0f5ea2eab5ba5cb726ec8d1085672fb0b9139eb9cbe5b431e7f60987fbb2458eb18c9dbe3a3fe060c569ccada26b0495d306195752ae5012917e98d616364273367916dd0218b464b2e1e0868417af70f10f01ec68073421db5988c0af2636144018135787356bc783566b0e20d90e9f0c721780e5e530af7932c437d53205cbfd8668f6151d2181b705e0917184b51d179de686bbcb9623f62cb94cb5d02dc3ecd2b4c37c4b92434e2809d98ff718edf41767bb088345373cd573add1ad2f6c1a1f343da31f91401270dfb33a735a4ddc6216d986818e6939a841a5c5def00edc808d33d67a932dc5d59707ae7d56cf9eb0c91dc5174bb6e7a176f29a0d63fcd06dc522559b868fd6b4b309370cab1e05aef5151d70110a081c5f5f35a34824cb53631912da6a9a0f4badc5424740e5acab119ee090b6e415eec6066ba97702754fc579300f79f1ea8dc0373ad9c2f4027a950646a97cc250f7af22f6970c932060d860b1fd0ba6e451c0443176bb3932ece7d8c4242ed330eca9b9cbbe9d18a973bc5ec46a7559fb60ef9190cdece5db54c3a42b7d60914f89211ae973aecc5450e85735e734a303d9a5d251382c29470ceb944d395e895560b471fac7efcc6b815664f2dbd206f7c5dcb661883ed335ac17212af20f6bb46db212d141e135d85aad063ebd070bfaaeb2f6bcff62a0430aa50dbba239ded76aee1d5e8e1535887837842528a2d0cf039861c7e89229d9bcb0c9e4a349090f70d1e904f6ab55ad6aa49cc3cd5771780a157f50833b4e790bcb7bda15e6e3984efc07f1ddf98a398668e296f870aad303e16fe37b0179d6b5c4062d3e5cca9f15825b0f74a0e3cff9c7406653ad6bc639159c8049ce62fd4760bd3b0381ff9732d68edc5040ef5e27f57ec5b41c4e0e5131f22dbcf6fa8f68312f388274a4af864850adfa43e454459f594c486d899054d193cdd05fbaa2a12a5c6f250a3bf992fd2efa6f6e81a81fa6a219be8d4bca51182f48856bc97a47c268842409b13a0b06c4d5fe00009e994b901aafb68bfd83e88d2754d7e6840ff4e248dcd266efbd1d20f09a4700818c032343189cd47ec23c0032410ddc26af031238a3e4fe1550b22a78b5d4224c88bf69e7b1b5f6090cd6a2f7a574e042c2c0d1af4c38a3f4a12ab9ec3744313bd3b69e1360a88d420bd23ca73e4c4a8868a15d02c293fae58f7fab9fe454e88b64013edf5ada816a8bc65be0752b23e200b95f3c11519cdb601e13eab5ac03f0607efcb87cf8d598afc5e8c96524d30ed4c76edc87c9fbd98497483dbd8e1bcfc8ff71e4ebbfdd784a73300f4345b91484138047f86f12e8ab06e22c24349a397cb2082d9f15172af0834f55f2d7749832cbf00cbe1d146824850bfa8f196cf4310a1b940e3b403f87ee045fa889aa4656c2fad5348df1777b15273707f98c8e3d8e2051497e5abda2cd239eba928d57f79cdc2f7d24a54a74c3febcea5ba8a82f5cb34e46f870587c23af8f19fa8c5e94840c579617bf83b234f04c04b8d86a68e48b2f1d5036edd62ebaa15e340c453f3a61d12bb21cef4b011ed074ad4afd57cb145fe61c06c6824e928b0a016c9618eeddba8166718af407170a576e446c90253043f379497096464086eb1aed23e829dc65b73c8c867f3d5bee41ac8070a771ff8e3870dd7f63c87a415e81f62483ccfc293b1a4e4ac2a218a37a6ba3077bf82cde7884fa2b6211de7ab26916f32017f0552d6185064482fb466b21d963ad068286e15e808575851cf559eb937d6943ffdeaab9d2f8376ebb7df96a8cb04939914173349627472a30a58fc07724757d61d9f2d290cc3a2723fb3506d5e3775e9da2e65b5631b00de85d6e237440d73a2662bcc5d90f6e401865b46ed42ccaa9535c9ced22881289ba2f7653617eddcbf5932f27676b08ab0c4252c65e20933f5d0b0244208d8a8bb815aa8f3e547394349bb51b08f3f175cd59c34a9df283ec29a652aa4c82c2187ab43a5ab2ca57833a65b7cd4329c2b15b717f01dcdd26d316651849209a738e289fb29a05afe2e0af2660f2e7f3cb42e573d4cbd32b89c44b5f32250aa5cecfa25ea8dca7c079d590dfd31d972842351df8f8c0504420950d6bacc82c7cb5271a8b6f498cc5fe7191d5c81c2de0ecfc9051a15e8de0e5d88444b35f9c7f87b856132a375111739a3886a849f0f2ec7e593fcf697dd9bab4578c9d68a3afdb9b2e90f9f2a517cb0410cfa4887aa28e6eff0308f237ed0c7a111421c4c0cc901b3c357c5001f0e901982b2bd352f51b4f5e40d01106b3e21da64a5b9f7abf28018cfb1694ad94b467d702f0b5dac73069c997d4ca12c3c2c58324cd5ef8a5ea5305134adbc4c8cf2c6a3927026ac39b776e7de74c4065fbefea7efb092b194c741f32e3664e39e9831e97aa0422f8276534613177b03ef9bd9497cd1ca733618a9d8764993a1675ed82d91c7c8dcb523b58276e85aafee8a54723d5e1d728ee8066c85d36b7fd1764b4488353c9f0a3c28d0116e2054b73dc6a45723114684d760db228f6a7f5b0e0b08694a4df5208ff023138e9d7428b7c952093319ee45fe2a5b6478f260cad0d3cc70f53f6c8f709f492aa575cb9920debc0bff013265e992bcedd17237f47c39dbabae3518f6baed228df6517a191d3d3bdd3a30b88830070ef70c091ff9f6bf7f0e86e32d3bdc2460c8cc1f14642bd227f77206471aa36c230a1d6502b89e49e8aee25850a9fb5097e8c1ed4e4ed621ac22d690ec5654af181e288fbb5dff3ada1c2bf41d1402afc0d5fdaf00bc1f3b1f4ac37551658183b6d35bb51a9711caa4d9b2de29ef0b34fa623e4597d96be59b924cb60b55d0e88e55a16cfe5b2795b60cedcef5b5de75a809a2657b90e0a506325726ac16a12b186612ea1641f054a09b6dab639bc278b1783631112992e21a24d17338aa32d9a49a6f5622b04e1b989b1e952415faf304053229a4dd19ff605c2b1697a45d77b588563451e17c639267f1385842cec1576cd46f404c19067d5ee254c85ee3594fa9b7c7666ad9ebb52e68441193dd912932414228dfa69d0dcfc1f5a0860b49d2ffd49e87452a811a7db2fea42e03e4cedb78ba9f144df174b7fb95dc5904b68be8fa7905a884ad7a525a6d22d9936ab32adafc4df09f07033825173376c8a4e0b5d62e0564f2b064175930490d1bfa4610aa264d265289c71078003d38c0d8d5dbf2b038bd27c8bc8b95901cf4338e257ff25a283b89ae24133b100eea633e734a177d44e92c4b6d1948b1b76a415b8a324664c73d7f4c70b618b20972a39be5fca6bf6f134c2519c6d3fc9d03085d194beeeaa239117d5b68913c3510cdaa9fa50f6fd6d97de5fa990036d9ca039176e2fb730dd2996464563cf7f69231f9fd006566b2d8caff520deebe836685b176b113ae00240b5195d98cb7f1e9643448310d6fc89ab27b6916eaf519e778b135e9d9a417e0f536ce49ff30f5250ca259b70e2ce0a520e692967fce131e7026fb6ffcf46364ced6c95f6688b1bf7e8335b5a493f4da9e6d0f8c4e0c07c9cfed271f1b2eabfec47dd506a8f9fee930b866a1a531a1f8996f0f19ff3373a2c35aed1efca59c3dfabea15168420ac0bf4a484d7abffd4d49df482aaa6236af4f0dd9d1d24c37f5a6b5c37df5bddc6b32869588ccb7311a8cf3f982b3e28e158cab67c9eaa472931213b6b07ef58c6aba07f3891f91be91fad62dd76747b42027af86a066b0bb6a926b6a30fd3b42cc9f6071f123208901b014277e4d021ff685cd74bd8c9f4bfe48519a93648deda3660c44fe3f10135bd4e0f6b19719b63f3ae99da7cb3efb66ef0d04a58f6adaa9861fd7817004cc83e9ef2afc0d269917066cf30231a2578e687c8312feee2fcc6f9a1040f4e6471c91a0d6e3b7787a7b553b24dbb7071341f6d9682dce9f38cf9ad79842c846c4c92f7a3e8d4ac118dd5f41590295285f04844c55d8fe4039d7757a088436dbf9ee1ba42c015401073bce076dcd130971d96fb74dad68d01a5a64e6c695bb1ed1f80ea4bc917198778384e6a39d93c0b8a3bd09e916be8f1d79e1d3c86a565c5be0d07eefd71174e6db604d04f579121460b2af6b092f454eeda4d4eaa5f07863bf01f140f1b51038a5652af001726ff11a629892e8ed86643b4e88a49eb4c1ad624952eb2e19b1e34b0c3581243dd4b9eef50069b5226ceb8f1f945b908d305d30000", + "weight": 10536, + "vsize": 2634, + "discount_weight": 1874, + "discount_vsize": 469 + }, + { + "comment": "Transaction with 4 inputs and 3 outputs:", + "tx": "02000000010440d20e775327e47c7a3aaa0d62d2daa92d6593e825d4058fb83f02d2982787bb0100000017160014136af4d9d56195fb5cc45510db243f2c9ac549b0ffffffff5d3b095569d32203262113e114093bbe7ac2ed26e6c1eba94acf3d62e9479fd4010000001716001427c88e23665abc413e795078f07e0573bd4966a6ffffffff1f8d80edd1f8f600d0a67ad89535966d70ca89f267b84ade3a841d46b646d03a0000000000ffffffff60420f6b5047d74b73280a80b3c5a3b700d0edceee2d3c424c2e47b5ad7fa189010000001716001418d6f6cf51186fa55acea541252ef8642f539340ffffffff030a3903616f4fad0fde757dac8f368334c6326e80be2358948a74f4b96d2ea2e3b509266e8e780023d26ce454f762a63082125f3d591c5a80a40b3652f2df4f3e3be103955beff6bd21e9db19cbff6029b77c0f33fcc6d2fd38aa5d50b90bb9168a1bda16001434661a61e4b2ff2c61881cb4eaad3a691756a9f50b11d13d3cd766f1dba3690803d68d8cefc9e9a3bdcd6287bb646d9ebf0937ecc70850cae0c245577ce7f12487692d489291cae55ef61c8d57da4d1ae91cc58d099a03ee30d577a7a8aab53a448b0eb7968aa77e101c46049d1fc13564f84bc18a2cf417a914bee11153fd9e5ea38e517ac44cfdf18fadc7ca9987016d521c38ec1ea15734ae22b7c46064412829c0d0579f0a713d1c04ede979026f01000000000000011b00000000000000000247304402201ad36f422bc76f2f7f2eed881cc825a5f48342ddace0107a7bedd5e0452b90cc022058d32863bebba3965b4dee2dbe83cd4a9fb8a926dce8b3ac5b1d1830426eb9eb012103e32dc1faaef6d46590eaaae789a57ac4c16a58648891baa060679962c95c3ddb0000000247304402204555a3ec408b9904f09a192b696cfc6bacc224355053dad66b1ed1bf04d67ae60220056c2ba284d8f04c870dda677cb48415a2a0de6e41b30a1f822fb942abac7a8101210266e0063c0902c63ac8cd67d68c564cb6bb00dcb9a1f1a3f00975acec406e5a7200000002473044022057ec539a2a3069831556b700e3414c2c690e7ddbc2cd5521e541d1694e75728102206386cafbcfc0ea7a58447c506320b370cf1f990df38387e16915ad80044010b301210223b1920f70e92491512dbf4f266295315da535e66d18ba566fc13e71aa0a0fd9000000024730440220624d81f43ba0777b49296c51c0eb1ca56f78eb6c75996a9fb1202956a8d286e902202446ce430bdf63dcabc3bb70415ab0fddcdb685c35c76da4f7f098ff6039464e0121020013a3d0f30453adb05323aecebdbb0d9ab7203fddbc51a4177a593c46b499ff00830400078da5c4069708cf37799af32fd4186b7ddc0ab5b36d45e65811ebd5b357749e0b874079956c001ba37ab67889cf71aeacaf7121bb87af4d3fa62aab85b9644e86d456c7eb1c96e803fd733adee77575ca7bd8f9666c53c361dfb2881c1dcd8e362353918a2f4298dd72766e68372217042fb078dd607584de55c52a939e560093fd4e1060330000000000000001990d62006914e223b8fcc44384694c0f3de1182cbfb2223623b49f6c9a0ef432239a3fa618a891ea7c2b9ea9d74c1e9cd22838a79718d824f24967067457d0b9168aa1100b156a690c534ab01b76739b27d7d2e55e1d0688b217b44228a81f2b4a122dcfd544e6e7bb0db0ce48044a759372f4e3d15a16599db10c07e09c436c1c7712ea1671d18ef3914d128624a108282f1375e0c480f5b563e0f521f12003f91209792d7c036e6a6724ef7ca8d3186cbbae619f4e41122b2162c2fe8f44048866ebeac117c4c076b6949813d09a265c79f6f247d878a899c289e0a694371e21273e49223c13bbff3ca6a3921784f68a01ab3444cf7e92b1d115731294689037556363c1d53101fb53cbc19a54742762de2b61ee4d10e27ae887c95ba313290b7bdc4ca01d90c67029ffa6abb35dd3cb0c1aea44d96778f8fe4264b3894eae75d0471b7f3f53f99ce1aa9bd0007884c10a570c8ce4f279320c374041a92d320b8b012cc50836250848fc6299819b3049089c64215eb76684e4f1c79b7b0c243470b9e04391e252c43e96c85e0a243217c1fc4523ad98eeaf7e53d346932a362122fb77bb0b9341b4bc03aee9a3292cea480b2b89f1e10e15dd2f33515dd511479b8a243f81263fc0200000a57ebfddfe96a677ba053c2638d3bd6d3bda6a40a64f2be902fd9b0e84c9dffd3cefa116cae49513ee8616454adf6be38033fedae0e005aa3913faf76a667fc20b24003ff843f1b270fc007885265c4571adb85d9c1428318d96fc7bbd53dec4ba107c9c46141122d9dc388f39f2cd92a475886ab4a4f4f02a11ad331e32e7fdb5af9cd37876a7139b616ae5d12caec903ef33e78bc9f32d590fe4dbbd36220e8dc93bfec5c39d40ec64d2d7ab2780d110d70646e2fb23e5be59dbf1309d5f5f1ed0307ca579f0760a6755192bd4e82d4b9ac407bd2eb9436a6250a26887f3a5026fdd4bf9fdfa860e6e3c66459b52c22e3adeb39f5ee74d813ef52c67ded7862f42b3f41792d332117a4c9a79c9533e6340c4ac824f747f9ad696273e5c4f648e33eb331ff3b169200577456de347b909e00500b2cc38e75e74eed3213471eec258f8518d65ddd75bb79c8c357b4b5ed794fcc914f181b80fadb143ac371125e976358622f868a6643091b0f7b3e8a9d137a54cbd8bafd7e135c410640ca57032824fa87b5a69bfd5a1f8d92ca2420bab396c4e50a9dcd80baaa422e437e7255b861804c82a6c366645d8aeef188539542179fadb47318df8c1c71167dd3e8f5b47472316cd8845271af5e65989ea7ef1ed30b7f081e6d9dc75c1ddd6eb111f951957c28a3f43b3a45254c1e460caea639974b562be1f390a2d32218c240f1374306c049d0e1b20cdd021b824ad4e891389240aaeae626336b75f2efec67aeef754424056f654c83c3fc97fbe5c86863593dda2270ade4f8e9f110cacebfb5ef24758ee57df46c0e9745c42dbf70be6fe6f47e2521d59aea709cc66f4188cb6d0e72a2cad4f00f28cfe5d19208fd6316bc4bc97301590d9994df83f7b7df0cd8e0bee24173b0467595dd8077453dc71cec547c868b353d62e3fa8f1c35757e2913fd181a6080cb70dfef18b1a2be882179287e8ef14838edb6f9a8c1a78d6a3f10f2caaff2b18d2c3a42da4e813af6fbde121f1a75d62503ee444314fb77b385ff957c22bc9ab785aa83611a62e757523be245de8c4c72d3eed6f9b2ef8398d07a8439cabf2669f989bcd3dfeb19e2ca4c55184635edd7a3a113140d01594037245c0dc9fb38c556eb6e93c4d9c0a3b73b899dbfb1d42f270efd74b9ab2d2df9b20ef4488cc8e13e044dfdd543dd95637a3fb2af6016b19f3523e6f32001e0e4515a3edf11a71855fecee07391c29810474ec3adfe37c18542e4c5f4b31d6cb2e5bf446e31d09def5430199bd2cedb33fd7a0f6036328bdbca5960cf93d8f50c0a8e7606937c3e9229f2993b91d914d4d2ef689ec5970d1464d08f4e5c9720c8456a02c374b380ada8a3a5cb118550799f12b01d35c5b96e279d1fafda1f388de3a74f7659c39a3a5a8f04aa0616d419741b6f50e84cd056346ff37b429d17ae960209b6b6421bfd3073b2c163336e7c98a1ef8aa42305214b9c250d0736fd3216dc203c81b521c55cbfbbf092b0f22af61dadf24816688d7c1ee727d9d0f665fa2b47471e842cc5732ff80ab889537204f6f702c8d991a9fa315355ea2e81d43d2ef6b9eb970966b3f436f949900ae10bb770fbd5a0f39d6ed833071899ebb277b74d4f42dece3bd58b3eec4898e6db0ac631ebcff570c8b1d981075d22950fb8dbf998ea6b95de93e983f63bf1cc7cb6cfd284d150902d4b3d026fa83760be025d81e769a29501e6038d3c303d9dc0cec3fdf3cbb277ca190d1a0c6c6125573fc5028d4edb00315b458ca71ca097693b378011fc2d92d174b6cca8e1cbaa2649ed8d0e961446081741050a7af08607da2dee28355fbd876ad764545f5f1f97dec4a58e0b9bf7e4c6b6cc999d0fe5b0acaf89a5df71c2d823356a79202fc61291825c8b7427a324e3849c4011e97e04e0924c88d34f82d211a3e721e743fe718ad5b5847308aa1a4ccbde430ee3698b016926bd29e95904b7eb2407e88b4c8d5e92eac1da4efe562b43c004b36c65b1884537f553ef117a04cfd026626b19c859cecb1106cfc13affa027727438ea597ca98245acea167002c988c172c96cc8525a9a5d4580b84984eb52af7d4326089455e9ba540d7d2c866d4b7b0077c5bd76db2406db60f1f12974700d8d1efa968454c581e6a764ab95add5a885edb7d9632830984badd216f2482f234fde1a261fc37b4f8330d3b29a217dd327090f52565aee6d4ceb646b285df2a3b6591a832214356d29fd9ec381f4f9dbd9e85c1157d5d3fc8b5036fd281361be9cb2d9596d43a616d80f9e4ef40c62128f7156d3da4353355ce7b762f9da589041fe5c319c1e5d6f82133337a7f3520350fd1c663672c2224281057c92a6fe23e5e99fc28ef54824f6f885fd61e917161ab119ac4ffc946ec89d0df486bea1dfb58e4770abd0659039c1d3766f43b0c7f0c6eda893969c0fd0ddfad68a6b636c40d401f6ca8cfd3e98f5589aa25f52c17319cae03bfeb56e635ea91462d0f4b94c09d52497201b9428df0909b101a66b3dc732ccd4b7ba72a63b18bbb58acf3925278e70e6d3866c020b7c140d0bc577c969e26cfd8234adb17c2db54d861c37b253cb6d5da31c0b8150b3f4c7ec2813ff3fc50b7ff1d50dbc6601bbf83ab0220a58e2bce0b2861a7c68b1d1839543caeb0bf008fdfc6bc72b46c11837dbd5ec06642710e1bf98075210e531762fa880ad09ad97653fc18195b67b23ef7a61f8788a9db77d88ae182a796bfcefba5625c714198dada2afcbefc7c1c045cc2f087974259a3b70f4da0ef05844d7caf2e9508e56e35086782166134863dfaf474d48ab23cde2273f31c084f237aebcaefdaed06e6e80821f3a3172d0f911cae8471c12a56d4a6c147db3a2f0f200f96aaf349471a06f3903b204c7f7313b3fe43c2c692115b6ccc5c52d7a9b806e2933f3008ae6a7d7a94d12b24da72f63b8c131f0f802c714a4e17fb6aecd5ba607af6ca8113e13355d4fc4c1ae3d80dd3aeeabb034f616f44c9b74bf11533526f9bcf4ac12b26e925c3a8b4c3dedce7b34865732e521542c289a92bc367692250204514bbce51c345418bb921574cf0f370208fde81fde03161b2e40a83d8be4d2d3e3850b50dc97ae89e0242f0211bf63e80536cc8f09e299ac08fb07b3076e30f845d3d2bee951575c3ceae30f6a623116a37ee09f6f7a1ee79d94f44d661d36c069cbf7b1cfef71f227a0d3b60074d2c0d26e29bd4e038d08a230fe1a084a973a730b3595ccf39a6bd3d32dd580ef7864384b8974f60483efe43a9172d4891941977254cc91878d8d9d05dea2d9272b132874e9fc0a112af0ac8807d93ff626061a197485e445f332a3b60af3f3bf778cbec73e1dade37e18117a879bac424ba5897177ea03c9f2350816118f154e9e7da69e0f42bfd04dbc211f6d30664c616a135d157df16d40d7bf59036700f903067e91dec547d90616c5751fff3a1af5ff78bba674137056fc6540d91d809367d3f528dd97088b762a05156225ef7fdfc4917b62f8ffd95be3a61a16853a1e8fd4a81a1ea1b5147f9d02d1769f4525a40855e82080eadbb857d182830f77d21e81a1373ac86303b4c897dd3bcb4d3ae9c46a0ff962ec8a3feb34d799c7669bc99d7355936c539adc3a1948db1f8751c09427b7951e39f612bc28c658c95ac318ce93ac273add7c85211e676fe85faa318e4af874fe6f6b8409d99c887679d671a086f17d5c42ae470edcaa88972493aa943f121f24ca6c24669c926dfd70d9caa99342b60fa45ae39695879390e088d342ab598fe74726dc0b7805d65da1ed845951560f6f38121303e682cbfdb7e5d93844a186bc1b3248e81689aa7a7a96c41fd411c31057a54008baa5e5e60bc4fe15be5b7b04a8561f0cb330fd9caafd50ad37baef36f0998bec9541cb858e27c00e754ee753f72f917f5dbb8c2752dc727b30305c332e2eb12f3b5e5970cadc14d5db40509e8a1eb88f9f90a93366d644376bb278ac75ae8b5be7c86e95e7c580de7cc15001961b9cde2d3b5f8311d61e762cf2e226767f2f5da58859341e80cdf0a9e4b19b44e4d88be7cd9ee6b5ffb09d84d3b8b8d8d03d3782e0eca0f0bdf09709e89d873b07660ba2c830ec644bc86f2a0179b720f178619e53524d29a15847e8e5b3c2d09b1a67e359eca24fe2b4699fb3cc0400968a525a3083308c342e623f22753a10d98edbe509cbb313994e75a843e95a77f7410c39ecfa1ace928257ff78bebf72faeb9c7a84f55cf4e54a231e7db7a57c1f4ffa8c1409b4e25dcbf86a8a7002eca8bf69a4bf948bdda18670d62bc8fbd687a4e003c0feff293327ab2960359cdd947eb6d7f4c1b3e51da954bc139ae8bbba22d16dd44567ec3416ef2028c03f7dd22a398247e380ac359c0aaf62a335d3d63d820f7dcee62234a16c33cce3d68a78b56114cff93b84bdbd347924416502a75820582807ba55a1d52c6bbc5441d709cc7dd90308c541d1ce9cd4e63ee9a3204b2c2e5da2f49db7e0c293ae7367dfefc168c8bb7b577f70fdad642ef65f86a1de9847c3cd81c4d3453645b2f0127102f586ccb7c4998a3c860292eaf4be3cfba03ce2d11d0899fd60f33002394c761dfecdb9a624caad7c364598442f3d8ff268a7871007e3101d064231ab3aa700d40b6dd9e3c1339f3b309b3761625a2893b6ddc0202ad76d387fd97f5bb0965feb84876e3a81fef95df78855e1dce7286ad1fdd66d6160cb04bc3a3ed147b427aabf7958812b06cd5b0edad1f66bae114802e22e88e69592564c10a09daad4d797751cbef21a0a219f6dffdb502eff52f83a09c7de1dde3201bd4b7cd912fe280bdcd7225ea92492028bdeecb798fb011a866929cd9c44f12c0d00f32de3045f940f0eff60eea0d95131486410c9824d286740e3db5ad41a649ad8f42029ca553c581bb3772b0821b33282120e74d3a2a40e44428be2fd84b0a244090c70c88673f30ddc1a1c8d424b666585f31d36bffb266c09bcc2ee4212dbfa2c665a75aef1c22a42599c5d31939d5d8238754d463f896a0906bcb37bc5b4a7983e0ccb99c99cac292bdd6fbf41a522919d9ab03063f08fdda5aa5336bfe3f7829405b8b993f9dce9d3562ad6e9e8210693ed00f7aec88692a220cdac775818a62bf78b9cfd62a8e6326b4fd8c9164a5b280a1d088b0c1650a156c09a64ae94490d931c1fe105e1a16747cd71c5550cd3d1e0b57a6f3ea1f0680f1e98304000bf11b47003d960b272bdff380144f26b8038ec733c4e7ffe9b54ffe5fe2cf8e3655854f2e2062afbfb24bfaab7f2ae1fe343dac5355dce3ab675ac1c8cee8adfa1f91fc87b6b5f1e4afb067212cb4bc7e241b06a56dc3e72ee9a08d98e046f69386788d159ef17677fc362ad98ebb7b87b82f7e8674d0f1dd356b8312f6692480fd4e1060330000000000000001589e4200804759c6a15741acbfe337fdd7276a45fc233274663b54c9d7841b41e700a1166c537909f1dfc8ffa669cfcf9e7cd8bda75c94bd69fc2e331c2000225c140e8c42cbe187d4539dbfad5795e8db6555d63d9500c781b38ba0192db522b53ea587fae735ec8e8e66f4aa015dff234067f957641299e60f6a600ca54942b42e3243c038997802cfe3c9f7601ec29a9cc5e1a9524a930179afe38b31a80bc19902e836fdc15a11dbccd7e628034bd6dca93e7ae9ccb396ea150a6f677f434d7f85bf010798e0e6536fe8495f09c9e6e4251c97cbc2632cab92e18b379c777e2ec95b620312de9ab4bc634cd8170de350a7d263f693f7ebc5cdc52359d5abbb6de56227ef7bedb21e1746fb59d0c2a836b5922473a9544c268264a425b6f1e818ba4c8f76c846e2db0ea21fd7e0e0aa2cc247546a15193070972100c5ae3ba0a9a1030e6386e3a04d6d8a97a86e3df1a67c919a4d223c8ff809e10a0ae458c537cb2f5c8d20542511dfee62352b800b5c980b553c07f51ef98a72989dc1250ca2c7c3594948f107c6b3591f916621e0fd1c1e37cd9e11fdeb881e15f62c4cbb33c525b592bc1976207e7215037ba5f2c5323f4884d475bf3249652cab440989264ba7987295216a9c965b4d5da29185002abbf389c9a8fa40a4e2705127f1da29e9ac139666e37f4dda0efb08195efc2e970ae4ce0987b976c9bb79184f246e6a7099121db50c4bbf8e65f6a7b7b4ca44cdf70d946ee13ab62f4a4c81da0f392c5236c622357ebae756464e5fc28229ec00a4d5a727891933321e1e88fa76e61109c1e1cd6550e8b9c86b4188764ee4b6be8835fe013c41475c51e89acb71f77a5cc79a75a78bd0f198aa9a8ea6022bd3a6bb59e2309930326eba451ed932247b635d3fcb7aa6bf80d6da088c1d9fe53553bf25f1b0426dad5ab8e87853fff0483aaa5350a0357e8d382619b516442b360631332a71a7ed8143e5dec6a3ca0d2320fbbd09d5f2cbd6bca3481a3edda93653cbbcb698e67400484faed0c2133f8a66253cf493815ca27011dabc73294aac14707ee4e068ffe6f58939ca3e54e13aed06dd0a466a3b9bf58f10f09c9b5e90069de5f7fd85e3614db6ea13829985d60e503e133a8d13d6e74f858ce80f61f2fa935bd4a3033cca9e622cc5f272f825a04b7503bfd79cb590776fd042d514b2e75bd6cbc7f7d113db4e0c9235402712d5cef1d7fa410d754f07cb1496688f12b1fd39a7d15eaffe81d57e9d834e873bf1d6162101536461b43572003dc7ab720f444740e48e038d21e083734783cdd05239bd36261566bf6c98ea1d25deb29ad190ed02cfde601b53a9fe8407332ba87d8f657b74fb14c1c6fa80af1d304618436ef1db96923e075c7efada68bc21ccbfae05d7c778dad45cc519b443270544b333a90c0d6c9a0bc1105022e04749736e524235b140d6570b2a6ab2cf37d753e530f12c053e24c4086e70cb9137e717bfbf0fd3d9f8dd29118a8648ab45e5f976b45bbf5acdeea8ca54d489166e8011dd9a681c5ffeb78abd9b37d809f5a0e9b167ac64dd07c1b348670452c0c42bb13746617ac06bc0fdd373a90a63df88fa50a229353185fdfbb808d7a602b573c43f285ffa72489ef832eab6a115dd819c2bbf1f703bf0ed06e8ca89066360708694170a5dc1485b33b1914aa39051a70a10748d8491186a6a23a8f67409fdf575d416eb3842e751168887c3b50d18f6ff2a1341ac5eb5dfd2f61a656c6737217debd40bd4bc312173f1d5777a50d39858664af0c33e0566ea5783faaa809e3a2b087034f7fa05c769fc3488252eb0171446fb480b27531e707a825b6800c601cb79ab92ef9d1737b8dbd5f71451383ee15eeea6bc09f83dc66f7e5129ed3c37d3d0d176c64920594d90af9ebb39a040194a97c0bbdf65a7a45ef0f2cb1b6b99c1d22748de18e50e01f1ad1ba9cb7147f02ca0c080ad4ed5b707057b483214dd4bec6771c65b57d61760649fd1f899db9a473e7e21a2d0de110c70e7699d54a6957b6d702d3244567e27f244fb6ed88417ce5393f3b0973286c38298ffe14cc47a7797aa25c15dae6a4cd43603553d21fc0eb3b930725ec79674383aa974ec3742d095de6277ed276e9c6f9ce7d0703e1eea10cb5187b45af7e3848ec49f5c363ec0a1f93c03dd49ed3124b3def798c89094f5e84ff3b157780c1dac7f0c7d334a164f06cfe1e9943b9e1b7e36b0e145c1e900121fa0dceac549bc37e268c380acd6505e17e55322b371d95d859cc1f4a696426fe5a3bbbd84672e4fa1ce588b026f370737af89561ab31d7d8ac922c0310ea26a0bee9d3450906973b402f0227ae427f796e51907d10ee65d4bbffee7ef59b888d9149abe971cd2ae6c48980a4064f046b5469aa1bbadd3b41eefe71b64cd4026f2d9d6636b4c47999260e45eef3bae7197d189df038299786f42bf3bba900ded09e9231801a813674ba8b934669febbd2d5a181ddca948b904cded2115d3682740c6e28df3c939ed2f30a26fe84b10c841f68431a02312bb29d6cf168d3ebbc2ffd0bdca251ed2174d73dd3dbb2c3bb5bb549b75ead8936ba4b11ad431dbf6ff5b7af12bab9edc5df593670a3de8381a0303b596d67cf124a168ae0e61b50f7a053fde968517380681147bdcafcd06b225968e7518220b779603c8fa9dd422e6fdfd06adec0f2adf6314f888666ce4fe2ba6c68195a334a73c6358fed67c1c114f3c4c3e47ef75bdd2697de14f73ec63ecfecd8608bf60979eb921d3414372b8a9674a63455e1278b4f5edc1a215fb57088af01e948b23685a93fa199d646581e243a795e8d273824acdedc77ce4659e13b58e7066dfa5fb9facea32b8cb99563311ef6bfda29ba137978908002f9eafa8e71c5aff58b6de3520b43e48d7316091c2d25d73784c44b039313c0f12bd0db7421101c34cb65424edf2eeddd0aed220f28c02c6dbc476d3d1dc470be91f3b5f4eaaf790abd569e6f2793ea52c8d4ee1cba4bff7e0058a7ea289a428a2a3f965addc79a5a30a464db0d9ec79fe72157a28be888880ce35d492ae884dbc70d9267c9054551cc443685fe3df06f1713d10127e58982b12f81ebdb39c97ba0f8e7a9c84777ff4d32ae4dc75449b5027eee7c3ae4eb9b475089d992991d27c40702a7989da54180f40b658a940c411070f17ed6dfbe9a5351af0441abf229f45bd0f998e1287e703a7856fe14c380a7fd861306ccee36b728040c07338353a4ec1623edc8e2ff6978d310cf73f8da713423ae3a21088501f4cc2a7180a373f1b7555f89001a112e37375a33586effaacede453c583f4824a9aa8d589c8458ba85030162d8d9f12e4b8185ee634de5813dd228f7fc9240d7c3a19d77a6a489c8a1849e59df426f6bceb7b4baa910e0a1051476f9fad549bd30d6d67305a0669a1b0358cdf8c3260998a69570d42d9f48827d6aa0482a2377bfefe2bee99205b8297be4c6f2887a9d88663f31b3912c04e08096601337dfe2bfb345caf15a1856a85ea7dc05dbb1144511f175615d6a4664ea9fd3e318f6e788cb66f39926027e7242548b9ab64d6b53001aaf620661820fa77338f7d86a357f95e7f507609ddf03d51316b676b9b50b3dff042db8e841487b61fd80970e3afb08d3cd9fdccde2fb992d34c6603fc4cdea8c362b28242fae3b75b5645c0608b23796960ccd8d59633b4d70f33f76217e5984af7e2e139c6b6c7b11ee392e64ffd20d079bf499761f29a5af56b84a7644e69aeb22aca5beea493fa37cf098365f7b50f1ac7ab9981d25c2af29288a873ac3a6493dd96797d755618947dc18f48a4010e43cd1de7562d358a665bfc86aa757f7bf156f0bf01f24916716ef23d9f796e9931c4eecfa79fcad87b5ceec5e8b63a484c78918551569f3049380c740c9f18dc3b78853b183f177026317c3ac9142aaebd4faea56861bf47ded98797327ab621f89f87b65ce8faf20ed3866249aa57128d60c206bb522a60719568035a4bf4fef0e2a687d6e5bfa9001d155989d61880ccc6c065d407101d91a4ffafdc4fa1f486eb1d617fd710873cf29d5ef131a6e7eff94ca52b83d669cf57fcf2e79116a5069f90fc04993ccd06fcbf02ddf951510fb4f0b0847bb950db8dc19c573df4d21ee4dbbab23cc907ff422908566d9f7fca44d97f588f9aab138b0cdb495ced352f143bfa92b3fde6ed3cbb237fdb06c2cbdbb4b9a3b030503901571a121a3dff64960c24535391d886b728a9e3ec9349be16081df593d5ed700d1440047f2de2fd5c6521f10faaf511bb181ee15b1e7ac01348dc26732d1acf440c1eee63b5dfdbc303a68ffcbfecde67017e6fc29356c6fc53d40ff495018351cafbfd6b383b777ad813d2b54decf10bc1412d9e887ca69c995c2879e8796749b884c28ae358803ed4567a49b8968cd41735d392ab08845629c0e2f6d6f396a746b1c28014fc1a8145a6bb3bf2f8636b1d5b5265c302f545bece5ad54ec51d3f3250ecb6cc1fbec8856dea56ec388a7de9fcc439f42fc2787a778bd16c335c66080b3863407694ed0158db6dd77ebd8c8efcff57bedabf9ba9d7f3625e83edf3ade3330c28049c9f8566e5c59595fdf2e85cde9589ccd48d1d98d87dcd2d2c9df4183c2653861dabeaa82adfc837ac171cbbaf62911e636cc97e81a5274b0d1f262106d5aecaec35160e79390310508e84fedd735902469f4565eb8fdf0727c13620e19ed70a461769c73c3b46c90477fa25947ad8ef0ca1b93728f188ae6e41f157c007f3fdca859ddcc008b3a135107104beb8497d03998ffd80d81e197f904c48efc717c82c5f2e6d3018329a7cd00c84f8ed6f26ac10ecf398ad6d8c0e7e2d1715e7392f2fee327a6ff331c81e4d62c658141a6bed241cc9ebf840940c161885ded0f6b934bc2630844787487db548b62f0906c31bd42f6f3f9488d091431db1699a24b0ce25b1e13a74851d97416f111faff01b7b5452cfa497d9e78343fd11324804ce055c68851bae055c9d6c5a5bfa052826a55bfae1a7624cac71b992372381c189792aeded6ca5bfaa3bbb2027ea64dce64ff62dd404b565fb35617cefae16aea67341a04e0ce148bf950fe5197164c4377580488a7da1a4d95ce2c568448a9c01fc43b961bdfc62b12233d65754b4e591b1021a9b1dea87d9fcdaeac91e08ece818cad218cf53568fd99e9d9679d23df916719e3521f75bea2189ae8795d3796eb842231d5d0038fdd84148f5b83421c2ed1dbea795285656530f336bf8b5645353b621fdae159d114524112a8bb7a56b026e3ab5f0c2b16c581edf6bb38c25dd331bb4792915359e5f6a059e720256d93319af96e469f26b0b2d849baeda96b16f9364b30b92b1389b6e97600a34c6621064fd826319076cb1d5c5203d36e6cbfba5d9b80dc1643abe9c002cc92051689f93e12cf207aeddfa1bcb8d1f22d3699fb775a1e1113f16fd08e42da31d2821555b80c752721d9ac209415370f04059c63cb26fa41d0096ef68cabb7b543592b54150fce70669b2643660968c04cc7d2ed66e468d87f68dda8be5109f2519535af9e0b5fb62cf95b282c389e9856fd54a6444cdb9d72fec929b3196b3f5ea9bbab9614e2cc78bf2a53227e4f3974c368c8b7fa481501978e98379e14062dc0edbf05a8f98edb4a5a22480f62642610930b1abfed3900548b6b445d7d8ced351af5b594f64dfb17d2afa6ddc9c1593cb57aee4713c82a90643ca72fa0716bd0c0ea98461bb0f6436525d47ad4745f28924c8bb967e351ce7ba970be55cebf6620ee52aadf6e8ff2a58901cd0cedca36bfab79285d7d91ff17b92c7d1ac67ad8b46ff69c6717b61334efc06566eb74ecae0c302039c0000", + "weight": 11192, + "vsize": 2798, + "discount_weight": 2466, + "discount_vsize": 617 + }, + { + "comment": "Transaction with 2 inputs and 4 outputs", + "tx": "02000000010265c1a5c421e567eac3408b86002ec2cac34cb11f6c6f0344b53fdb8a2fe5d74200000000171600145b5e93bd6d3db526c212c1001591ffa426f3c8e2feffffffa426ace5b8c930247cf8d5eb770e220185b55e9b8ddd9009b92527d6c36082760100000017160014e0f4711c07626a8d15f78503d47ea13708c82f28feffffff040b85401de91c3f424934652c15b00c87cf64163d8eeca4063f4d5eebb05e6a3e2e098392af4d760ebd5bae99e5f75c6a4e03f867e6a71896d930e209475817e3393b03cd899ea46a41a2a6f60e191531af662920d468c590f62fcacb83ef40fac9586717a914663036ac1af89a04569bee85017a7d0e0bf92332870a88155dace95bcd23494f3535d7a4cfe4c72f6bd382f53074a5f0d61821d6aaa108f4c3bf6e149ddd2a49682ec5fb30acd2eb152104f52cded967f9478cbdb87af603ed9f16cb3306c159c3319fc39b06ddac69822de3c93558dd9f2d6b291767acdb17a91425a191fd044922742b497c097d5288e1c92acb8e870be1436610f55673220ed543f5967d5359ad9f9ff3cfe80391df1ec2d5b742f240095f363836349c5012b7cc6c04dbee67d1f62e057eabe3c93943ea6775f6b470c5032a7078c6eabd65dab31487d6581a742fdfdb88df7119b3f70109ac28e3567dd717a9141b657d7c7b77763dc834fde13cbb8e350739619f87016d521c38ec1ea15734ae22b7c46064412829c0d0579f0a713d1c04ede979026f01000000000000018400009def2b0000000247304402202e7f8a862c5420c55d9cb0ff91bac91e2153178b1c2d412e0acbed5943a802b00220480afaee1a779059141d923bb772ddc2eede0ee4324af86cb2d78c02edb0c045012102084fb12be92676625adc3319b43e1c5292b622ed8e4156a2f14d95dfc8d1e3ea0000000247304402207fac08a34ea8564c44a00367098a07b47b4a0e2f3f0e134d523bfe231e0ab2e10220541d7159571860f2a7996ddbdc4da44bca186091f6a4a513113fd74a52ce7a7c0121038c417286b254c7da2a4b37d13df7ec35c80de8562c64bd08ff21d1598999c1900063020003dda58f718c7f8ed87468cc71771d2763fb31860af6f18ea1c9a7f9b7420fb9ebc6c54676e79d9f77ba5d5f6fa5747d2e560deb927b0de9e8f65977cff567d33391d65aca5b570b5e6c83ec961b81b59b8c78059f4a18cca2aee563cd60208bd9fd4e10603300000000000000019f3afa01366905c9b0eecb5c39bbf271c29bb7ff91e3bb8dd34aa0b3cc27f40473ffa7885da6da0062ce87f57459f2af09788f5cbc520032cddbeb71206e45ab85bc4325f6753b5bbbc9b7313d6c2b400b37fe635b71476737e398e89d2e8e27190015708e4b676a91dbcc8e9572e4da3308b8615231f4320aa90110e5a9cba4c3e3aff22cf6a152acdd81ac520468154fea739f0635c40dc5a95ff49f316a60bd978d76b5390b8f9294e5d0fa2b40e51e4ea2c9d7a402b1a6590ff38d611dd671399bd91f4d0a93ff23b97c24fd088b99211060c43a237293f75f93f6d2ce40e5a94bc6603a28fe358f2bd7c79fcd4df0ca9146ba071e380b1f179d19e08b7a4c845eb7c19a38f6db94a7b89073bd7bed874f767b6719e4300b94545f817e9bacd8c2eefdd626ca633fe8dec35c1def9a59aa618e0bbd7183c7c20bc7a5a5c564659f3d29a72a6ea68b735963e2d25540cc49d6b67b0ce015dd10b083d202fe84b0b368b27a08806bd8044f0460c1e6d0fdfb5bc05a72de7f2d03318759dcb4ae61b8f861ce4b4d3d7c4985d737385e2f171d484a41f7183f51e700f420820eb6789042b74728ec44b4e05cccc92f4cc59b2abc8c3eb35b28111758d93b08f8b94c4c961b203b7305f3e4e59c71cf6ede9898908ee0902df5324482597e75fb7165df7295da777e042f2b5ac67637f24be0e0e3234662fb4a2de6fc72e9ffabafc6f9593f3f0ed47fd412e2346a4ae8dc3538f768e97bd594d2cd07abdb7efebda3a3a802f7571976592041d298b6d8e80a5cd0013854896866f1f2f61e6fa270e4a77a5cdbdb77f39a351743b83168fffa71783b456aea359fd6d442014b0df9a784ad3a78cf67809c4700d52f0bc0c83860f2733683bc0bf691d59747044055517e901135bdbb88a1f6e4db57b96820d2f0d76fcac2e0ed7da046cfa11773d6955a419c6080b09320196c4319ee1073dd007ffef828efd87c7345423e3015f13edf51debb05591eb8c954e8f3dee615cf831c1666c6992d0997f0184b086711ddf98eb97417655076122229983eb780a7d607d1c42df1cd1fbbb893cda25ed0def925548f97db8b97899218f11ba5d8f8856f3b6f695b84860ece94fab3969fcdaffc52034bef70461aa39cec4a6cd3f4c37a72aa01116d0494f1b6d6604f240585a1fa064479de86133e44369bc102616410c58c67b86b767c6192c4db3f0a8e1260d9ea979d63e80320b998a5ee32e564f7e945eb6819931c46741f9f8ebd20c683b3454336a073beb843d70c8f7ef22aa08584e6a7723df645710dd246296ef761417abcb561c93709af650b5eb41a31d8fb8e17ca8dcd024539d0c9adbef5c2d7b907ba91b46422c25f5ab8fdaf23d735b219e6ea602eaf7bd5bbfd8dfbc77db3e2105070ed3d9377b5a7e679f1ea5c92ec81816cbb35fff7c3b26289d25cd1d59411da40a7dbf3dbda1e0eb5e53b5c462d28b4a197dd852c27e4bd470dfbf46d62cf0a699f04f482951ffa15c2160579139e4c8b22b124fbe87ba5b727361127c1bd48818fc193cb89e32aaa1010d56b73f15160c332dca9327b5eea4562528d606e218ce035592e25143a1c16cb516b22d3dd01cd26cb5fd355898268f0c3712f1f070c1ac93f64a2b0006203b893ff4b53dca0974bb783571c7d7ce7f1a2805d50ebddcc7814142935e50939d0eb401718622a0280632d9157e84d77f2102f8fd9b97af8cbe848b5f6acb7af6a16a8377eb7cf505f8c31918c1a2e917bbe93cea7c3dc54e17fb2eef2771706955dc815d5355ee7eb3e81ee795052a2026609067d5d37087b2f5cbe3ff87b176e7722cbb58a1f9a58ffcceb394a2bd0b6f3f276aebd2d2b9b85a510dde7755fc8f4fa17e4f63395c631f350ab948516eb8c1f481a1eaf3d57bf7dc002003eacddb68acb13d5de234f5964a6d69b16382fb080c0c572ce1d826085bc3bc27231a3a1e7e1f190e215be228dbc42ff51cca328476e45188b92761dc298d1600782027eca3dccb741a9942c7d045ba288243bf3cb33717639921881e38f297c70ecb0aefed97caf8b663206e637e5c3f0800307f05b679ab7ac6833a5c2b719b03f93894e2dbebf4d4800d89bc790f2e3edd3d4e06086b1efb35ea542bfb6e96e85ba54d6c780978c95948a84c94df2c05ba70682dc63b067fd7b0d56ed45b13850225726b82cd741050ad0b7e555e650d2880142e0f2144e6faa214c9ce285ead0d443d93e9ae113fe4ac25333580eb1420b0dc68f298d3158b69d386385483c7567190837ffb8fed85a6ac57d7949e9470be95bfdccaafafaab752442df010d9cc502a5ee63c7ef3ea10fe8e1cb6a0a12e3633bb38319f2392d926119c9f93ab91e7e660d491235585cc58cd363ba0f9cb86becff14532ec769faf0296c636f2a21ed5dfff26f588bf1a0af5c4378441a8e5eb5cf87d9e7a137cbbe8246a1bbe28b2eea6579d718ab9a53f8bb51baac1ee5923d047742659e14cafec8186359fdf4faebad2562aa70f4ecccd93040a86486cfe1c46052635d71a64ea179bea31b1c2e0a2e644a91bdc01c97e9ebe0b191bd6d7ff555bb9d277839b2c79e4e80c46c9921e9de5b08963897565e3e0923bf6d483815b789a9a1418f71c59c82b6918037a1d4c30ba91fa9157701f51c32506fe27c40fb0744a978722c0ebaeeeb68d176c63925a0094fb60103c306a2d3f018b6668b93d80538052b6b0e20fdd16c63f4eea39a3b2c6a809bba259c60245ec62fb91daf946dae4f943fdf5a4c5e5581a86ec83ca3e37eddc2f05b21e25d8f20a9e78c07e2effe66cd60ebd19d16e88dd9464cebb48948b699fd442b5827b0e1641a47413c99f13bbe5913c45e2da3ce80ef17ef7e0baddd8ac10770e4515f16f1cd3a335bdc5065cf298d0dfd6a3de4ff62eeda79abf551da4d7e916c3a5c5f009021610be64754c92b4d3034c82f81829e863d85e3be23c9a18a1dac57795e189bb07cb27a356623321475dd5d9c41617a1206e0d5eb0e7e89c0d61ea12d0bdb2f3a08a6cd9c185e8abc3381375c4a39ffca40d94253b1f773cacc295cf135a042ee5c4ce5bc6e363ab7269392b4c68e66f67c3218949ba027c0e68eff65bd2f668ea7bf2443327c057379dd22584919be5aae8f17eab5f4e567d1d9beab1335cd4b8202c75405e6e15aa936e6911caa54371ba971149fcd1beb6011f003f780a2ac0b771155a3e834e20b2e7df746543ac6b8450344b7db63aa0b40605256071618ddc9d73fd6902cf97fb4c636afaa1bd02c70ebc15fc309ee6845e3e8bb23f7dfebbda85b893bc34c285c09d2ced9afad3fc59cd192f77d568269e9068aaa702e9b2cc3faf6941bb01e8917467ee54d99b9220f4260b58e84cd65c7997b8741b724c805f9a08b1ef6b6388ab4a912f13144d4f1b47c21f29038fbf3af98f2bfd6294d1c450d3a66a18f1f3c12026fde8b923b86d52dc5bb0532a93440861822bf176ba6c53adeb42d2644e4affb374583e8a800ef65160889f6b453f3081ca48d27c96ca1b0bb97d190fe8c4b44089fca0efba3e84963aa53ac40ada2d1bad3c4aae376e68ac4a10f3ae4af04b875f57ebb034da2fe757ebb0f8e4b102c8c5da83629933007b9c2c64714be5e3b8a9c45ae7a00e72a943bb1931159aa2066164a07d4acfb0017849aee73eff1d37a92d11eb9e27ad21ada31408b6e04a1175e8aa46acd3432aa3114f0fb10e34c1bf5348d693cdc91dff58f13d916177d72a7c242afe17130f217de0dbe04ca5d34e98cf0ff47bc791d6deab0a391699bc0d8458dfe1ab35b0eada324e10cbef68c2873d2e9d064d01258099b81a9e657adb8bb53184c639887463eabc4410e4de02191a46dae8b4db7cd831e76eaa4575cce1ad03239544b4deeaa38e3c9937172bfa1f13189364af23250963f80c3f3fe49a4c987715c335aa63b49e89f0be09a0062694f1ccc856838fcd067a3b6394823c67a55f352f301cb2849ec7a7633eb3c0858f93daff879cc341929f7fa988b379ec04c86c2b71f5d967c09f14e4271d06f6f9e6674595b5deca77ed39b038c4c0a04503a103dda6dc3b6f444ef9d03c1329f97ce35d5c36c2a800230065ad4370ca814a23051e0bfbd295117749a856f5dbac80d9063ed84977ada3a662b0f3854fb95d219104719614f20917e1455e9372e3003e5482621760512587f15ce89feb8a33c116bf7c31bdb33eb6db54e90cb4e0719883f193a489b89972f4881bb05205f6efd08e80b640ef1d4acc9497564ea9e4f00ef66c2bb2ce8ea5e843af866d6433a9f3db1b951876fa649763ba250f91027d8d1f2d9a9a3fe6470f67478723beb0456e1ce7b4ee453b5e023ad21d7757fb7a940ef281e23b3607f6e6ce63d8a40cadaf5c307c5094d3b228c440865e46bbcf046902bdfd75a7a00675ff685a118a6a59179ce32019d068aa000c1a6ee190537f4b9fd98b498722141d1690e1638554dd57e141d4835d7b535248bf6178d66916a0e65d9b46ee9b056b10cf55cb84df1414f6ced488b9f0be8a5cfcddb0b000a61b84fb3d391e6c38c1af57cdbccebee5e1775702a1b050ff461c00518b6c3450488baeba9a7dbfb92910afde9201383e33badbb78096a807e71ec551b25f2099d5933ab43b50f7d82c4be342b17cb65ace747c840f14db27639d90abc2278b38983b0dbc83fe2d4650a7095051d2a1d09f68bbc439da2859f5414e19b1612c8aae119152a10acebdd6677049954dee0575aaabf2880fd1b861eae7e332a3673d6cd0a74321096e56f65746f82b7522c531c58612505bd387415c91fe4c1c41af1ed601f8dae21a3e6b3e1523cc671d0160cdf524da1b07cbfcc114d18f64ed9589b29f87029e11bb82e738e83c43bdde5fca12ecbc85ce272264437376cab6ecbf25f141a5ce137517d6fb0e905884582e26074f447a451a8d9a7005ed4ab0b22cc851c882b074c3b865278865518bbe1436fee52d5406ed0274f4c8001c98e814a785e865efa72d66acbcfc2aa3205fbe5a9dffe5e7bd5ffb5fdc3a3deb1a1d216698a7b477e0fd970698507b63a7a05954e9d4cb0b15043bd39be489df69fe348f6e052ad5d3f00627be33f503a2b3d40b7420e453466f7cdf747526176d521154eab4da53b4c509c8084e584dc335ffe5601725d40eaa4e48562c9a9e347e4fa49858f245930f3b9bca074ca704a9dddbd0a503ee68dda376791345e2ed6f283e644f703b66f771b9b0d7ae4e2d81be80df9935e9523a3858dde77c8ac905c902c6534f987c26bf6ecd87f8e4bfe3f234c7c1d49b175641264c3e7ce74344bae05c79fc9fefac2f5b89ea1fb12e6b330ce97d9aeaa5942c43a587acd4089db6c69fa25face0e600e6e06b32ac26b05035fa39f50d8e9e995125ad90885e249e49412fe6d8fb669673e54f0e245f9213d30c89332569da7f1afc8efadd7486089c6f87c44612bc4111a2964b324652acd4998a18625134cea25f93a09c34ba0a66b84786ad8d8e30732860f6352166322e6501c76fc9099450670ac95c098a9d1e17e3d83cefa3092888b4e691d936bee0484b1137505754f2b44a70a0d8744fa64f9e14b491b1988928d5a4b2a1e700cd7ee215239a090c5ce6276e29df8d5c980623ad44f83f3615f8c5040d282cfc91f8cebd24e18ecbf93e1dcf56b1ed924aaaed1aa137b3669ecd2696e1bcdc06bd0e104110d3810834c74ebf38281de1c1f87f70cc0d4a61824840332c446cfbda7f37c92e69ec5629cc59b5e158a1107b627ade5edbef0b665106b39811470f0c070890ef664885d92500ff474251f56eac69106a1467599c79840320a6dc56932086644c33011503f9a397beb110ececeb20a00ca0e226077630200036fac08273b4f492e87e9813de67f3a16540de56796e229d34486b44e772512e9a2ad83bcfd4aae0ded409f3167399a5a25aeb86b569647e8111d067ac50bef976afaa1729b7d0bdc43aa315bb91f999d26255a18fd7a80fa821546136442fec4fd4e1060330000000000000001f073e00013bfa5f82f45d0024c0809caece86ad257aff66143bd881fb2dfbbc6cc359c4ab16e8c4b4300f61972e27ae6b2cb9c06dce90be90cbf7bb189444341e8c4ece299a43cee6d7ccce5104713dffc7e95ed6ec1fa12c76a6969e20c698f7bf1e844459ebf661c6f74e66563be40d10642ea08570d1e97d8726369375da2721090ded210f4e56188d089c6de1122f29b868245a8b763e431d3dc5f959ac9d84b3f269a616a7e7deff256d1eaee8f12e40f10dae482a49fa5c8f62094b74dc48b828d81f119482c896e3551ec7139b2ac20c510de8c95c7eb94c8d84434b6e320f6c2df8132fc2c04264cd9cdb99f40a39cf763415020298ac98e8d1f83ce834394f2f1cbbca580a30b5dcf37087f5a109e97bfdc900b39a2e9d5d6abc26444239d45a3478ac49670672fcecfb58deb9eed24383e638611a0462c2a5523bd7c9111e040fa0e7ad20d3d51cc5c71268d93da82760551d45943ef8228ca5782a0e0cbbe8c9c75861891eefe956cddee8bb4755a867f491dc43fb57381bb8a092f8efef40813fff591ced33ebecc09c68f6d547a15ccf2e9b331e6e211d63dbc139f36f5678ca362c84906075e353baf1beb01768d52473cb29299fe3d954cc30180a1e548a3e08d261c51235ee4072fc508d7dca458fafea8297e5382bcc1cfdb64ccd1fbbdab56cff4a0891c3e5a61356c286acc21d86b7978842a399f6c2d30abe9e3952bea58bd80f66a6f97a2dda11340bcc41a519edd56b05e1807ee980587c3266582d799c05caeef28aff1dbf9fc409111eb3a28829177617d53c7a53ab7de20c430cfe5c6b143fc8bfd7475f801a9690d1ac3c1074e97ec2336dedeef7294351253b9842eefb531efe47e53d154abfbc98ec848d24eae30ca90809e62841bb3ec11173fdbbbb880192c667399a0eb3259ab08c30369184198476618a4f3928d50ee72f93e5345f8ad2eb93f7dd58886e253d35b1811b6bee2f71eaf3880d4ba2bded739b6ca87819f7e01fd03d586efac80b61fbc2095a54b0685d9ac38659c34b54a5ec3ec24ddf4d56153e2ffe57862120cfa6605ac4cb556c76e0a9c35395baf765811087d4610fb3179ee2ef9fab7c3a90d97b7b6b2492ef532aae62922852706ffc5452d989544ded09a5e72237728e7df9d92a77fe2e0dcf56bf46b29608d2fcac37df13bfdeb13e74d9c20dd38f391139e8c0c83143dac39b6c64cb8fad3de62d611f28978b2885ced749f2659e9c431e55c2525f2df6d17a08c046a68c2eb0383461d96dc322e745053378610f66cdd91a905fca646bb3cd60cb165e926483fc8d130819984a2f92cbc88b5f6230a5923a0c803b4705122e4e776fa529366b27fcf366750807301d29809f99e1b513bd367bffd349d93bf7ba8cf31f89b7c808d1fb4904218efcd41adf4bab934a1630b83610aa6f17c7523d6e35cb55d4916465e579831b5f06d4f1ac8ee16506c2c30540c1b0c1ff594bbe44b34a17a0aba972dc9515a9315637c2412c84575c65fda1cfe53ea283c7014a16729b26539e9139247fd5359236d419451ded76c7a77c23a0fa6bfbe728414c792e265cc38908c418c800e8117cc96e8a36813db7f1167fff02abdbb5ca6b7597b3249c3d5fab614ae71cc7c1c2f5ea57159495d174326f7c98bf22a216d6229f65cf19ef47182b90ad87669a794ab955ec5ab40e6f4d54433a31aa557a3f2f651ff474c08abeb289dff5e4b66a0449ce0bfea576568c4fd3fa7b316f003188304749a880b9ef40de13c2898c72190318e6b1c2361c1168b02ee293f3056a8732637ed2169e799bc7c3bcf2e44a95a4a8c773bed1111d4c18ace7c88d28f737efa36de840ae2ed4884f918d88b02904fb72f3e91630f046e83b94a159ae193d97ca922048fad6b9837a9624f7adc9cbbc01343b33a0a2e361e7fde52e9ea8ee541f2a723ab4c96d4716af2abb503215dc91312172ac09e2b41ee78a63efa2807a9fb31d1bf200e531c0fe990452568c4f9bb354e7fd58ca086ef3ef5993fcd015b123587d7debd8907a3d6b44242805b31bb3929120db2f1b644e19654fdd72e15e0a38f275a1c027b7933411d626ba76146100094203f33484790d964e02dfdf8778206124c9289461df5046d49f2c5466c31eecf1c25c08780bd54c74edc05b93b3520556c8225094d3d5aec362ace3d85d525b03390b01ad65c7202cf8f92c1211f89c8561b412f1f0f84966f8747e06a4375cd769ff6c5f38fc3be12cb0ea1c0a86de66ed2016413e9360229d05a52f6980814eb172665464941be91b164a175e1a8b38121fe12095943dbed37a514fe2454f74c6002cbdb52049a24fc7b747cfcf7d0a0b8a545fcc8f2eb38568dccf457782565144b3ef610c38de74d42de6a1059ae7a45570dace2aca6ef07fcc0be1a1ac5aa93e5a3923ad4b30c6bcc727eeb97c7f54c1a98d0ef3b82f0ba9a832abd9a0e176acc08b663fbc477af4d1a561080c88f9089d4e518a366ee26721e5e9b5e955790ef26dbd150b7e891fb8eec265fe20d05cc3bd4dcc1b79b31830ffcd30fd75d3f1b8220beb5f8332b355d6833c2842903f956037533d787d2a5f6aa454b097e797cadf197ada9da2eafbbc76cb74c3c9d262043bbb483c7f5f63f74e86c9a1faecce89e7e00c52ad1c91c50aee63bb0249fa05c89175a706a4772459d30f017f5a9e74842b5135b9e0ddd733147713841b9b8be1195e4c5414c0353ea1460faba592a405af5f1686c31a9892bbee810656f9cdf45641602566312294e260580b96e183819740922c2a39f1ccca81e539b3dcc88f4ad30000a27d01ef1f23455a7c075d5012d853c080431f2dce9a17aab3cd75349f80a22e7d97318679c3ec59327e07cc654ca374ba9497d0c590a7b1d10200e944510ea41b457196106584a5ecd2811f61b9fc14cb2940548a50af810f0d359d24d19d1c0ab9c3495cb2722ef982351cad33561f3c58e3d9f39bc9290fc7f6214a51814b170633de797157f06a39e90f7d8552e7c098f74847ab4000cf2213165c320049aea984bef0bd5e7f632d33f0a7070590f5caf5825e6d1ef98806079b95f520d8c85439d52d57d7b34aa72103bb02ac03c24e809e0e401d4412bcd880f5fc92e31274e3043e36cedfae5b48ba6f8853de2a668af5f9fde0aab320d57a795ace4859d9e8a572f4608b89e796a9b595b007b6517b09d1dd5afe25eff09ba36a4b0d8b161c2b16670e360b49e772cd23743548d695d6178459fa7d195f18726cd2e59c9892a5d6304644528cfb06367e6b55920277526c88a825d0a52c7437fed3a16e04dfe3de9d0c108f35de708f031a16669961da01565b101542a18513db92f6cb7f1efcb96a16f03bc90b30914fb8f09ab78595266f9c485163645022f217f738e2348a4dbd46e42ba8c106f0051cfccb9ea9e593b5a7029f00a62572b850456ebafc73bd8529f279f2f49a476a79b72dda8e3ab47385369444264b91430b95a346259905a9246eb4098f3fccacce752dbe1c02f60304c252cc31e557356b249b20075b01056c71b99371ff3917eae4fb29c00c39f13f78cfb96ac8e2763ce736232218c88b07c151afb226a8b3a99f21256fc8d832717b6c8d18221fb65b7ceab75329a3260b489ca78ae2eae0c01b68231a8b8786a413ea395611fe4d67f1746c53e56cd98badbf976dd86ee6ccf28249b5e3c4b589b166082a3e785a65973b92881147ca3c8cfbeb54913e6a2fd427b6fbb553bb5ac8721264d486e1a58cb867918dc5810b1b22fa944a74ad8b7038846cf63890c2eeef860f28a5be1d46f84ca5d24d1390ff563621f4d7c0717665cf67fc350ce2e7f4d6e239ac11891a8bfccfd57d48bf3c116b9dfda18f2240a43df0fd37587357eb91c2a5aa8b09a3634b59a85e4f040bf342ac0ff9d516c30ca6416e97aa654b9b73a73eca004e4228a4ab445217c9ebac84b34c3bb9945c81bcaaf17d0ff8da3dc8aef1bb268408a82edf874a31015330c59eac12d8c5125e3b41327f26da6f28f869e2864e88dcbfad39abe569d86460e42d48d95fb887b4f7544a91f50967ab3d6e771ccc75cb3ea8d4fb08d7eb0f5fbb69dcb7ece6fea781a056ce23a4b737257f574a2cbed81c2de7f1abe493609e1dbf591106ed13d3d5d12c5c692759f0b03d86f7b3c7234704be8055bd87cacf0088aee502f8afdf0e8b48e85154fde3f3185b2c56830bb3aa8ac1ef060628997e4e947b60a7416065a16365fbc64813d4e8d68c85b2cef37e529de8291cf0a54dedcfad5ed0f8a2677e98919666a1cac5bf2f23c3142f65e49bea3c4f93398717f80c01d1e1b593842a226193b57c9a6f6cdb0f5750e41db77b4b936056a3e2f93b9d52a8030767c7fbca1a9c4cc088e5104097c7146ed3ba6c2366a7cae345f338feb01086a3693432dcb82d7d92cfb6ef9a4b1434777eb0bed8f901ea86d765293a05fd0420ebc21a78e60479da86c4e43c2717f8fb963b32483869ebd697a8c3c513c382744eca1264a4e3801d35003cc103e13c572ac4fbe2fa2a4260dbc88c60af9eed72e84bad57749bf3a7638f9fc8ee3c17c92e7a3c72c3df99f70ab674ecf9859fa30331cc05932eaec0a2ed952829255029779eacfe33c429c44667cf253b838521da5317faf2fff0bbc60968877024f4bf74aef668173300c49d039bcd89777990864b5249d0c4f9aec9b540e9296c0ceccc85d96d2c8a9851c4eae381af7eea511cb448bc98a47794f07fd78a012e6a78ec65d81584d22647f5c2bff98e5e0d3aa9aef8eea7c4a8dd985f9b683beb5df9081e71303c669288b18c9a19a5b17015fcff77c3a574155fcabf7d598a1808f50ba49301eb36b1a6adc8fde22b425bafd86b061af4b1425f1077bcd15c5cb3b3a452e6e1ad6a8c97d59ac55cebea70b4d9ab8ceda5ccbff25eac4e6e79ca92533b39eae081f02f492f92a768b6986baaeb293287b52915e7e48389a494d36c4e05e82d8268487c950dcf37fa6a17d611c7a9f4465e3ec13791f17cdd7774bdfa4bf550f49a9c1b1bdcf71849ae0235991803f72fc701b394892ab9e423bda93e2d4d1a2374c2b7e394ab00e7f9670d909c5558a5dce677eacb22bb308a4aa2842c29e3f0c2d0947731d39f8420f7bd5677844facc3cfd96ff017ccbf6d4b3f4fc833894879dc34738e8becc91e23166e415609942ea3e361a90a2795cbef1b1a117f097d01f89d0e40cebcc528c1234ea0663b81242018fea202d12d8f5bf12feb4c9e810584e39c7f6808d49c03a29307051549ca17429c16fc11de0c274e2a1b09858943ecdb5cd98a716bab838210fa2ad1918db7527cacee9e6ad5c590f06a10a3c664e59b4bbd06edf459f951ed4a743b16b2a315d9f413d8494d7bd17ba45be16368a2ba283d93461b4b20d423a927b1467632a4214b1ddef218a5823b82096be7c70acd6c644f5f8a17a449f9ba4a662f29e232c5b1d96e562e4b6acafef54698ab2753ae6b044d4582eb425cf0a2bca4b2790968f4aafbf60f7738d1e1373f0946737d8f9edab34b813db03703e4d09e33448953a86ceb932717cbf7a442d2f87f362b8a9b46f0e87101bb802d9db82c3c5de51f8afa9e6c3a558cef0bc9a6609f766d09ce3e02d911e06808019a16df768cd50107d3b37c8cc29dc0f6377d785547217fd0b94aafaf910d02f4f25a26db1d657878eff526d9c571e2ddde39540847640a26246641dd6052ecdec204f64c2408fc9280635e7dcb7ce23ec4c2b9fce07ebcf8d92d6ed3e3441ec04fe6940c528fd0fe7b4a92e3d1055dc954a97fbf2bf1a3c07338534156aa5568a79fe6b4624c0afa36135a9ad07bd1e1a2bb12a79b9ebfede1c0c47f0d33dbc77acf463020003733f9eb34d9a2f404115ef8a7bbdc254a0b8c133b8321b7aaedf1a5c8d34aa25061156d773659446a9f00a72026d08ddb27a331b0a087a7b5a149b7d005d48b6ebd64620fcc9be0c8129224b4c3ed123c38704cfa2fe4e2d8d3346eb51c835f0fd4e106033000000000000000152d26300c08877cb70b78e608110615490fa7768d9b3ea10e663cf38ae183a405858b01431acca946d289109f5408aa2c1114a8fed2620d5aa36d37d8b09ac2c659e7f65fa06b491c6fd2fb8d16e55b6df2bc4b04ec48c07ea88894318c0b5c9f9480bb86185c0d2ccd4e561cb8430ec2d50bcd000ca6665fa037caa56fad5b4111197ec7fbd9ea78a5f42e9e6d93fa3be33cb14e142f75891e516d2ddfb877c39c657470ba7bea9e91d653224226a673a596f2e859221fbc604fa76211e9f470a50e6b6e45b7dbe7689cf9f66103e43dc0debf0c3bf32ae4371bfb4972cd0c8fa33b0a926ca87cca2330d7340a5df548aae5e2b57ce7f6e0b28b569e704708ef6678087119cded40af2c2787509b2680f356679d4e374e7209fc96393b9a127eac72b4154e09d0d09421e0cee230ae39c4d4c730c08382742871541c433c9d55b04962850f0ec74af6702b8377ec28e0ed97f323f803b37058ec2c8d7f12884cfdd2fe27e745486c618c18d6e9a80a897e06c41901028f7a5a1fee44cdde2d48d091f793215f4a78b85874bbb952f02bacdd9234bbec86e2cad13686a35dcf40fadf899ad1d510b73f483b03252d432a7fae38e53bee977abb11ab09dd237f9c9d8e866f59deab0a1f1af69b3ecc6c753d8a84ca9c78c14981633e3e325147b85c0257b286dbb40aa00e7164d0c56c11209f390ec3eab5c78efc9d4c874d808c83e3faabfefd8fe63f834deeedb27894977a9b37ade1b65383e785d339f45a834c56a8d0392ad31273d802eab931bc9e59b7000c8e5813d4f30bbb902192f7d9b39c5c6c8b6c5804507cec262d656c418cd384b85825beea9862ac235fc00b12c1000cbc07ee57d4343080dbe4adb63da361ea2a9e105ae7ee0177e7614c7ef77a652f5a1d60ee7a72bb52cf46b8f56cc4994fcc4204f5b8c1832d8a21b7a69545dc31c194bf144e17ec99bb0faac75771b4296f9d6f00afb8fad0230a91f1c6abf469aa2d0cca8237d48d320c9330ba4fd3dd483289d521469ac02d195ef78f185d3a28c9cd8cf26fee7296566140563738bad57d697f00b53b001d67463ed084fd702010f50f472e820aeb794771c7fa5e9a0cee324cfb8555602826faf116732fca49898ea6f55d191e4d79af7c813f4e69d8d74f6e450f48df3eb9c167c5ff22bcde86930c39a5481a60c139228e285a778d080ac9f807e6d8de752c656fa83b10afd893939c9928d90346271cdc4d0251b4d0ad9c2dc7cd69f3541647c969bac4589ccf5636c9473a46b7a47a8edb148cdbf4b45d793552fff0eaad0d9c15d5bb8c8b5a17bbf0a1e56de1e5236364cd67f1fd503e62d505fb953a55930c64935a3f4e372a5ac5e0577381ecd641837f74264679b6e26e44bb3e035e0697af7696a4b7c925e59cfcfa5065c9c412d295bc51811aa342d4f7941e3eb3764632999701ad1753c6083d571d34272af7ec401b0b62d4ba8aa14b37c7681610ad57878f5f358f2940b5086a78ba48741ca0777315771d2448be59cd08231f61a6cf73a8cdc831a1e829ff23e46987a97622a12839d8c9ef1af20a7560e761284cffdca5c34b09df94e387c069dae24d52db1207814745e98db8330ae66759e4b059a623ccb59b286b187b81b7daf35d7f24c7861693920f1cfabab01eaa0db46ceca5999950fe2741894da966ab0252078672e9f78bcd0a773974d5b8ca367af86b1a33089256a5d29bb84f8f36178b05fa9c2d2022e2aca66af6e5505626ef38ba03111045b37f97657dc6e8b2ec448ff20a831cc3a4e678413efb63621d888239634b6cfe7b3192290d1b49d734ac0dedbe8e6f26bbd8d5afeb8422834b834e705d8af68537b34c9e167e62670dc6c0f5a87d312c4208921877da36d7c20ea2006dac8bc54b9b66457543d5214f1d05d9a4ee2af2db08dda5d0bf95528986f74ec6a1aa7c4a6810690781f78e70f6484ee14494757f03fa8b504ba610137085bd3c7df15ad4681b7f2090320ef6db06bda06f12c660d459d18aabf0bbcce05e89266b82f5d86b372bde0fa652d291146e8899a1e0e06feed4bcfa949514276ef3a8d27c43ee5f29d8bff4b68c9a18e98da3357bbaaf4c4ecc4518d949eeb7da8d93f053430fd8d3aae3b2fbd5333da080fb4c522a6647bbd6e3a7836ab890c380fa599131b627968240d26a48ec320809fba455b0d83931548edd0a712b6f23dac6ac6c7071977864f6d9a454b41c03f1ccf3c5431ed59829ff3488bc6765ecac5ff3ce8da37ed262dc4cf82edc6377a37930d766c350811baeff0181682d0ea1bfe05897b976690122edb13fca19fe9e202b8d93f04cf3dffa8a5d65c5e3ce4adcdcbd35fb16b29b1ceceb6ed40a0ee6e210466381837a2ac86bf2c3ac84b828fba6abf7f3dd638eaafefa63d0ee01b3c0baed62253be7092715de9143599cc3876e88ab804b70d326df8cd01271510bab2109f093c5db8a6557a71c0e6583fd9bf94d6f42119e9ff998b5c217be87ee1102ae472a87172679e3b52033f5696f0782b962faf0d65274155e7ff4aa6093a042d85b3a63eb33ee5c09bb591f0e937fd9f3cf895b93c895270eda8b0d13bf7c31d4664c087386d51747dee7d6aecc40c8fdec03fdfb728ad10741d5519b4656953ba5aa0a37958fdb95281111bf8543f40810e8c65e0451fb105514510e1dfcb7fba4140d2dccf998c42a18eb34eeac72bb9cfde8c92b082085548d372214dfe82471307d59013e3e3e7b17ccc8f3a6caa907af23c6689c997da08780ceee5e619c2a8777bb17656d2fb2e22fc4ef2e28366d57411bb7b9247d92cf28d08f0054957731ab095429da4c7bbd84edf3b1d5f1b28d616c04e711e2d745e4f7ffe436a9c451db9f186461ac893a1f3de4fe98cb4c62cebaa03f1edbc8cb7ed1eecb30b7a3715469c9ec0102ef5d94dfda77b105bb05818ff9fc5f5b08fbfa89d7f2b4c04ee45dbc43bdc8a29f669eccb186ccf165c8b2478eea3ec97f87c2f09b9859b2a14aebf8e2e3539daf6adbc443806ff16c0b487ca6ba7bef673251577854bf73cd9cd6188a2b79b0fad8c926008774aa4bec32a733e8acc6e0547feac456ac1c58d9e33e8a8b951bf6f8518ab47fd9f3a74db6e63065aaa220ca238f3204460457932a80ca02bb9377a42a742d80222eb74c2a9a3cb7a41faadc4abc30b034bac83cd290a4a195c8cc0646c571feb215f2b7ed42f6ae4bd80d126f55853ca04bd8cd69f9c2df9450ab998996c9f26838a9e753a1c49f8535621a1f58a1b1155459b1550aac450165104ea37fb0b0fe3883f6e522b518a10550451609763666b17f05484cfde75bdf7ddaba5951177b7c8b73362cec76da2702307bbbee68b3f7bd45cbbf591c1490c2c1a3f9ffd05cf44eba242745137382d5f55fdac29cee2ba31aca327aecacd575a1261d9896f7d5989dcbb31a2b71d586e2f32bf0794debe4f6d912d3a6323cb1711f69c98ecd950f2c5f7a736b7fd462f00d04e6748423c3e4868585ecc06d11cd61707e1314054c7cb1cf414eed96812ca9b53110296e3cc70fe99618c411c83ff938c13b425aaf11edf4916df79ecd93d2dc55e772aab4d565ecb05a28447e61cbac5120bfc034996bda9a7a1ef0d32db42f5b87a14604949e692213a406ad187d03e4e9bc48b05b377db77255ae6a88d1419fdedca975706d015d03b9e1ffb4842bfe20d4476c5ae1443c98ff8d6c0e06e0ed378f1e3cbb6863a33c64bba731436c1f1891f9b24b1a6ce623abeecd021d663c22357d833c91f4d26dbffc62fea9042ca4e3abef2dd1ffd499f8cafbab5904a5b26de4d61d2552fa080741dbeacc0a8d4f8ae8d8f291ad02ab947d24550d96a5a66dfeb75bb65e4e61d52c6f182b9dd79c5957a783dabe93bd3c80de17e611db68c47abbeecdc369635493bac45ab95fcf648f1a60bb7772c7c5e08f0ba4413c3fd10121a9761babea2b94d4279697430865778931c2c99b69f97670d019fee3653bb17ec19eebc27feb9b73d802b57681684186819a6ff494e58f1ef553dada9291da5890dabef1314e38f316b5fd02134423bb652f8d6946e30680545454788e7a21e4a95057c5e7fcc8e5c8da4ec5e9164fd29f2d8fda77fc7c573c00a9c0c4608b4f466f3f34bf4a3eed2989d740589a1e58d9817b2af1279bf0cfa1dceada907b1327704cef6ffa9b8d488dfc0af7d095ec281c924fd07a6e8b07c913b736c54eeae4382f796c086d683b79f720d3b6424d4a062d1c5377e6eeb5ffd31003bbbf8544e084091d747d3debc0cf868e4447ce9cf0154cc96a4568735002b17707ca835f09be9359dae6d370db3be28c9ca8756aca094f8eb8f53d92aed941d87875ff32c3ae73951fdeb826fd1f0da41e6c2d9955d26812ebf2feb54310066ae3b006a4dc00c479238c6799c9763f02321d2de18cfc43ea30009acafae17733e200fe8d438e092945f23cb21d5b58145f9c94b0181d9de2c6e4c8f2305fabe9cbe4f1a091aee08d86cc81a86698da27e9a41e7bcaf1d0f12692a52b42e3fbc3a425d161074209e80c913135dde51e88ad98181586ebaa580d14fd9d990ac45a82a151539f32bf2d687ba9320167ff41c17471a83f51bef0428d4ac170de897d996c3560c4a0403ce9102a714fbbb82de265291a78817348ab11719ac4522b3b431e5482859537c98d716ca29f3b8c5447ce61bc518aff74e4ba63246ad6e15afb088c7339c3bf6ad034e616168586df24c426936ddb4ff2f7ca5d3bb500c82b5bc9e40416be14256532d6d2af8ec74018a1edef32672e6dcab301eed35725431eef904313307e402ec6c22f4c920cbf5b7f2b13ecb9b38e070d690de95e8889afac5be965ff0bfa8cc94850f163e918cec73f976e724ebd250b6bf090b3401cac1c4b03110a1f333ba14c1d18d4163b317fcbb1e504ac7f5bb4157da03d8d558e2e28ed39b1746543a9de70ad1dc22db5dd30d6fc9105f41835f7ab62f6385d7d6d1c7dabe700343ebb2f3c1bbe3b495d6787304d0054506027ea9bfdab80614bf811212e5afbde6f1b65620d6b8944845ac9558a64a1913269930b6bc157f277eefb1074dc15d82036d4968801facf0d2e7719c8b121790663ffaede7a91a1f4bdb2a83d7336271ee7e996d6721673b18afb4d2472ed31da440b7fd452b1a5b24007dbdf780f9f130fa3b73baca86f2a4be1229ef5d83e8ad3582794ba182553a3566392eec9f7cfcda8c6ddae331fc63e519e273383460edc9e83061a7f70ffe367384c6f54952d0c551e39c321861e3b925fb3ad7c0d2df20874e649aa642a8f9604c2c227a3879e1859e1e238dad258117c2cddf963c7b4831d7564c66a2e30bd6286cc7295da97c5680ef22156e4dee2ca43ac1a1a12a065bbc82838cd81f48c7ba19780225810be3496067fb1e3df473951979a68a5386fb956aca68e2b8f121fe47282d564a6bffafaac66c155e0af643e73abcb7c61467c9f832a2680343ac58760156fcfa0db2f540a221b9d9cc864f53d432521a54f4cb9708bb127c85022078a86a5849f8c5dd2a6fae46980fdbaacb0fb41941fdcb9900ecac65545d286c14e22d5f89fef97dd2133bc20649cb8b68ab81504ab7fa61bf544f94ce7f03f2fb28102e7f7f47fa36368bf1c17fac2c5737eabd07998c923d8970ae3312d5da12a3b46ded0bfc2415020246041e162dde05b14888b536b5b870e109438ae2571f73671cf3b971d5e3145c50813a416a6f6e91c7f93d294af8fd37061f126a6404f98f2fa1dba62716bbebe6fd4b527964b49e2b26581af30836ba8a6a28af460d29d815498f571f63e1643f9806085056c338c6c0ce01caa00a344d0dd6afd946bfa397813196c9992bff90b10000", + "weight": 15261, + "vsize": 3816, + "discount_weight": 2268, + "discount_vsize": 567 + }, + { + "comment": "Transaction with 2 inputs and 5 outputs", + "tx": "020000000102ab976c6e4c2bbf73afcb1c4fc1b43b4f5773f82bfd178097ce1b4820d3995d810000000017160014ae3d88abe6df555587401ddffd10796d3e178ab0feffffff74ca98d2b5395790ab91b6067134057a3a02d70987051d36370f1791f8088b5d02000000171600143dc23050c59588f9620545e8b757e4da656f8960ffffffff050ad6e9bb5e976223d5202ba077aa7a5a24dda275e94c8912d893398131399cf0f40866ae91721f063e8bc3b2c313e5648ec645aa0de5e7411ccf202808fbb47338810394221b6913ccd26cf3f7286057d59cf36849c88da453c26c2341c4b689d09a6817a914e068abe572a132f57955f66825a8ca980f25464b870a48cbc3c36cafbba89092fed6da0dae74b72e7874b91ffcf11b4797e2d4948158091de50e3c8a35bd82969a399473f9e2bdc353cb5eda1964193a462d9080022d850249398ba9ab44bed25fc5136dd92b8e6e70156a7df1f3e011ff9bd46c21d6b2fb17a9145cccf7691fddf4dbd2d8c2204576a9d59202f7e5870afa190e8b73f8c7c047a9af4259875692c8d56bac7a56eccafd4f25b9e74de29908a2c5e90fe2a08241f7a0de26fe72cc132137da315810e74fafedb925340247a003fe22ab8fa8d382da43fca85faad75ab8bbf8cd87c4e264846bb7cf7022b9e87417a914f93ca781627fe5c7895eae88d7dc202d7da9a080870b44629faf6801146a3b8bfc0c167d4618d80471d566e2bb282d117fa66fd54b870874975c5ddeb9784331db10be3fe7b6bbf093086bf50e22cde490e8a464384557034355ac6df9c313389d17a658ed00bde74747262ae4d97903244f75fe8690c91717a914efbd9f0851e68d5413bedab5fa8e8c1683eec68c87016d521c38ec1ea15734ae22b7c46064412829c0d0579f0a713d1c04ede979026f0100000000000001f90000a3f12b00000002473044022012f46b718d225e6c72fb81e40ac8d1cd51a625169d68948899e5f83842ee7d9c022064fd2b4c93069e50ea4b3bbfcf027afc89658b204f20001757c8b21a9e67544c832103a644e3646f143153bc52dcc816764283fe67ff9d34ae9103e218e15e9f1e27680000000247304402203c01fb4c469b99a53e163e3d423b9a1c1f2d8bfc8573cf0f71adf0c80dc1af4f02207e3371d745b2a53e60c8bb8337fd8fae7e0d4d06a1b0056ab871c5ae9a6919b9012103beed4731641c564d8e4330ad3e1037f0f3c183fc70c0547663736eacaceb4ce80063020003131378eb2d79019106afdf1b53713efdf654f77556bdd71fd3b4c36f5fae3c5e6b4bcaecc8a99e4fb4fc22b25d52371180990ec601e8243841fc7790898f57349f08675e6c6e4ed61dce40a09cf352cf3b834a8175351372a9946125825a03e8fd4e1060330000000000000001acdb12015330547e27ff5b3e46c21fb47d6e204b168dc81034da199cbf192ae778db22143d316109054c5e3f93191b777daae791bc6a49604c8d1b04a599fa4396fc97634ea3b6eb38b00b6705c14becfa12d3e4c6ee789e653423612dd0f10334afb0818e5ec33e7ccc745118c9f45af6fefde1e645c849f7c50e013c85492fee376afb7f7a19d4db64e1b7c073b10365925adeabf03d319036665ad834acd5d77bbf30fa9e9cb28ce9e069bd22851f9a2612a79ccb209d8e406a553338b47c445cf535fcac43cb6b866328fcbdca7570f9d95216c6c708822d5e163b7d9c4a8459c4897105f20764cfa709e12d3e5013609dec0cbca55da1b07ae57795a7b25968664503dffa63c92af1e272a6c0fd7944cc6d5b2d619268f3dae022f1cef7cf26b3b69e24d8fc537a5fe378a3784ad6ff36562b01457dafd90a8ece8393fec37e3fd880aae7b90056e11309c30160fc9bc8c511467b27f4b66035e92985a77082216b18ae1579011c166c3acb60de4bc39f631adc2839eb8ebcf1c418b1061fff3d7f061c209dd4910632c6ca77cd7c2713c778a7fe77d188fdfc66a640b81a6496cd334fe08266df8e597876802c2ec22d7fd2170d42a39e0c794411858b382f2e92390261b8cd92533d085ff9956b7bffe056a2f32079179e76931944820ab61f81e9d3daf588846a3a0b82581383896d701c5169d9bbb07567cf5ba4bd10ea62234291fd37c67427aafa5ee17cc272a81e30d9677dbfa1731efd575c0488ec62afb4a84d1dc2b45eaee15b13ef7f306e7a5f8af9b028b499fd23e0f3de2b1608bac26d222edcce8cf1649f69f7024496a9e8ae8fc2b99d0402a9269bc2853efca8c8e5d91d5404f0d62686481e47e6b42f9181f9e68393bd2bb2e01ade29e3385ece0c5a16b0732e5d95bb5bf869a565ea8fec0cda97ac175596d9cd6c984799772ba931d1a5bb21fef90d8007243ea9b99c5c1237f34b6670034decd4d4361bc6076de9f706de6f9991085f429e42ca0ed5b1f066252272fea3bf04e4b35519d913d016e5ebb1ce00d9c7ad7a25f7045e3e31ff7afa55cbfe5c4528249c8c4c7c48e73828be519a84cc8ec2fb9e52731910efab2e527ab7e81afd0be3e6d29e002e145e3fe4af210461f1872144a1624b42a34efab592867f50d7f49a572b95d333d9ce6eb5375fb3fe32e3ae2423d73bdfcbad92a81ff847c71068393ae74d51e369ce59b860c59d990b06c41fb1ff0a0edaf9fd4471da379a80d916bc6dcc95af77c004ad97d0b86f19aa5563598c495f2182e606bb117036509b977fdf30b62cec0e73c33928fadbe5431e0e84b70fbb549fbed55d52112426b5b339d77bf95c492fe0918c793302818fc741d89a2e94e320ac6dcdb5f9cbc0fe08430558ba1490789bf88d72ccc5ae23265b8ee040bc790a59cb47b497f8996d1dd07d917fa0dec09331ee1bbec5d3fd34fc6789082e8cce251d9bf51c7f7d4c740b869f2b5fe46eb32157709b9c3edf93d44c5de58fab161a176ecf32bd07098d1f6b0111ebdbd0701a333e06c4a59eeda98b8431dfd6086a49b67633ac097c4fa846a635268aa27f19d588258de1ca5b94f62b0bf5bb703ae6cea9fd530cb28c470a2ab1a825e280621b7ef06020fa62673fe3c24d70a12b91c0909bb213286dae3718a381f5c2ded80c8aa4243a6b27352aab4dc709da31f26d5ea126280e093bb0e8e8c0c3e179e506b69fef140be05b5c7bc1c46fb575c0880eb5588d764307beb5c806648f42242dfa60f388f6cb7564e386e93d46e9dbebe4db9138b39b47ea382b1ccd0ce0c08a7d4efd0decfab6061ee5bf516567488d2abae6e466bcbbb9470d2340c48388bf9c0705746aa2ad913e41901d79bc342584a658e65fd01c386fa73fd65443d36b28e8e3df391073f5a60b4bd56ff6ee3463dc1817d0fa3ea843be41019eb4e4827a7119f9bcd3d932f6e6684c9559273c68feb85c10c2ab93f036ae20af896827f81c4be0a2b49f8f668a9b1345a25b9956e47010cc3783be09f82b825ed64f254ea9799438d0804f40e4db387534966b83d160fabb0f4afd9b098673ad71ba77953eb7a4fa01adf33be08b77914f296e1c4df5421d6449626ee42d76d826730a0cd965805d5abd13e0aae9756a2bc676a76addda5cfafa7da46b43a264dc1571feb9b4ba9c1b68554131f76e3e03316fe6c58ed5a8a91dc0cc56b98f7467b7e6ffbf5b74e926d4265fb4cf67a34110847bc051789b9a78e5976cc24b4843ce693cb76ccf557e9790ca726d2fe54caebb9f79ef1de03adb97f2ac8a6f5b38508e222d0807f68660bf8f0578181f3b3f54f71cc64badd9e5dbbdede7e026a1143450a10feb04a2637fd32030f84959f7b9cac0b4d4c75188dada232b457e29c5ae1e683fda8379bbd2ef06c6b63104042a43c3461c7ed85fccfc7698d959509342b6ce5c96539a995aa0bf1db4d85a315c216fa44f8b364aca031047fecd15f9ae7abd55f5b7442c31ba42bdeb90360645abf11303fd332bb6e1abeb76b49c435fabf51ee378755a40dbe7bee27ecf3a02b7a0afc018e5245c3c2a7163ec65e948341f9d49c9037d5e1d3c49e8222d9a278672603344f5028498f71dee2ec4b8603c5fccb444b02b4b51b19114e3b9b55015fa5c3dd58244ba2fb37a00a58cd8975241ea117040dcefcf63fcb6657515ef979fba766c507975fae2918adeba5499bafb5e7566fedcaa568e115b777c941240cf0935909f04bcf6181c8d2a56e4fd7d4e724d8635bcabc42da317dddd2630d0231983958ecd3752fa57fb28ca18836927c8ad6ccf27f38c5e61780f9d39458fcf00c5211564b10cb47b795dff71d38f976ea6dd4943f5f7b65cec3de4eee3337ba08008502165c34dda346cba53514ff8e65a7b6d3a034e426e3f20c6369715f93650d51827999085f3722667bd67c024b273a5ade9ef71cf49f123733d620d710b978455f9b34beac468d54a089e19f2efd1dd985dfff7e4c812d4b6cecbf6e68ee170e5182bcc316bc5123e9a7708f20f56983378d8368402b2d983b981052f09b72fad2da65afe117e0bee4cf10a5a2c198aa11f93900cbb5aefc5169dc172252668ca1fa1213199613fb7250b4f2cb12b393fb3f5360947ecf2c5869d6d47ef2d3d57aa2b08863acea3402b02b40ab55e7e528049c471bd78ba56de7bc640876f4d819474eeef05ac0d6cfcdf3299b2efe07a3bc21a2d4164b4a47cfe110d5f78f24827d56d9fffd03182f5c17ecc46eccf2a83098a8149178089247432a25490b5d4a7560de0279bc7087a31db63183f43624759936f78f04001872cdb0e5b9cd7e8d2f74310b4f71b655d2a2dfb1e984ac9a8d078f3ff130fef02e89dea50f23329dcf3d2f31bb1dff2e3f02508208a44e495ce022a8872e01df9211d6974a06df5ee8e061477178f5787bb281336b626bb4b59db0d9825e3821aa4a6667ca6ca5e41f2f76bb775279268ab73d3dae30ea712e26cca4b17199e198d1033125d58903c0ab67881d43c1807e0ee6b3da6258f96029f14badcf1c9f3c55b269a752d91fc42492ba2493c4f1331c49f9cd471310a11c624353eeb7b58dba7f9c5ab9d15bd8398048f9f7a19c73b68df77fe00070899bba94c70710347fc068895e045fa4273a43e868b86b829cdb57d2939922e19a9a4d037467690637dbda796c627f7a98d8db014843cb98df050df7bd4bff6b3b6b1770f83554e8a568c6bf9a66648bdaf6877d9a744998968a9c3cf3ac9344c860ba42fb935f7d2ae7401404a56663d5a3cc331e074391331343df8107b2007d2715e326ba9a34e2eee745f20c8379fd0f6f3367480bee9faf0c73a7d52df5338409fcc408b6f5a68d6fb8bc1fb7bb010c1271a16cc5613d7f35a530057c7dfb155d66793e546e61e4f82a0fc6cfb317673218bdc3dbe762c357edaefa34bc1901f4a91722339e065cc0c6e7ef16a7e61e2385b13330b5f3303a277d6495aeda5676a51501c0be28f60a36e71ebf2b702eff9e5d5ef5a862870e8fa2afa833245a2af3b3c3ea16a79d085d3d2cc52e91f3ea92a145007f212dc16bd516b66e0da365bb72f4c96d517526eb08b4a8c58006cf6fc83de23b17afeb32ff31b261ca0febd4a13af1ee270955e8c3032be719dc5f47e068c3f7755c2861db8c77d231d68e02720a3d36eeb0f0bf53dd81519aa9b733f3f51e4a7f29d0fc73b3641e0669fc74c9603324c249d0b9ac9f00da89f3b6fb88e5a639d016f4111981586494cdf2db3718a19fa4f68dfb3787c98db541438dc3bb4126681fa9593e40befb07746a7a7a8148724c6ba57037110e44a2798651e63d895659bc6b461cffba68d445eb2bef67f3ead6e52ae3562dca19fedc4edaf67a3240648de95e289e485c13ed97be9ba648ba1042a90133b87742c6892ac50e5bf7d8c3123c894fa6fca5443ea3516b52808abbd65ada9425cd6a5b393152a2ba84cc9ba876fbc3eba031e4fe611f9b7ba662cb6b46c218ebebaf55a6dcb68947f9269bd551f2f1aa564f22a68fa8eeba7e797cd172c35eaa0ea8e246be2cc102fb31d9421b0cb53a3d95bbdf1764743b7d4f0f78dbba9e67369edfcd2019fa70ea27da20eb0993c723c5d6fc23a4b0da4bc79eb64702e8eb7d19543364eac3c60bc318c17fdba028ec1aea11e370eb6c05303a021326b20b16d057402cc5e51d76fae7276f80226344f61e902a858b2ad0a91f391ff674d104f0be3329c0f15d7d777bb2678bc8b268d4c252ba167472cb44693a2a9084db2eb1bbd1155603a8c62b45f6a152f7da8a8d310d79c57e36ec43f450ac114f698e88d9a21766be7b5cf0f84265d55575adbbb2b7204514d228145135428b40f86eafdd61d849bbbab69f6e7ebe9768f748b76adfd4adc52bada2a1d9a209562467554eb8add00524b183ae24206f1768a4c2c3770b8bde16a3a62da89e89e07ad97f57ef6a63e4e6fe6a205811ae90f66fb1c50875366a9c48ca3bc285d9bc103f4169b2c5bd279b8436655ee76a022aefb902e1231e4c413d271195b49470d87ff3bb3e516b24e1fd0b1a8f1c0158d3275a9d1f62603aa2f73d8fb6a1176e85d55a803924b6306e37f1c40657035f04cbabe02fe095f4eb86966027c389f7af43bc8902fd13088d897e92fc7f038a5ce4ade6a1c3c3f8385dcfcb2fe32f032fe706362f7ff0ccc26f9c55bbf6ea5bf294b24d2a52b35d6e8e5682cb97358eec778aba351966808601fe2f3eb7fffea3acb74644148e5e328c646b5a727ca845bd661f7b6caefe53ad9e83f3e090a4f54f846f3abdd60254c1ed21a4ac7f581c27cfe81b6841a7227733f20bdef249e9c0efec82529e4954a6a69d69cff1e3ea27f9c856f664e2a55ef44ede8540eac8274253f0834d0dc0187e5f1276d968d709b66f4b78f089910eee3573ce8a9c83e098a61b5476756a488d4513a84187746f13931975f67d60123a29c083dfd4c02ca84bb686ada72a873e325803c087de3762fb56efd20b89726baf8e78c7adaca6c88b15bbe3f885cd2964bf68dfe35ef116a3bc2bf0abfcc1b3f623efdaac3462383b27a5485046421b49ec9c9e67757bb012d4d6e477f8c7977ee58a31d8d3e6b6188106b6c895446ebef7372666c620dd0adc598a712f4466962c66dcae7b70395288be1a4a7a6a0b1ec3f8fb61354e2b0e6c178a2692d34083a31ee4dec66eef8fd0b2b2f33fd972229c8eea3efdba6ef11584be3fc0f38770521a8e9308153e8ab2a24696f52aa687395cd9a0f91558a82b6321ca3732908d4accf78104a90c2ac49ccef693db5da420b1cc3b83c16cb7c9d65244f06ab4c7aa4c57776b09f7902c35bb6d9e58c7f02811b09b7f7feed63fe7963020003c6eed479511be281d319a5a044814d47fa6ebc34e11d61255cc572e419d57d07d313d2990b06aae88ee3cc93cfddd9c058d86407b7fef99afbc7e234be134a9c3147c5cbcd565daa2ba3163562bc241ec8a40a4d8bccbafea54a8d146ca23c22fd4e1060330000000000000001ef8d9700e10759fbdb67cfaead65c7edecec3a3e93c5d4dca786e9777542c189a442fd10c4829f4edba3cdddc6154f031e3b40088f3686ac1e36ec8a43fcb4ab85be1852d3dbde312c5972a49198d9d53112255a7650cbca7db0eda3186755a7d911fdef5cda4c4ac7f0e582b2699cfe4f73588beda67c2de3f1c86962b7196ded05ab22584689ecd3629832f1134ad454e0522df48cd596e9e56bfe588ac5b05f500ff586601c4fb4ce7b0f9b7cbafeb392e7882cd74077d1abc6e363061d50deb1d7b3aa70749157c53c4e3a87d032d9f032f4c4968eeb2e12a217f156ee80ff775491d7a1fa08447728e00f46a618e343130853d819b42ba5d6e5547d82d19a815b3171fc59970dee04a902d5469fcfa0c42f1e51cbaa53ef15110b8849b44931ed15b03c993f4eed1096fa86594dfb4b3c338ee3edc356812df940d0d3e9d801ab3eb69da1bdb78af86d83c08c7b04a20f030bf8aa478872e78383defeb3d07a5b61bad3262d9170f679485742642b7c877e67df1193e96ef857c48c1abd532ae96bcd3c0131c5706e46301e13310ec83f90722bd5db804b7e23d1b042401171ab5dcbe22d39d979bcca996d088e2cfe2998cfdf294ffab0021212005993c7cd74d868f8eca9a43596b2516160e6290e9929edac9d51f3cb4b02d31c0e9b2cba6d389903c401e313e7f15ab6c93361fade62e7a44c54125b59908060f019beefa2f11c936d54d8883e79ec2f0851270336b74a4abd45b61e70521a5b7c7340f7980ae8be0c59f6ecc2e2037d583e5a62107d4ac633a6b11eee3507a24aa838b873dcb82dae8ecabc87e61664de9e7c5c39edf56f918068c2077d06a0c197f8624bc1621a503e3c26689f3139dd52818506a9b998c5da7220caa0c5d87e502b1488b6123f7e2c0e79852bafc3590e4eb8480c1b11723fff908b2f139bfd666d9dd0662a18c42ea16d525897abc0313b9482c8c8b6407112145b5c1d085260aae6684692b64ea4219d16abd8ebfbd4a2619fce52d737db99e2b16eb44af4c8415c7eca0da53b7eb67d80d08668f334fee5a6147724d837d92f1891c2a6b9f3dd1d6054502585bd6d0f9790cb3a9e79b1befd52a7f440deac77c148c732e7bc43f0b85bc34946d89628f070e514ca11dd182cac222ae284a36a84907e12f9cd22be33594e79170201f415602ca388e43f3c193244eaf314cd9cba0032299761690ce7e8d3a953b7fc4538ff6823eea5290fb5c8ca20778d8394b09cce8b1b5deb7b330566d2cdb50f5f4920d026e954867ba6d498ac3153bfd3621daff51edbd1beab0e9e8d9e496bec8d9d5809b37b3dae396d29b8ac1fe7e6ba5646ab4b3b65bc47a4e90ec68e0f263c33343ec2735e6b8bb480614e07aef9a4d31c1b15a169ec2b00def13c5cae2fa1dcce9ee112ccecbea5a7a2ab722c7031b3562a829d78c09979d6a7cfd65b529fcbac6a819788746b4ca8d55a05915cac934f6aed14760e4bf6fdd1739698d52298badde1e9cb0e430f32236c00b996e7c6c692af02c7b6d5519e8f60ef29616b2b4e977ae2c922a3ee5910ad41f1deda9daba8e2a0ea698f81dee8741cee1842cf9682e56aaa96c7c89e8ddbf3e48b198206106263ca3f8485a7fa5e73a5a7d86f44b327e7ce93bfdc87d254534d10c59a6f0b5c55d17af4053457f57770731032d494e99f6c11920d37272cb7a6022621bcecc6ffeffefa440bac7aaac11e04edcca59424235f9f7fad3eeb95ae3f6befcd8f01e7db60a2429f52a7a5e0131c4c4fab2f4eafcac33e4d91adf9bf75ca72f7864d0dd03760dc940f347c9dcbcad535929580350a73c89a88313ab145a497bc0fd41144a8af0e1a21bf578cc69a164757412a2e2bb8964a3962ca4d4c92616c9a0dee338346d7d5a871c2eff7683b3ecc482f14d5cd76c01db1967b3ff1f1aae33c5f677ccc249b90bd354a86457529105944c12de1097ff49498f704941f4860bceb4c95c07b6da2e55106cc480d988ab94f1721b6a744e968355b68a392654b43de75843d827f17290ce4bd03c0dd1f2b72e7cbe6e569a3bf675645a3cdf04e6d8eedab197050fb809fd385bc10af84fd4cf8bec449a2eee4d6030c1c2ff518c6c2d852baa06f18e926add939f69c1d7cd038dc3a348b957092b51da49e027ee77593c9d2e4440b2300ccba82d8dac76be8482dd81bc5a69ffe27876d6a8899d41b49d9e71c4d74b061ef2caeff7bcc05588434469535c5586096767af2bcde19880e8daf14061d991b5b50708cb62ceb2c67b71c70ef9c7aa72f7e35f221ca510136e51cbecf2e55b99b61ae66f1d3d495c899c814a25f847debd30b06c19c8e4ee530b3e44fe3c8763a99e77cbfdf2e225a08bc25c9be3b39c6dc8a9c0db0a9ee0286896f2e36a67715f13ba8010613bbe22c4cfab5e0e8a9141def61a687a7d550d271f20c58e1841429fc6d9d42c28bdfb4c179b128f6b696a124187e8b1be128151cb1121b378d34923223b52a6483c757aedc023427068cef20d347eb5ec15761c68e175b0e97cb77414a70b2da690fc23202f1054cee718b8a7ab9e4dccdcd62a2776ae704116b232d42b5fe071748dd946b8da637b1654edacdbb4ea7087d1156cd7499b4454a1891ddbf7c4d943022668da24ac7ffdfb61c97f5728ca2592f8f5aa6738a1f27cfb430e528292b8ee3fca9bee53ea473b002f71cba1ebf80d7a610c472a1a40b6d5624ab1366e6cb3962f898d45c886164221eb68584aa302aeed53025fbbce0705d620033b7521e4a14f8310b3719e60024044140528b1b660845d1dbf88a73e92eb1e703667390fc02d24c5cb7546c57ff20924715ffa443746a7bbe010c4c22a9b7adec6c8a208fa7ef080f5e1b4250c5d7137dd1c171c6dca718d38ec421168919f7d1d32e0caeb2617d760e5315338bb92e89388e2f8ffd59796a260539dea8c0b4044c7d0557e85e4b5d94781802249d714ece7417f03fd553515376a5e557d4eb12d5f6e3e50b26f63d39af3a0d40deab57a97944f5ed39e2f26906c18b4bcb7442f363a85162f3ba84fcf8cb884f3b744add81539c83c238138db90105a7d55a8ed180076946fdb9041ca9d49f11498a9d6ba47eec1ec12922d045985d3ad9c221c5bfa00c13a3b9c4724978e6cf0293dcc5096e88d6a6dc05ee7446d3faa428938ea127279b88cfcede2d0f1d372a2dd4e42ea3b3c2c6cc02acb28829c9a6d04f7ca35e5d43eec6e5a6d37d0c518d8036cff343c8d02ceb6708f7b017bafe15eb7eeff147dd7b80cb5c53e9211337d6b1e0b81ac432f18be34101bf3b973d577ecd3dbcfa1add174c49dc1f5cb0b3e6157c68aa446ad34662918419e4fd7e188bee6103195e3731c54b6e86896ea4420faa9768cc838055a3e5894d5b7a068cf064a8fe5002c998ab9ce325159d692f294b89ec826ef69874226d06c8eefc8b8f114deffd065acbcbdee9c63780a1228afb1b7194ff1c1e2c6531aa710f6daf8bcb2d86a92ffc84aa66c069966dd0e7aed5077333862dc4ff744b86d67d34cdbd16c5f9e0168d388a22f5ca1d35439ba46650fef8e2023fa494d9f16065be9528d60f78c70483396ab20acaa0e01824849ae7471da87cb34b5a3e8621a632be00a0d46c10b2321cfdc81dc07f05d50e433a6cf63804bc5bb685eaa1d3b4f74f11c4766ac587bc419688724ccfdabade070c77ad5062e8d6f02954939137ee7c9ea91536cb61ecb4fa4af1e0b963d7ac273c1337c449fbdb433c620bb4bafae754205d3bd31d439007a01a0a4b14f3ed758d84f0196010839f851a03e7d93ae1ee1d6deefee5000c88c027293f893a4235abf28082fc474a385853ac16ffb4b9bbb6dee965357c9a6e8a444f26d08898404f0e237caf0762b939fcbd149f4f93d5066302b067b66a6a5167089ef76b080af5f149874492f94dc25cd4e8e86194e29556c240824347f9a8a0a2379c6e2b695d6922dfa7b9147f99558253f25fb76ad288f957d950312a96fddc0177083d3a0d4f05c93f534f183757b57a91d6fd6b7713b713356ae97c40bb048a6a6e3476d98ce38a140aefd42d10f66439425421b18c06bb39b4ed5b548254ac26e5aedc7acd5d7cb717bec6a26579e71950523fc630294f051b852fe2dc17aa6ccf80f90efe353ffe22f9ce0e0968f6dba8325e609d2280ec31cd452366a7faee2df981b24aa025e1b1ee86cc638cb7c11b6f62079d5c30c9044560f839143d11e8cfb525bf3957b14df79d8ee9e669ba77f4cebea65d4ff10487a673b581be273be031dbee4eda67d272bf2a6a63023d5e1db08e974c2c1bab887bb2c59ca99d0634f75f349095772620056439d21c79dbec4e011e18d1aebe61a5715ffa677c789a59fa05be6919adf1cd7635a2c0bfd58e67f07b983cbc9d0a534b6e8802a88e927e7e934af20159447979462d01d8216c5b97ecca3e47aaac340d1910a1090c2db3a436dec160cc0a5c3a62c83b9849dceabe32086d9ea3c4f2dad93d7dcd4bf15503ca1f450f8b4536190395a2a492c02d82c80a50681967be1e2206808df4818c720954418ee91c126eaabe86c9f7d9c5a3dc49cbdfa9750da9c8fa0105601e6bed190f60f15e0e1fff0e9bb41d1fea36ab46144017f9bdf146a11283dc34a464e47f2e7519f1711e1d56dab7794f6d74c659525ec0787afbdc65e065170db1c40c693aea7e7624dea9bf3bc2223646a59d2f18d6f7e6b6d2d69654430ef73f48a598458862bdef577668c5171dd371a66c8a163ba587a46bc8fd8de4edcd493cc1dd77fd2a3ccdabc001d2a8d59244db8435093876649f8e05b326d0e85d301d10f99e551d494da853f7bb6d463dc8d181cc8f3f5c77a33184fec2f6b974624f76b26926e2af6423370d71c5d52e19d1b9af2ef0b9a79a28fffc22471a50139f94f4d64d3b3d157458f668801879f1031196882c4e985d804d060322dff0e9a359ada3958871b712e5b496393fd101d0f2ab6873084b19703e516412dca0e1f8724d29fe4f5b8d32b840d7b7b56ced8c65051ed65b533ee138e1c012673831aa096de90cba77c58977357ef84e159b8141784a6ae59b7024e2a87a0ca15b8e0d8546193c517fc65eea9debd4615caf03beab72edcd2bef6df437f50b56f61b3fdf47d065cce7999794a1d5c955dc26e1c3d2b52c0b62729a45f0410ffa439bd8c8f439b49c1c96037280e837fc4f32796dc8381cb37d5a174e1ff89d4515609eb42ed7d64e64cea08ed57c494f9d6ce1c0c5802ddaa58f10ed29f6f8f674955f0cdb9f89499580bb188985a29c4c32a8f136622561fe82faa101adbe4e025fcffa7928b59e0ab7ebb24082218f35229315bad63c3ff4fe22c9ac2693bf924b769f5507f1a91b8645049dc26602201dc9c631ee36b28075f5bb8045d951899c97a1850edaa7ea9e44975d7dcc796a3c416d4ba00b746eb61c71e738b181a9054e6c2a6ba55c1c9bf8c1965f898b8d2cdef199f3332e5d5ea849306d948cbbb9ba89961baeafd5b46ace002866b881678582b2bc4b0da6e0b5cb0fa4cc723c9db2c2198dc2620083f9877830c35b3ac64678b9d613f6c394a66f9f5b91b35694a1b4f0f243aff3ee60f4dd1bf7e84c8a2024ef3232fb171457970dc8417c78072aa6ca4842e41dfd4c6a1fd8a201d15d62ee4e29f086058cce86603625cda4eb201e58f5673e9a24ca754128609b430a1bd69dacec02b1e6db42d795f25c4e1e5b95dba01d6c7b3352e08dc153e1da42ee204dc01d9c35cf04bdfd296c8e643802f0216554028ba327887b047202210d551a3c9e4f78dcd4d4c9d81cc7d65ea43f464d2d258bc2e1d8fbc9e92b8f6095d3f68490fcfc2e564a7c7afd9d51188b71bb65a3f8906d63020003cdacf592fbf987be58586d8c2d23876b58ee1718ce6547fa75a130e6c3f34db82896851c27c88b1619049eb59731e55437ace3fcd83cc54e5a8f1d76175776a64fc29af577f02d92ca6e980e0c040b84492acc566fe89db98231426130269c7efd4e1060330000000000000001fb073500c9fe31fa0c4ace9304cb6779eb1853f9950967c81de8f0c8840a88fc719d758aac93972ae5abed1df8e11bcf51eb4991ed8526ca7767c4dc2545a9cb0f610da226b052f26299692f5144f4e3262c78654a3da6cff85cfb7f9e19afe73780bc89b320ae2c78135db5fd4913715b41fcbf8f44d09bc739a898f6495fc1cd596e1ca269e95ac7fccbd9dd5c660b1a97bcff3e37fa7db00661ef242a9ee338d64a5ef107fb72bab71856d977c8848a95d1ef33c68340fbf8681bb51041fafc1170cac8b10150c29303ce45dbc826c765b1b6d59c15b1daa8f63c6fe1e3506cdd325d98b3e355d558731fe957bed841494c1d353bb887d48a397122142771f4b1e30199d3d39e2ff8d4f802063504febbc7f8e402046231b0de413e74d9efbae177463e871eedc94f6a8ce53f3d8843387be07d134baeecd2f88cc76de8cf68735654aabc79074f62f6c50b5319edb65e0b82fab69cdec320208bbcefdbc03a0682569cfbbff83a370b97c66e81ab53a2de076c5ac34ce4979a1c2fc6c1cf5c04925f8834e0211edbb95d3cc4d04fca2d317bc28e77969f69b23a666ca90aa2e689b26f57457bd0a766b43baacb92d769661d3bc42f302e055567228a0a3c317faca54ff0bcf2bf8f71d1834f1a86d4f9dd56f67d90c38fc9cbd7b34971973916ae561e7778da80352b907da75ff89b49565dc04a7bde79efe37fc816df99019332b9b23a0fc1c9c39dbe8459a5140ea48b59e23e4ebe2f9d070cf7fe9618acf8953d174a95284ff9189652a8f7d934ab7f3406fc47715da2a4511ec04d4dcf292259bffbd219a60a4535bcbed852970fd047d975ba23a6bcef1cb56b8ab0ad66ec31781e7ea97dcd8b1d52ccf6c3145ff0629d8ae48b984eff7636000217cf387c5ad59c57546603c76b46a12e32aadc9ad68ecd22882031696126230c5d85071be3bb4e7ca434c4c0dfb4e0916f5f48185624e1124ceddf2740869de0bccc3a1e3ed7120eff453bead4fd5eeb00e7b4e8f400796e31e355659c446a2e542ece4adea4054818c66273da512ebf7caaedaa2aa8f349354662bf240aa567565c406bba94182003193fd4d4f6df0892340d3564a4d4e7c429aab19d24b46dc7eee6cdcd8e80c590f840aa451e14562a20c778fe105eb7c66ff65b828c985e86f42ceb9363e273700804b58bc5ffc7d1208e8662b0568a743a0305d862b90c25bfc424c7eb4b3067bfbd2f2f05c895f1d0e3dda636453018f3e5e6d1078ca6582ddf27ad717a8fa0476e03d8bb37235f5a68288b262137b8bdd34a227a5ae3b69265f7a365746287d04df71933ff868890c06118aa7798003ccb8578e705cf22d596c3569a79ae1a8d3962c910e490c2cf10163e2daa1695a52e0fed56e59554f058689b1366741453bbac4132e75c1849d0bef0e7272398b87519837647f30a2b02f0062f2cf3178e73cdbc1705532a3112ca28f80ca54fe671e20c907d91ac1008e562ae31ebe190fb4bcd590906a740c68037350ce00ecad104a6f21da72a94ae01f1f681743ff0760892ffad70c29f53b41c945989d8b008bc7bd26fefddcae34341b1add85bdd32104eb58fcac6c1abfeb02d5b6d05ddaf991c421396a81bca41a311563ed1bcbbcc47aae5f2850a56f0bf8217ba46700e80a1b62b30d422268166199b264ffa847cc290568145731b5d4b411c71fb6b97a157502af8b05034275381a0544406dfcd3bd4bffd09acf2ae2736dac3d1e8126c9c537cd66ada4bc4dac9f193e09be6bd01bd3ac6d17b227e87bf15cda6086c9815ab89148843c89af6bfa95a218b1e997c8af52de2e0b0e201d11ed032693ab826d7c57029fecadb53ad18778166fece38d7e152d35d81d922aa375a2b56dd5a57f9f0ad235a027be5bdae76004c453ecf91eba7dedaba4b698d8a13f3c1df3792b434e5f0f736bd22f57d7f5b69c4880ca79a4b3304332779e873ad0ebe146529a5b7eb7105675de01177c571e04548ddae418ec50ea0eb5cfa853030ae60e47fc8a94d543272d64956b55806447fbd5276506b0aa3369647cc9a28693a3f8148c2ec061dcf180c6f9fdb253687733ec938821eb8c95c22ac54506e41dc63d70120f405f6305f5196ba1f666f29aa561f217d98043ab06fdf05c24e001e7988980fb2e08d44d39bd06e571ae08f36697a6f79375b350a9978d780bee2c8e54d46c1e6109d977c4151875c277939428110dfa0001e71d84b94ac19a0015eabf23a47091d54488dd174ff86d154e96b6721ccbd47c5bb4cc0bcfc4a222bea8f9399f69aa8a40c51b2ca9d87634e8d96a7fff5a024863cb8fbd02eeda47cf0932b18d6b7f4e5b02294ca31b0b60576f9c279d3c914b4770dd05cd7cba9180d56ec9f8c0009f13296ab2678b0ce74f94e82ce803422813f0d2b750cde9e4f743946be569606bc860bed0e1108ce9863e86b86eac97b5c06bb1f9cb81dbfdadb280d56d5540949171d92333c7d14794fee9a24baedd9869c480dcbd841de1036508285f5415b32a21af6fc5a412533a39d081290ea411f960faee4f3b1ecc6745f5bf983755b13a89a8f4e25baa18511ce2907e189a5d495f0564408daf89c7274756f64120f8b3a45b7279d18ff42bd8d4b545c34214866ae7e4d1d9cd5c6de6bd9a96fc55815816a79b0519272f41791375cc8659ad9ed8e68161570eb56676538305eaf6f4b8222d561d5311743972a030ed630ae8c56c795b25a5307b5899283d9ced7ab65d837fddefb5e7ee23e0c3f3e400fa79c0c853c86ca98a6ab6e3a241d3c228e69c82f96eef38d547550596d89923165fb9fcce71f98cc8d5f1936ec83de6f4f1af36874a8ccfdc4e1aafe64e202243432f11dd269b5bfec128410c640504a40a91252df7ef250df2b5062f57041e987f4f7ebc64c82fad47d5bd5bec10962a4fd3ebf73022a8b143d24e06df729911255f4944d1901c71f891a47d6622a4b3660905cdabc57a41e8cf684c239acd9c0f402d11163389e6cd7fcd0a400d02fa0ed0d3e415162b47b6bcfe6b6bb4c8aea97f82c940b479e1dd83f24eb6a11d0ddd219f8afc7521bf4aec1a704b15a81c7009bc7523c8da6f191c7adf44a130a9d1014f6ebc358c165019b62b9b873d99b055fa6b8c2d204c7749fe8a9779af04ebbc5bf54d72ad6a706325c464ea7d3de89909f7d839d6cd944845f5a9b57d33b606a1e73a621c4ad33ade4c2c9e43265f8f87ca43f460c95ec7f12becbb4b5c84deebe2f2bf539f8b4d804c01645e8d6264c81531fadc38679ccc32a36b028128463075c1ce220a21fce4a2b1353b6c7850c5214f16960df553193b2fa2598af07fe9dedcdea9cb88a0af48fa2daa913a64f844006749f90b012d718d0381ef1a90f1a3f31120436fc18b2d7b4920386b1682e16e0b2a824727cd1311626521bca457fad207be13421441b0514ddc16681792650a4086d5b12c3e1c3862506d45055f94afdc8361318d32e0d445c5aa9fb6efe293bb0b6e12ce137cd8a3f2ef6a9ec9c2bdf2de637cb2d4a5137e65f3043d2f0cd6ce23e4eb5c12bea20fd84ed30fe1dd5966d3bf0a9012ce3abbe4aa23f92fed44f3ab4d1f152645b781ca5712ba95f7e4dc6df46176123c6d3fd3f5b47f95b71e348fa03814f5f4acf6a5db891ca66f84ae412cc2a2445f3cc82e73e8ef90ba3b88edb08a26d8e156541c22a1544583ae6a93e5ca82d4fa4a977064df6fda691d51d7a66a74db7369c2bf24a19b62f86d8fa6c06effad9b0bfea563a58b273025cb8e6fbe8b9fac67047ba1f4c30a01fa195b70cd1219f33d434ecd3527d4e9c59478ec546fb3c4bff72d1497b26b48485582b6ded8142cd262c8e81ca10cb7cd98ceb410e3f36f95dce4ea0662b552f51f2a22d17650d4a8e7b3c9d33a026977661e31678994889d7949e80213306df30cf5de6410afacdbde09f1805831cbf153e696db44f7916b939383d0bb696663f711018443a09078761ac313b4324f913c308646af1e3092ce337122869528f53fbf214e4645ad22f5099277f6ed0ed4db6b59f2f913ef3dd106ac8f12ec0c3f736fcf6488aa5a668f7f573d3e847e626035447d7228bf057dbba94a49c4eefda2675e52931b9d374e5cc014dc0361a830ea0911bd804129ba66bfea8cb631ecbf9cad725631211e2c2682e8457f5e3944dd852c0972e9462ad167134f7bb6aa7d4b2af902956bd6223e0da1c25f053bbfb07e72047073a206f28e47e01b1afa51fdf19226bd817ca0ffde19e412f642a8a481d5ba73af89bedadb4e3f5536dad83a81666f6e9f4d8bb7929d7ba8f8b588acfbbfadd1dfeeb95cc063f4759908356b767ed19723dc344bcdd5f358c8edb6f11fc278c1d945d5df9eba14e47ff6964459549d7e8f8ab51f6cb975a2ca890e73d4a062978cc31f80d9b7e0a625acaef629110967e427177a26b38f2746f5a3fec73d663c9b007340bf51ba5e62a178b50b78ef4456671efa4a0fe3ba9e2a197271b4a0764b11a0bc6dbb1f93d52b93c16757032a4f963e21abfb8da248fa5c3f02949a2f01bf77fc41cb75943e876950fd625d591e2024c2c4b35ed86fbf11d862d92ebcacd947b0574777a3dca838595a85e88d52db124ca5b841fdf768ee5e2125aae1b674c11251c1b1a5122d89550df0fe542a0e1fbd65045f26d2eedd40a0478d6afcb1df564a2768ecd1773b0b391c7d88bd9ad8aff1eaf03620135dbd00a1853d5637c43c44af054b0f427b4782a744d51df89cbcae55cb2d0f77a6a01486d66556fd64cb51a54f60f79ee5a29514ec6ff0b93e4f1ae5d8207d985e2ff4097299c6fb09974b6afe23b775daa8561c34a79b588c2e312fdaa9c6159bba1800c7ad55beac282b8fa0e81d596d660fce61f2014d4402c653219c6effeb53cdc91ca529aaf1c6c9cd661b2ca85e6e529f1016ef2b8f4c969c893a0b8c285a1fa20e6203679d218cd35891d80cffb2f54979299a48c7c89b1ee1621fc335dbe8ada4bfb01d074437bd7f9b24e082aeffee4a884098ed976ea1ac542787689318249b53bf8ad29aca50f4be50d9820eba0dcde7dddc7ae54be09c006e9b8e1b5c14b42770d154d7afc3f2c297a086fa7392cd386362bcfe056b4310fc02788aee567eeafd762edc9ad438d41076dc3a668805922d04701141394a0857b0e3b0ed2aa40e5612070a307c1e5430811ff1007704379569f0273a049f4968b6ed6aada867ecfc64f346b710e9827b821fad5de73401c26d8f185f81e86abd2a55b4210e0eda37634cf720d1f4011b9881a4c6374b1e50b968e9a654c6cadff9a6dc3a9e0c0b2a5d2753832c19a12792d9d3e3ad301e10df0bc053559c561462859ae932b715bf8d808089d69363e492fdbee2931a81d5bdc64b2139dd3f562806c2fdd782f4188f040c814f9c3c338a1873af4485584f406200b199083ea392d1e00014fc61ce0da340f7699769c32c9b95760a7b200bd06b1cdbafdb20e1947b5aa75c43a38ae0c9d8ac81eba8eeeec1188e18b375e063a4c1b2251f5a68f20c7d8ba9e1b185a4505856764d16351a35665fbcdb8f8c504751d8148507ae57a5103ae04967a497c6bcda901094fa1f8b666f88030579d897e8dffa70407691599aac1dd87a8d045f5ad839c59e13619595ba3f352bde5b296ff41544d87546d26c01f40978ae720d19ddc8f3a039a5d9bfe61e9bd91d50b865dc1832b83e9172f3204d40ae530ae1a00da9e9174e1227df05df286baf638f90d914319d8df868c3a27432c99d24fb1de8f3e9c21b05f718095e51779ad3674290fd3e834f9c390289614e3af5089674af83df5a36d3148745a023e651b837180d04fae008286d7a571c35d44c54f0368de49c2aed76663020003d6151062e39b8485767531b523bc05144766379fed2e941263182f5b166242c6140c31543b12471576283472285e64f78757e93053ddb228e9abc0fd2a6dc563cdc6a17e4b1a56c0d15c283bfecc4383d342b8b6b9aa4890682c71a86c8b05fdfd4e106033000000000000000157c94a01098d8970345a431f324f55565abfd19cdfdbec3767cd489bda706f663d2671d3177a0f96b0515aaa0707a1276b22ad068c8de9b3fbdc92bb05f6bbb4e55c5f566c2d8a458cf75cb54c1a59e2c24f41888dcb847636b6e63e0ada90ff62e18f5425c48d9f181bea2ef9e59db4dc95378b4e75cfa383c41fe33401a6bb714ca6f8360dd76e4053c16f0631ba2077d610cfc20aa1044890e73204f0445ea8a3ca8643f7b4f9dece3b5743724494d297acf1dc75279cc23b325cfcb2686fe7a5fcd6808867e0b4896e0e96a1d6ac533c57c616f542e11510d2014b4479286455d96cd873d54113be745d0ed042636f3c7b0f3f846eaead668fba2d80e7e266d1382196f7e8e41c4aa1632f5f70b8c01d787e355d13feba8d2fc81070a6836f5ba6353b77e377520a9ade3528ef73f89f7172a992498c18870fe6e3b629cfb76923d94e06217ef45764349513a07042d8072647aa4fd1388ccfd646c49fea61781941c2333d7d2011cf1692062ea30f39c3b191620127aebf1c37675b625a273f903c8b6cee5ee9b921832caea9e72174aa17edae8f5def03a4bd9006cf85d1a48b3b35c49804eb326da93ab7a55c378baf44b25ab3d2dffbe366abf01132e326ebcc4905d1cf6c91f5e19c0196ca7bbd56210eca0993871db0eb9a134f729d5d38a092b480ae3430d1a3b4cd56b620e0d49a6844722ebdb6abbb9cc33c74ce2baeb94c7e08f8d5dfb40f982f7413aef40889f3e695f28019d92bad7a5c02b8226a076a44b33b99fca66f2b1030772d2f896f47871832e51ecd4194f29d78c79cb66f5f74e06f72dd76c27bdb48cc78d845991595a7cf6163b7b81565f6607764add94c8670b8ea4674ba3b8bb4c0c25c5f4ad00d3af021a3f9937301ccb6cc116e33d67dcb5f67a761691a3995aebda2f8ebac5fd6fe27d1a76993a77f0f05b0ad5766acc4b8c7a85d62e41674de3d92b9328ab07b47f670e75702d49a806e97fa114c43838d6d01c41fa2767782cf163dad48920197e1c1dc0bd5b4f438fd2e5f9ae423766e543c2e73ad34a5e1a5482f7bd359235c89ed465e39d92a3523b6486e383495a87a4dbdcc770e7081c541f7df292ce3d09be22be1da61e674d7123d115761628137633be39dd1d6c279dbf73c0b5a3a016158eeb89283fcc2607223944fb228a373c12f32bf41e119fe79a7dd5a2c7b25f2529afb3d56ff0c92dc07f7ca30aed14988cf0ba08563c01493a2be2d1f5f970e0464b8d476238aab0265f801bf4cdf57197a095159b761a21cc9cb753310e8b69de9eed677b7d7ad76a017ceab1ff03faa16b6e8fc85c9ca01ebfd9118cd5da7b2ca71b929d332b969e91a3c1c3c91ab2558589237e9249537dd3347fc8216befe04a8a4868ed9ebd083d0a529b0099d7831aa5468dfcd6963eb83343777b4019b50e91c0ede66f9291a71c61a7a945fa7078e9cf6e91c2cca2b3a491e758a608b53f47fbe6c571781f434e7776a493150f02d5856d38803e3cd535ecb01c9b980d6516f23b9ebfac82bc2555e384835ebb8de0a69b76d92c75f059f0a735cd047bafe81dc40fa48bbeb39ae06da02978e21835825f931b4caf60a41a285ddd141bdf81ee2490865fdbcd5f411a134902a25c174171f8d2da4acf3105d70e7de85f36d3ea03f103f4951dc6640af45b8037f0871668be828a9f6ce93629629902c30e5a506240c642c2108077a60a4f7cf655dd3ffcc5c25231300d496b1991cf4b4a4b51a870d81ed98f9b79f1d19c48c453dbe16ed8beb36478f56dbc03aecd8848473ed2ab6cedd8d91cb4ee040d5704b2b95c8d53120e043d6f64036954e60e435d88c901b79020583b21cf8062478e893fd72f5f676b3ea36671210a81ec36ea7518deffc516f137da1d90d429b1bfc49a0714b4eb1f6c54f99ca1ebb271e69a8d3490c89d41f94838630397f6bd992f72a5ce0fcc7487a46ff9c414316dbcd5b91d4959d2567a1c1892150482b48846990ac96716dbee8fff8964f8466f8b7c53ebcce86e09fa4613a3517da783e1ee7422087aef23c3834dfd77a034b5ac75852e91f6275d8624b3ede2ef99019ac70513adf685996d7069086221eea6034bcb036fb737905227b35346839beecf4688b1f4d248523872196965e77dc080c5cc8101c9e3c700fef7c056e2d9ec788e7faa153eb3ce2268910eb4de957059ee792a4a56f8e82ed3975135bb987a00ffc99201f671b88ab26204272198985d280a6447f48412b0f12a5a0b49f79d5d383681fa9a7306aa3f3d3a23f0e72bdbbbf9705b1afc96c1cc9bc0c5efdbe41418ef4f02f7d887048cdabc17c25bd26f54f694130349f741224a6bef8c6d8f90d46da79f69dd5615b7ea7c5a67574d5e48aec06c5869f660538dc8307a2846566a0b1bda7c629a378c42588086bfc09906077ba1cc2386414d436f88fc9afac84cbffa8e3786fca7d141d584764c95b7039bfb472e5ebda1a071381d36600ef1f2fb082b81b3effd7eda8340c1e384afe26170a2d1c351f8264f765b31d0e44670dd065d4e863e54f7b3d3e61d133e99a8d8c0f8818d413d3220344c159baf14a1c31f78caa8e7d3550667d4d31ec3d20bb0854a0b5431c9515b2645ef4f6b31e5d5e75c6428fe3a76e2b31d88cf2613e01a838cdd4d13938b1f8d29f4860872c831938b7eddf52af1f3d6a8cdcdb2d425637b6765d2c90f0429c20f391f8f6a5605130e65848084d2bfb3635b410c21d86b3f8cc1c9345ab9f84ecbcdbe71de1161ade26c9fbd1d5cb83a01d3cf7b19d853fff861b6120b0ffa8275177ff99ee2c8e61003464f5c45d5524fae64b74eae4ac984698a54b0921f31971b45f9e57583066e301f4044c24b79642e1b402ff1964f89042b5de36845e29c2363820ebab3da1a81b8f0092caf1cb1093acdd10a5123d9c801e7fcbe29cae96ddfd99842d195293460663db1813ef73de7cd917cbee3a2bbb876e933bb408cefe17b3b1c3fa1589ed7ad9b18967f252e7cb92b0d7ebbf0ba5f32ecdb1d93cf87e471d1fdda74323351f07d4f895d00118ff44bca34e79c60a09eccd5cbc4fec8a476593318fff1d035da297a6b40baf2b31a2ea41bb1201483e4132cc932c0669c2cb5563f5b7af9bea2099c4bfe1238fd1c2f4c59795a8361a9f90009262391c176be61c79eff872ccd854e054dba541acf9219b280243a366a60fc95e7915feb71e06f9644651930e66e5cd387f64154fd3f3641cf280fb93affd38baea735bfdd99499befeebcd2635649eb378f41a69d28700aee52996ca0c4e22b7a0359079d951befa1214f65ca3be800db9ca3dc88b43fe53a8c8ba69ce6dd58d12f9ebd6f4313827639e57006332256cf09add7d47a167ff1c9b975182e06cd6f9023d71d56a2201e8ac77de90ec9b259a16e3fb13e8d7a670b6d72ae0d27264acc9e198cb7851390dab5f0863f1b2005c4b0b6ac2a953dc33d05b93bdc9c879948519fb938e0dccb76b4f39460978c3caf7041fa6801bb3a114b045e148a1d3b2a2db9cea0b5c07c4c40c7f98be6032a6dd0c2b962b6c28d719fc98435466c7b225f5f13519fac921296c5c8b3f66ef4c7af628788a1cf819d27bcfb2e0b56b9c2f78df59ab34d05f8fd9b95bc8027abb52f1546fc9af6c39c5c65a683fdcfe71367f399a796436384daa51feed6d3e96a2d159e22d316e4f0c48c9f4e1f907b842a7bf1562a24293f062bf09fa9b7433ce603f3065df66b474148432e905dd7251974598d654a04223a8680eb69fca114783ac98d0c71c66817cc9aa9ee2bc97b1e7cb77a2e6c40d09508484a0d3e8fb3ef139ff42e8a5ca8965cf01c67f43676053e5cca2e66d9b22f5928fc2de699603a25b17d9c34827c31df30bc1f04e616ff5a0e74b1bbed1ecaef51d9190c4a4fc771ee03afe14c6a7eefef90cb5bc5d065e549ad2441dd4a7bb3b6ccd6e0225377707ad4a389b90c78ad8284d93a87496344ee547679dec94624cc6d627c7198ddef5feb9d97f7e39f0c44146e0820349b6fb055b44e1da546d1d042f46a874c8f0ac8999068bc22e4eeb55891f9b03efce407c0331810380e6b3d7666bdf52a4405d2d651607ebd5610ada0452de9aa846035b1b5f2ff1b620ca62c84b26232c8850e4b0c324b7074470f09146f6f84c50247c895351ca99d8c86bedfb04ed1a1ec7458131eda6578c7b23b2769405ae11692db2de171ef6d9fd275936a6d5d133837dab719b2581bc22ca6a4dcaf9b1d897c0c9eac5521290e2da7f456b4f3df31dc5885982b78eec8b065807262b446bb25f5ec9afe98a90f761a518993466cdd4b1fb7a4833d0da615fb858d3b7a466938d3dcc69625659bd044d3dff7ba275c4e9b6608f03857be3b15ba7094e08d724d62c38f498a1fb7e4d9ac68b6d4b3659e1fb645c218553e84d46c57c6ebb2229386e35ab88335893eadbda97f3ec307ecc9889628c11fdc3fc79707d02ce38ceac47639ee7c3737cf50e24069a1031bfcbab875b8b6f7ab64a595153e61483015c4ffb54c05d347830349e52dd66fd7c65097d7d41c3d26669154aac3863aaf16276e2354d87cdfadad6d4e979605e51dfb943c9f00341efc499859f44f384d2500b355243ac004b8ed4f6d3de7210fa3cc6b87288482e460f13ee0e567f18b2c74eec6e19cc24948bf3c8b374844b8bdfd594c74b274e725f20b1cdec23de8cc951ac1cb045e285c99fc11cca3ffaaf4ceec460b3fb77efb863fb75ada6acb5e99f18d6eaf48de04038ff5e04ee67f7559e4de23e21e07f2c4c218bb1000898aeacf3d7203f5095fdb10cf426dd81a556b8bc482373ab70e98b61398dd0750ca11579bb6c7eaa01390de475e2e3fbe6de0bbefcdba51e3b7a4b161ecac76e9fa13ce7c2ff35dc355c4474c15650282d2678381ca70cd16415463137f22732141fe204d00e7372467285f22e3bab6a52cb972db64eef232e82e5e1494d3b401fe6df03cefa56334f120e68df5ba3ef5081e9ad227199754272bfa9ba0400e521fed620221fe510f54f0745ac7e1bed9edccc566fd42b410bdc83f61f9247a3f0e7a6cbfb3438e2562edc9fc7d538810d187e1d7082a036ee625f0797ce140cdb4864127acee6a3c00ffc9cec89145a54df8c7a36adec9e00eaa1c9c1cbf548a07c9cd288bbd8855512dc000c51bbbda0c1da141e230c20fe0ab5286e126c5493689074dc4e5960160c9e2075ffc67c33c13bc776d446db065b2b6632cb292efb720b16de0e8235b10e11783215754cb7a518d76fac6646e7d20a217f7c22be31835419626fb3e0d547cfa8897cf0fde6c07c3706e0653007e3129351e3e966d7915a22c413381cb62a5f4e442ce635df38c9e5fe4cdde500ce34251881a1614713b015e6ad5cd8b9b1ab8013849ff13834187cc23fa45ef265e4d5c3d6fdf6f492a81681cf79dbc9c4efce4fcb770f1fd41a8268e9f73eb0cc692d1fc518c31b29e020050ae33c5e7c5b23321c4131207e3c4cf061efbb7453c9c85aefbe3ea3534cb186eb7ab66b6ef21fca5f000fe965bea303dcddf31ec958c288fa1801187e2840eb47f105fd68c26a9dcb88a2beaf638431f1e04b19a8345815f33fc0e0ba935bbfabcf75c1287e62fb735ef7d12225378e2651ec781992cc73d2a5444ec3bcc1c023c5ae0cbce5f55458a934bd8a4cd80e0975f809db97eeb39c8743e74b64ec28b24aa5a49a7a0de86cf824ad6b5143382de1579cde7301c21fea149e8ade1e4e8bfc0d6a6dec5acf88e78f1a88af5481e65650e37f0f495e728795668eb8b89c4bc5d9402e44bf7e3e4af771cf30ec273321e39659fb131f57c43b8e56eb19ac1dc6ff81a324347450bcf787f069af11cec34833e333c80000", + "weight": 20030, + "vsize": 5008, + "discount_weight": 2706, + "discount_vsize": 677 + } + ] +} diff --git a/src/swig_java/swig.i b/src/swig_java/swig.i index b8631f6ef..5c0cbb0e4 100644 --- a/src/swig_java/swig.i +++ b/src/swig_java/swig.i @@ -997,6 +997,7 @@ static jobjectArray create_jstringArray(JNIEnv *jenv, char **p, size_t len) { %returns_array_(wally_tx_get_btc_signature_hash, 8, 9, SHA256_LEN); %returns_array_(wally_tx_get_btc_taproot_signature_hash, 14, 15, SHA256_LEN); %returns_array_(wally_tx_get_elements_signature_hash, 9, 10, SHA256_LEN); +%returns_size_t(wally_tx_get_elements_weight_discount); %returns_array_(wally_tx_get_hash_prevouts, 4, 5, SHA256_LEN); %returns_array_(wally_tx_get_input_blinding_nonce, 3, 4, SHA256_LEN); %returns_array_(wally_tx_get_input_entropy, 3, 4, SHA256_LEN); diff --git a/src/test/test_elements.py b/src/test/test_elements.py index 3ca248d4c..8012aa8b7 100755 --- a/src/test/test_elements.py +++ b/src/test/test_elements.py @@ -241,6 +241,18 @@ def test_deterministic_blinding_factors(self): continue # Skip final VBF self.assertEqual(h(out[:o_len]), utf8(expected)) + def test_elements_tx_weights(self): + # Test the elements weight discount + with open(root_dir + 'src/data/elip200_vectors.json', 'r') as f: + JSON = json.load(f) + for case in JSON['cases']: + tx = pointer(wally_tx()) + tx_flags = 0x3 # WALLY_TX_FLAG_USE_WITNESS | WALLY_TX_FLAG_USE_ELEMENTS + self.assertEqual(WALLY_OK, wally_tx_from_hex(case['tx'], tx_flags, tx)) + self.assertEqual((WALLY_OK, case['weight']), wally_tx_get_weight(tx)) + discount = case['weight'] - case['discount_weight'] + self.assertEqual((WALLY_OK, discount), wally_tx_get_elements_weight_discount(tx, 0)) + if __name__ == '__main__': _, val = wally_is_elements_build() diff --git a/src/test/util.py b/src/test/util.py index adc99686e..c593c9f5f 100755 --- a/src/test/util.py +++ b/src/test/util.py @@ -676,6 +676,7 @@ class wally_psbt(Structure): ('wally_tx_get_btc_signature_hash', c_int, [POINTER(wally_tx), c_size_t, c_void_p, c_size_t, c_uint64, c_uint32, c_uint32, c_void_p, c_size_t]), ('wally_tx_get_btc_taproot_signature_hash', c_int, [POINTER(wally_tx), c_size_t, POINTER(wally_map), POINTER(c_uint64), c_size_t, c_void_p, c_size_t, c_uint32, c_uint32, c_void_p, c_size_t, c_uint32, c_uint32, c_void_p, c_size_t]), ('wally_tx_get_elements_signature_hash', c_int, [POINTER(wally_tx), c_size_t, c_void_p, c_size_t, c_void_p, c_size_t, c_uint32, c_uint32, c_void_p, c_size_t]), + ('wally_tx_get_elements_weight_discount', c_int, [POINTER(wally_tx), c_uint32, c_size_t_p]), ('wally_tx_get_hash_prevouts', c_int, [POINTER(wally_tx), c_size_t, c_size_t, c_void_p, c_size_t]), ('wally_tx_get_length', c_int, [POINTER(wally_tx), c_uint32, c_size_t_p]), ('wally_tx_get_signature_hash', c_int, [POINTER(wally_tx), c_size_t, c_void_p, c_size_t, c_void_p, c_size_t, c_uint32, c_uint64, c_uint32, c_uint32, c_uint32, c_void_p, c_size_t]), diff --git a/src/transaction.c b/src/transaction.c index bc1a75356..8cd493903 100644 --- a/src/transaction.c +++ b/src/transaction.c @@ -1965,6 +1965,49 @@ int wally_tx_get_vsize(const struct wally_tx *tx, size_t *written) return ret; } +#ifndef WALLY_ABI_NO_ELEMENTS +int wally_tx_get_elements_weight_discount(const struct wally_tx *tx, + uint32_t flags, size_t *written) +{ + size_t i, n = 0, is_elements = 0; + + if (written) + *written = 0; + + if (!tx || flags || !written) + return WALLY_EINVAL; + +#ifdef BUILD_ELEMENTS + if (wally_tx_is_elements(tx, &is_elements) != WALLY_OK) + return WALLY_EINVAL; + + if (is_elements) { + /* ELIP 0200: Compute the value of confidential outputs as though + * they are non-confidential */ + for (i = 0; i < tx->num_outputs; ++i) { + const struct wally_tx_output *output = tx->outputs + i; + /* Discount any output proofs */ + n += varbuff_get_length(output->surjectionproof_len); + n += varbuff_get_length(output->rangeproof_len); + n -= 2; /* Add 2 bytes to serialize empty proofs */ + if (output->value_len == WALLY_TX_ASSET_CT_VALUE_LEN) { + /* Discount confidential value to an explicit value */ + n += WALLY_TX_ASSET_CT_VALUE_LEN; + n -= WALLY_TX_ASSET_CT_VALUE_UNBLIND_LEN; + } + if (output->nonce_len == WALLY_TX_ASSET_CT_NONCE_LEN) { + /* Discount nonce commitment to an empty commitment */ + n += WALLY_TX_ASSET_CT_NONCE_LEN; + n -= 1; /* Add a byte for the empty commitment */ + } + } + } + *written = n; +#endif + return WALLY_OK; +} +#endif /* WALLY_ABI_NO_ELEMENTS */ + static int hash_prevouts(unsigned char *prevouts, size_t inputs_size, unsigned char *bytes_out, size_t len, bool do_free) { diff --git a/src/wasm_package/src/functions.js b/src/wasm_package/src/functions.js index a1c476f46..8e6735aed 100644 --- a/src/wasm_package/src/functions.js +++ b/src/wasm_package/src/functions.js @@ -646,6 +646,7 @@ export const tx_from_hex = wrap('wally_tx_from_hex', [T.String, T.Int32, T.DestP export const tx_get_btc_signature_hash = wrap('wally_tx_get_btc_signature_hash', [T.OpaqueRef, T.Int32, T.Bytes, T.Int64, T.Int32, T.Int32, T.DestPtrSized(T.Bytes, C.SHA256_LEN)]); export const tx_get_btc_taproot_signature_hash = wrap('wally_tx_get_btc_taproot_signature_hash', [T.OpaqueRef, T.Int32, T.OpaqueRef, T.Uint64Array, T.Bytes, T.Int32, T.Int32, T.Bytes, T.Int32, T.Int32, T.DestPtrSized(T.Bytes, C.SHA256_LEN)]); export const tx_get_elements_signature_hash = wrap('wally_tx_get_elements_signature_hash', [T.OpaqueRef, T.Int32, T.Bytes, T.Bytes, T.Int32, T.Int32, T.DestPtrSized(T.Bytes, C.SHA256_LEN)]); +export const tx_get_elements_weight_discount = wrap('wally_tx_get_elements_weight_discount', [T.OpaqueRef, T.Int32, T.DestPtr(T.Int32)]); export const tx_get_hash_prevouts = wrap('wally_tx_get_hash_prevouts', [T.OpaqueRef, T.Int32, T.Int32, T.DestPtrSized(T.Bytes, C.SHA256_LEN)]); export const tx_get_input_blinding_nonce = wrap('wally_tx_get_input_blinding_nonce', [T.OpaqueRef, T.Int32, T.DestPtrSized(T.Bytes, C.SHA256_LEN)]); export const tx_get_input_entropy = wrap('wally_tx_get_input_entropy', [T.OpaqueRef, T.Int32, T.DestPtrSized(T.Bytes, C.SHA256_LEN)]); diff --git a/src/wasm_package/src/index.d.ts b/src/wasm_package/src/index.d.ts index b99decaea..d004f4163 100644 --- a/src/wasm_package/src/index.d.ts +++ b/src/wasm_package/src/index.d.ts @@ -606,6 +606,7 @@ export function tx_from_hex(hex: string, flags: number): Ref_wally_tx; export function tx_get_btc_signature_hash(tx: Ref_wally_tx, index: number, script: Buffer|Uint8Array, satoshi: bigint, sighash: number, flags: number): Buffer; export function tx_get_btc_taproot_signature_hash(tx: Ref_wally_tx, index: number, scripts: Ref_wally_map, values: BigUint64Array|Array, tapleaf_script: Buffer|Uint8Array, key_version: number, codesep_position: number, annex: Buffer|Uint8Array, sighash: number, flags: number): Buffer; export function tx_get_elements_signature_hash(tx: Ref_wally_tx, index: number, script: Buffer|Uint8Array, value: Buffer|Uint8Array, sighash: number, flags: number): Buffer; +export function tx_get_elements_weight_discount(tx: Ref_wally_tx, flags: number): number; export function tx_get_hash_prevouts(tx: Ref_wally_tx, index: number, num_inputs: number): Buffer; export function tx_get_input_blinding_nonce(tx_in: Ref_wally_tx, index: number): Buffer; export function tx_get_input_entropy(tx_in: Ref_wally_tx, index: number): Buffer; diff --git a/tools/wasm_exports.sh b/tools/wasm_exports.sh index 17afb17a8..b07eb5475 100644 --- a/tools/wasm_exports.sh +++ b/tools/wasm_exports.sh @@ -761,6 +761,7 @@ if [ -z "$DISABLE_ELEMENTS" ]; then ,'_wally_tx_elements_output_init' \ ,'_wally_tx_elements_output_init_alloc' \ ,'_wally_tx_get_elements_signature_hash' \ +,'_wally_tx_get_elements_weight_discount' \ ,'_wally_tx_get_input_blinding_nonce' \ ,'_wally_tx_get_input_entropy' \ ,'_wally_tx_get_input_inflation_keys' \