From 5f4dd67a91389b608ee34ff355c357e0cb106b7b Mon Sep 17 00:00:00 2001 From: srdtrk <59252793+srdtrk@users.noreply.github.com> Date: Sun, 7 Jul 2024 10:20:35 +0200 Subject: [PATCH] imp: aggregated membership proofs (#54) * imp: updated contract defs * imp: regenerated abi * imp: updated program and operator * fix * deps: removed itertools * imp: efficiency * imps * imp fixtures * refactor * more refactors * rename * imp tests * tests passing * test comment * test: changed log --- Cargo.lock | 2 +- Cargo.toml | 2 +- contracts/abi/SP1ICS07Tendermint.json | 103 +++--------- contracts/fixtures/memberships_fixture.json | 11 ++ .../fixtures/mock_memberships_fixture.json | 11 ++ .../fixtures/mock_update_client_fixture.json | 6 +- .../mock_verify_membership_fixture.json | 8 +- .../mock_verify_non_membership_fixture.json | 11 -- contracts/fixtures/update_client_fixture.json | 8 +- .../fixtures/verify_membership_fixture.json | 10 +- .../verify_non_membership_fixture.json | 11 -- contracts/script/SP1ICS07Tendermint.s.sol | 10 +- contracts/src/SP1ICS07Tendermint.sol | 90 ++++------ .../ics07-tendermint/MembershipProgram.sol | 7 +- contracts/test/MembershipTest.sol | 88 ++++++++++ contracts/test/MultiMembership.t.sol | 158 +++++++++++++++++ contracts/test/SP1ICS07TendermintTest.sol | 12 +- contracts/test/SP1ICS07VerifyMembership.t.sol | 159 ------------------ .../test/SP1ICS07VerifyNonMembership.t.sol | 150 ----------------- ...7UpdateClient.t.sol => UpdateClient.t.sol} | 8 +- contracts/test/VerifyMembership.t.sol | 146 ++++++++++++++++ .../types/sp1ics07tendermint/contract.go | 94 ++++------- elf/membership-riscv32im-succinct-zkvm-elf | Bin 461772 -> 464028 bytes elf/update-client-riscv32im-succinct-zkvm-elf | Bin 1235800 -> 1236764 bytes justfile | 6 +- operator/Cargo.toml | 2 +- operator/src/bin/operator.rs | 4 +- operator/src/cli/command.rs | 8 +- operator/src/prover.rs | 22 ++- .../{verify_membership.rs => membership.rs} | 68 ++++---- operator/src/runners/fixtures/mod.rs | 2 +- .../src/runners/fixtures/update_client.rs | 6 +- operator/src/runners/genesis.rs | 6 +- programs/membership/src/main.rs | 75 +++++---- 34 files changed, 646 insertions(+), 658 deletions(-) create mode 100644 contracts/fixtures/memberships_fixture.json create mode 100644 contracts/fixtures/mock_memberships_fixture.json delete mode 100644 contracts/fixtures/mock_verify_non_membership_fixture.json delete mode 100644 contracts/fixtures/verify_non_membership_fixture.json create mode 100644 contracts/test/MembershipTest.sol create mode 100644 contracts/test/MultiMembership.t.sol delete mode 100644 contracts/test/SP1ICS07VerifyMembership.t.sol delete mode 100644 contracts/test/SP1ICS07VerifyNonMembership.t.sol rename contracts/test/{SP1ICS07UpdateClient.t.sol => UpdateClient.t.sol} (97%) create mode 100644 contracts/test/VerifyMembership.t.sol rename operator/src/runners/fixtures/{verify_membership.rs => membership.rs} (64%) diff --git a/Cargo.lock b/Cargo.lock index 9dcedd8..0d4c058 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5604,13 +5604,13 @@ dependencies = [ "bincode", "clap", "dotenv", + "futures", "hex", "ibc-client-tendermint", "ibc-core-client-types", "ibc-core-commitment-types", "ibc-core-host-types", "ibc-proto", - "itertools 0.12.1", "log", "reqwest 0.11.27", "serde", diff --git a/Cargo.toml b/Cargo.toml index 2249bd8..6eb299a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -55,7 +55,6 @@ alloy-contract = "0.1.2" alloy-node-bindings = "0.1.2" alloy = "0.1.2" bincode = "1.3.3" -itertools = "0.12.1" dotenv = "0.15.0" subtle-encoding = "0.5.1" anyhow = "1.0.82" @@ -64,6 +63,7 @@ log = "0.4.21" async-trait = "0.1.80" hex = "0.4.3" prost = { version = "0.12", default-features = false } +futures = "0.3" [patch.crates-io] sha2-v0-10-8 = { git = "https://github.com/sp1-patches/RustCrypto-hashes", package = "sha2", branch = "patch-v0.10.8" } diff --git a/contracts/abi/SP1ICS07Tendermint.json b/contracts/abi/SP1ICS07Tendermint.json index 0f43bbf..94bb826 100644 --- a/contracts/abi/SP1ICS07Tendermint.json +++ b/contracts/abi/SP1ICS07Tendermint.json @@ -172,14 +172,21 @@ "internalType": "bytes32" }, { - "name": "key_path", - "type": "string", - "internalType": "string" - }, - { - "name": "value", - "type": "bytes", - "internalType": "bytes" + "name": "kv_pairs", + "type": "tuple[]", + "internalType": "struct MembershipProgram.KVPair[]", + "components": [ + { + "name": "key", + "type": "string", + "internalType": "string" + }, + { + "name": "value", + "type": "bytes", + "internalType": "bytes" + } + ] } ] }, @@ -192,37 +199,9 @@ "name": "trustedConsensusStateBz", "type": "bytes", "internalType": "bytes" - }, - { - "name": "keyPath", - "type": "string", - "internalType": "string" - } - ], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct ICS07Tendermint.ConsensusState", - "components": [ - { - "name": "timestamp", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "root", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "next_validators_hash", - "type": "bytes32", - "internalType": "bytes32" - } - ] } ], + "outputs": [], "stateMutability": "view" }, { @@ -372,25 +351,7 @@ }, { "type": "function", - "name": "verifyIcs07UpdateClientProof", - "inputs": [ - { - "name": "proof", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "publicValues", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "verifyIcs07VerifyMembershipProof", + "name": "verifyIcs07MembershipProof", "inputs": [ { "name": "proof", @@ -413,14 +374,9 @@ "internalType": "bytes" }, { - "name": "keyPath", - "type": "string", - "internalType": "string" - }, - { - "name": "value", - "type": "bytes", - "internalType": "bytes" + "name": "kvPairHashes", + "type": "bytes32[]", + "internalType": "bytes32[]" } ], "outputs": [], @@ -428,7 +384,7 @@ }, { "type": "function", - "name": "verifyIcs07VerifyNonMembershipProof", + "name": "verifyIcs07UpdateClientProof", "inputs": [ { "name": "proof", @@ -439,24 +395,9 @@ "name": "publicValues", "type": "bytes", "internalType": "bytes" - }, - { - "name": "proofHeight", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "trustedConsensusStateBz", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "keyPath", - "type": "string", - "internalType": "string" } ], "outputs": [], - "stateMutability": "view" + "stateMutability": "nonpayable" } ] diff --git a/contracts/fixtures/memberships_fixture.json b/contracts/fixtures/memberships_fixture.json new file mode 100644 index 000000000..feed1f2 --- /dev/null +++ b/contracts/fixtures/memberships_fixture.json @@ -0,0 +1,11 @@ +{ + "proofHeight": 2110658, + "trustedClientState": "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000002034c200000000000000000000000000000000000000000000000000000000001275000000000000000000000000000000000000000000000000000000000000127500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076d6f6368612d3400000000000000000000000000000000000000000000000000", + "trustedConsensusState": "000000000000000000000000000000000000000000000000000000006677e1da994a2058af458e1a97f19bfa85c99ba5db6534473e8040e671a45431f78651bfb73058223e788b1b021cd25d9d8b80f1e21f742014d270fc850bacda1e63c419", + "commitmentRoot": "994a2058af458e1a97f19bfa85c99ba5db6534473e8040e671a45431f78651bf", + "updateClientVkey": "0x00eb2455c8d14f1f4a2287daa622a411b2e4a764d522fa5172ef9d1a5b8a0f5c", + "membershipVkey": "0x0045c54ed5927a845940a1b05eb768a384189a43f0ce816f2b7b0621600045b1", + "publicValues": "0x0000000000000000000000000000000000000000000000000000000000000020994a2058af458e1a97f19bfa85c99ba5db6534473e8040e671a45431f78651bf00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000023636c69656e74732f30372d74656e6465726d696e742d302f636c69656e745374617465000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b70a2b2f6962632e6c69676874636c69656e74732e74656e6465726d696e742e76312e436c69656e7453746174651287010a1174686574612d746573746e65742d3030311204080110031a040880840722040880c60a2a02082832003a0510b7e3c60842190a090801180120012a0100120c0a02000110211804200c300142190a090801180120012a0100120c0a02000110201801200130014a07757067726164654a107570677261646564494243537461746550015801000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000025636c69656e74732f30372d74656e6465726d696e742d3030312f636c69656e7453746174650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "proof": "0x16b7a55336d5ec7ca39056b6c196e4b9b8064cc1d265bddcf0002ac3f8bc7b110bdbdbc35133b34f43edb6e151383133c12341b436e09135617723e97b8c68291d58db5d9b0dcf7e41b4e32e384c5ac0a36aadf7c5827ec0b753d1905a4fb79d2e406de821e612024ed9ffb8a57b54dcd5d29aa57339d770cdaf8e9ff17539dc2ed822f8f00b7fd68f3be3dcc53d6a4565f3098e6d1e4dbcd6fad4a53759833d089e4ad0409f058af0fd710929ecd472184545c1dc241ecb3aaf81fbbd5a3bd302c45c2ee2deda40dc7a215b48ef29f1ccb8c4f250999cd0c6c813caa1a731f112c5b17e7dba05078de10456edcf97e2722174645ad123ab1b0530ecb9eaa00b20c99b04d82a2bab4d3b38dbb0f17123866f1c6d352d1d7883a4fba21e7b163000b7b79f7c0a30cbad1b94fd813fa903566301412d36540124ae41a9aa63869802f2ae7f0838bc84892cc2a9c2a4e7c90ac94644cc2f596922c0bc3c29491b0f1c237c0dfef0346e55ef6abd1b2ddc22c72642885593a7c7d167b1a92682ad262f6b17de5d09ebc1b902f660da4764240ab1a77143b5796237b80af686c4924815179569b1802d32c6442979c7f77087c5179e1aa375660371f76ab22d7715e607e3d611dcee3a1a004971017ae7189ec43dda4500f8a63dbb69ae8fcb9372aa1cd3f1fed9f2f41b1843630ba313a549c8694f58af1975e61ef3ef4076b8132e058ae7e36d6daea788cdd9d6175e022689e023f48d607d280ccf07b7e6cc54a406eb1c12a9331e14d7836b4fdaa4624ce9a5fb5d16435f6c039fa07af4554b0d0caf56c2e314fbdbf74ae8dde597fee501548db6ef467a0bfc5d7b299eda4d4a139fc47354c40035aa8cbad583aa4991bcf757d702ca50fddf3449e2ee4beb610cf3f82210e65708430a0d97737b9dd0e2364cff88eff26d456ee305d9caab1127e508bae2df774cf3600862152e0403006fd819504d1d7d2b6fe6c0642a7cc61cb30d1f23901e596e03057e6536b42d49ba2143df02497832faf7a24eabedc90893a49eb38b3d6e6fd52031d58b832654b532257e2394f5ffe3f54695f3bbc208fb3c3166672edd08535ae93cf2ef5ece36e52e81c174fe5688bfa14bf065c32590102d6800b82e6d965bf486d1c8779cca6481359fbe0a741ed836400fafb31d6ffaa13804ef0134544b5f835ee72191b9cf4b3806afeba6b6700111926438", + "kvPairs": "00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000023636c69656e74732f30372d74656e6465726d696e742d302f636c69656e745374617465000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b70a2b2f6962632e6c69676874636c69656e74732e74656e6465726d696e742e76312e436c69656e7453746174651287010a1174686574612d746573746e65742d3030311204080110031a040880840722040880c60a2a02082832003a0510b7e3c60842190a090801180120012a0100120c0a02000110211804200c300142190a090801180120012a0100120c0a02000110201801200130014a07757067726164654a107570677261646564494243537461746550015801000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000025636c69656e74732f30372d74656e6465726d696e742d3030312f636c69656e7453746174650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +} \ No newline at end of file diff --git a/contracts/fixtures/mock_memberships_fixture.json b/contracts/fixtures/mock_memberships_fixture.json new file mode 100644 index 000000000..071be31 --- /dev/null +++ b/contracts/fixtures/mock_memberships_fixture.json @@ -0,0 +1,11 @@ +{ + "proofHeight": 2110658, + "trustedClientState": "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000002034c200000000000000000000000000000000000000000000000000000000001275000000000000000000000000000000000000000000000000000000000000127500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076d6f6368612d3400000000000000000000000000000000000000000000000000", + "trustedConsensusState": "000000000000000000000000000000000000000000000000000000006677e1da994a2058af458e1a97f19bfa85c99ba5db6534473e8040e671a45431f78651bfb73058223e788b1b021cd25d9d8b80f1e21f742014d270fc850bacda1e63c419", + "commitmentRoot": "994a2058af458e1a97f19bfa85c99ba5db6534473e8040e671a45431f78651bf", + "updateClientVkey": "0x00eb2455c8d14f1f4a2287daa622a411b2e4a764d522fa5172ef9d1a5b8a0f5c", + "membershipVkey": "0x0045c54ed5927a845940a1b05eb768a384189a43f0ce816f2b7b0621600045b1", + "publicValues": "0x0000000000000000000000000000000000000000000000000000000000000020994a2058af458e1a97f19bfa85c99ba5db6534473e8040e671a45431f78651bf00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000023636c69656e74732f30372d74656e6465726d696e742d302f636c69656e745374617465000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b70a2b2f6962632e6c69676874636c69656e74732e74656e6465726d696e742e76312e436c69656e7453746174651287010a1174686574612d746573746e65742d3030311204080110031a040880840722040880c60a2a02082832003a0510b7e3c60842190a090801180120012a0100120c0a02000110211804200c300142190a090801180120012a0100120c0a02000110201801200130014a07757067726164654a107570677261646564494243537461746550015801000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000025636c69656e74732f30372d74656e6465726d696e742d3030312f636c69656e7453746174650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "proof": "0x", + "kvPairs": "00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000023636c69656e74732f30372d74656e6465726d696e742d302f636c69656e745374617465000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b70a2b2f6962632e6c69676874636c69656e74732e74656e6465726d696e742e76312e436c69656e7453746174651287010a1174686574612d746573746e65742d3030311204080110031a040880840722040880c60a2a02082832003a0510b7e3c60842190a090801180120012a0100120c0a02000110211804200c300142190a090801180120012a0100120c0a02000110201801200130014a07757067726164654a107570677261646564494243537461746550015801000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000025636c69656e74732f30372d74656e6465726d696e742d3030312f636c69656e7453746174650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +} \ No newline at end of file diff --git a/contracts/fixtures/mock_update_client_fixture.json b/contracts/fixtures/mock_update_client_fixture.json index a548f24..b0312ae 100644 --- a/contracts/fixtures/mock_update_client_fixture.json +++ b/contracts/fixtures/mock_update_client_fixture.json @@ -3,8 +3,8 @@ "trustedConsensusState": "000000000000000000000000000000000000000000000000000000006677e1da994a2058af458e1a97f19bfa85c99ba5db6534473e8040e671a45431f78651bfb73058223e788b1b021cd25d9d8b80f1e21f742014d270fc850bacda1e63c419", "targetConsensusState": "000000000000000000000000000000000000000000000000000000006677e25092a23d699a0d59f2e1b034c129b0051fb711a3d0d1f2e895fce82e933b8e36fdb73058223e788b1b021cd25d9d8b80f1e21f742014d270fc850bacda1e63c419", "targetHeight": 2110668, - "updateClientVkey": "0x007249a35f961b3685a282a934413027785080e03426a685b787c7ae6d10fddf", - "verifyMembershipVkey": "0x00daab7c7010120e7df060b4615f623986641fbd9cb1ee5c9120c85a32d1c732", - "publicValues": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000006677e1da994a2058af458e1a97f19bfa85c99ba5db6534473e8040e671a45431f78651bfb73058223e788b1b021cd25d9d8b80f1e21f742014d270fc850bacda1e63c419000000000000000000000000000000000000000000000000000000006677e25092a23d699a0d59f2e1b034c129b0051fb711a3d0d1f2e895fce82e933b8e36fdb73058223e788b1b021cd25d9d8b80f1e21f742014d270fc850bacda1e63c4190000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000002034c2000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000002034cc00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000001275000000000000000000000000000000000000000000000000000000000066882e6e00000000000000000000000000000000000000000000000000000000000000076d6f6368612d3400000000000000000000000000000000000000000000000000", + "updateClientVkey": "0x00eb2455c8d14f1f4a2287daa622a411b2e4a764d522fa5172ef9d1a5b8a0f5c", + "membershipVkey": "0x0045c54ed5927a845940a1b05eb768a384189a43f0ce816f2b7b0621600045b1", + "publicValues": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000006677e1da994a2058af458e1a97f19bfa85c99ba5db6534473e8040e671a45431f78651bfb73058223e788b1b021cd25d9d8b80f1e21f742014d270fc850bacda1e63c419000000000000000000000000000000000000000000000000000000006677e25092a23d699a0d59f2e1b034c129b0051fb711a3d0d1f2e895fce82e933b8e36fdb73058223e788b1b021cd25d9d8b80f1e21f742014d270fc850bacda1e63c4190000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000002034c2000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000002034cc00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000012750000000000000000000000000000000000000000000000000000000000668a3a9600000000000000000000000000000000000000000000000000000000000000076d6f6368612d3400000000000000000000000000000000000000000000000000", "proof": "0x" } \ No newline at end of file diff --git a/contracts/fixtures/mock_verify_membership_fixture.json b/contracts/fixtures/mock_verify_membership_fixture.json index 07de771..be2deb6 100644 --- a/contracts/fixtures/mock_verify_membership_fixture.json +++ b/contracts/fixtures/mock_verify_membership_fixture.json @@ -3,9 +3,9 @@ "trustedClientState": "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000002034c200000000000000000000000000000000000000000000000000000000001275000000000000000000000000000000000000000000000000000000000000127500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076d6f6368612d3400000000000000000000000000000000000000000000000000", "trustedConsensusState": "000000000000000000000000000000000000000000000000000000006677e1da994a2058af458e1a97f19bfa85c99ba5db6534473e8040e671a45431f78651bfb73058223e788b1b021cd25d9d8b80f1e21f742014d270fc850bacda1e63c419", "commitmentRoot": "994a2058af458e1a97f19bfa85c99ba5db6534473e8040e671a45431f78651bf", - "updateClientVkey": "0x007249a35f961b3685a282a934413027785080e03426a685b787c7ae6d10fddf", - "verifyMembershipVkey": "0x00daab7c7010120e7df060b4615f623986641fbd9cb1ee5c9120c85a32d1c732", - "publicValues": "0x0000000000000000000000000000000000000000000000000000000000000020994a2058af458e1a97f19bfa85c99ba5db6534473e8040e671a45431f78651bf000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000023636c69656e74732f30372d74656e6465726d696e742d302f636c69656e745374617465000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b70a2b2f6962632e6c69676874636c69656e74732e74656e6465726d696e742e76312e436c69656e7453746174651287010a1174686574612d746573746e65742d3030311204080110031a040880840722040880c60a2a02082832003a0510b7e3c60842190a090801180120012a0100120c0a02000110211804200c300142190a090801180120012a0100120c0a02000110201801200130014a07757067726164654a107570677261646564494243537461746550015801000000000000000000", + "updateClientVkey": "0x00eb2455c8d14f1f4a2287daa622a411b2e4a764d522fa5172ef9d1a5b8a0f5c", + "membershipVkey": "0x0045c54ed5927a845940a1b05eb768a384189a43f0ce816f2b7b0621600045b1", + "publicValues": "0x0000000000000000000000000000000000000000000000000000000000000020994a2058af458e1a97f19bfa85c99ba5db6534473e8040e671a45431f78651bf000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000023636c69656e74732f30372d74656e6465726d696e742d302f636c69656e745374617465000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b70a2b2f6962632e6c69676874636c69656e74732e74656e6465726d696e742e76312e436c69656e7453746174651287010a1174686574612d746573746e65742d3030311204080110031a040880840722040880c60a2a02082832003a0510b7e3c60842190a090801180120012a0100120c0a02000110211804200c300142190a090801180120012a0100120c0a02000110201801200130014a07757067726164654a107570677261646564494243537461746550015801000000000000000000", "proof": "0x", - "value": "0a2b2f6962632e6c69676874636c69656e74732e74656e6465726d696e742e76312e436c69656e7453746174651287010a1174686574612d746573746e65742d3030311204080110031a040880840722040880c60a2a02082832003a0510b7e3c60842190a090801180120012a0100120c0a02000110211804200c300142190a090801180120012a0100120c0a02000110201801200130014a07757067726164654a107570677261646564494243537461746550015801" + "kvPairs": "000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000023636c69656e74732f30372d74656e6465726d696e742d302f636c69656e745374617465000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b70a2b2f6962632e6c69676874636c69656e74732e74656e6465726d696e742e76312e436c69656e7453746174651287010a1174686574612d746573746e65742d3030311204080110031a040880840722040880c60a2a02082832003a0510b7e3c60842190a090801180120012a0100120c0a02000110211804200c300142190a090801180120012a0100120c0a02000110201801200130014a07757067726164654a107570677261646564494243537461746550015801000000000000000000" } \ No newline at end of file diff --git a/contracts/fixtures/mock_verify_non_membership_fixture.json b/contracts/fixtures/mock_verify_non_membership_fixture.json deleted file mode 100644 index 52a7550..000000000 --- a/contracts/fixtures/mock_verify_non_membership_fixture.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "proofHeight": 2110658, - "trustedClientState": "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000002034c200000000000000000000000000000000000000000000000000000000001275000000000000000000000000000000000000000000000000000000000000127500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076d6f6368612d3400000000000000000000000000000000000000000000000000", - "trustedConsensusState": "000000000000000000000000000000000000000000000000000000006677e1da994a2058af458e1a97f19bfa85c99ba5db6534473e8040e671a45431f78651bfb73058223e788b1b021cd25d9d8b80f1e21f742014d270fc850bacda1e63c419", - "commitmentRoot": "994a2058af458e1a97f19bfa85c99ba5db6534473e8040e671a45431f78651bf", - "updateClientVkey": "0x007249a35f961b3685a282a934413027785080e03426a685b787c7ae6d10fddf", - "verifyMembershipVkey": "0x00daab7c7010120e7df060b4615f623986641fbd9cb1ee5c9120c85a32d1c732", - "publicValues": "0x0000000000000000000000000000000000000000000000000000000000000020994a2058af458e1a97f19bfa85c99ba5db6534473e8040e671a45431f78651bf000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000025636c69656e74732f30372d74656e6465726d696e742d3030312f636c69656e7453746174650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "proof": "0x", - "value": "" -} \ No newline at end of file diff --git a/contracts/fixtures/update_client_fixture.json b/contracts/fixtures/update_client_fixture.json index d8d5afe..61a9bc6 100644 --- a/contracts/fixtures/update_client_fixture.json +++ b/contracts/fixtures/update_client_fixture.json @@ -3,8 +3,8 @@ "trustedConsensusState": "000000000000000000000000000000000000000000000000000000006677e1da994a2058af458e1a97f19bfa85c99ba5db6534473e8040e671a45431f78651bfb73058223e788b1b021cd25d9d8b80f1e21f742014d270fc850bacda1e63c419", "targetConsensusState": "000000000000000000000000000000000000000000000000000000006677e25092a23d699a0d59f2e1b034c129b0051fb711a3d0d1f2e895fce82e933b8e36fdb73058223e788b1b021cd25d9d8b80f1e21f742014d270fc850bacda1e63c419", "targetHeight": 2110668, - "updateClientVkey": "0x00ea0c57add5f11124cd3c0b6ba7308029074950f4868aa9223ef21c36c06262", - "verifyMembershipVkey": "0x00a3a59ebe9594fa1f4b8ce4e5ddbd4cc23df2834b47fa5c1cf40831a609fa9e", - "publicValues": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000006677e1da994a2058af458e1a97f19bfa85c99ba5db6534473e8040e671a45431f78651bfb73058223e788b1b021cd25d9d8b80f1e21f742014d270fc850bacda1e63c419000000000000000000000000000000000000000000000000000000006677e25092a23d699a0d59f2e1b034c129b0051fb711a3d0d1f2e895fce82e933b8e36fdb73058223e788b1b021cd25d9d8b80f1e21f742014d270fc850bacda1e63c4190000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000002034c2000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000002034cc00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000012750000000000000000000000000000000000000000000000000000000000668790ee00000000000000000000000000000000000000000000000000000000000000076d6f6368612d3400000000000000000000000000000000000000000000000000", - "proof": "0x2d10648a8204717c3df139ede4c7fde4dd83c7c574d4af91abf76d69da328eb227d9c9334099f93cec3c49d47ec744153a962dce38349ad7ff1c6ad9fa3e669f1d314f51e22e79da3c41a28aa072fc54fd1f343de5bb54b3b256fa2fdf7197972e87924784b0690d49cdfed450c424ed582d2eb452ee33e75173aa8d443b3b400f5d322a22b02494f9d7a50c822adf5567e3f098f929d5bb6963a25bc46392741e24f9ae4b0bfa7b70e4671b3bcb848083db6b4397f77e3fcd5a2c47fbf7de590c464d443ac32c5b75a081257ea6f6f856b518fcf52fb3503fbc3d251cde51c011a396336dad139363a9f9d95467f3c436b3dad93ca9e1c3e57d21d6532e9e0023fa1d2a5344783edfd6960a8093dba442022b457bb00a41a97dd46444ce92e71b08818ac21c8335334b8d45f27de97f228313726443c1b436739a0b7ae2825a117a557ecd42fb55e0846aac0add8a32915e5b12b3ad66ad73260136653505260480dc40550f36a4c531b278f51c9299e64332cc16d73e6520c2d9416f48057018d17fadb0bc67704fefa48cf539d8e14640331d4ba7611f8313ebba294dea3607f06852f65a0b60c695ac6271ba93500fe4b3d1ca5bc1eb962601ce85ef3e5d11882cf09ec893462ef95c1d65643891798582964fdb9c9d22a52b15eb9c504b03155fe2aa4ba66a41ccc7bcf47c89529367a33b178b6d91e4903cab9bdd488a087b990f8c75dee7488bb24e0314552170c79fef3f430138544f581b7976f95c257a345f15f85e156660ca20e0b7d9588f4ca57675573020fe21360084238a0f1b63b4426a84efc0a31385629ae74273fc60b2d716fe846e711042f308ec60ae243a3ca3058c522f89662f6a7ea5aed8d912750f56efa15bdc75155230d72e0117f8b119151f2aa1877b30450cb2b0413a0450c090f68cdb164d16fd81ba777f1cdcbc397f6e83a0d7e38c5076e64a17f1de681d8ab25c296f37306d84a8374f14caaa2812a03fa2679e6b977ab859ede9ae61bb395885c084ed5af9abe3b2451811c1e409cd8dfd337e43855e16eeb21ed38cf30792930e967d8c2b5dd02ed009db911467467bb6b4a467b6a79defb669c562d57227349114decc11b3d0ff891539eb3305196226522108df3ec1a2fa972aa19a7ee494429fe52dd7546b69fb129e25f6c70ba1bee8b2fcac1ec2df7a3d8122076a00fa07ff3cfb43bd7ea97a" + "updateClientVkey": "0x00eb2455c8d14f1f4a2287daa622a411b2e4a764d522fa5172ef9d1a5b8a0f5c", + "membershipVkey": "0x0045c54ed5927a845940a1b05eb768a384189a43f0ce816f2b7b0621600045b1", + "publicValues": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000006677e1da994a2058af458e1a97f19bfa85c99ba5db6534473e8040e671a45431f78651bfb73058223e788b1b021cd25d9d8b80f1e21f742014d270fc850bacda1e63c419000000000000000000000000000000000000000000000000000000006677e25092a23d699a0d59f2e1b034c129b0051fb711a3d0d1f2e895fce82e933b8e36fdb73058223e788b1b021cd25d9d8b80f1e21f742014d270fc850bacda1e63c4190000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000002034c2000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000002034cc00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000012750000000000000000000000000000000000000000000000000000000000668a3b4b00000000000000000000000000000000000000000000000000000000000000076d6f6368612d3400000000000000000000000000000000000000000000000000", + "proof": "0x28ab170baec91a8e28a47432c2f5cf5b6ee1b96960091be65bdbbed19af1fbbf0f3c90d4531d0332d06dc8e1e1eb84b2076649b80a72a346a18f5d5ab7d8f2c71f3504f214ddba2d881cdafd75fb520a78e7822f7afe85a9f50234927c3f7aa20be0d421c2a05f9ddff75c436a9e1ec1075a5c619ecfa89b85ed5eb563c118980ff977366c07218d2abce851804fb6ad976275f16561d5a1d770320a4357f71c08ce6660a75d2cbb6cfaf767c76d24c57a4440bbf853eecd42da1ac1fe1cd93115c20b5b9b31d3854d4ba7ab63edf68c3a6a47b6fe9eb19371e02f670473f8f92b99e490b0b0c83ec4ec0117497ea609b4837713e7dd8d9610b509b4b81f65e01ee5c165d9d345c60720525aa8b22b3da651269720a867dea45996cb7f8477b009a150ba77bb2381e1a1f2208c1781fb1bff65fb24da9eeb3202ff46662e4d95069f2a0edbaf595cc20d921f49b84ca2d73cfef386ad3e84a018d741c666ac8521c05eb4be21e614ff85a84338e80f0b93bc961e92a8f22c0d1f17e0a6437fd2268aac53acc5f1e71b2b27c26de75246d57332b3689833f2363cfff29bc9cf281cb59ec6d32af3a84e6fb7d097b791b830fbfe6264eeb8cfbd0e2ddc922c46f02788f8cef5c420d7a225f487a64eb4fa2275d8e03bd09aacde5d1f99315cfd791be42e25d6ae3eae113ccf6a244885bc90b15e790e6ad996e81f4f2660ff96de13e4bfa2f5e70771cefca8be9fc031d9452d06179c0c65903fe7278022fdd18212920f66a7567ae7939e27c4d1c9181b31b753ad82d4cb8aceadbab241ac5a822dbd717e45817cee754d564ba47a30293c0b1744132b35fbb9dd8984289a341c2e4f73ff5d142bf083ab32c36e007efe4c379e5a5972b26e304883fbbf01cb2b1b9f7499e71991c3968f865cd718e8f64d6dcda4f29794e2576748dfbb51ac921651a42a4b5f4ba729f7a4b27dd16c26a0e9415d5c8e2cdfc5481230da25baa0080e9229fde28d14c510577f2e2e2f851abc49dec6d5741dff007b153376575f254bbed35798bf1c687d01b0d84e15b015bdb9bab17f381c9d4f32806ba0f9df0c28eea7155fcc1194d30984af9a89369a0eda59b85852da72459406fda13ad6161521da4adfac3373bf73548a059a8cde5176cf2fabec19df32e194316d50951352275589a808a7b0c45564446ea739dce60f147b2a9223f01bbd8f485cc200" } \ No newline at end of file diff --git a/contracts/fixtures/verify_membership_fixture.json b/contracts/fixtures/verify_membership_fixture.json index fb0be4b..fc3d816 100644 --- a/contracts/fixtures/verify_membership_fixture.json +++ b/contracts/fixtures/verify_membership_fixture.json @@ -3,9 +3,9 @@ "trustedClientState": "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000002034c200000000000000000000000000000000000000000000000000000000001275000000000000000000000000000000000000000000000000000000000000127500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076d6f6368612d3400000000000000000000000000000000000000000000000000", "trustedConsensusState": "000000000000000000000000000000000000000000000000000000006677e1da994a2058af458e1a97f19bfa85c99ba5db6534473e8040e671a45431f78651bfb73058223e788b1b021cd25d9d8b80f1e21f742014d270fc850bacda1e63c419", "commitmentRoot": "994a2058af458e1a97f19bfa85c99ba5db6534473e8040e671a45431f78651bf", - "updateClientVkey": "0x007249a35f961b3685a282a934413027785080e03426a685b787c7ae6d10fddf", - "verifyMembershipVkey": "0x00daab7c7010120e7df060b4615f623986641fbd9cb1ee5c9120c85a32d1c732", - "publicValues": "0x0000000000000000000000000000000000000000000000000000000000000020994a2058af458e1a97f19bfa85c99ba5db6534473e8040e671a45431f78651bf000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000023636c69656e74732f30372d74656e6465726d696e742d302f636c69656e745374617465000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b70a2b2f6962632e6c69676874636c69656e74732e74656e6465726d696e742e76312e436c69656e7453746174651287010a1174686574612d746573746e65742d3030311204080110031a040880840722040880c60a2a02082832003a0510b7e3c60842190a090801180120012a0100120c0a02000110211804200c300142190a090801180120012a0100120c0a02000110201801200130014a07757067726164654a107570677261646564494243537461746550015801000000000000000000", - "proof": "0x0b3125e12dbf35d07daac29ec2885f340f90474478b0912f978ad4e598d9ad611b371be4dbe51d28d5ddd00d287203a62071871f44d3731de0950fb27a5509b71f315ee5baf29dd0b7ddfe6ace11a74195e2a66bb548883ad1f9df8190751773025f03abec9ae704a746d5d063b61001239fa62072abf4dbc1f465b8672b10071fba7973324badccf39129ba8f4be593119122947dce0f61ef44a4548e523dfc2da5270a99da0e29add2f97be6e2671fdd38db7600e410e88d4bff03211d480403e9f2df59bb05beab15209029ba90478b8e33c02a291bedd2e9a1c291873656208559532d9e69380667351fe45eb2a79e8a728a15c642ecde425d17860da13c12f94fcff3ce013f95d29b7a70ceb857d4db7e6482fd8260a3f616271e7b1bf005e28766b52dcb032f6d5b100ac79e97847cf6b39a6dcb40695dd3ad0881cc771b11f4fb65a508c4be88652d4962ce1b485b2b33ccb9db731cd3899fc11b255d077a823c36b3464400c352cb57981d2136da3c9235d949c48a18bae4afb234ae2727a43232792d037c1cf402893edf0ac7c07ac363c1a144e7158060f960d50a1ec5973012fdb0a61a69f4d92f846ab224a58e2b279a7a551c0337dfdedd1f1e241f1d61d98877e651a48b58a3d94b937345164976150f663eb15c65761fb5bb19e358bbfece685e0363ee4327a2d88bd59069f174b4a899485a86b8ff3a74f10905b1450c1b262caa12d1cc3345858985329556ca2be0ac357b8a1bca4bcb8122dfb04e9d47684d6dcb857790817c60c165e301f79823ee1b906d0c48e02005220de596d0d4fde38784eeec2cc9fe92d4370ba253af17e4b969368d4263297201e9b0b0222a9d5977d2ceced5bbe50326e9df6cf1adcef6d5c062e22d2abe270b9d31d11a5d9f2aebbde340b95e3389033a881ddd30696bc3af6c429343253614abb8534490be2226cd027e882f327ae5d021b0fc6c8fb917da87f060b01c5215bb8c1308cac1282cd18895e795ed74c658e7e7b4524cca7f49c5d33748541423d03f5ca27ff3a2229f7b8a49ee2c34b78a798dad86b9014c2da01ff8bd90f81536a417400b79832829c5ddcfa1a8c34b4ad4709503c66917b072ff943869001fff6036dbbcd77c1d434774b7dcba423396f09a4f7093f94a7330bd9a9a72460aa814a169b4e06e5e222883e7ab1e061b869c3887dba4fb5fccd0c7d0104ae8", - "value": "0a2b2f6962632e6c69676874636c69656e74732e74656e6465726d696e742e76312e436c69656e7453746174651287010a1174686574612d746573746e65742d3030311204080110031a040880840722040880c60a2a02082832003a0510b7e3c60842190a090801180120012a0100120c0a02000110211804200c300142190a090801180120012a0100120c0a02000110201801200130014a07757067726164654a107570677261646564494243537461746550015801" + "updateClientVkey": "0x00eb2455c8d14f1f4a2287daa622a411b2e4a764d522fa5172ef9d1a5b8a0f5c", + "membershipVkey": "0x0045c54ed5927a845940a1b05eb768a384189a43f0ce816f2b7b0621600045b1", + "publicValues": "0x0000000000000000000000000000000000000000000000000000000000000020994a2058af458e1a97f19bfa85c99ba5db6534473e8040e671a45431f78651bf000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000023636c69656e74732f30372d74656e6465726d696e742d302f636c69656e745374617465000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b70a2b2f6962632e6c69676874636c69656e74732e74656e6465726d696e742e76312e436c69656e7453746174651287010a1174686574612d746573746e65742d3030311204080110031a040880840722040880c60a2a02082832003a0510b7e3c60842190a090801180120012a0100120c0a02000110211804200c300142190a090801180120012a0100120c0a02000110201801200130014a07757067726164654a107570677261646564494243537461746550015801000000000000000000", + "proof": "0x20087d2cec6a91e6883ce38f346a0afab8b136961af22e33c5ba4ab62b9db6e32774b91c8d89ac74c46ad8e2780a300e98ecec3ededcacf3dac1482d6ffc8dc4304e50a4f533ce51293f58a243c2a3a2f7f6adfa261d574ebce9e0397379f8140762bc2155aca0e8dd41c8e74a4d7601c840bbaa5ff1b1739618f05aaffc45821836558e63e51784519292003151a9b9f250cb8b94d8a672cfdb6746b60d773c2dd2b9e886328aab8d0d37fb1772a9b2e5866415611fcb0de15d1dc82e9e37f01f431adb7f7dca449215d5cfea5acc73939e44731f08c9c38774599647c7ed892716a1073aeeee4a5906653725147f3decd45f2ab4230ac87d7a0f885e43c7a712a57f90c7c7f1497cad47da7f7d15d8a84a489af66086fc05bca5d9f706e75d0929487dc3473ec07741b6f2d89647113c1e67319476fda8d1eaacf576beaaa424fa859453a2d03b968215bbac666870ad5d9b23101a9fe973059d689163897f0199365cde6d895b7f8c3c8d82425f32be0fcde170af51766bef06d5cfe901b41dcb251270bc0ec7dfda462dfeaa36a4567f76dd2bd861e0439880e83453f15810483ffa1d094ce287683335e03a9e838a3813e995ce4ea4af876eabe4aacf452c32261c73965925cd899b4ac5040a3f2bb1213f08ec2f57b3fdc777a32a6c581803a528874edfb6236f1b160326e75d2458b1213643a1cde140df518d6bbbca285ec8e46e26136e1624a4f74ca7e5a0d4c51efc3bb50fff86d95eb4498a8400155a7823965449008cb50b77121cf74b1105e8762ebbf247b2ec8c9540c0d5ef200b92d954fdf466f4e78d2131ef3e61c4310dd6d1a237731cff9d09907fea132e43365d72d5bd82538198dde27a8367c3ecbc33b880eabb815683ef09dd2523127b6a6d7e4bd037a1486b2002c70e5333127c442e63aec3cdf4acf865c2d2dd19852a32a4aa2320ecad3accbf8df6c2260291c9b45f2fb17eda1d45f789f1fa1089622f2b8549e319404a4cf68d4638cd22d588e251fbd52d3a7cf2f72424d526a2e6123f9452a00a5a5438a3c5a57f925efa6e8f24e329bf6ffdd39178a0c22df3fb1ceba04b38dad892184111bc92ba5ec642d6c37be7cae0f34bf12fe8a213ef17c007c0c79188e60b621cc3d8f4b4983f98ec14a6c318f57187d52bb40c1a94119a58d4488a2637bbd6ec1b1b5cbb8f3dd28a0440c6f1255dcb05f9ea7a", + "kvPairs": "000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000023636c69656e74732f30372d74656e6465726d696e742d302f636c69656e745374617465000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b70a2b2f6962632e6c69676874636c69656e74732e74656e6465726d696e742e76312e436c69656e7453746174651287010a1174686574612d746573746e65742d3030311204080110031a040880840722040880c60a2a02082832003a0510b7e3c60842190a090801180120012a0100120c0a02000110211804200c300142190a090801180120012a0100120c0a02000110201801200130014a07757067726164654a107570677261646564494243537461746550015801000000000000000000" } \ No newline at end of file diff --git a/contracts/fixtures/verify_non_membership_fixture.json b/contracts/fixtures/verify_non_membership_fixture.json deleted file mode 100644 index 3d5006b..000000000 --- a/contracts/fixtures/verify_non_membership_fixture.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "proofHeight": 2110658, - "trustedClientState": "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000002034c200000000000000000000000000000000000000000000000000000000001275000000000000000000000000000000000000000000000000000000000000127500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076d6f6368612d3400000000000000000000000000000000000000000000000000", - "trustedConsensusState": "000000000000000000000000000000000000000000000000000000006677e1da994a2058af458e1a97f19bfa85c99ba5db6534473e8040e671a45431f78651bfb73058223e788b1b021cd25d9d8b80f1e21f742014d270fc850bacda1e63c419", - "commitmentRoot": "994a2058af458e1a97f19bfa85c99ba5db6534473e8040e671a45431f78651bf", - "updateClientVkey": "0x007249a35f961b3685a282a934413027785080e03426a685b787c7ae6d10fddf", - "verifyMembershipVkey": "0x00daab7c7010120e7df060b4615f623986641fbd9cb1ee5c9120c85a32d1c732", - "publicValues": "0x0000000000000000000000000000000000000000000000000000000000000020994a2058af458e1a97f19bfa85c99ba5db6534473e8040e671a45431f78651bf000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000025636c69656e74732f30372d74656e6465726d696e742d3030312f636c69656e7453746174650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "proof": "0x26772fe8d9d4a2f59416aeee5d9c453b0b690847f6d84ae906454b59fa30bd682340a168391932da56400e85274047f51ddbda5f0f48389fff5e98569638fd0e276341cc9dc9374baf96c90bad27c904045c7e8829b62f3f87168ece87e27ea108dced8cf9861ee31700eb4d1da7a4d2752be91459aab3421b9dd00edc8458d626b749464c99907ff27c562edc452f149ed16860d939c2f3c84ecac5ef8c852c2992c63f0c639dfb89f9d1f9e20ed2d07c8f3aae1d178502bf4e9c79201881ba2df58a15d65e78bb16ebf7a6381b004acb36ba9d63e3e50dbe435be906aef6b407abf95bde62d99ef864b37023a4e20b766b5bded69dc0b06eca51b7759453990a3b576e41edfa88c2bf924f9b9dc75b0a22e06559b6b3735ea8faa7f86c12470f23b0a21fd9d83019786a273547fc92e1f8e0016732c7e40e0da0b2f81b0865224446056745afb3db3dbf8800d0d0477abe010d0e275bf8ae2c72da005ac9fe15b8081d802dcbec03a962a8570fd5ad53fa129c521db71959d51930404b2de41a01e5edf6c5a94ef047dbec6c48f871502798e156f7c8280df08de4e24c105e136c4d858e78342636598e33598246d4650cd4d19e4393157863fa68b706e27e1c965a919af803fd442ce26cfe63b57bd6423d467277bb3a1ec4018a450be79016d92146024714173a1cf4257500ddbfba0260e6a5a38e63d4340524c3b4be0d111f01772aa1bb29d427e27c42bb1aedf1b5d36083f870b739047837401e60330975d1002cbe327d129441772541a6781aa6370aa132c0f4f21a756e44b9b70b060e410410f020410596eef4a95ab4bcff9485b30ef884df72457a829bb163c8285549f751eec09eb6325ee2d553efa93d070133c09853c182ca3649e41b5dec2178d0cd846f86298e01ef8521920e36f097727c9caf041539bda5a274a185141dcbb7f0d282386881b46b09f61d7764d4edf98ffd8a161bc056512f07d3ab012fd7b74e6c1a03646c80046eb03fb33cf6886099668155bf5fb242204d9b2687127a2a292a5793cb2a7f11d7aef4eff13c6ea68f52ebe293d4e3e18195dbaf4e09a004e9e90ce685413b4e7abf411f18adc0b6a5a88555cfec25c493b7e85ca51d3159a36e6a3049b9fdb6133212437f6ec86a0c4bba68cb09bef47fab25858209e15e32606856bdf05148aeb8a17e665587b82a80d254d64c2804b0eae58e0a", - "value": "" -} \ No newline at end of file diff --git a/contracts/script/SP1ICS07Tendermint.s.sol b/contracts/script/SP1ICS07Tendermint.s.sol index 689ff91..a44930c 100644 --- a/contracts/script/SP1ICS07Tendermint.s.sol +++ b/contracts/script/SP1ICS07Tendermint.s.sol @@ -12,7 +12,7 @@ struct SP1ICS07TendermintGenesisJson { bytes trustedClientState; bytes trustedConsensusState; bytes32 updateClientVkey; - bytes32 verifyMembershipVkey; + bytes32 membershipVkey; } contract SP1TendermintScript is Script { @@ -44,7 +44,7 @@ contract SP1TendermintScript is Script { SP1Verifier verifier = new SP1Verifier(); ics07Tendermint = new SP1ICS07Tendermint( genesis.updateClientVkey, - genesis.verifyMembershipVkey, + genesis.membershipVkey, address(verifier), genesis.trustedClientState, trustedConsensusHash @@ -79,16 +79,14 @@ contract SP1TendermintScript is Script { ".trustedConsensusState" ); bytes32 updateClientVkey = json.readBytes32(".updateClientVkey"); - bytes32 verifyMembershipVkey = json.readBytes32( - ".verifyMembershipVkey" - ); + bytes32 membershipVkey = json.readBytes32(".membershipVkey"); SP1ICS07TendermintGenesisJson memory fixture = SP1ICS07TendermintGenesisJson({ trustedClientState: trustedClientState, trustedConsensusState: trustedConsensusState, updateClientVkey: updateClientVkey, - verifyMembershipVkey: verifyMembershipVkey + membershipVkey: membershipVkey }); return fixture; diff --git a/contracts/src/SP1ICS07Tendermint.sol b/contracts/src/SP1ICS07Tendermint.sol index 06eb52f..04427ec 100644 --- a/contracts/src/SP1ICS07Tendermint.sol +++ b/contracts/src/SP1ICS07Tendermint.sol @@ -96,19 +96,19 @@ contract SP1ICS07Tendermint { /// @notice The entrypoint for verifying membership proof. /// @dev This function verifies the public values and forwards the proof to the SP1 verifier. + /// @dev It can validate a subset of the key-value pairs by providing their hashes. + /// @dev This is useful for batch verification. Zero hashes are skipped. /// @param proof The encoded proof. /// @param publicValues The encoded public values. /// @param proofHeight The height of the proof. /// @param trustedConsensusStateBz The encoded trusted consensus state. - /// @param keyPath The key path. - /// @param value The value. - function verifyIcs07VerifyMembershipProof( + /// @param kvPairHashes The hashes of the key-value pairs. + function verifyIcs07MembershipProof( bytes memory proof, bytes memory publicValues, uint32 proofHeight, bytes memory trustedConsensusStateBz, - string memory keyPath, - bytes memory value + bytes32[] memory kvPairHashes ) public view { MembershipProgram.MembershipOutput memory output = abi.decode( publicValues, @@ -116,58 +116,36 @@ contract SP1ICS07Tendermint { ); require( - value.length != 0, - "SP1ICS07Tendermint: value must not be empty" + kvPairHashes.length != 0, + "SP1ICS07Tendermint: kvPairs length is zero" ); + require( - keccak256(value) == keccak256(output.value), - "SP1ICS07Tendermint: value mismatch" + kvPairHashes.length <= output.kv_pairs.length, + "SP1ICS07Tendermint: kvPairs length mismatch" ); - validateMembershipOutput( - output, - proofHeight, - trustedConsensusStateBz, - keyPath - ); + // loop through the key-value pairs and validate them + for (uint8 i = 0; i < kvPairHashes.length; i++) { + bytes32 kvPairHash = kvPairHashes[i]; + if (kvPairHash == 0) { + // skip the empty hash + continue; + } - verifier.verifyProof( - ics07VerifyMembershipProgramVkey, - publicValues, - proof - ); - } + MembershipProgram.KVPair memory kvPair = output.kv_pairs[i]; - /// @notice The entrypoint for verifying non-membership proof. - /// @dev This function verifies the public values and forwards the proof to the SP1 verifier. - /// @param proof The encoded proof. - /// @param publicValues The encoded public values. - /// @param proofHeight The height of the proof. - /// @param trustedConsensusStateBz The encoded trusted consensus state. - /// @param keyPath The key path. - function verifyIcs07VerifyNonMembershipProof( - bytes memory proof, - bytes memory publicValues, - uint32 proofHeight, - bytes memory trustedConsensusStateBz, - string memory keyPath - ) public view { - MembershipProgram.MembershipOutput memory output = abi.decode( - publicValues, - (MembershipProgram.MembershipOutput) - ); + require( + kvPairHash == keccak256(abi.encode(kvPair)), + "SP1ICS07Tendermint: kvPair hash mismatch" + ); - require( - output.value.length == 0, - "SP1ICS07Tendermint: value must be empty" - ); - - validateMembershipOutput( - output, - proofHeight, - trustedConsensusStateBz, - keyPath - ); + validateMembershipOutput( + output, + proofHeight, + trustedConsensusStateBz + ); + } verifier.verifyProof( ics07VerifyMembershipProgramVkey, @@ -180,22 +158,16 @@ contract SP1ICS07Tendermint { /// @param output The public values. /// @param proofHeight The height of the proof. /// @param trustedConsensusStateBz The encoded trusted consensus state. - /// @return The decoded trusted consensus state. function validateMembershipOutput( MembershipProgram.MembershipOutput memory output, uint32 proofHeight, - bytes memory trustedConsensusStateBz, - string memory keyPath - ) public view returns (ICS07Tendermint.ConsensusState memory) { + bytes memory trustedConsensusStateBz + ) public view { require( consensusStateHashes[proofHeight] == keccak256(trustedConsensusStateBz), "SP1ICS07Tendermint: trusted consensus state mismatch" ); - require( - keccak256(bytes(keyPath)) == keccak256(bytes(output.key_path)), - "SP1ICS07Tendermint: key path mismatch" - ); ICS07Tendermint.ConsensusState memory trustedConsensusState = abi .decode(trustedConsensusStateBz, (ICS07Tendermint.ConsensusState)); @@ -204,8 +176,6 @@ contract SP1ICS07Tendermint { output.commitment_root == trustedConsensusState.root, "SP1ICS07Tendermint: invalid commitment root" ); - - return trustedConsensusState; } /// @notice Validates the SP1ICS07UpdateClientOutput public values. diff --git a/contracts/src/ics07-tendermint/MembershipProgram.sol b/contracts/src/ics07-tendermint/MembershipProgram.sol index 7f7428b..7eb580f 100644 --- a/contracts/src/ics07-tendermint/MembershipProgram.sol +++ b/contracts/src/ics07-tendermint/MembershipProgram.sol @@ -10,7 +10,12 @@ contract MembershipProgram { /// @notice The public value output for the sp1 verify (non)membership program. struct MembershipOutput { bytes32 commitment_root; - string key_path; + KVPair[] kv_pairs; + } + + /// @notice The key-value pair. + struct KVPair { + string key; bytes value; } } diff --git a/contracts/test/MembershipTest.sol b/contracts/test/MembershipTest.sol new file mode 100644 index 000000000..fb0d008 --- /dev/null +++ b/contracts/test/MembershipTest.sol @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import "forge-std/console.sol"; +import {Test} from "forge-std/Test.sol"; +import {stdJson} from "forge-std/StdJson.sol"; +import {stdError} from "forge-std/StdError.sol"; +import {ICS07Tendermint} from "../src/ics07-tendermint/ICS07Tendermint.sol"; +import {SP1ICS07Tendermint} from "../src/SP1ICS07Tendermint.sol"; +import {SP1ICS07TendermintTest} from "./SP1ICS07TendermintTest.sol"; +import {SP1Verifier} from "@sp1-contracts/SP1Verifier.sol"; +import {SP1MockVerifier} from "@sp1-contracts/SP1MockVerifier.sol"; +import {MembershipProgram} from "../src/ics07-tendermint/MembershipProgram.sol"; + +struct SP1ICS07MembershipFixtureJson { + uint32 proofHeight; + bytes trustedClientState; + bytes trustedConsensusState; + bytes32 updateClientVkey; + bytes32 membershipVkey; + bytes32 commitmentRoot; + bytes publicValues; + bytes proof; + bytes kvPairsBz; +} + +abstract contract MembershipTest is SP1ICS07TendermintTest { + using stdJson for string; + + SP1ICS07MembershipFixtureJson public fixture; + SP1ICS07MembershipFixtureJson public mockFixture; + + function setUpTestWithFixtures( + string memory fileName, + string memory mockFileName + ) public { + fixture = loadFixture(fileName); + mockFixture = loadFixture(mockFileName); + + setUpTest(fileName, mockFileName); + } + + function kvPairs() public view returns (MembershipProgram.KVPair[] memory) { + return abi.decode(fixture.kvPairsBz, (MembershipProgram.KVPair[])); + } + + function mockKvPairs() + public + view + returns (MembershipProgram.KVPair[] memory) + { + return abi.decode(mockFixture.kvPairsBz, (MembershipProgram.KVPair[])); + } + + function loadFixture( + string memory fileName + ) public view returns (SP1ICS07MembershipFixtureJson memory) { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, "/fixtures/", fileName); + string memory json = vm.readFile(path); + bytes memory trustedClientState = json.readBytes(".trustedClientState"); + bytes memory trustedConsensusState = json.readBytes( + ".trustedConsensusState" + ); + uint32 proofHeight = uint32(json.readUint(".proofHeight")); + bytes32 updateClientVkey = json.readBytes32(".updateClientVkey"); + bytes32 membershipVkey = json.readBytes32(".membershipVkey"); + bytes32 commitmentRoot = json.readBytes32(".commitmentRoot"); + bytes memory publicValues = json.readBytes(".publicValues"); + bytes memory proof = json.readBytes(".proof"); + bytes memory kvPairsBz = json.readBytes(".kvPairs"); + + SP1ICS07MembershipFixtureJson + memory fix = SP1ICS07MembershipFixtureJson({ + commitmentRoot: commitmentRoot, + trustedClientState: trustedClientState, + trustedConsensusState: trustedConsensusState, + proofHeight: proofHeight, + updateClientVkey: updateClientVkey, + membershipVkey: membershipVkey, + publicValues: publicValues, + proof: proof, + kvPairsBz: kvPairsBz + }); + + return fix; + } +} diff --git a/contracts/test/MultiMembership.t.sol b/contracts/test/MultiMembership.t.sol new file mode 100644 index 000000000..4baa706 --- /dev/null +++ b/contracts/test/MultiMembership.t.sol @@ -0,0 +1,158 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import "forge-std/console.sol"; +import {Test} from "forge-std/Test.sol"; +import {stdJson} from "forge-std/StdJson.sol"; +import {stdError} from "forge-std/StdError.sol"; +import {ICS07Tendermint} from "../src/ics07-tendermint/ICS07Tendermint.sol"; +import {SP1ICS07Tendermint} from "../src/SP1ICS07Tendermint.sol"; +import {SP1Verifier} from "@sp1-contracts/SP1Verifier.sol"; +import {SP1MockVerifier} from "@sp1-contracts/SP1MockVerifier.sol"; +import {MembershipTest} from "./MembershipTest.sol"; + +// set constant string +string constant verifyMembershipPath = "clients/07-tendermint-0/clientState"; +string constant verifyNonMembershipPath = "clients/07-tendermint-001/clientState"; + +contract SP1ICS07MultiMembershipTest is MembershipTest { + using stdJson for string; + + function setUp() public { + setUpTestWithFixtures( + "memberships_fixture.json", + "mock_memberships_fixture.json" + ); + } + + function test_ValidateFixtures() public view { + assertEq(kvPairs().length, 2); + assertEq(kvPairs()[0].key, verifyMembershipPath); + assert(kvPairs()[0].value.length != 0); + assertEq(kvPairs()[1].key, verifyNonMembershipPath); + assertEq(kvPairs()[1].value.length, 0); + + assertEq(mockKvPairs().length, 2); + assertEq(mockKvPairs()[0].key, verifyMembershipPath); + assert(mockKvPairs()[0].value.length != 0); + assertEq(mockKvPairs()[1].key, verifyNonMembershipPath); + assertEq(mockKvPairs()[1].value.length, 0); + } + + function test_ValidVerifyNonMembership() public view { + bytes32[] memory kvPairHashes = new bytes32[](2); + kvPairHashes[0] = bytes32(0); // skip validation of the first kvPair + kvPairHashes[1] = keccak256(abi.encode(kvPairs()[1])); + + ics07Tendermint.verifyIcs07MembershipProof( + fixture.proof, + fixture.publicValues, + fixture.proofHeight, + fixture.trustedConsensusState, + kvPairHashes + ); + + // to console + console.log( + "VerifyNonMembership gas used: ", + vm.lastCallGas().gasTotalUsed + ); + } + + // Confirm that submitting a real proof passes the verifier. + function test_ValidMultiMembership() public view { + bytes32[] memory kvPairHashes = new bytes32[](2); + kvPairHashes[0] = keccak256(abi.encode(kvPairs()[0])); + kvPairHashes[1] = keccak256(abi.encode(kvPairs()[1])); + + ics07Tendermint.verifyIcs07MembershipProof( + fixture.proof, + fixture.publicValues, + fixture.proofHeight, + fixture.trustedConsensusState, + kvPairHashes + ); + + // to console + console.log( + "VerifyMultiMembership gas used: ", + vm.lastCallGas().gasTotalUsed + ); + } + + // Confirm that submitting an empty proof passes the mock verifier. + function test_ValidMockMultiMembership() public view { + bytes32[] memory kvPairHashes = new bytes32[](2); + kvPairHashes[0] = keccak256(abi.encode(mockKvPairs()[0])); + kvPairHashes[1] = keccak256(abi.encode(mockKvPairs()[1])); + + mockIcs07Tendermint.verifyIcs07MembershipProof( + mockFixture.proof, + mockFixture.publicValues, + mockFixture.proofHeight, + mockFixture.trustedConsensusState, + kvPairHashes + ); + } + + function test_Invalid_MockMultiMembership() public { + bytes32[] memory kvPairHashes = new bytes32[](2); + kvPairHashes[0] = keccak256(abi.encode(mockKvPairs()[0])); + kvPairHashes[1] = keccak256(abi.encode(mockKvPairs()[1])); + // Invalid proof + vm.expectRevert(); + mockIcs07Tendermint.verifyIcs07MembershipProof( + bytes("invalid"), + mockFixture.publicValues, + mockFixture.proofHeight, + mockFixture.trustedConsensusState, + kvPairHashes + ); + + // Invalid proof height + vm.expectRevert(); + mockIcs07Tendermint.verifyIcs07MembershipProof( + bytes(""), + mockFixture.publicValues, + 1, + mockFixture.trustedConsensusState, + kvPairHashes + ); + + // Invalid trusted consensus state + vm.expectRevert(); + mockIcs07Tendermint.verifyIcs07MembershipProof( + bytes(""), + mockFixture.publicValues, + mockFixture.proofHeight, + bytes("invalid"), + kvPairHashes + ); + + // Empty kvPairHashes length + vm.expectRevert(); + mockIcs07Tendermint.verifyIcs07MembershipProof( + bytes(""), + mockFixture.publicValues, + mockFixture.proofHeight, + mockFixture.trustedConsensusState, + new bytes32[](0) + ); + } + + // Confirm that submitting a random proof with the real verifier fails. + function test_Invalid_MultiMembership() public { + bytes32[] memory kvPairHashes = new bytes32[](2); + kvPairHashes[0] = keccak256(abi.encode(mockKvPairs()[0])); + kvPairHashes[1] = keccak256(abi.encode(mockKvPairs()[1])); + + vm.expectRevert(); + ics07Tendermint.verifyIcs07MembershipProof( + bytes("invalid"), + fixture.publicValues, + fixture.proofHeight, + fixture.trustedConsensusState, + kvPairHashes + ); + } +} diff --git a/contracts/test/SP1ICS07TendermintTest.sol b/contracts/test/SP1ICS07TendermintTest.sol index 1b11e40..17f8526 100644 --- a/contracts/test/SP1ICS07TendermintTest.sol +++ b/contracts/test/SP1ICS07TendermintTest.sol @@ -14,7 +14,7 @@ struct SP1ICS07GenesisFixtureJson { bytes trustedClientState; bytes trustedConsensusState; bytes32 updateClientVkey; - bytes32 verifyMembershipVkey; + bytes32 membershipVkey; } abstract contract SP1ICS07TendermintTest is Test { @@ -45,7 +45,7 @@ abstract contract SP1ICS07TendermintTest is Test { SP1Verifier verifier = new SP1Verifier(); ics07Tendermint = new SP1ICS07Tendermint( genesisFixture.updateClientVkey, - genesisFixture.verifyMembershipVkey, + genesisFixture.membershipVkey, address(verifier), genesisFixture.trustedClientState, trustedConsensusHash @@ -66,7 +66,7 @@ abstract contract SP1ICS07TendermintTest is Test { SP1MockVerifier mockVerifier = new SP1MockVerifier(); mockIcs07Tendermint = new SP1ICS07Tendermint( mockGenesisFixture.updateClientVkey, - mockGenesisFixture.verifyMembershipVkey, + mockGenesisFixture.membershipVkey, address(mockVerifier), mockGenesisFixture.trustedClientState, mockTrustedConsensusHash @@ -101,15 +101,13 @@ abstract contract SP1ICS07TendermintTest is Test { ".trustedConsensusState" ); bytes32 updateClientVkey = json.readBytes32(".updateClientVkey"); - bytes32 verifyMembershipVkey = json.readBytes32( - ".verifyMembershipVkey" - ); + bytes32 membershipVkey = json.readBytes32(".membershipVkey"); SP1ICS07GenesisFixtureJson memory fix = SP1ICS07GenesisFixtureJson({ trustedClientState: trustedClientState, trustedConsensusState: trustedConsensusState, updateClientVkey: updateClientVkey, - verifyMembershipVkey: verifyMembershipVkey + membershipVkey: membershipVkey }); return fix; diff --git a/contracts/test/SP1ICS07VerifyMembership.t.sol b/contracts/test/SP1ICS07VerifyMembership.t.sol deleted file mode 100644 index 4f0e1d8..000000000 --- a/contracts/test/SP1ICS07VerifyMembership.t.sol +++ /dev/null @@ -1,159 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -import "forge-std/console.sol"; -import {Test} from "forge-std/Test.sol"; -import {stdJson} from "forge-std/StdJson.sol"; -import {stdError} from "forge-std/StdError.sol"; -import {ICS07Tendermint} from "../src/ics07-tendermint/ICS07Tendermint.sol"; -import {SP1ICS07Tendermint} from "../src/SP1ICS07Tendermint.sol"; -import {SP1ICS07TendermintTest} from "./SP1ICS07TendermintTest.sol"; -import {SP1Verifier} from "@sp1-contracts/SP1Verifier.sol"; -import {SP1MockVerifier} from "@sp1-contracts/SP1MockVerifier.sol"; - -struct SP1ICS07VerifyMembershipFixtureJson { - uint32 proofHeight; - bytes trustedClientState; - bytes trustedConsensusState; - bytes32 updateClientVkey; - bytes32 verifyMembershipVkey; - bytes32 commitmentRoot; - bytes publicValues; - bytes proof; - bytes value; -} - -// set constant string -string constant verifyMembershipPath = "clients/07-tendermint-0/clientState"; - -contract SP1ICS07VerifyMembershipTest is SP1ICS07TendermintTest { - using stdJson for string; - - SP1ICS07VerifyMembershipFixtureJson public fixture; - SP1ICS07VerifyMembershipFixtureJson public mockFixture; - - function setUp() public { - fixture = loadFixture("verify_membership_fixture.json"); - mockFixture = loadFixture("mock_verify_membership_fixture.json"); - - setUpTest( - "verify_membership_fixture.json", - "mock_verify_membership_fixture.json" - ); - } - - function loadFixture( - string memory fileName - ) public view returns (SP1ICS07VerifyMembershipFixtureJson memory) { - string memory root = vm.projectRoot(); - string memory path = string.concat(root, "/fixtures/", fileName); - string memory json = vm.readFile(path); - bytes memory trustedClientState = json.readBytes(".trustedClientState"); - bytes memory trustedConsensusState = json.readBytes( - ".trustedConsensusState" - ); - uint32 proofHeight = uint32(json.readUint(".proofHeight")); - bytes32 updateClientVkey = json.readBytes32(".updateClientVkey"); - bytes32 verifyMembershipVkey = json.readBytes32( - ".verifyMembershipVkey" - ); - bytes32 commitmentRoot = json.readBytes32(".commitmentRoot"); - bytes memory publicValues = json.readBytes(".publicValues"); - bytes memory proof = json.readBytes(".proof"); - bytes memory value = json.readBytes(".value"); - - SP1ICS07VerifyMembershipFixtureJson - memory fix = SP1ICS07VerifyMembershipFixtureJson({ - commitmentRoot: commitmentRoot, - trustedClientState: trustedClientState, - trustedConsensusState: trustedConsensusState, - proofHeight: proofHeight, - updateClientVkey: updateClientVkey, - verifyMembershipVkey: verifyMembershipVkey, - publicValues: publicValues, - proof: proof, - value: value - }); - - return fix; - } - - // Confirm that submitting a real proof passes the verifier. - function test_ValidSP1ICS07VerifyMembership() public view { - ics07Tendermint.verifyIcs07VerifyMembershipProof( - fixture.proof, - fixture.publicValues, - fixture.proofHeight, - fixture.trustedConsensusState, - verifyMembershipPath, - fixture.value - ); - - // to console - console.log( - "VerifyMembership gas used: ", - vm.lastCallGas().gasTotalUsed - ); - } - - // Confirm that submitting an empty proof passes the mock verifier. - function test_ValidMockVerifyMembership() public view { - mockIcs07Tendermint.verifyIcs07VerifyMembershipProof( - mockFixture.proof, - mockFixture.publicValues, - mockFixture.proofHeight, - mockFixture.trustedConsensusState, - verifyMembershipPath, - mockFixture.value - ); - } - - // Confirm that submitting a non-empty proof with the mock verifier fails. - function test_Invalid_MockVerifyMembership() public { - // Invalid proof - vm.expectRevert(); - mockIcs07Tendermint.verifyIcs07VerifyMembershipProof( - bytes("invalid"), - mockFixture.publicValues, - mockFixture.proofHeight, - mockFixture.trustedConsensusState, - verifyMembershipPath, - mockFixture.value - ); - - // Invalid proof height - vm.expectRevert(); - mockIcs07Tendermint.verifyIcs07VerifyMembershipProof( - bytes(""), - mockFixture.publicValues, - 1, - mockFixture.trustedConsensusState, - verifyMembershipPath, - mockFixture.value - ); - - // Invalid trusted consensus state - vm.expectRevert(); - mockIcs07Tendermint.verifyIcs07VerifyMembershipProof( - bytes(""), - mockFixture.publicValues, - mockFixture.proofHeight, - bytes("invalid"), - verifyMembershipPath, - mockFixture.value - ); - } - - // Confirm that submitting a random proof with the real verifier fails. - function test_Invalid_VerifyMembership() public { - vm.expectRevert(); - ics07Tendermint.verifyIcs07VerifyMembershipProof( - bytes("invalid"), - fixture.publicValues, - fixture.proofHeight, - fixture.trustedConsensusState, - verifyMembershipPath, - fixture.value - ); - } -} diff --git a/contracts/test/SP1ICS07VerifyNonMembership.t.sol b/contracts/test/SP1ICS07VerifyNonMembership.t.sol deleted file mode 100644 index 8f36f0c..000000000 --- a/contracts/test/SP1ICS07VerifyNonMembership.t.sol +++ /dev/null @@ -1,150 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -import "forge-std/console.sol"; -import {Test} from "forge-std/Test.sol"; -import {stdJson} from "forge-std/StdJson.sol"; -import {stdError} from "forge-std/StdError.sol"; -import {ICS07Tendermint} from "../src/ics07-tendermint/ICS07Tendermint.sol"; -import {SP1ICS07Tendermint} from "../src/SP1ICS07Tendermint.sol"; -import {SP1ICS07TendermintTest} from "./SP1ICS07TendermintTest.sol"; -import {SP1Verifier} from "@sp1-contracts/SP1Verifier.sol"; -import {SP1MockVerifier} from "@sp1-contracts/SP1MockVerifier.sol"; - -struct SP1ICS07VerifyNonMembershipFixtureJson { - uint32 proofHeight; - bytes trustedClientState; - bytes trustedConsensusState; - bytes32 updateClientVkey; - bytes32 verifyMembershipVkey; - bytes32 commitmentRoot; - bytes publicValues; - bytes proof; -} - -// set constant string -string constant verifyNonMembershipPath = "clients/07-tendermint-001/clientState"; - -contract SP1ICS07VerifyMembershipTest is SP1ICS07TendermintTest { - using stdJson for string; - - SP1ICS07VerifyNonMembershipFixtureJson public fixture; - SP1ICS07VerifyNonMembershipFixtureJson public mockFixture; - - function setUp() public { - fixture = loadFixture("verify_non_membership_fixture.json"); - mockFixture = loadFixture("mock_verify_non_membership_fixture.json"); - - setUpTest( - "verify_non_membership_fixture.json", - "mock_verify_non_membership_fixture.json" - ); - } - - function loadFixture( - string memory fileName - ) public view returns (SP1ICS07VerifyNonMembershipFixtureJson memory) { - string memory root = vm.projectRoot(); - string memory path = string.concat(root, "/fixtures/", fileName); - string memory json = vm.readFile(path); - bytes memory trustedClientState = json.readBytes(".trustedClientState"); - bytes memory trustedConsensusState = json.readBytes( - ".trustedConsensusState" - ); - uint32 proofHeight = uint32(json.readUint(".proofHeight")); - bytes32 updateClientVkey = json.readBytes32(".updateClientVkey"); - bytes32 verifyMembershipVkey = json.readBytes32( - ".verifyMembershipVkey" - ); - bytes32 commitmentRoot = json.readBytes32(".commitmentRoot"); - bytes memory publicValues = json.readBytes(".publicValues"); - bytes memory proof = json.readBytes(".proof"); - - SP1ICS07VerifyNonMembershipFixtureJson - memory fix = SP1ICS07VerifyNonMembershipFixtureJson({ - commitmentRoot: commitmentRoot, - trustedClientState: trustedClientState, - trustedConsensusState: trustedConsensusState, - proofHeight: proofHeight, - updateClientVkey: updateClientVkey, - verifyMembershipVkey: verifyMembershipVkey, - publicValues: publicValues, - proof: proof - }); - - return fix; - } - - // Confirm that submitting a real proof passes the verifier. - function test_ValidSP1ICS07VerifyNonMembership() public view { - ics07Tendermint.verifyIcs07VerifyNonMembershipProof( - fixture.proof, - fixture.publicValues, - fixture.proofHeight, - fixture.trustedConsensusState, - verifyNonMembershipPath - ); - - // to console - console.log( - "VerifyNonMembership gas used: ", - vm.lastCallGas().gasTotalUsed - ); - } - - // Confirm that submitting an empty proof passes the mock verifier. - function test_ValidMockVerifyMembership() public view { - mockIcs07Tendermint.verifyIcs07VerifyNonMembershipProof( - mockFixture.proof, - mockFixture.publicValues, - mockFixture.proofHeight, - mockFixture.trustedConsensusState, - verifyNonMembershipPath - ); - } - - // Confirm that submitting a non-empty proof with the mock verifier fails. - function test_Invalid_MockVerifyNonMembership() public { - // Invalid proof - vm.expectRevert(); - mockIcs07Tendermint.verifyIcs07VerifyNonMembershipProof( - bytes("invalid"), - mockFixture.publicValues, - mockFixture.proofHeight, - mockFixture.trustedConsensusState, - verifyNonMembershipPath - ); - - // Invalid proof height - vm.expectRevert(); - mockIcs07Tendermint.verifyIcs07VerifyNonMembershipProof( - bytes(""), - mockFixture.publicValues, - 1, - mockFixture.trustedConsensusState, - verifyNonMembershipPath - ); - - // Invalid trusted consensus state - vm.expectRevert(); - mockIcs07Tendermint.verifyIcs07VerifyNonMembershipProof( - bytes(""), - mockFixture.publicValues, - mockFixture.proofHeight, - bytes("invalid"), - verifyNonMembershipPath - ); - } - - // Confirm that submitting a random proof with the real verifier fails. - function test_Invalid_VerifyNonMembership() public { - vm.expectRevert(); - ics07Tendermint.verifyIcs07VerifyNonMembershipProof( - bytes("invalid"), - fixture.publicValues, - fixture.proofHeight, - fixture.trustedConsensusState, - verifyNonMembershipPath - ); - } -} diff --git a/contracts/test/SP1ICS07UpdateClient.t.sol b/contracts/test/UpdateClient.t.sol similarity index 97% rename from contracts/test/SP1ICS07UpdateClient.t.sol rename to contracts/test/UpdateClient.t.sol index 345f497..9520ac3 100644 --- a/contracts/test/SP1ICS07UpdateClient.t.sol +++ b/contracts/test/UpdateClient.t.sol @@ -18,7 +18,7 @@ struct SP1ICS07UpdateClientFixtureJson { bytes targetConsensusState; uint32 targetHeight; bytes32 updateClientVkey; - bytes32 verifyMembershipVkey; + bytes32 membershipVkey; bytes publicValues; bytes proof; } @@ -54,9 +54,7 @@ contract SP1ICS07UpdateClientTest is SP1ICS07TendermintTest { ); uint32 targetHeight = uint32(json.readUint(".targetHeight")); bytes32 updateClientVkey = json.readBytes32(".updateClientVkey"); - bytes32 verifyMembershipVkey = json.readBytes32( - ".verifyMembershipVkey" - ); + bytes32 membershipVkey = json.readBytes32(".membershipVkey"); bytes memory publicValues = json.readBytes(".publicValues"); bytes memory proof = json.readBytes(".proof"); @@ -67,7 +65,7 @@ contract SP1ICS07UpdateClientTest is SP1ICS07TendermintTest { targetConsensusState: targetConsensusState, targetHeight: targetHeight, updateClientVkey: updateClientVkey, - verifyMembershipVkey: verifyMembershipVkey, + membershipVkey: membershipVkey, publicValues: publicValues, proof: proof }); diff --git a/contracts/test/VerifyMembership.t.sol b/contracts/test/VerifyMembership.t.sol new file mode 100644 index 000000000..41c9525 --- /dev/null +++ b/contracts/test/VerifyMembership.t.sol @@ -0,0 +1,146 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import "forge-std/console.sol"; +import {Test} from "forge-std/Test.sol"; +import {stdJson} from "forge-std/StdJson.sol"; +import {stdError} from "forge-std/StdError.sol"; +import {ICS07Tendermint} from "../src/ics07-tendermint/ICS07Tendermint.sol"; +import {SP1ICS07Tendermint} from "../src/SP1ICS07Tendermint.sol"; +import {MembershipTest} from "./MembershipTest.sol"; +import {MembershipProgram} from "../src/ics07-tendermint/MembershipProgram.sol"; +import {SP1Verifier} from "@sp1-contracts/SP1Verifier.sol"; +import {SP1MockVerifier} from "@sp1-contracts/SP1MockVerifier.sol"; + +// set constant string +string constant verifyMembershipPath = "clients/07-tendermint-0/clientState"; + +contract SP1ICS07VerifyMembershipTest is MembershipTest { + function setUp() public { + setUpTestWithFixtures( + "verify_membership_fixture.json", + "mock_verify_membership_fixture.json" + ); + } + + function test_ValidateFixtures() public view { + assertEq(kvPairs().length, 1); + assertEq(kvPairs()[0].key, verifyMembershipPath); + assert(kvPairs()[0].value.length != 0); + + assertEq(mockKvPairs().length, 1); + assertEq(mockKvPairs()[0].key, verifyMembershipPath); + assert(mockKvPairs()[0].value.length != 0); + } + + // Confirm that submitting a real proof passes the verifier. + function test_ValidVerifyMembership() public view { + bytes32[] memory kvPairHashes = new bytes32[](1); + bytes32 kvPairHash = keccak256(abi.encode(kvPairs()[0])); + kvPairHashes[0] = kvPairHash; + + ics07Tendermint.verifyIcs07MembershipProof( + fixture.proof, + fixture.publicValues, + fixture.proofHeight, + fixture.trustedConsensusState, + kvPairHashes + ); + + // to console + console.log( + "VerifyMembership gas used: ", + vm.lastCallGas().gasTotalUsed + ); + } + + // Confirm that submitting an empty proof passes the mock verifier. + function test_ValidMockVerifyMembership() public view { + bytes32[] memory kvPairHashes = new bytes32[](1); + bytes32 kvPairHash = keccak256(abi.encode(mockKvPairs()[0])); + kvPairHashes[0] = kvPairHash; + + mockIcs07Tendermint.verifyIcs07MembershipProof( + mockFixture.proof, + mockFixture.publicValues, + mockFixture.proofHeight, + mockFixture.trustedConsensusState, + kvPairHashes + ); + } + + // Confirm that submitting a non-empty proof with the mock verifier fails. + function test_Invalid_MockVerifyMembership() public { + bytes32[] memory kvPairHashes = new bytes32[](1); + bytes32 kvPairHash = keccak256(abi.encode(mockKvPairs()[0])); + kvPairHashes[0] = kvPairHash; + + // Invalid proof + vm.expectRevert(); + mockIcs07Tendermint.verifyIcs07MembershipProof( + bytes("invalid"), + mockFixture.publicValues, + mockFixture.proofHeight, + mockFixture.trustedConsensusState, + kvPairHashes + ); + + // Invalid proof height + vm.expectRevert(); + mockIcs07Tendermint.verifyIcs07MembershipProof( + bytes(""), + mockFixture.publicValues, + 1, + mockFixture.trustedConsensusState, + kvPairHashes + ); + + // Invalid trusted consensus state + vm.expectRevert(); + mockIcs07Tendermint.verifyIcs07MembershipProof( + bytes(""), + mockFixture.publicValues, + mockFixture.proofHeight, + bytes("invalid"), + kvPairHashes + ); + + // empty kvPairHashes + vm.expectRevert(); + mockIcs07Tendermint.verifyIcs07MembershipProof( + bytes(""), + mockFixture.publicValues, + mockFixture.proofHeight, + mockFixture.trustedConsensusState, + new bytes32[](0) + ); + + // Invalid kvPairHashes + bytes32[] memory invalidHashes = new bytes32[](1); + invalidHashes[0] = keccak256("invalid"); + vm.expectRevert(); + mockIcs07Tendermint.verifyIcs07MembershipProof( + bytes(""), + mockFixture.publicValues, + mockFixture.proofHeight, + mockFixture.trustedConsensusState, + invalidHashes + ); + } + + // Confirm that submitting a random proof with the real verifier fails. + function test_Invalid_VerifyMembership() public { + bytes32[] memory kvPairHashes = new bytes32[](1); + bytes32 kvPairHash = keccak256(abi.encode(mockKvPairs()[0])); + kvPairHashes[0] = kvPairHash; + + vm.expectRevert(); + ics07Tendermint.verifyIcs07MembershipProof( + bytes("invalid"), + fixture.publicValues, + fixture.proofHeight, + fixture.trustedConsensusState, + kvPairHashes + ); + } +} diff --git a/e2e/interchaintestv8/types/sp1ics07tendermint/contract.go b/e2e/interchaintestv8/types/sp1ics07tendermint/contract.go index ae3c7a3..70a071b 100644 --- a/e2e/interchaintestv8/types/sp1ics07tendermint/contract.go +++ b/e2e/interchaintestv8/types/sp1ics07tendermint/contract.go @@ -58,11 +58,16 @@ type ICS07TendermintTrustThreshold struct { Denominator uint8 } +// MembershipProgramKVPair is an auto generated low-level Go binding around an user-defined struct. +type MembershipProgramKVPair struct { + Key string + Value []byte +} + // MembershipProgramMembershipOutput is an auto generated low-level Go binding around an user-defined struct. type MembershipProgramMembershipOutput struct { CommitmentRoot [32]byte - KeyPath string - Value []byte + KvPairs []MembershipProgramKVPair } // UpdateClientProgramEnv is an auto generated low-level Go binding around an user-defined struct. @@ -84,7 +89,7 @@ type UpdateClientProgramUpdateClientOutput struct { // ContractMetaData contains all meta data concerning the Contract contract. var ContractMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ics07UpdateClientProgramVkey\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_ics07VerifyMembershipProgramVkey\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_verifier\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_clientState\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_consensusState\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ALLOWED_SP1_CLOCK_DRIFT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getClientState\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structICS07Tendermint.ClientState\",\"components\":[{\"name\":\"chain_id\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"trust_level\",\"type\":\"tuple\",\"internalType\":\"structICS07Tendermint.TrustThreshold\",\"components\":[{\"name\":\"numerator\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"denominator\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"latest_height\",\"type\":\"tuple\",\"internalType\":\"structICS07Tendermint.Height\",\"components\":[{\"name\":\"revision_number\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"revision_height\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"trusting_period\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"unbonding_period\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"is_frozen\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConsensusState\",\"inputs\":[{\"name\":\"revisionHeight\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ics07UpdateClientProgramVkey\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ics07VerifyMembershipProgramVkey\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validateMembershipOutput\",\"inputs\":[{\"name\":\"output\",\"type\":\"tuple\",\"internalType\":\"structMembershipProgram.MembershipOutput\",\"components\":[{\"name\":\"commitment_root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"key_path\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofHeight\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"trustedConsensusStateBz\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"keyPath\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structICS07Tendermint.ConsensusState\",\"components\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"next_validators_hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validateUpdateClientPublicValues\",\"inputs\":[{\"name\":\"output\",\"type\":\"tuple\",\"internalType\":\"structUpdateClientProgram.UpdateClientOutput\",\"components\":[{\"name\":\"trusted_consensus_state\",\"type\":\"tuple\",\"internalType\":\"structICS07Tendermint.ConsensusState\",\"components\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"next_validators_hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"new_consensus_state\",\"type\":\"tuple\",\"internalType\":\"structICS07Tendermint.ConsensusState\",\"components\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"next_validators_hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"env\",\"type\":\"tuple\",\"internalType\":\"structUpdateClientProgram.Env\",\"components\":[{\"name\":\"chain_id\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"trust_threshold\",\"type\":\"tuple\",\"internalType\":\"structICS07Tendermint.TrustThreshold\",\"components\":[{\"name\":\"numerator\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"denominator\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"trusting_period\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"now\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"trusted_height\",\"type\":\"tuple\",\"internalType\":\"structICS07Tendermint.Height\",\"components\":[{\"name\":\"revision_number\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"revision_height\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"new_height\",\"type\":\"tuple\",\"internalType\":\"structICS07Tendermint.Height\",\"components\":[{\"name\":\"revision_number\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"revision_height\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifier\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISP1Verifier\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyIcs07UpdateClientProof\",\"inputs\":[{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"publicValues\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyIcs07VerifyMembershipProof\",\"inputs\":[{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"publicValues\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"proofHeight\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"trustedConsensusStateBz\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"keyPath\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyIcs07VerifyNonMembershipProof\",\"inputs\":[{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"publicValues\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"proofHeight\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"trustedConsensusStateBz\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"keyPath\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"view\"}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ics07UpdateClientProgramVkey\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_ics07VerifyMembershipProgramVkey\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_verifier\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_clientState\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_consensusState\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ALLOWED_SP1_CLOCK_DRIFT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getClientState\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structICS07Tendermint.ClientState\",\"components\":[{\"name\":\"chain_id\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"trust_level\",\"type\":\"tuple\",\"internalType\":\"structICS07Tendermint.TrustThreshold\",\"components\":[{\"name\":\"numerator\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"denominator\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"latest_height\",\"type\":\"tuple\",\"internalType\":\"structICS07Tendermint.Height\",\"components\":[{\"name\":\"revision_number\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"revision_height\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"trusting_period\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"unbonding_period\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"is_frozen\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConsensusState\",\"inputs\":[{\"name\":\"revisionHeight\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ics07UpdateClientProgramVkey\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ics07VerifyMembershipProgramVkey\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validateMembershipOutput\",\"inputs\":[{\"name\":\"output\",\"type\":\"tuple\",\"internalType\":\"structMembershipProgram.MembershipOutput\",\"components\":[{\"name\":\"commitment_root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"kv_pairs\",\"type\":\"tuple[]\",\"internalType\":\"structMembershipProgram.KVPair[]\",\"components\":[{\"name\":\"key\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"proofHeight\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"trustedConsensusStateBz\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validateUpdateClientPublicValues\",\"inputs\":[{\"name\":\"output\",\"type\":\"tuple\",\"internalType\":\"structUpdateClientProgram.UpdateClientOutput\",\"components\":[{\"name\":\"trusted_consensus_state\",\"type\":\"tuple\",\"internalType\":\"structICS07Tendermint.ConsensusState\",\"components\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"next_validators_hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"new_consensus_state\",\"type\":\"tuple\",\"internalType\":\"structICS07Tendermint.ConsensusState\",\"components\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"next_validators_hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"env\",\"type\":\"tuple\",\"internalType\":\"structUpdateClientProgram.Env\",\"components\":[{\"name\":\"chain_id\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"trust_threshold\",\"type\":\"tuple\",\"internalType\":\"structICS07Tendermint.TrustThreshold\",\"components\":[{\"name\":\"numerator\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"denominator\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"trusting_period\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"now\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"trusted_height\",\"type\":\"tuple\",\"internalType\":\"structICS07Tendermint.Height\",\"components\":[{\"name\":\"revision_number\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"revision_height\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"new_height\",\"type\":\"tuple\",\"internalType\":\"structICS07Tendermint.Height\",\"components\":[{\"name\":\"revision_number\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"revision_height\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifier\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISP1Verifier\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyIcs07MembershipProof\",\"inputs\":[{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"publicValues\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"proofHeight\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"trustedConsensusStateBz\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"kvPairHashes\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyIcs07UpdateClientProof\",\"inputs\":[{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"publicValues\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"}]", } // ContractABI is the input ABI used to generate the binding from. @@ -388,35 +393,33 @@ func (_Contract *ContractCallerSession) Ics07VerifyMembershipProgramVkey() ([32] return _Contract.Contract.Ics07VerifyMembershipProgramVkey(&_Contract.CallOpts) } -// ValidateMembershipOutput is a free data retrieval call binding the contract method 0x344f089d. +// ValidateMembershipOutput is a free data retrieval call binding the contract method 0x46264891. // -// Solidity: function validateMembershipOutput((bytes32,string,bytes) output, uint32 proofHeight, bytes trustedConsensusStateBz, string keyPath) view returns((uint64,bytes32,bytes32)) -func (_Contract *ContractCaller) ValidateMembershipOutput(opts *bind.CallOpts, output MembershipProgramMembershipOutput, proofHeight uint32, trustedConsensusStateBz []byte, keyPath string) (ICS07TendermintConsensusState, error) { +// Solidity: function validateMembershipOutput((bytes32,(string,bytes)[]) output, uint32 proofHeight, bytes trustedConsensusStateBz) view returns() +func (_Contract *ContractCaller) ValidateMembershipOutput(opts *bind.CallOpts, output MembershipProgramMembershipOutput, proofHeight uint32, trustedConsensusStateBz []byte) error { var out []interface{} - err := _Contract.contract.Call(opts, &out, "validateMembershipOutput", output, proofHeight, trustedConsensusStateBz, keyPath) + err := _Contract.contract.Call(opts, &out, "validateMembershipOutput", output, proofHeight, trustedConsensusStateBz) if err != nil { - return *new(ICS07TendermintConsensusState), err + return err } - out0 := *abi.ConvertType(out[0], new(ICS07TendermintConsensusState)).(*ICS07TendermintConsensusState) - - return out0, err + return err } -// ValidateMembershipOutput is a free data retrieval call binding the contract method 0x344f089d. +// ValidateMembershipOutput is a free data retrieval call binding the contract method 0x46264891. // -// Solidity: function validateMembershipOutput((bytes32,string,bytes) output, uint32 proofHeight, bytes trustedConsensusStateBz, string keyPath) view returns((uint64,bytes32,bytes32)) -func (_Contract *ContractSession) ValidateMembershipOutput(output MembershipProgramMembershipOutput, proofHeight uint32, trustedConsensusStateBz []byte, keyPath string) (ICS07TendermintConsensusState, error) { - return _Contract.Contract.ValidateMembershipOutput(&_Contract.CallOpts, output, proofHeight, trustedConsensusStateBz, keyPath) +// Solidity: function validateMembershipOutput((bytes32,(string,bytes)[]) output, uint32 proofHeight, bytes trustedConsensusStateBz) view returns() +func (_Contract *ContractSession) ValidateMembershipOutput(output MembershipProgramMembershipOutput, proofHeight uint32, trustedConsensusStateBz []byte) error { + return _Contract.Contract.ValidateMembershipOutput(&_Contract.CallOpts, output, proofHeight, trustedConsensusStateBz) } -// ValidateMembershipOutput is a free data retrieval call binding the contract method 0x344f089d. +// ValidateMembershipOutput is a free data retrieval call binding the contract method 0x46264891. // -// Solidity: function validateMembershipOutput((bytes32,string,bytes) output, uint32 proofHeight, bytes trustedConsensusStateBz, string keyPath) view returns((uint64,bytes32,bytes32)) -func (_Contract *ContractCallerSession) ValidateMembershipOutput(output MembershipProgramMembershipOutput, proofHeight uint32, trustedConsensusStateBz []byte, keyPath string) (ICS07TendermintConsensusState, error) { - return _Contract.Contract.ValidateMembershipOutput(&_Contract.CallOpts, output, proofHeight, trustedConsensusStateBz, keyPath) +// Solidity: function validateMembershipOutput((bytes32,(string,bytes)[]) output, uint32 proofHeight, bytes trustedConsensusStateBz) view returns() +func (_Contract *ContractCallerSession) ValidateMembershipOutput(output MembershipProgramMembershipOutput, proofHeight uint32, trustedConsensusStateBz []byte) error { + return _Contract.Contract.ValidateMembershipOutput(&_Contract.CallOpts, output, proofHeight, trustedConsensusStateBz) } // ValidateUpdateClientPublicValues is a free data retrieval call binding the contract method 0x8de6ce1a. @@ -479,41 +482,12 @@ func (_Contract *ContractCallerSession) Verifier() (common.Address, error) { return _Contract.Contract.Verifier(&_Contract.CallOpts) } -// VerifyIcs07VerifyMembershipProof is a free data retrieval call binding the contract method 0x89eaa22b. -// -// Solidity: function verifyIcs07VerifyMembershipProof(bytes proof, bytes publicValues, uint32 proofHeight, bytes trustedConsensusStateBz, string keyPath, bytes value) view returns() -func (_Contract *ContractCaller) VerifyIcs07VerifyMembershipProof(opts *bind.CallOpts, proof []byte, publicValues []byte, proofHeight uint32, trustedConsensusStateBz []byte, keyPath string, value []byte) error { - var out []interface{} - err := _Contract.contract.Call(opts, &out, "verifyIcs07VerifyMembershipProof", proof, publicValues, proofHeight, trustedConsensusStateBz, keyPath, value) - - if err != nil { - return err - } - - return err - -} - -// VerifyIcs07VerifyMembershipProof is a free data retrieval call binding the contract method 0x89eaa22b. -// -// Solidity: function verifyIcs07VerifyMembershipProof(bytes proof, bytes publicValues, uint32 proofHeight, bytes trustedConsensusStateBz, string keyPath, bytes value) view returns() -func (_Contract *ContractSession) VerifyIcs07VerifyMembershipProof(proof []byte, publicValues []byte, proofHeight uint32, trustedConsensusStateBz []byte, keyPath string, value []byte) error { - return _Contract.Contract.VerifyIcs07VerifyMembershipProof(&_Contract.CallOpts, proof, publicValues, proofHeight, trustedConsensusStateBz, keyPath, value) -} - -// VerifyIcs07VerifyMembershipProof is a free data retrieval call binding the contract method 0x89eaa22b. -// -// Solidity: function verifyIcs07VerifyMembershipProof(bytes proof, bytes publicValues, uint32 proofHeight, bytes trustedConsensusStateBz, string keyPath, bytes value) view returns() -func (_Contract *ContractCallerSession) VerifyIcs07VerifyMembershipProof(proof []byte, publicValues []byte, proofHeight uint32, trustedConsensusStateBz []byte, keyPath string, value []byte) error { - return _Contract.Contract.VerifyIcs07VerifyMembershipProof(&_Contract.CallOpts, proof, publicValues, proofHeight, trustedConsensusStateBz, keyPath, value) -} - -// VerifyIcs07VerifyNonMembershipProof is a free data retrieval call binding the contract method 0xec09cc74. +// VerifyIcs07MembershipProof is a free data retrieval call binding the contract method 0xc378470c. // -// Solidity: function verifyIcs07VerifyNonMembershipProof(bytes proof, bytes publicValues, uint32 proofHeight, bytes trustedConsensusStateBz, string keyPath) view returns() -func (_Contract *ContractCaller) VerifyIcs07VerifyNonMembershipProof(opts *bind.CallOpts, proof []byte, publicValues []byte, proofHeight uint32, trustedConsensusStateBz []byte, keyPath string) error { +// Solidity: function verifyIcs07MembershipProof(bytes proof, bytes publicValues, uint32 proofHeight, bytes trustedConsensusStateBz, bytes32[] kvPairHashes) view returns() +func (_Contract *ContractCaller) VerifyIcs07MembershipProof(opts *bind.CallOpts, proof []byte, publicValues []byte, proofHeight uint32, trustedConsensusStateBz []byte, kvPairHashes [][32]byte) error { var out []interface{} - err := _Contract.contract.Call(opts, &out, "verifyIcs07VerifyNonMembershipProof", proof, publicValues, proofHeight, trustedConsensusStateBz, keyPath) + err := _Contract.contract.Call(opts, &out, "verifyIcs07MembershipProof", proof, publicValues, proofHeight, trustedConsensusStateBz, kvPairHashes) if err != nil { return err @@ -523,18 +497,18 @@ func (_Contract *ContractCaller) VerifyIcs07VerifyNonMembershipProof(opts *bind. } -// VerifyIcs07VerifyNonMembershipProof is a free data retrieval call binding the contract method 0xec09cc74. +// VerifyIcs07MembershipProof is a free data retrieval call binding the contract method 0xc378470c. // -// Solidity: function verifyIcs07VerifyNonMembershipProof(bytes proof, bytes publicValues, uint32 proofHeight, bytes trustedConsensusStateBz, string keyPath) view returns() -func (_Contract *ContractSession) VerifyIcs07VerifyNonMembershipProof(proof []byte, publicValues []byte, proofHeight uint32, trustedConsensusStateBz []byte, keyPath string) error { - return _Contract.Contract.VerifyIcs07VerifyNonMembershipProof(&_Contract.CallOpts, proof, publicValues, proofHeight, trustedConsensusStateBz, keyPath) +// Solidity: function verifyIcs07MembershipProof(bytes proof, bytes publicValues, uint32 proofHeight, bytes trustedConsensusStateBz, bytes32[] kvPairHashes) view returns() +func (_Contract *ContractSession) VerifyIcs07MembershipProof(proof []byte, publicValues []byte, proofHeight uint32, trustedConsensusStateBz []byte, kvPairHashes [][32]byte) error { + return _Contract.Contract.VerifyIcs07MembershipProof(&_Contract.CallOpts, proof, publicValues, proofHeight, trustedConsensusStateBz, kvPairHashes) } -// VerifyIcs07VerifyNonMembershipProof is a free data retrieval call binding the contract method 0xec09cc74. +// VerifyIcs07MembershipProof is a free data retrieval call binding the contract method 0xc378470c. // -// Solidity: function verifyIcs07VerifyNonMembershipProof(bytes proof, bytes publicValues, uint32 proofHeight, bytes trustedConsensusStateBz, string keyPath) view returns() -func (_Contract *ContractCallerSession) VerifyIcs07VerifyNonMembershipProof(proof []byte, publicValues []byte, proofHeight uint32, trustedConsensusStateBz []byte, keyPath string) error { - return _Contract.Contract.VerifyIcs07VerifyNonMembershipProof(&_Contract.CallOpts, proof, publicValues, proofHeight, trustedConsensusStateBz, keyPath) +// Solidity: function verifyIcs07MembershipProof(bytes proof, bytes publicValues, uint32 proofHeight, bytes trustedConsensusStateBz, bytes32[] kvPairHashes) view returns() +func (_Contract *ContractCallerSession) VerifyIcs07MembershipProof(proof []byte, publicValues []byte, proofHeight uint32, trustedConsensusStateBz []byte, kvPairHashes [][32]byte) error { + return _Contract.Contract.VerifyIcs07MembershipProof(&_Contract.CallOpts, proof, publicValues, proofHeight, trustedConsensusStateBz, kvPairHashes) } // VerifyIcs07UpdateClientProof is a paid mutator transaction binding the contract method 0x61d311c5. diff --git a/elf/membership-riscv32im-succinct-zkvm-elf b/elf/membership-riscv32im-succinct-zkvm-elf index 080bb3255240c6958be48e69879e7cb57d0c69ea..1d0489d1d0c6f4c11337423638fea9d34172b666 100755 GIT binary patch delta 97958 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 oQy2YPbb9i)?z^~lVPa{6vkNQ~&?~ diff --git a/elf/update-client-riscv32im-succinct-zkvm-elf b/elf/update-client-riscv32im-succinct-zkvm-elf index fc6da6d74b07d0c3e1c5e4f1b0da1bf10088842e..8a9834f81080254c528e0d900081417a45e19ab6 100755 GIT binary patch delta 180458 zcmc${d3Y2>^Ef^;J3X5~2q8-dBmqJ~!XZaEgPa3l!wunT7lIt3qC^7>ipL;qL! zH|!cEH5}It|3C3|cjZXem;Y=Zk=E7k(lX++G(r_NHbr~_cx5n6Y-@{wc|^J zn2fihhRB!wQT3cM`qfTjW%`Tj?H0LPovwk|#-ATON51N>jCOD~QfkLH5|}m**IyxW zHyU08I|>Z1n(Ut*bBkge^Y4#orWi;4XJQ@^iS?_s6YIY-QExUFA&>S)#m;ol{Co|X z)0`&Op`QNrHLyQt*lRuiC-Rm)sU2H7z_8~v93qeRzuwScE^A-yG}h~WJ#L%G-7ss% zG`2DBJsaIGV(Tx|j;(KC*jE}2krn^oc!w_1n%Zfk<&5Unct>xo$7;v6iu@&woi1e5 zz|5yHW8LRBn#_^GU)3b22ZI}PYsWWkL;Q6A>VzS3C;!O=2aSG9?KJviM)O$W2zj3W zXksvMxSTPy(-=b;&BIAU(LQSJCfG?Otjd4xQ{zbZKx1-$3lHE6DInieDE9RI2o zPMY7YLGu%*NpbYtICBl`N`~Dw)rtMZHLwpc>^d!-*axnGy^mpk-*Sj7`@5z&tfaqD zJB_}B(v%%bYZJ`d%s|rS+R>%8OvIR0Bjj=Zl2#6P(pT0_qd&%IMz$UyPw}s5?J%ld zRD&j$hKBy2Kjy?x|C{^Ax{tJ#JP{Fp`K>ka{*Ld~Df_X_pQ`_z{?TO@I;6PbcA9i5 zD)PPQCx!w!EUc3JF>9W)>AE3Zi?Yj|hY~rXY;ccJwNoq>DCRJV|Mo_TiDmoy*Pzgu zjI;ijZ8s@_PX1-yiSl#)oRLk-@lVy6F=p%1x1FO4+dq3&K&88Ouo_^PFMknHVxp`)Plw^8B*a(>sQDl~G#zp`y3i z*uQw@f8-}#nKfSv(>R8)p9mSfbda*Gc{&?-ajoO_L9ol~{umc}m%t zw`&-S5$d~a51Ay_r@m3v@m-b3Q_H%3P{S`usUWE}3TowF_fft)q%7vpJF48V?8v9? za35m0dI{s*_lvRa));&d5rrtBQQ1phG$rz=vIEC!NGM^(iAJgo@*5#fJ$wQ^b#7V3 znHu=T6rZL542P@!yU$LPe`i+u?(75M24$$y#gJ#r-xFiP#r)Pr??Q?NtkK~2UUjWPGv zm1}eo|E-xI9j?6O~Pa8wbkC@KIxVfZT+t3D-4| zdql3zT!22I1y-B0o5;T*E>P+j^SW zUV=4k5&2Pu+~7KSUbyvhC~HXw=LvABGfH`f#dSOI2=fZogmN;F891&$#wY0P#RnQ?( zKm)FfH`HdHeNO&4LQaFDugLE-P4{TYGGs8F7U1}Pi6k1=DUb$M8S3=0d9+M!?vkgP zmv+i`$ntIGtX+7Y);`l7N!sP0L<;k0B-935cgydff_J|zHPvur*58C=NRFug5&96R{`?wV8VKeCqd4m#pfb|pyANC)W2Pk@u z8TFO?jG{>CX6bP`OGLQzwVag}!e^sh)qD&3RR_w$Qxpib!SrwBLd+j$zL96jvSj9* zlpj~*ZD!@S^3!$YL$L5yY(BX19GdnENWu#Yx**qYt53l!*@D@W1SDh}<wth6!pamXcsV_vA>Z5Y%TDjYUL<**o;h6;x*ARJbK zc)HACf!|i1m!}kb&Rg;+hiDu75dMzjzcIj=^jz8=#bLfLI7~;FQP<{n9JR7(0zV== z_&d~3q>tdZ<7u#BkE)Qqz;N4wXjCImN40g$78L3_GAA7N|Exg?H7`ae(`1~wZ>Xbq=xjB+uJW@i zzhX|Ur+nx}uWA>kERheI+vAkaijC6bP37|HIJcO^ub0WchQ* zNKg_B(5<9cd$dDt1r^l&tw_vFmG-EI`o`O&2%LG2@wNcEnO?{Kjc%rg`pZWa!-?}# zX{O_NL3e9ZWj9JLWcWF6^eRw^y2&oMgqQ0>v17BjjBGyPnAI_4t91#v9I{pU4RR8Z zONBW*QRziXi!DhCmPfaldNbu&C9*nMRwXO()wgC$3uTy!Np5NyMb9wLrz3-XKP zHm0|$GRA#9pBYLids=TDe@mPh=v)h|jn-Su->h!C@G(^MQsQxbInzt=%a>tcZ{;*j zbJP1M_bS3{da|GLrQAO>McNvCP3IEchwACmPPUb`wXGbW+$+yF?;D`x(Oi2pOUY9( zdh~2e7#LIIhAG41*t|DXwjqQr_vqC!|Q#)>l3W}cj?EYak; z=IlJ>eWd|rM3%@^MoVVYgTc2dUF3SO@K&X{90hA`RTA6R<2nVWbzfcD12EXYX5rNM zDw@Tf@{z>hU*}n7wBzv8p1?HgoP!=E;gN&D=Me{pe%%xJx;q%H?L#d>ldf9k_V6 zGECkN0~aV`<#)|h3zSs(db9(r_=9!`lyj@G;>@Ze^S%q`?@^}lss84B zmB}(r^{?ND=D{(|e}G28R5N0slBi;;YiTH5$n~FiGy@Ap)|<&_VLD?GZv9QHOyq6) z4d|vvs@pCchGHMO=|R}yLk~I($wfF82hH9^N~SAK2n;?BLC^6Nkx-kt>i?8;F05&m zJ*wbB0n4H%mAx*Q_6e3L*RNCtxa6_s!ly6>aE%f3w6Z~sY{vAW;rIGFCA0e0ytGcq zQqn@r+~KETEw;!-NwAg-wVBhOL6(sn*odRI?A)lFi>SH6GSwHAuw_bQm{alj7Fj@# zZOTNU5?{4ViPs#<6eP{S1krpIl`5`qP(y6PslIC3%G%pHnvP@ z{zUDK1{L^t?QO+W;G?y-l~93?)ZSK#ZOtDJwWU@^Blggu0+)sw?KY^`sm#RD?O`fd zjLtVV?xJ&XUAWs)CbqC+Q@6{S85o9=yE@dyN5NT3N%Ynpof*uZ*P>7%?arvjDniz# zufblvK^5|o3-!$5dz3s9nP$>^>R-Fcm8|MpQ+)@E1<}7G3_K|TwXr7*!M_^6iwRN0 zO=g*>R@^o3DR(H5q3i@P2bJc+ZI6SP8Lyhl4=NpLirx1C)+W`S3mYr2#F5O!A1Pld zn2B>gQLZW&-?^XBn3-#yKSJYuthww9G%`*k=f6~bz{#QVs1om%o0}I;V4Z}U1^1m& zx-!*~&rhH#OV#XYU2BQVBjdH5FdHxhFp+=b}Pg4P7&Eel+$l!JA z4|F&un)}aE1xA>;KPjdf*B)tQkA`s&Dw2Keq1`!58|`86IW*cDbIUml^EPi|!j<^Y z`1WurEH0`PTFJD*Aw3stgS#&(nYc>XdQsVp_L=pE;!$9o?DCk8{iTeS(R7uUFsY(v zb-hAWoNunVs<^1FN@Q0eiK7WZ!J=4D$=enxG#9NS&(h165aD)BK_gFhyKoFHo693y zkGk9$ZaS+MK}C$KBkay{oy65d?|QC@cXneBtqt0&_Ys~lbmI@L8C-lk)!jod`|1>K z3=r@Uo@~RV{!X|a#P7E=+Vz2=7`;qXW0)+;w$2MQf^6%o02gFSe>&ko*~UdDJSbcG z9XG31n<*YwS6u9!qYB6}OlssBDr%u`6{rO*^o;^s(874x2@h%^l{(=;EsU4Un0S|l z>(OWFNVErUg6mUTfqZIGYq~(l72xox0-P(rNAz|l92H=2W0n(+3UK_HkdaL7ki_he zC-{R5vzv$ffeF8fLe2 zC5i@-J`iXH9i(yrF6f|t?1Tq(us(9agF5IH+#rvoQG@6Qs6kr5f9JY>!`;xMtzAe}yM-z27dF-Th4#f`B!Vr&4 z2wE7Yom`EeG%?}@E%b9v{Gb-rFA(#AE6?oL#We?W$d6`eH`l0O4&fSX7AQpx)(UXJ z4wiWMLDb-RCw@qSEzAyb4{8T%BafXsdSWgG$mtb|ogC&8V!(1;IDDLwH(G-a^vzCq zvJJPUIpL@a$G?f`@?38=CX++D9OIj<-rM0~Kc_}U1A&vEkr64txpkNXOFS^Zt-~e9 zIq`!USstd*=>E()^|?lDrnw9y1D(1^?+82uU8J`JxS)$JKFSw#vEFmy2X)ckWxD*~ zW!Ay9Z)n!L0)vNybkXTZ84Cp-To(?%TYw9?Sc{zS;7IA>@fE~JT_noidXVX|ekilc z11682uSU3r&gOG3lO}Z)xC&ZG?F2a2f^pTacfwH%E-lju4{D*q)q1X#W}8u{g{;Ge zF|G_=23&>v#)KK9eE=s!B)K~=0Dm_a@o%M5bbHb}jRp>)Cx zvR;DQ#q82ktiYGH*<-9at%4NQwkH!v4jXKS%yN=S(7MqHM=cm!7t;aaqZS;0GSlMgsmvA=Y%QARI<=5u1g?S>QiK2(w9vysG^mB; zapDKH&|{evx82Na5p8R+X}VJjqh`=@Tht6%-nW`T%Wd&~?OIqoXn&c(Y!NVH?!m$r zI^55yxNxo$q2cu&)T2^H^5hE*ciQWz6!l>p~s!e!Kq zRjyObSmpQ|xD{@>kB*77j*f|4q~$>Ae_YdS2VwJ*FhA6OInT z;QAyd936z?Ph`Q;;J?gG$J)U%!UzQmlP1*@s0A$~BESVL!fWcF7M2+L+%dRz^_dn= zEn*>CH)IjJO7u>Fvx}W}vGxd(1&yp%1-PJ*V~$36P$MJY#1Gm<+Q&2+QA9P8EUwXW zORf zeSs@YmhvJ&#Nb9p zCp@T?)PZaD%Hzz9+uE-4-IF2LVQT0n1ad(Q{YwEZsNpz6DHulzE4+hh7^h4$4qbs}7lcb<=nKM)u$nt4T>2lk!P~2t4W6QI(h;zTwhPz5c!*jP za+WGK_~Km4RpRi$HB>64_>Kg?Rbp@{tn@~eIQ|&3Vhyv$NV8;JwLO>+%Pj~Igj-hy zIJXBEBF4QS+^Fls4+@v+0197i{<@yoL$iIN&8Cn~Fg0{>juq6<#naw`8pb}SxMaJp z(q1P#sD`n}tlZ@K4Ch;O*B0DGvcsa1+5dilhRf#gxdNQaE@Ae6&$%Cy=GxPnZ_sb@i^)J4GOX6L-aLNq8-$^ewP)?B&Gb(>2RY7MNW7~_F}X2T`Ieix%5D_ zY%Zg>KqJZ)i&@@pg9UVd0iPS3!6n@ZN7)>|uNm_J-PbdYK`##8@Yz!!9|E;!*q9rW{n{a3=F(KyRD)i0{!tdx!Lbb*j7z~N&2aRu_3^=}jKdCwVKn&pIJ&pH0B zX7QIUcQBnY-cnNmSCA=%Efmq(jE9~g;0rRXWG6f*Q*RC^bFKMICGGS$v+|p;P8**J zgn|NwxVVF9be_A5_3P!WF1OOPTL~LJu}a~BIXoutUCg+U8_5nkJBb@jl!5SBw_N%L}LXUf#uTC>ufj0$0 zQGuNTTvQ;eHVG;4wi7?3fW;N?{YDkI-Q0JvT7hC_`uhYzt^kMU3vjML4l{jNfr1J! zxW3Sdj|y=72f%QvYt8Tf#3c_t&1-o%T!GF4p{PJx0WK<#>4b+A=bmXH7JHstcbOZLFjIY)865M^V2~AmO4pe7peXqIKpaw>aS_n!%;8 z`UXXF{AoL*RD66r!8{tRhLQ{u;dsYR5N$*|MHn_KE71uLigrABLsf&Kt;Q>((BJAb zP;t1gngc!6!_DPa2>e9(Vxc2+-8wAbbE~s1>Yq5_A^C@x{M+NyQ0>a)E)(!Yxr+t3 zDEA2`Jk;-ECp;wgF(&uLw<(bWGx4P^5App8=i964ir&yn>Y%#h0>1sp z1RE^{MuI{{k^tuh;ey*Z;X#G;)=qd(AuFB2!6MX+extuVGThTcU1fI9sLp*{m7@X+ zQI)W$GJ-bvTEOQ{!EI3Kgoji)#%=R_R~2iW8_YA^tG$vb;CRDSP(Xjo$uOvZ@w5}3 zY%3;(Ej@z@7^_Si99&ymHV5~rmYu@}I!EBeWplV#2Jvx-q4>3I)-ZT2n>8GN41F>4 zvp#(28EdI`?IInI)VN(43%x)6Xh2VB)>qXP;}*#6t3Ez@2tBUo@u_xoFa4F*h-j&b zN>5GMC(^qOqldAoajc7Z(ZoI!8VGBXeh0mu8Xq^59@nfUG0x{HM1|xfYP^3`gQif@ zPi=0$j?cPcBnVyMpN-(~Scn-&Ro1D>10Yvdm*DZ0GrHPKB-hp2$@NQ|{Gt9xuD7G) zi$c$dhYxTvk$$S3iS#XJ^6da*A~oVVT!zvtC%N@m?c~;nl>7n3x(fNzRbTKmO=#>@ zv&24F)-~vN(NRPCGf;7hIt!*}tIfOl@hB)BI*qhP&03U~L{vU%_^QJKdQ^_Apa*gp zPCj$E0@#(U_L5h^`D`^+lq`ugi(q`*vSh};XAtf9LBV>sS*Z^W>%JIc0u!qUN(NK) zcM9Fdvm9H7sQqjubgG^t)~uYK!}FnP6na4RP^v@;b=pjLYp9wl5*yQN*p3k!Q^C3c zi60z>#P~KLb02&XK0Ks5L(@mrPOfKj+20IDa{V4^|GWBDNqLQSsD&;2OEfwAiLWVr zfrGg^v$It{Pr~S6Z3~(?+oWiy7@>|8RoBJ62ch5St*qY@>4m&H1YbxRh?4|8yQteI{#GDPMsVeL4vKfH*J0STOy(bIVSTom)Y51FwE9gT zd8nEWZF5kp)t{QXJ4DY_`@z>aY6nqqLwukkC~jQlHot2$wRw9e9j$J|XAZezLJ`m8 zJ08P{L5#I^6j13#IBekec=i3TSK42U*8!i=T!ng`i?a zORsUOZyt~2()Yak%_gX$>kY5Ax?TtiC#d}*zbwpdB)Po!LfgIx>KxHF`i5(0_cYh; z$%$0E_o;Sm;POQE7JO8cdxKL&OROyg6|KdT2L{x38c>hmX|4T}LZOtwLg}6w(mDJt zd{C7P!zZhg6=^MOnXIl<^kUGbsLi5%J5t-OS9rNWnnH0sk``Y~=X|TsgYM-gdvI@$ z-Ww-i%M|rGySI$5Wzwl+YHmxhZX%K%+6JtDf%~%v72NAkSY{+-8q{GfglM&7~y-Z9x zT-4{+5cLtaUYqG?Jpm!>cmbwk@2Av*HnVdrT?Q+z+i>zOwRf3Sv2l;@j>W$ zn>wleo$U3V9A?AOd9g&XOCS3!kqaNQcP@DQD6no*yIW2^|h=GZL}HQ$6%OD9KRmNerV6iv?N+a{4BD4GF&8!;XNnwBRS3FhVQ2 z&vARi)5(V}(o+=}dZ&859SN)ly0}8+qr&0cX%BkBH+RyJxRv){@?C21<4hb$T%(A@ zEw~Na&p{jNqj_>y;L;qY^(66mh(IpY<+4}iqim^HC=~A$6}QBdsz7Z01|@UV_wD+d zkJ8V=DDje?!%quvUVpRfCtaW{QsBLL>K+H5uLOLNPuMO6PG_9Y3C`#H`Rb1%AL-rN z`AB;NIA4PBZ2SQP)tOpl)wGNUIQ9h1yO-*vWrw2IA&~;adMe2SmrA4ruZBxwH%H&iJPiAdXrI@Ga(QVOa27dP4m;Ei}_J`)P#D^v0Or+=BPPCeDDQwBC(%8P<#OVnmi(vw8NdB56Em|!{A z&1fk5-9ur5{m}ns9$l`^a~1487+9PWL`+GADNuvL`F=yc9Umb7pg@noUfV`YEH_xt8w+Wj{=EkShHLGhnkG6;I*+8!_;Oz8S}$c(WQWkAhFut6ly{ zn*Jx3_TV$MN^1<(GirUooUDWTP@YLc=6s)ba2!N!P`f1ljXB{1g-nE(H>fSbhpje4 zTHT#pvrOK#v7m4K=dNLi#+>B)jkR`7bP_&nsZMFeMlNjx+`Z|arRf%xHX532uDx$b z)h@|x7$Zo7tAsSNKgTj2wru`qarii!i5u~3?c(}`iIXmehOCNyVnli{wZnQfHTh-q z(-=85YCU?8%GWkUfg7Om*?(5Sc#5mw+fus<;a+2W7wR!n!ML51SDgr)gh+KVZGEsqGZ&F^+({bfpyG|2Xp;SW~L@PmN*Al)}{Xm!;H}>v88OLrRtC zwc0&bzD&vf%gM&U)R$FL{u3I$f}0-Ik0hqPqWTe9^@`d{fOaiYdp0t5RZl5cYUp&t ztv8@@r`i|ZE>ou~7+qGnmgeRyrL?69+__!-pJJ^QT8w8n%{@Di#(F|*SplV{+6TNl z)mfa2j{71ZmeNv6_>7|8%Yhlp=l(-!o>#2f1fX#z7d|3Qn+vh8sx1`>Hw`HxMq^Eb zm~_nt-@U4~QS^~Qi!=uG*VLVgqzgbR3tHl4TYubttDc2Hq87KhV!0>m)!Cn^(fD3n zsBB=kQfInn*SEvoo8$eoYH;N_XZe7Ge|#RBm!Y%h%Ph!XyvIo9cUtj-L~= za6W(Lt*}(>o4s-mPOx`|rgJtT(tRQSuVl&W4;tHz6z^@&&cfiH!{_tBTt1%%?hDQ5 ztQxQyQfc!XGf?eo7Oy8r%cb7AkMz(+- z52@(|M>8j&V(#+$v9iXkgGF|^COuY|yhrljr{1Wau)*;KzM?qsS>_$omTWdkbf|;Aq+pFwvzt?xdXH~M&t|pU*@gUR@o1Ga2<%t zmpqS_Ev2@@zR|sTpZ5{k?$@+s3@@U58CXZu_&$$v@Xp6LIQwz7vU2Al3*+`M7RBMX zE3>q?c*cJG6TGeHNt=%!^v~7A2Fq)JXMe6XFIb)0@@2`7uidAn;8lr{xsrhuHac)F zMXT6-MA1_o&5}LtO1j`3WaB>V(Mn}>1R1TU@PT)|<|jqiY2@iH3i1q-m5T<^s6`gw z^PVr%_(`?2)8-i^PSv$_ToEN zX#P!hE4%t5$~QyB7Z^|st5Je)3ujUbTGE$l;-u$!bNLHF8B`aKn|&%~Ah*lmt!Nj? zX_u_^PF;O3az2f=1^M8qHZ`%Jl!I@5IS8gpU+iihCwbf}9IvRX8ZX~g!|KV^Sg{@F zgs|Z$1m1RP2YsIBRBb#o^D9 zQj2iq&l6m5)mUr#3S_;keaf2*rc7xM8fD-3~LE?ri)@ zQ;du`QRZcq{&8?%=v3fj=>42NZ zz~{6V&bF+Zox*2)S(883NbXW8%I`+)S-FKf!o@?h7H;ahMcGAAe1f!KPt1M3XQ6V4 z7B`CP`W3BSZP}aX;H0Jm!(@jor|2j%P((SqVq(Gh5VzmlxKBt2g^T+yB%LIQ4SwRP zg-Dh`{?K3|PdmmNe`8mc#!4$OH5{i?v0uA~4JZZUE+CG%fthxZ!r2?6(IoU6b}lw8 zGu2O3+QGx%_WYOaCz_1iQ2g%fV7HdpKBw>*fo5r%g}vW!b<%g9aQ1J)2At=rosReK z2FU+fO>J{BlkUH0zArM7hbJO%lI>W!v4n8bxirEyhcys#o*@mP;%l{j(+?T0JAnPd zJ~`%GX+2!}S}ly+NlzMh+}>AV={I;@%IIVs_y*5QMZUt}zU^@Fgqqjn6n;<#_Y5nL z3woqmLTRk984GuxRJ$uyCTu-P7d^+|;z@NgE!;{@VL@lj#xL8bofZ8np76IRCx6y1T&+!@1J>&r3~SKacf>toW8$vB-CUUOh{ESmDu~ zD0v=_9wQg_{h-bq9Yp)xM!V=llWw4O=ijjXEewA=EIg|YYY}AotIhVj6AjlF6s;f} z?VJt@nURd=$=7V}FOeHNv6;(EWcaeu~7QR?IxjXz-x zSC|WbQs>Bj znrDAfx4H1T=2!K1IWCszTjWdd(+~R>v-11`WV9o#q2j#SufaeMkz8ew&nsLd-=Ajk z1+|k>SE87PL4|{LJLzf`|E|8JQgp+Ko_h&>5bJyT;re7)b48txs>EESB|Ls?^(vMq zf5Nh>YLQ}@D;kpj;Ig9KdfWt`i~Ye*3>DL5lktBmHjz8R{34UkW+C&R03Os*NUIk3tyFuDml@3(6I!d4(B4`2`9qb&%XkJ!AzfOy z>45l)NF6pXOGpEI%-wb_{F!gTq`Cf`G^3wWnt?CYQfUfocm1<8{V105}#j4x+OcRUqRf8AaO08nZp@_zW(b*-i?6Xep^4$yTJhu66DPX>R5;dxA83;6Obx zv3=9fGd^w~H+v*SqmBp%%~+eHK~6MzEkXLRaF`sOxAKuDI0q9yscW;eUVxVM3GR7AOsK8dH;Kq@S6K-wyL3)5;qZow^&9njK4mf(l$wtC30K50Bbc-!y<;qAaTSN7C} zWIEjZE${eqGEHl0d=^c8St`GG;SBc-iMx*W)wg2+ue^#_q34Mx!e^hfu;bN?J(Dzn z;%QpkOg@tg^u(n}U9`=TD;;+}SZ!JE?c&=k72>W)aOW-F#db=fTxmq&QVYKeCQ+V9 zX&&`1&P7thyti=j9#7r`{FSq zyN4O6Unq-mBjLdj`Vi!{#$kEwTH^E{oZ|G^TwF)E*!Z8t;WjE0_rE6pQk-^qHGl$UuPBz0_Vcc|0cKRFto}J!^9wbhJ#mOYSnV#bb?%U~+ zF*OS4{mCRn(NDwKWb%Q66TMzX!(~AW(n>gJRKoi6Uabd>Sev!~Zx0%A`trQLJ7~mk z^nH11=%CR(DP*dmKMkLxkj{#<3L;WThi2AA&w>l}{Ulk+o3{fWxGmzPR0hpox*x`+ zVp=ka!AK>Uw9>PrvO3R&3PaeBEEH=WTuddSB4b?Xff#({A_j6=k_YKI$%>X_o?@-1 zwPhQ)GmRwF!eUh#W$`RrYD=;qI-Nuce3H}2+(h2lMR*DxKav`@TG^UTQsrS#kxp(- zWWH@Y6snDV_(Yz;@aW|5Rs@UB7}(m1c-JS|4^>=PKrQ*>Yw zPth+2pXx85M#!qA{|DM4D`On(zi2}2`eb%2+(ijw{!~G+*_wFrK%zN1jG3XS+`q!>9m#ulS?6&DAKF-F z3vR7w8dkYD=W6(|VyweIW)sz&ysdmx&9=fjYEC18$&P8{1m)ox0yvFyGuw0`ot$%t z?20A2MPl*$1<&vc zx`t(Vl*#6=aB)W4P=;sXj2CE;hmT#Rg4zwMynm3Vzr$8utjaT3&cB|PW{keL8y&r_ zP|=O5Z=UT&+-iH=a?i&(8W%wrC4jBIu&*Z>RKQM(28#vzSn2hYtK(%Ejh`5G z;u+nmAN^4cB$a8P&0t4Kow!yPrfn1!CWPYZ_zFi19;||gdy#g1vx?(A%vT<>uTSu6 zVR6vMIA`CSTKwxNsO;?OV|MCI(&{;C74HH**4}$Uu4S>>>Gm9 z`MoAJWRdRy{?#4x|hbgHxFiyAem|Z)IFU=PVz{C z&pOL^(BME^8i7G$;BvJa!bv{dFcRkj<5|0XE^Hr(?b0)L`#gvlMQ&H5#;|Y{8um|E zH4006{R=pQ*9j7PYnu8S+leS)>4d!*O^afD(?Md7AGPwo90m0~)CtNTu2E3$Wtnso zl>9}KU`q~p)lIhxwZKxCHJYRfORD9g3BHN&F)dH<^@K6xjSynYSO;S7u|zz9uy`z8 zwe7|e;c>8MENP-xb>Qe&(nVn1cpSMY)_94Tj`!zT_PcbA+!gRojctNZWRWlmcjfXQ!EGeeG|#eK^}{PJmAa?WK%zm8Uk__lFMcx!0G!t zA=V+dd0-NW#ii8aP&t{r=&oYl_g)Okr;u9|>%VYu3LWkH&E8YV0K}SM8aI+>@J~7n zgO<~1^^ye}r;%?It1B$cCHE+L`<*wFb#j9zJ$Ta3@1r#V%fYA2(p$)XBI+IUMClUK zzg{;#^tgj;laIlfJ4o|5KW=tn6@f=ZQgDfjo$`;Asbv=Ayv=3v z$qTX*1_uQn}hzxlfYL3DT_aQ(4q={5Y7f^-0nmUH zDr_g|5)6EbOi+wDu;wW;GC?0sPilLL-op}y^S1fE3F>OP$#yHWTTN%X!!UR?(n;;0 zWHs5W7E6P2R(Gk%_=_GTVn&J){$^dt?<@!o;4=T1$pqYrQ>J zv$yN% zhHhgeroC@(V11E^Qzvd<9S|SK0dr@g7kw1hvB?Jv#a;9veHhCQ{1|Lj28fxaB{uoQ zZa&B#()GtGnKnzy;Q$JXd(9D6^O-KKSy&C(5bo!1@UVI_6jr%RP@j;WOYHtl>gVyY z1xGfZoA0rsYOftt?}ehOnCZb*7tEq64Bkj?qGe}WJWI|a`3=~<5hFQFq|qjHl9q`y zp0`75H#FRYW#BbrzKn;-nN0j+Lv=B)7@J6Jg4E+00ka#nZX#3Ummy*^IWE5dXEu|y ziq+U$`Yfq0*Bj_>IF7yE%c5oD7TgRmZZr39A@|nBwx@=M+RWkG$w!J?r-H3Q$k`s* z5{#!Jqs(z8IW3;T8~7THxKVu9c+qRbOXp_PvniZFFm*w0^0**sA5fCSx&B#2SU4Yau;0)t|`aqZXg^eC-38B)jM?iqujjs4k?oh zj&jdKYp{GyzQ+F0qk1u1QHed_W2G#~Q6QOl277ADe_QNx4fxQHPMgGTpFl%4RQ@s= zYg`D1Q!K|b#?Fs{w(pVQidAXe_a5r1Nw?!)+qnoitw?LL;X#521Fb>O`vdH}G~C?( z0eMnZ_O7CZaBFjM1sNrJ#?eEhT*3EUN;2HZ?K~>qkmf^gM1?l#hDYLCI$`@pRUe~Y zTHB%FCj_5DZlWBT!mFQ<4{(F#|Bw&z3T6CNhiL-s2UUmZa^ZH!_>^vHJq#N^rS<sREu250H67+dMEJY#Ky z{I75`QDR?Cu~lnGRcD0@&*bYMCRS_0E0nB5@u{p*>CCT%y~M_k?ZzyA%^D6#$4K)# z6P-tiih1Si^EIZK+^;oi!smo?cEwXG34CrSwT}`}Kh~E7PukEbisn+kMt=5a$<-B9 z7p7Mgoo*5myaVl7BAz}#W|Ig@SQ5Ts`wVFeQ8#M!n|xS}gE2u*mU5gA`SHq(C9gw~$jM`#`Rk+v%PKo2v`oRyU%u^@v}e4EZGim>DKgrY>8 z3eD(L6E7L@j4;K0oonJ@xr&Fj{Osfsm26C`9u!zzNs?m=H`yN0*!F-HD{s^i5&~Z` zrQGFzdNf_Iv{kzDYkU%swVz`bwzR1`LhrA!ODDo@&+?z|aA%z2>B%d$Ng2<_UAIpF z|4I$yY|HA)>C(E|r?~{W!rr_st{eJN7+t~Mp1iSJ_nL&R>-|1FG)Pad7UB6N>X5#) zOy14x9_$*CeLdZk!!sgLyxrTgrs9QNdE1I!Xd0&i1=8Nmyzy}Fn%cQK@wN+n>;r~E zud+H)rBYjd6jZDq-BfeJ;&iTTQ9LRbS+g^we?iUO7&4B2Fif5anwf@Vi1~PGi9nT2 zix!Zm7pkFlW+~r*>h=m;!C}}q6ds?2?Q!UC)Pz-n$LJ5ktP`Y_e3~AUYb7W119FUK zpgB7r$A34YBf}2Jad}Bp9v%&C%H&2Av8z9#2tQU*fntIOoxrG$>jAqUz>bA!i?IffmRV?i5-#;ZOi$CXZ{Asd8qzb>rf zI3~wC6Ax7uEWY;#M^!PHr?Ym6vz6M1h2=r)7)7sM`DF~iX_AqPO`)8fE}!d zDLjrR`a**P_a3zyPt(T41{3&gVY%J>A)Gu#CdOf43yWD6l3C|go`_6<2a~j3=B97S zDOm~NDYx%%U5;N%`3{SoZD9O@yCdh%;5zy$Wc)zdxFxDAK2ys5fwTwTceuUfE8{dW zrNJj!YdKNG_c+I4TgLau4-ZXzPuo_&!tY6z2)`cO%eppvcZ=EAPCWa2faXFE!) zA&~JS>i8Yx;H97r^FMb{9XfTP-`8gcM(N83d}!DHQy;TF5d1iosJ}bG@WEKSO9#EOkrIoB@T*zBE7IqM+?(U zA6$M!`-y}H6#L_mQi^KyhciDp&ZD&cnT#58jm2m%J?ZRoCmw?H4LfYdg#JZKoA`5A zuHxQITKoyNM>8I*pUFEzhT$;~6i(kppx0b`M92^x%;omNwR{Ne5Edyzd6A;yOpN$G zd=8n+MBD-uRb<%pBN2?=!ZuG`sjXj@GFP-gwt>5FEl9;+4Y6LzypV>!ePgljd<&BJ za$wvq=*xPViNP^Nmc7((;tJ?dU+y8JZ4VfOQH~j{zim(B@!%lQZ0sBaGM3Y1kELG6 z3LQQM%S0N^-#gAR*D+_vYEi%&yN!2DQryj&^R@*OYPRid%G-8Kq#hR(#xsX2$)2(C zl%5pUmX*Ni4&PwE#sGQeh-b2I65SDSvf0~+qt2LIv&|L9+q_fg<1Hs$mWQ{IsdNT_ zigP5s0Dp#~?XAzzR@_+A*Im)P?ZQp9n9QE?PfepGfKzl~9ada3@7vqXwK*Wud;dL< z5UbUXpU-wI9_G)u_I}H+S-;Tdv`ySBvF=?B`YF=Hy@9$fK0&SQxX0yD4+w2KdZ?_u6L|@rM{lw^+7H>**@Cw~RXwfAAnJQ0 zke7*9kDJV(ouYok-bvzqpBd~V^*^?5OY;u&7hSlD&kNZ-F5`3H^^2sv>zTknID3)I zZ!oAZ-8ZPqx8+h^v_=mg41)YWaHC}qEd2vl!GmDeA9Sn#e{ks!%%FoH=}$adBt1o$ zBl1u`u1-BgxI&dA%o0*>3Qtv6jHFANnjH467K zj0&Q{{=aZ{dLT5sME+Mm=?F1QdMyh0{G=FPM5N^W`oOrrx$5KzW-_L_ z5y4cz)wSP;qqNYa9a3~$`>WbLidALqSGC`j@lSF(-*P`ap3LaS&FWz0dJD=7HCTpYWp=@a=fc-XQ%llX8hDdfp?R@Qa}igl|j_uB%OKvX!B@i(aHD zkEL_gtdrmdDdpfUdLgty%BdANTUX0N)pMe-V|Y3RPkuhB=*^&EJq2D<#JL-)8feXwtb;VE zHEZU2H2xe-lY7tdYu0Zp_cHrul|xCq76(ncyBoUMAo%ve)>w3>-H_Ye-PCh})(Lxe z(ZuFziOCM%HHF-!xX=1}LoLp&(<;zf0Y@5YLpxYox&FR`RBt>V@DbPF`-$CGTYvo& z?JKLZ6UVZIyVh3lvaMhQ&7a|lc@J~N@T)7Rn42s13|x%W`nHwU<~^+P*j0TM{>Ua+ zFSd~BW~v{{3=f{|v14%~?|ZxbCukW@>8D?#{YRJ{ zuk}<4Z=pleSIIsHmGN5VI$2ZvSYe*{e$yqGnyfX3u8lFYyfRF0tfeSKf~E8txB^@0 z)pr>x8fydU=)*kfVj2Hn^^cI#$=xV6N6!0clSH!yRR&kjE*RKE!=rv)xUUJ)?HvGX znrPY0^uDe%RnEh6GKFaa<-Dbs;I$a6U9Ma`Z5X{*CeXp{1&tH5whAt0a%Z4#PfE~Q z&`0456SR?vuMQkY&?eN$YU?43arI&0S7DkUk=_~xCTh5zYCwtbF+w5=)l*<&B96Y* z435%!BWY!lHX#9D!a&_ozI5VA@+(kU=_@+i{Ge1e|DMR;WS~Dn4McH39)g~#% zg_SL}o-nVOrfU{`U#21COxL>6c*BI-6wWu(UQ+_GP}&?7G>)!JM&+%~pn$^bea%eH~=IQ6Ag+Pvt1zq*&cK2-a3c&4>hl|nwp1|*avw$aj! zn#B7^wIaTOu)U4eHk#vc<$MF+Y#VKiqV)y6t=4EL78__zKl`|rq4E^~IZii#IR0U~ zJ)b_-SM2tqoJL2OF58_R1SM^;gMp{9s0fZQZuNhxwSe#1YD1!ZYpWFt3D6>bdi?HT+}-W73qP0h8c^fWl+&hYow7IQIFOlND1UZemith z!cmmKbl6Jo1OMYBf!nZ)O;>i*8ub;K2WBI<6&DnkgTLF@zZXym{I~C3RKUjZJ^*@q zD&{f9HkSMs9o1vg6d+9sT)IwcmL6EeSDCWHR+%_b9)cr9SD7nV+&zSJcto_F)+{Bk zq88lM0`5|X>428@u4YEz^vj?}2Q4Lq_XVdKL5^=_HEp0679w7PcO9ig&p|wNxsV=# z<*=)R);-#`3FA#x!6lTJ?R!{|_cZEDFkjHcHm<6XPiyQ8>zD7TYCKYcHgNGik`4Hq zP?I~@`!<5n5u?DnmY(Wi#c<2@N-93Wv&}dW_I0EQeiWz~T6%XcFh4@oF#b2=5aAM- z?)&ahG3M3kKnT1o;Nb>VhL+NS`yj)^h%;Hh_;yhfn2euqEAku4e+OQMQlv@1;lRlD z;6uvPwtKKp58>{Bv)G=(1J22lyikotUWJTKT0(a;AI%U<4tWFRWL-mVCXeHJEijOF zB-g>#aUat5wSVL5yHDhtcB+WTqaal5X<&`jZcykFyQ!hictVE=8sz2BnT z;P3CC7-e-PPgjpk;4HQ`wRQQ4Cpui9p{=M-+WJm}qg^n=qpMes=`Rq~75xE29bry? zKpzSDjThe;L%fmygy+MQAl3b6AMyQxeT#yat~7Q0gKTnTWw(E!VnBg`-FOxVbq~XI zX*X@2lC8p}ZW_L4_8Cpxwt1rL1&npv(3t~w_re;&mrvXMbumUe z%*F2)2<_W@X`LBQJYPujLmlLKzLz#2+Lur98J{TRGqAVzO-i7W=fnOkmJgYAeWe)7 z3Lgn_Hw^BhZB_~|LscJ~kBaa;l)hT$Mp?fF7aVN8u!-ff#n8I3*6liW<16e!c1U!U zI}_h_aHTEAA=IV3Z#G3#6L=q@3zMd9MnD$9rM@(r3Lv>3RzdjU==6SC8@sUxmiN;- zC%7sLkyGBolp}t5pDsH}*|GyqX7)p3?^;vUwaGGk-#=LXKhYn{fBiKqYVp(L1GFCQ z&8TZpHa>Y7pd}QnSeuFW9=Ep6gZtR%4Y)Ijj!nP(!nG=)?S8GCU2#8TJ>8r|ygQwE zzGpbzJsTLm2yG)>$a?t4Mes!m2hU9*T&j!*k@4e239)gTIXwGWo5vRV-J-a7uE=vW z8u9BzO@?t}Z{sB~eQJQQLcd|e;m_MdTRF$<7ukJ8_Dk3cd=yxTJ+TJaxTWxVmX==N z3*&`PAQ-Q1uVAlTj&B;(Dm#duw!^7#c^Q{ojvwQpCjx|T7I8j1S$kcr(JuOfnwoyJ zs7WSk^}g=xVX3Xv0)~v^^Quks8kbVEn|{kEuHbKpy>Bq&T8MEg0L@cO&C|&_cxi8O znj*^T#UA^40X`A*;=p>}<}{z~4bsq09NEgn1$bk6d9aagWublg zI0YYO?S3tLe>EQc=m^EdDu;D+Jbqk<9ZBHdq57EZ%vbTYP4D489DM{3YJ-?;Ep}+y z0mjc=evr0fCt9=FHxvPZ531XXX*Q%asJ;PVYCrJ zm)`j~{SZ+?`hqVwPYnw#ba7|keZ|{~@HjW}y2*Fk=2gjgm49u!W&(TKjm3-KjfX0@ zd*W6TD{$-(%dz2sZ#a+5Cpi!86uXbmzJ->9wGMrKr+It%cHUmJjXveH?NR;JAtod3 zJC0jzJNnh3ggO@(9Fx>h*gjZm8%utufrlRxN=Vsp)|MqCD;naG#{011M`$+$ZR-08 z1`p9vV$-U^@nPW*+!Ub$SXBN5RE@(;$k*xFhJ@}rer1acZj0BbEpXc{7=$*T>|ZE9 zj9hm0M-=@E8AG*>_>CXt5~1ex^aw*j?5STleCIivY&|=@5YJ@9oe!N};5^sE{-Njx zn=U{Vz53Qe&II%a@;hg8&qbSwExXY!7(7ht9visGxBKt|JjmA*;luAK4%2!?e#ma! z$mWw_xcw|Of?310dmDVnELB7z=+(1?L_*bYt#d4X!-Q&86u4r;-OzP}wu4Sio=3cX zs2ZU?+03f)5JOItHsUMHJwNk7wfJ=?@n0uorxx#8mmCdKAQBx{xsjSxKc(JO-_XZ!7JhSLp?)9D`eg#tRTLmhRU*53R>)+4SqD`D1Y&)i=QM zvAA7itb+=6|35fC7PpOz)sQ?6;rJPcspAmOSPsTGx>fcBl)j-P!vP8`kD{KFt^^uz z*YPzFTqnlqI^JkLe2wb!;mc-Me?)c+%o<F}hSnfIj4<}pMkdq;t9(&gzXDCu?mIijr!aA7g4RNQIKgIO_Pm z>trpVXP_nZ7R=B57{gxnxS)hNif;$50+XvB-?BE>I^K3T9b%?v>5~JkY!%z^?r3fK zJc6gbxJz8;IQ7N(GY9nlKgzxZE~;w#|IC4N&YUw!2#AV`BOodg;S(jZQ5k$>il$yO zGZdfY0~O88WE2J;sZl7)%8E+M%Dh_Yv97nqbj-?ISXyS5l#i^;$gFE#tN(ZHGXo<& z`u+KQHfPS>Yp=cb+H0@9_S%o*9hMp$y6elrPgcIwH&W?ckjiaowDB%AA^Rle8X=pw zEZiLeWw(dYy?hgw)gr<48rmpkl-jPJ&>PTeAhpi+EQ>>(0%(z5$$G4IdzMIdcMhi0 zl2K|$+n2O+l-fc+YQ>f~>BJ~C13jG;h^Druq`TF24KF`H$BL;W8(+q_2e*&RyIb86 z@B1|xOQp5F_)(ad`7%|AUVNT%Myrk5W}&0o%dmr)O1Ve6e&Iu=ykQtasNFiiC%~(z zbhJ9b@XiU4Fsu9?wVi%2K;LZYbPsE&aWzYBLeuRXPxJ3l(_%}0x@-Y&J5##1nkntj zKRctYOx0|!6rAx+vdYN57u!QHXou_vwK#WQFrB*Rs%ahE`InDwAsaxML+bFU0^XiI zji2bAI7fnfW8E{vyZXXRD_zCD8#eBw+U=gAJf+}DI42tuwc9-fT&vl2;V5;Cni=Jv z5a5wDy4y=8(%doXaJlGhsvN^Arz@Qw1DEOUH+k8LLk8nhm9b{(SY8e|mly1xkLRI( z`q;_cnc9w1$H=&}efc=PVyU5tVux7k^i{{~`_AMxX zTE@=k@#y^ie$;G&dZU%#xu0?-V1neCMWqu|?5LkcM<=N9vA!u~*yRqnz>*R#fr;4) zK1eeWPCaQdW;3?qCCXXMW?-veHe;nv^aL~DT~ z!ux=5vIy?^=ThZFH6hu*l;bdEwux!-c;O*GEV5jG(?U!(d}A;mmK zk(1&73I+A9253tQl>#4^)WQ1ge*#6f5By#WnDoH!r&07xf!`H?5B`1*@M(egb%4Lo zs!nJ%l^2n>iHN_9CH|M_=wt|(e`)!>aO(K~2~;hqYBHPyR#X@7HehTnY+|f?2&S`( zXqfO*%&o1V_YGvNZ&9J_q$T&N2`&919e3cNq2OiZB?ODa2)5%gR?& zjn_E$ubk~l0+eqlb&8sj?EM}rlmZp}=?WL3kUaFq`BPNQ)*!143qR3H{h-9#Xw_8o z9^e1y;8gTM&jqqiWBcS+>N-uGAhY>24btw0$UNI215Cn7!U8%t4Yr7cqg~T6K*3>< zI$iDGK{{E~>U}M5Ikd5|Ok)p3ZO?KYXGaoxqt3^0sg$*}=PTMU-NMa_#6jFgr>l8& z$@CqfoP6|r*8!TJ5As|e(nj(8fR5(#whTYHW~leduD5983`}sOomUp;dy`JgP-n(^ zUWbJUPbWxW#UMy=y+%`Jsw3k(8!a+c-yqmo;*R1cmY1WcYNpyp|0x5b0fsbO-8oC0 zC+~iiHqHWB>Nz?*3k|n>Ep7f;?Mb&3sP$##5)CL&r}2W`&H|WtxQkmTCfBkn6_d1- zy3U4)Pn!VT+fRFZAHNy0)o^_RMD6bSV7GT3b3WNBy_# zJwm1T^Ww*0w47{JOHs_N_p2|5adReZaf&*6(VSBrWRo+VHaw`N#YruS)`v^Smn)aT z*6;aCG@(^QbEwE%AjcTjGYHw#4U>Y>5@Tn(V>nQmoTD*gc7D%Mddo z7iXx%Kpjhc=d+m`ZI;eg4O^V+ucB6a?8jFs=i#BU*A{~Hy{!+aX*SvSJ)Kwpj<`-! zy+RBUo^NPUA>Ltxmlm>NeT1s{-Gc*}cHK!`J!+KfjiUh`o@d3GlRWCk@D$&27&wM? z@*8635n}hSB^!w6n`T6uYgzd+wV`SAsy*ct-?+;%<%>*tmt_)huCXH1!o}(^ImLth z`ynM+0GU^2lDchQ20J#zgB`qAz+>Ypcai{Q0*6%J^eu-JrAXK&!5Mf_7-Wk?--((G zHF2Kfpel}LKB79~y-lNW;GOr$1$K>Pi=8$s(yF&9ZGJ>8kv)gZuBGZlTdZ%JRWfG? z7U0=x_I*tK%_d8$$+b$&HoVP5hbZy3FiTf~)3Gkx=fU&_)~a)b`8Cz_m2)o7?dFa( z>Yw;=Bke4=H8v}sP~UHy;)2hQs}eYglq2#yjb2$lh>Jv=Z>_oKb+sGL8Zv}$E`@Jr ziI_vF+flTq!0fwS{VhzEI^(MZED9ZH(wpdou5@$xo9cF3yw}N!u8dpR$HxUd4~A49 z2Woe!aVhSYK!p;^lyupG^G&URQ)ty;FB{7>M`-a7~DCgB*e zc(+BkrH_<6+VKf*BS2csxSYmI`$J;08(j(S|HoC~OAo5J%d8N3E`Zm4Go3jIyy_g3 zB@0Ea?oFfI16n-wI;5t@?p<;va`&LCBKI8vF;^qrd(Tzjb3awHty?0Umif(#E5fm|syNPub#{Ro3`6Y*R2K1b**n@(5T0EL=zeS2193po*^;FBa%Lxc36_vf_u+i}BtDSR(-YFTmOZ zu#?yz5Wi)mC*>YPe)kci5t1&XZ1(tgndy3P)QSZGf)Q8_N)XM^@{P;D1o<7b%Pg$rckE^4vifZf$KzSae zxhK>vDSXr8VA!NMBFclcQ;c`ZqcM@h?g$+|C|pm>ah`|i@CnOgc5aENsa@4c)S$yj zMp#VMr_@Gt&q*~g#pk&UYox$Xco|j^=UPA;fq}`agSE3}0o-4MHU1_G4K9xiA=rYN zc_nIT26;|h6?HNlIR%2Hdl~h}tFmapx6DX<$Lh2?mVWzIbzT*!|7k{Z2SY8o3P7gp z%C<19{O%eUzWI(h*Uf6M$Zu7JntZRex(cpjn)yA0riXyO^gZ<1)g;RJf$3^Z&L7k+ zLp+J#4H{C?L<3v=N{B}PD--b^dvy3hoDCNZ?~L{q+Y?h4MxuWMIaA6VSu%o9JTGAt~EPM=X1#9~jPg;dONEQBr_&Hqu&PIF=3=zDf+5qGI&bW37R z@h6C=oe>ElBz)!SNA*;!=ZCA{`<~96Wt;p2_5F!mFIDD}pVWI{)&GaBdaHndRc{sW z0oD5%8Kk{5>1UW1MZ2l=XUyb_cJX{^AQt4y&%yE2dk1;WDKKs@eWKat)b_IU8f`eo z`vGRrzH{s%+DMo19_xGgvN@C}#PbrR|H8J;i!|aF%%P-pwB#4gQ$ag_0e0-KJg?rx z7dc98gbPvR!nGk&&a>@QN=wdj?v=FpJX=c3==6Dz>?@|MU)8~y#4W>C-LGofTdV(I zd$h2qRbZafDlktH@%W%o^*xvJR_d4rOUCQomw4K1Iiald`IMS#YevrBu)hU6RagC{ z&VuW7FHbB>N+|NbI9~82b^5Q`zVKa+TkK6t{aTLJup=skpZKy~o3G^zk=Ca;F}db< zQDV~9*pq!gF2f<~MCSq79FBpvMExo;?SNzgKOC-$5>v4!TkPw=zHQ#C;unMSLa|a{ z{q{fwi$$iSGC4nRAl-e8)hw2K7YKE0&n{$w;g9r?{es&52F|H?7iZv!^Fd3fZ%w4K z)Qa>jr6m{CVVa<$WEq{ffQ2x3nb_AM%4JWJFPBPxR~t2mt&MhLGns2NZN7-;gpg?V zIo)+dw8Ac@JE>aL8Z{8RJp=WF_sKV0MAr|Eevyv;&JLGmeO|(FR2=3vN0mz_}i^V8}JTE*HFpyZf zn)I!$jW--98wZMl?eYis?!Mh>2X{T*d=yU?|4M1(e^g5l;b^>(Y1 zsjJ1=QCj+!+91jwLX^852)N-2TKzXs0Odzc2_v5Qi}wCq@%_i{cPDCAk0 zVc^8?!n-jX8l&~z$ZPJ>Jftd z!`(31u{p!4{z&8rvWLxZTOdzvt(>^WUPDg$L$_nYv`q#LF_y->vsReh6NE6Zeytx8 zt=voS7uQfDyQkI)gMUOw_Ix1>p;5{#Aq?CD>xV%4apUS=Dy{<5v~2;N!fQlT%u{Iu zrP{T^wpqe$SQ|YEw_rEpukG00X`HuzI4Y`BL=*D$8{ zrV+Y!>y34=x?GGA$7t#W-7q1TyVD+B>mvK-&?Q~No#C0djPPWc4riwDq=iz!ekX$k zp)(a2+MUr2TSKlCjGi?z_JCPsXpL-jtL2JAwIZU8y48{zk+YsQTn=kUbL(kOT@4|X zHq=sRNPR6S0#Y4Pl9jNjzLuvQLLbnTMP}m&?W`gz3&&7NnqH z?6FwHq`ahcPL;}vloh5cR-0=zM8pbnYa{KHEx|pWuU&ve%=`FpHL*B+c?6p= zD>k`?EEjC@TsoR|rXTTQ2%YRSp|$3-s_ zd6l(S^fD3eFQ!h-v=rHU7v(m?Ant#L<~Gyrm9t-=6U`v1y&W}Y`s&^A{d!q!#uPc- z&r()%^fXBohx=N5@&}(f3@Zvbbtu+V8CZ31H`g`Sy4Yw!3wVcc%qoteT4+Pz9>=&9?Uof?%xgTG(JQfXDv3^#A+#>Ptr!ldlo}|Lmi{FTZt}{QY$@flcu!N;8k5nIbVe}qpCM#gT88| zCB-Q_!FW+3HySp_2ODlXHA~j|ckv!%0SGkaF4jO|4_c^)0j0qY^+^ca+q5=WTO>;p z$=O=lE_?2x!>!R+o)KhkgC=ner_?suXuddpc^fTW_6??u;yH-+x6y`lk^0mwc}Ov0 zQsEOrL?39EfZke&^<}Ke*OwIQAeXN<4Q&f%JiY`=HLdhN#VU$b{!JF0 zt{drmiuS$?L&?_;^^)SKx*h6)yO1MO!DUx8jY`#q$GI9@vE(E0_->&6sakv&UwsT6 z$n^x^nFl^QId9~$6r5SoCdi&YX~T`o+yBvF zj`#dd7j8uT@ll(kG<0guFEk~-%eVtN(U zY9Vfj5xoD7I^Cqbqe@>wbN@lPO^x)VjNw?A%8tz{W4VQlMl0Az1KBOpF*UZR#R6kG zx~=D9nv|{;-k607p|T7jVO2nApAYiz$=7HejJz>Wh={kC@GfUbqh9UNr`+%GLEV;` zg>;v7Tz5D3Xx=f=Uc(&t&AJPC7VK6N3wWP~$?p9YhRs~2XAWaXkb4(UaTm?R+3oHb zT3mu_JolL6s*;qL+|m~2j$v}KF9y69*<5+%+zf4yjLGim+tFug;%}kD-L!;Q7j9KT zTVa`}42s{%hELL{mny5S-o1Ev+{IYw)4)q2UkujuHl5WBD=ylJg_A*%{lVmMa#Y zl(f#5Ghz|Xjg8?)r1^fUE!2OGHBB@=s#m7?WQ!<|xN*k9>HUpdJ+)Xv`O$*&|4g}f zAFF(4u?x2dS>@H@RFQ_8fJ4grv9`P#JU{Vy@<4fUS4pon5BJncWLYYs+$`q#N?Mnt z9WlKB4G?^hmbkUd*peGA+vFsMQndjcc0)vc*dUdy4TH;f%4>t~ezh1QbZ=%cM>&s|PmZC(TnQ;hb4FA4w-_tmmxPk(au z(|SbtKNlHGyhjCji(3aJmO$dbkdOVwGW%j#WTMu8{k5oNS<7+&fgS6NL*SEOyH&={}!+31; zpGWtwKGv|AyNu^JjToe*S?q2cEX-VmIIPO$7ASsWC+`ds_)>j5m$2z)v$8}-y#PXuFg*nZ967E=6JKL#A@9f6Z2^dA<^q%CR?CoTC0n%Q+X zIiG+RE^>sH5aAP3t>9Qrt`Xd7!?3rohd_Q(STtyaiV)~1dp?!?q3+ZO@ zNbLzIQJD0jw70lgS9Fs4cWbxHK9xq@t=$Ei%79ELQea%Fsp227Bn%#OtSPP^qddda zR1t34yDixX#h*GFR=NA5TD!^{MZVG6eIavM!9nR;>V6Mf)ZbA4J=(DlgWF>8LCVcV zZWx_zY8LzjoC~ffS0iq0YsuHJ=4w_WyjMPkhm}2)Ge(Q+;Cd%- zInOm1G%);FDE8#l3&eXJXiF$$i-dP*?HD$be6(*2#MreR8w<5~j7IBdKpxv}YpF6% zn_NVO0r6m(#SivwHI!T+uut``^3hIf& zlOSQfEXta!b*YPI$z;ZJi+N$P#``K@k=>_tu)E@zdu0w9U7*F1YYKX`FP274K}Yl8 zLWU`9FhxIu ztcCZjr%tl~=Xrs0XMroOa!M@#n|ZT(ftFb)mF1}pn5yBbwKT8?6hpv0+=pF{<~?Ct z%u@}d7i)n7W?D%4BY98gNUz8F^+0}W?ZV2xA}>P6y2hSBS}_(`g19{o=dBFKF4Bgx zwT7~9DW%TFq?X%yw$`(SN3`|)+8Xu5>LNHG;-v?vYPQx^%V!cj4^reDNQ-B-*>w&? zP{y6sYv*dc3Z>hky$3NGEyU$^5HXR{*AHC-3pcx(prZ!jJbk0RF;R$XS{vu;6Ybrj z*YMpcH9OjSqCQsqLMZWNMSGJlwb+Fl{%Y{`j`ntnExSSKnNS<)>P1r?0ChZ{cz_4- zZj?HY#V3Pu=CL?+HmA(fqHJ+eOO%j=5d~@l`!+19TO=+@3Zu>Q*A}x>mfA#Zlz{=+eB8PY3)P60JBqES2K(4->^T; z(+}~?_2oiq=Gu@37iu^m_?6fZ{BQ&FOcLr-j1b$}(}*H1GtT!+ zUa{VnB}FJK9x+5y<3f&&MJyzbmlta<#CcX8_vp|cb-}P$cWx)92}3f!)$RqnYgSkeN_$a~dNw>~2p$KNn@4GRuM(S|b& z<6an#rR;(+R|$`A zvwAEw&6t-cS-$ zhZT#V@;rB$kxO9F$hg(UwN%R<;&EB0b$X(=V;UwXcfqsE2z{0rEaIdd__6^8U&PfA z=j$G=3A9h4NtYz8^U;RWm2|RXnqWr}e`i17M zfhLgJlIpJz1G7151>`l>_tTYhdd|{@m0C)y4|9qu==h#auhcHa`i`KViMoX_^>e!L zi1xkgd!J5}YTwA7owV;!?Ndu=M%6HE<73*rv7Q&17tk&}!5@6oRcPiHD78#W?%;bK z8X+fI=?RH(1@>5ao=Z$_-#Ia&$tC#b`-H1r?WpUg_xoPH3kfPTyMEgEYQp zueyvC#gkNT6;H_5V9OuuYJ6aC#42rGtPlGp7dkQKL}5KMKo75yuF{fYr6r)HA<{$f zmQd1aOcz~6G-|chxoNIYxY&Nc4a~%0Tb_vH?FXx^0XJpK$QmY`S`UEtwbQ3vG+FHp^$ck7 zcBAxHw9&Nv8EstD?j!6-taTH%c&|=|vCH15XR_+c|Bj;7Eb*)>5Tuh8h#{4BYI(8(MvY$m(hgh~I zEBl|c?p5vMc%_$E{z%xOo8yI37*=tOevYD5o6u6&$?p0P<)CbfRHbsPPXbj@Y-NG{S&+Fo<+Jg1904|>0c->pB zg)4!ceobo=1h!QA%xeRuy{Fis7BO24*tRtApylV^QpKqeR?sL~~!aM(ka_{{2-_-Xj zK*|1szpuvVom}S0>zDb)PKb?yBSO~`!d;N<9{)zM%Hw|z_}0H``C|3%C$GwvN*}Ne ze2d!zpT+pQ;y+|S|66|#IPh%-JpT89AHH2nr=?h?UYpL*J^%-HDqHH{*k!wXgX#~J zf-3#`?@EV?{QSBwmAimPdGoq3Iqz^;4_+6h5-@S@GuM}a+jnc&@O%3DK(7Kw_V2%L zX_0%FqA#usQ_3*P_Upn#`Wa^Dbzw^V+AWr5c4Mc>b;KufZxGO5c3r^Iz09kN*Jnfh zcbN?@T^CXQyIL=LY}d8*NA&MA^)lrmA(%idC&h1k3P_xfkAW8^$Ml@4}wkOee}A3)gQ1xJat`|{QV5`-gRMc zssS)lt_zd@AHaC8FMQPk=H2V#`H;)P`QYowX7z{KEiHruC`+%;)2Sb^+`WHYY?U7| z<*!~BCZ`fG?uV`mQ(0Ln43>Dlc2!}(;g#o9-;OYM&-Uc(0{ar@Rh%Dd$#K$-qE@z! zmb+|M2Qfo;3LADi<$lago-O40Sc{GI{4*L`sbJG$^%nMQx|n2cqKzNJX7#*Gr$5I0 zDf>?>B){cI0;vDg0-Odh>!XeXYT{#USKoPP!EHUZlacyMeiTe@uj zzew|AW%?lFd6!c0RQ>0GXEH?|!V0ASr61IAW;hag#|D1$ zF4A0l3XJDOZ&S5^eG{;wM4T$Fzq=~{dl9gAiZW&IOv*h3I=sA@YnX^ry`zA4XaE)m zhFwD#Mr<}k`zWGMpopQ!n;j^EFS3L` z3ssV#KQ}Y1w*s)P0O=b5dn@N_q}Ty^i$%>ma(>2G!34MhEruW&U)y8I<}Cr)QfzIK5!z5!%PfU@5J*(N~wBFbl2 zZx&#a0=1k6*u+3S9Ab9048VR&RRS;eZ2Fp81R$G)i&oHns`n5;;Wrm;d6sfMXSCe` z8f$@K@1)ew`iWM<9tR8Z2J$hapKEo4h*Q0P0yHA<8>ePmxIl$lvInIfVbHDswFi<> zYe@_I<`d;gfYz;4Az%vtYZLW~@Q%B3a-e*n-OY35&{Y~NmA(++UN2_xtnv-4K@K>M ztpr1kYF*xfoXA^m6gOt7#bNR;|g6od zsr2Db+6=6DxT@K)e~5RN)=J4q_NRwPiRS>#tq%IhBWr5CxtdqS-=$_hTZD!Q3|PTMZl8Ph^U4Ux$dcV1h<&>=e~%+2TFXXMBb!89-Ys=XYD47jvV z*5?0edl|4z$a-q=1-Lz>{#G-(;3tH{OTtIkm%@Ly)?Y*5%_YBM1Cv!+%}R`U{-QP# zs}Hz;{*tzx6O%&-kNHDeDZ6A^dk5~7slLRW?Jqj~2fVjM7ft7%+Pk*SS<$?6%psw8 ztDVGxjDYnV0n0^Oa~lb_yCBc?+3IF?IDkK;&Gj_rwqpAWShvQ}YS|8V`|C79wkM>x zwm@Pb#S5`03IaqvX|vU{7NX6AaeM?@w)c=-o9KjW2eIp^Aj}T0^7FJN%)UUDo}|X% z_AVWyRdB`g0wgzk0H5!%#I!N>6I0vQM~{g>Ss{3(NAY_PDTEDIN8|5)XLJO3o@O&0J>)M#j*9diIO49(L(-g`hD( zxB$X2(^2)oWb6@IQr`|&{I6#B2>VRzkohXGn8UpZpUM`*A2s*fU_S!cc$+F3*kKg^ z8?3+@tYipQSQvMj`y1F70SNA^X!|nW|8g`MeDJNI@ECh?tg9Tn(QFV_NQg33w3P*sgpY3Qxx{^ z2yy91w?uxG|e@vIrKS&y%`u=K4}pH#Cl&K~!UjMb_$NA0+~ zKsLvHX@4yei^XQ+vvva)E4*kXowI*qlidx;e%_v7xXOi=RlSX<6W(P{8I3q^zbN~g zm_vWHUu=LMl%wg(WZ!LcRMW9Nw;x^7^yg%05Z?*XLG~w@2k~^ode%T?C=e5CO(QJ}*MK1Vsg}E_=b1R_3}G{W)iZrx=Zi-HR-uu8uUcv;JyR@#2{a(Qp8hDi*;k zfcvRg7d<7xQ&7h3lClc*E*8C6w2K9km*`vtsW_!JG7G!tyRob|v-1 zXv_=U^z!g1sk%&AszEVCWt`$>#&O|_9{Pu}7xysSsy{7z+ft-UpAhFwLG`SzVG&em zHK#X?N?kgJ?YC%$OYa}++XrG&(ZouQtdh5fZcqw?7)pGRWeG`cG4O zmd^J+4#?8uGPm(|*gBxQHBoc**G#O*W4qI3XjCih(9Kj~q1nl3*5fO!m32UOTl=53kd~Y#l3wgXv%&U91#hg)mxq6tE#Hg+u!S2B+MH_S4g3Zypu*(?>@g za+%x*O0a^(nt)fX&iB)Y^XJ(I^w;q{5@DK%{d)gnjo-oa^w%@xIQLz`Z8EGa`0T9| z6CbND4YO87ejT9qj8M)eraUThb@^g7%DP?eAuGeEn4c~zqlvBlx9f3n%INE3>pW0z z73a>qKG5oc`a;?LIWF_m$q?_jS>@6QNFv0l@tyh;a`sGf>z#TBo8c}9AenDgkJQt`W&cB_ z^B(<8nSUG|qu-&}zM}Mr`ls?@oIaYQ&y$BOFpDSY{xI!V*0bJ)X3iA7oei?BqD}a- zQWLNWUa}V#p!4zNuc1YQaV7tximCd;|3}cAX}VYYja6Jpv3Ycw{(wA)OH_s}$0eNB zS(F_9ZkOkSyeK6+gVVwfEi2PE!`0vl6Yt7;z~+a*`u62D!~RPF>wTEk%|H>N8dzpa zpQ-(`V^nHrrQbrvkmLtu;WRm0@ryuER4OBX16=CSH- zV@5ux-)ZCOMJp$ln)&l}Oz*(YvXa;pH2)#pZM{rbLHhzP(dwrw%$NoGG$kIMdmKx^ zR_m~g@hngNM_HZ%MXjWYBK@`G?0(jPPsEFj3+~UXJbXei2&cHGQ=-R3t$&>7pwJvPOD2?OXk&@qBia1|Q^6KPVzMn*wdX+v_5@h(uzg-NBNywN zY_htEd`tA$3AowaI=aOBj#Lv>DD$q~Y{iK??G-C-*cK~JTz?*B#hnbq@paN3T!O=S z{jXVY)hx6&D{kBC)P1Rr&-6Sh)R}-&wpl9JyHv+j3O&soOZ6yxh528!e;InUeocfl-hExyH{Bj-FeSQy~2l@X6 zZ7zqIg)8;3)^cBV{+YJQU#+Kc9M4Dnb{CG&xs3?L&@=3c$9D1=DD2Iu(z$WL*G*5a!>F?3(;i8;sPYv`HbGQ`6t{i!EV-QmT2Cb z46di@{fo{&qo>6}EJBa0b6pj`jUcpbX-tLQIo{1Xrs^WevXIOUqpcN?-LMZSe}&Sx z{8@b@uB$75LvN|w@jt#$at~Fh2TcC4+baVlc$Pw5YG?>4sO> zBpA6Hk?S@6UfJE4Hom6c!`CPILgYeviJHBRxhq^T-Cx&7GuYbKb=;rOgbu#0cMQ>_ zmV`YHM`?&A^~VJ?X(Q^jRqtkV)BLS^ldv`$vS`g#JwEfwo>!*iLV>_HgPp9K*WJPNlBF%X^P+@{~Ci7x40PD8ip_p}_8*k&-C=sj(T^%hFc*K2Rf z>xD0otFh2){(&&h2hqW8`j~dNR zaN+CZk4lzGK>2I7GoNth%67eVt3gGr{P?tzR|LK<7P*AM2XhC>9qC@J+b8%89cYrO7LwS z^lr61jzBZG^cyRoB7egy9N5=md$?}K+DDvNf)L#HKMQzxKUh-57?P2g@F*;198%!P z0*`!(w}Vxb(vdp7sdpLe>x>~Jib=|g`_u?aat8(kr4t4O%n@?}q`F=zQ;RJxi{kwv zKyG`6VHyMU32Om{Scd@pooL^idb=iHSf~IdYVER&6V=itW{<@{Y(q8NsyC|b#p zID45~(z)it0n842NqZ4*KZPSU|I&xRB*vw^J24?I^!HADZawB|$1a-8#}WlgQPAcV z(^}Swjkmj10=soFy};!Lq9TeroqZ6vyG6WXYH2K>@VzVb)b~ISb{z~#`{@eNx zdGCW%`8EvaqNC+LHm&BFNj|*?mNDP4zGVC4F8vNZ;$FQ=-z!U7grpU1qN;Zo_-P8? zjl8Y`>a-iPP2Y5yzZ+n#Jj&XmKbGXj;RGl8i4%GaQk%|_;v11DtrC3(BlXh61bQns zytUv>iBc$B*rLv^O*M5E@u-rB_iYqB;!#`iE-L>(k4lGXIJn??Gn>$nAyTmV3-gai1xj&w{Iab`d6_$3QL0#AVUCQ88!Yu?-J*K z;+pA`K7jbRpQN21=xqg4y`c9DGRf|>l(Zj;&HI!&Vn5GNeU;{v|LC~t)Aw`7@TF4X zx?*Y(tHjgeAL=dTY+UE}A!a9gpQghf!Vl~_#fEK*L}A#T$dgo_rTmqc+yG=komo=! zDy{tp2BGJ37`K_!p;8|pd!8mwB}OjkDXOT1#+IJUTNECiws%EqH`OZkqB)R zT(Jj}=>;Xb=mmE+k3G>DvC``$r=*S(Kb7)iEj+QppPl&Jp=`?e7(Dd8gu9saE-A{6 zD|Cj{xX;(<47@|J;!fvJ;B3PdqEF!O#BjmWV5>R*1!E99o(n$F8`KE;@=tVJlE1b_ zKcE7ZSYyR2=Ae#Kch-PoVfZ%{XRasyL|MZ_B2}huHMnMMDqixNCY5RUE=JP4e&(9rGmdh4tBV@Q^;zX!VZC#jziu z>!;#i|)lvC-}UwsPAWJPuDn_^qKx}h&30<{nRt^3S&ydOLtPU!+IZa zu>b~M3t+esqGcUW&o z^}o=QuP8nF8l|_QQD4Bj7^J-A(W_7%d5yd`T%B^`>Xd8Opj`PI%B5?R{uk~1vWD_B zD)~wuC41lJ21ui*V|w4f%bc1>xyp(hP^C|UUZR~<7`S@xr|_?NAbXGB(`fA1dSiL_ z9&`TJdP|!YDJ+}^Xx%q@m#E#FSfO*^9*1?(kLb)ddhnn<+X7b0Jw->41Eaf=>YdR0 zNBIx1yqA?IhlJcO#=eM2CwLHfm=%~AaZ*o*l`)&g+-$kzFfBQSk*4>I@*zeN&Z6lJ z=(|&Tui%mmJJiHbHIcf1i*eX{m~y{G$8+67YroasmpwzwNvHKjHQxq7e;4q+o>clB z^s=uzUv$@&e*8`!Ci^-G3Ko1XD2O*V{{T#~^k>~gA`8O>a-P+Pq$porLscEAqpH57 zwP&H*;V|2A7VPka)9JJNgs9HP0_^z4Vu$~PnfsG|HtaHG=KYS{cg^e>%sIvXgX#H2 ze=b~p_a`&y0z8}Y-k)gA@A@~0p!pZUOT3@Hi1jD`Pt@jra4ESj3FIZppXRFn>6^l2 z*CERK3yT___f{FWg7&Y~PGh_5KePIqS@J4fO;*~0F#!P;Xk*)Xcvh}_> z@P1e}N;o|?%t~JpX1zy-Tkl=N4Qy8ai{^(LuiGw}>56fKP5A{j>o1h08sNnYDo~Bv zZ0E?Q8gI!;rs>g)WxDJ&%z6!s9H$Di%T5Dv20k3lur6w3K1{;_;3C1Tj z+b?EPl93`aYjTn;R?JN{dL`pSykaq7SMYwg*DY7m0XR%*#;+KvN;U>YWXEDnL&{Lm z@Y>#J>fV|Qilq^)jsEibSX#%=+1MT08U+uFHDlTsPpW#H)!g33xNpjskbv@F7h)R3 z_=ESy91&{{JoG4-Qo3$3unr;MSjb>U#Z$#i#xIZwwCxBxbdJZ z(Hzmq*e%;SQnL)i;u9ztMhEtGi`$ey3T{&hAe%v+45JZdg=;b($ymEue>2HhlR$Kx9_a;9}{AWWd@NZ6sk^4uY`BWccfeq|z)(?_q^O-sQjepvLZ1ulm z+6Ne~*qZOIVQab|U|bCWs(%kv-Y(dB1`j>JPvu_}InZdN?+n!LElTIt9f8-k&76U( zP~N4XgN%1%X&*JtF(&Ya4^NKqkLLawo7bxE?;*wQrSmyP2ks4Qgo;MOff3f*lrz}q z5CX{c&g!r+w0wxs z8(Auc7$4X^GS}W=JQ?2PpzzIGjM&MP1zG?Xz>P2(b^BEK<=N&HAg(uRiB~?3#+l#R z?7jsdX`fI9vfDnP9V3j9^6sA~=1z_63c&8y)-$I(WA+-FBL~FEqOFV$=N5XsOR>&1mBebj~xQjc;N- z`-@tK8$8p=tA0^16l)0m=)^tH*Zs(zi-E&)h`Qz)@v+h#3)B??s`RHRxd81?r3@bl{U3#sscqiZ<9;4|nt6ENxd_FWQXX8FgBF%TMCQb4G zH=q!Zw*tovMBWxP>0k+YfV%KbORD{M3B@MBe8Mke^*R5jK>BE*SFH3VH54lTd#rTt zn2`L9YSWczf%F+dF)~2U;CtCo@RG}Cx0Bb2sbb9aD0D|#m)=Z4nu^zZ#_!|VF z4dq%y1qH@DSz1Qb1?c?0;iG6^ejjt^Y~w6;(vGH$_d{4*chS-N(QKX(rhP6qn@=&j z&o?Fj;wM`75T~4>%7=`_-F~ZS6G^n!$Qp`OFE;jJrp_H-qZr&&#Q<<|hiy)y;FEcE?q(}N86&Jql_())y@2N_-vlHXmM&I~W)k-+<);JAgL zcP&7W;ofo<)|U$%ps=-Jvf=CJ}Pd2^%%1? zP>*@gLfY>!CUXkTEG=b?*gjG8GsT1Y-Y6PH(BiRfh7@Jt{^HVw#!a^EHdcdu9+3|fU4 z-o)rAwxO|o#f|IdyOUvarSm2c!-{hsrYx^9BqfMv7py#xs|XtnUz!qj8(dH|Hrgoi zc`<^0Nr$~KBEB-0lo-8bJohg#9Jc1ifH^X+T#<{`FSUiO?`JD|!7s5$m3e0$qw`BK z8B%nbvJ5)>7?mzFZf=N)g_9>1yx&M;n&1UGMpetez+;sDFk0dmRXmL5IYyNa8~1Yw zQvJMDhFsKYnJuhU|Bw=tDjK)kD&gpIqje~1Y}yj2e?3NxR~VmRCQ`iuG*nT{N}~*@ zH>|`=sESUkgdPEbxsPB}IYvt!G4dKzMPufJnM$B_ORDJ7Bhc|MkJC%Rh?Cq*DKxXx zNUDiD#c>1iTK*^?zOx{DJ!)*^!;;mH8poicDjzc%^@OIW#y%Hl|7!8!5KFGOv4TB> z)w@XZ+z{+N(aQMWnWeDzely#Y!S-gAx61gFCr72Ljl`CJpxwl!iirs=asC7DR|sYp zzF}L0@7ZF{+aGjrwQ-ig_mmr%n5Awf<9^wu)7;0w2A#G(j%kNZF;5u1^}hl|*(mo3 z7%EJf7rq?>C@h<( z?cs?rTU>cd!lNvF4Fx_=f&|;F{M&SL zK5b0bb*qx@dghv^jfZXEOj3o>`bM2+eS%u-!4NrWsjY8e=&TEsU}S@}6_8<_HXtV+ zl@-Q6Y`WRzSxi#u$Cue%lGz&7Tco9#L!UFIhjmK}l-W^Sv1!GNPS(427w~fsC z@{-$V_tdpf$v=|gC5Pe-;qcL+uFa&&0;(vWsi z5|ECaGCl9UG5PtE2Dg)(G~=bf^u z1F_8JaMYVRe&&5s#;47kC1C>b=m^JcM%T&hq{hgbGnr0}aHKU{9(dokGPIbscRFs; z4ocqas6z`Ybd((y!G>)YE2;#%L=PPzf0T>?+{ef052M~A36cxM!c z0mpJzcpt^y<>;XA3B>=02Hz!6kH5=d$^)jD@uM80ZEEhIwo=cjwCHZfrY6gex0R|- z)^ceh-Z^e7^&5?@Hgvkxp3UxYr0P4TTV#AdgYR)P(oY9o|4TFY)t( zp*JQuZo@;F>{txjYQ<#7tx>7-+DY|Mem6Y1hut-gzMAYfg{iFnUPod~0iqv3@FJ8V ztN~|f#xss~)cQWhVA~mb;66vw!tOE2(wPU_NzH(u0|Ix^B~i)JIs|?O1HT7DFg^JG z|N9Kd-?;|q^^k-T!M{Z{656x{tpo7N^1>k!zjF|h0`ER*KGo5pu+2kO^;#nugQj#k z8d*?neg*@-2SYGD`2PR4C26h~U}MnnY%k?ID?($vY* zCQqF`RoW1U=d}6J^wktcLUV=8K@{0A zxh6duaZw0e!7Bd4AR_I-?_hp6-iISpG)|W0a%d6=m%kTE6-eN41yC^V@(j{pykA0a z2GjA(;@@?G4>0*5Fd`js952e^XOluJ<0Jrv1_lm&=imQ7aa@QfC`bU_kK*^4kPy=p zafOKBAEAMP_?@3^;*xRif|Yqh;K_(MeFxt8d6eTr0>^FUbcAsTRe>k}=FqsA_2l1$ zo;ryf$(cF6ZrT)NEI_Cm&w0WT9~wCBLW^W+gfm%M9uoTEH-|u6q4*IJ5lpz^Stnyn z`n~|Nqj**X0wWLpmRdqULjtF5#QQ;nOD*w|lmLnlV$eoGJ7;cuvJ}}IND}DJGDl|p zNTl%}OZjU))X_hWM$IXU&>CZK5-8`s`^1<7eiNnOX3_xW#mC zHU!hNnBwPvmW_a|L(9lH5YW?$X%44{FR_GeU%=LiT|%$TaSV)dA-+4xn2%?Grl|WJ zX+{O!xelmn|N9-8QU3_oa)%MmHUr|z0T-3Dw4E3^LhE|JBf%Jl_@)+|JQw&%@y>%W z@@39-B*^=g(&)M1^%=yofFgd;Tt{+3F0{ z7dHa$R=#$kzorH{2h#tX>*y7=Jb>qAJlW2%;+xU52f*N}WmNtEDwXtbJE;j0Z^4tT zX#jnL^r(EivtjxGo`Hsmn}lttbBAOO?b$WQ2#vQtwsY=srdp&3)=dSqfM0a zk#=GxHVjWT*1KwGKg}~jrz>!&a0rBlGi?$)Yk zmM-B(QYI`#guE$}$4@J$5v|-ErBwrT-lHJfi!rbBbqjP9CkVBG1~5N43x7TBXyx8 zA$iqf7V2m4RaJ&KW;**5v8a5Qm!$1}=2O#~%d@%gTiDV+v-^9Pb>J zkSkrP$xq7`I^udXF0u6V8in+rzBM)PR4J3@?WYG6A`lFoOfeFLbMV%3!5R1N8k>4^61?o08`xq zgA<2a1EJ1)HR3s30TYa?1K$Sm0}%3q>3FWX6(ea)0i1vkiQwbkbqeQr5f>7_1972& z^M}6k@9W1E)@BG6E(+p|ff}T`lBLiv7w?yP!EWe{-it5=VGY6_glYs=7VHUx=#RwG$K7=X+sSgT7=!-B8!Go|CVF!Y}FEj)~7Qz&S zN`y-YZTg{5ge3@@5%wdTMi|;3#tVY|HrOi&1qh`G<4`$n?)p3++?Y@=qlMWr_cL;l)VjDRaF|Wy*Z$f z=V)kVsHjH;MI}WeBeTLXGb1I_hKdXo6^oPV?`}1D>8DZ&?qgasHoJa z$f(Fr@i!|nDl958l=pu2*^9mKo%fq>_H`}xxu54*|Nm?6!QpQdM_E1N({1mls#T*=um6vvN=n07UnQ>Tpt`MkeeZ8 zq^djr=^cBD&XJ@pDS3!me5v=k;S!hxBrcB68S@q`W{)~MXYrB_fp9iBkW8La;~wVO#x zy^0o%%fgl5s&G#Jljkj3kdwJE!>ap>ks&@)!d4A;iA!9O$Y$qSwcK^%iQ_ZuYZnl? z3e5J-3#5|@Z8d|>hj6;MGAVuQYEpqL`dU(kOT*>j3UH;kdRz;xXBz8wTrw^lw;Wf2 ztH-tCvSzvQ^d!6qb8{BnGH;S9f7u(UUR>?Hy1!|Wgtf_Oe^Emo@Xm=aWm10X=DFUB z0#@WY)`z%g+z8xi`bsJ85N`5phC$pKT>hLPRxwWQ+6il?^_u_x-5J%i;r|+dnF#q@ zJCD+z&mhFT94B{inT{;UxeK?ufC+ro9#`X0T)QDU&CB^L0VgeB%f;stUCMuum;47= z3tSA?s^HRGZdGK}Iy&+k88k9q$qVGPRJk;uru5y@lh@rZc91fm*KYNS#@uL zcgpZ|bhcQiFUWzY*3&+(pq z?vi=4mo8pps-$&0J%48Qf+e#v=A~rKUNlWMKpoOjul79b9oprVe+M@W_x)RSdxS;z zT3B|K+qlbm6*&u~kzE>L*>S;-VAmzOc!ZT0V-@ zzehbRI}{xW@;enPDBp9z6%@Qtu@e{%%T55^g+EW`bLyyK=aKiE8nOo7{G6I3_uA*w ze7QG2r|yw^&*#;8?wt~zCmz*xgLgpJ8GH-|C7Y1zHjuQ4N4;TPRJd-uMe`aDJwieFIU9`oMNqYAl{ z$4}g);ha{YUVV%O>co;@5nRn(HcfdYs@LP*3&#|}=fd|<&eFtKx-Xo+aPDlGrv3A0 zFU*?9NlQ8lMeJlDNc!%5+&iU5htO_b%y?1J8kXaF@*|_BX8c z-r1uCUJNhT7(5Ol{-bMIu;*=5gP!nC>QsvS0`=()-qQmy>uCzOvA791IsVViVex{K zyLQ6bX}#wE^=|kNv&wf{lZvQ&3vwhy&Uj4kZ~d3N~l zlioA?`AdVFh%wxyY|rH`8?R*UA?iRKk5IEyyL?WwYVl+_li93HmPgY$%)k_b;~;Mq&{JrgC{qB?s8}{hP%|+MVr-* zbsS=3z=Pm>HmhFGc(3YG1k3nVzggY#42LOUuZ*xpioaLXwrA+~Ghiv{#jmL2&#9llb;oF z_>+#kY+#qZs(L-^y)aM&OZabamvkon!ph|5|J!B%2YK~>kfl2^xoc;Jr}d63@E;>H zJ)HRYgaH1le=`yCd7R&}YRZBwpr$Mk+!AZS?2HVGZK)M|gass}AtPpH3H@r>oa=9# zcbhH8zb$WWVW?VsE7KpF3+(lBcQf)RN>I=D*}r4AWO4T5rSq0tpS@(^;w1}nZo^MB ze!>ELpp{u`meMvw;BXzB;skEWa~L@;&KPsnS)cwHYoMmxEh@%g3$3)#6%l z(Z^YGJNCzmIc>>@Whh$D z{S5A(zpie1&O5~u_J(@*IgZg&-UuF?E#@v0AK@?|j_%ujZdrgrBGd+NzM-Z+PeS%P zay+bho@3jniV;>kcFEis9wi{;d<*4yZ(@&3gqL(wj(fp7sDBl5IS3ArD`|Z5ZpzNN z&7Zww-u#8R%@ykQ7rZ0KgufY_`n8RIYLhvSMcESj;f+0|Ct)X3IuY+8>@JybFl^Pi zge676n`%f2L)zvy)$|gEhW+T}TnhU~N*KDL-wF;*@DA*{WWX{+z+E;F-WphjDtIjH z+47dUW&?H&$Oi`Ht2Pi%)Z1#~28Ph_Z>t>}IN!~9TXo(@0TsL*jL$bU_{4~Crf*~j z+>d-{(Eq&~Nk?R5a7lxH?cB>CUr%bKI=+#0Wj@L{jLW&poQcuY7a3RUVcGn` z_5oqsJMGPC+lwS}20S>ZKl&oImj}zBfc@A~#@#Kj9B9I`O1(qE8(}$&Q#Y3|c|Kk0 z9W|)uyTPU1iRW?Y$mKjvf_lk2L`A;j?b&4oLOI+E3eWGd1wK2-cfQ0yqVK(6e9_#U zO6c}7nf>D>ueVD!LZ_q=_V2P5mO)zrd)YhW!Y!~QPPd53_L(Y$;-Oz57njfH;0ekZ zRx|c;_1F?@WzFyLBVXPzm!AV)fV&u%j62k6sMUmP#f5hsYW2kVacQ_rTn=spt^`+$ zYsJktX{favSETxFqMnMksBxP(fUP1pnID4!_aci(qPvy>hSjGxw6MYSw0XF7YSt?hbt7`wT3~n2D>V9^ z?+1q$_+@xp5-e3S2RrGo1zm=AaMsBkS@gE-ebwz%@02lX@jn57{6`~u#xYqsk>(fB z2U*?ws<+R`xT;_kuI)S2ij5j-rQiy1g}7>*3~kAdO>&j`>{aj7KIyQ`N?F{cgFVFk zB<_z@sc~iAIbF2As!FXdW9UryAh=ez)&- zl$9vulAOf$AF5u=_D=Bh{77wojpnfMqu^8Kr5~x^USp^JuaDHY*S%u`Rmf#o*2G;r zPFt4a=i$cm*^3s;lfgKwI{5fT>!Zdn1>)qcov?OVulc{+1MMEQ;r|#wheU|qnz2Kz zMx5NW6V^`agB)-b+Tg$4I|lII{hNu9&$5oo_&C@JGGh23qk$G&%4u}2pXZHI33KFW z<5FwI$EsU}cT9x;?4foQNi|KJG}Kbv_jo7rQ)1rUYD0zB>#6%#y#b~Wxz@3=u)z6yDgVYeBc8nk-^yMEg440^Wgy)>T>40HEr z9>N{;miJvxmm2lWTiy$YEUyWUKo4`5k?DEvow>`dU+2H7MooR29$Nm%2fw$^LelY z&X_Uo8vVHtnY0Rhf7;=7C)}TLSoUrItKa&dU%#aTSzYMnFku~oH%tzLV^Ikpm!zt+ z&>4$X)T(js@fOS%wZY;10CzDc|BP7}CwJ|HwbOdd|Lgq(|D)Oi{(l8zCZhZ^)qjik zc(3|hL#-BE&)q|*)!QdfvLiU(EDSzi@w4NSUT#$(m!)`?{lp>oOng5w z8N%&%FZ{f0V!wNmF*|4WIDa!b*}ZktE#z@}P#^JSaIKZ)EIg6UW3W(VTfJR9iC?O1 zTfKwE%)m${_TZwVeNS!WB9|kTIkPj|oi@o_{iW)&jaNR3(M#lu<}Kim?Us4Y18i%{ zmul)ZZ?E&~(aUhsu1}ek%tA{L_aUbj=tuR`CvQ{BV8PtRS!^{0MXuipnq*rnbQ zyX0MJulUQ_rH;xyZ{hEj;0=+e-D>>@yxO0zo5h_P{l2$nC$yQn)o&k=tChP|pAVVC zi_yx!nKn&b_#yI|-D~zCKuLI!5~&4gQ50{`pz67vMh~y@bGbVa_iXn* zIcCcK;FmL2k~i5>X}*uoa^$Re0-vQer|d7g>J#tO5KrX+wZ4XCIR0R8J%9N@^;wN~ zn$3~R$-`3@lVQw>@ zgI^Em_Bn4bOg=Qix)t$dI2kNuK-a<4pc60p{;9*CopAr$VHwc>N57|9zORFk=s;4w zRv&&&=S%%sd1@*C)nBWTaY)Ot61 zp7=)H@`ZOupXhIcK*8XmyE))!sVq4KZ1VM_9Ab`*COD(*8*naVv3aa3#1(b<h~k8xp)yL3GWyS+DDyrpr3-MmiuAvh03ahFoQGG_@dJkD4$ zd+t15|KscwxeV=*YM7OT%fJ=j>Tn6_$Zp>FPkMBim4?g372ry74UY`7cj#ew^*=Gp zs>M|!o3nT^Pl*=EOSo1kK}%nJ&54@HY~BJ6dr(=`C+JG11Xy26DMVnu0?`Xp>sM*L%a%w5Q!}6<$O;!&N;?+gm@(s^LDlf`q(1%u2=1 z_RpW5?+>%G-eX|Grl@?FwV%)aEmRtZ0Q`2=A2fSkg)v)XgrtvmN z3t5vW#8vY-^0i@hJC?TGK#?$^E}gw#p4Ey@Z;v-)bFsYNijDZ!$(+c)a=U2R(wxN{ z<%re{yYgL%bK#sNvzOeaemUSh&6D$s>T-~iyux3C2M_R+gB&RA|3%$<&^vsrzd2ZL za;6nUggWxX8Y0|Id3`d>3bqMp#lZ;Eo68O#^giMVe4C7Cn*4GCxgWO{_X6%s+;-e9 zTt51*xc`W2!FBqTMI0^)7mGUwcNy+#++y4vxSt639`66bJ%)Q0SAna-)#3)wD8Bi1 z#AQ}9VEsmbxIwrxaEZ8!aVfZ&xNK@!7kvgrmjmlu##3BX(h4fo;RDRWwZ8{T%W4Uh z7HpSRQj1+$m##oAtxQVm#8N3nCp{$=S4+4$jtELJ_G5-6N>Z-8E96_5Pk+a|pV{B? z?ra18d}RBvk>OVI z+xqe_t9cXS9r5b4n6+xk%``5~p0_0UjC$#^xpU{KXBxbxb&5Yq_fy?p<#n&Q^Rlu= zEnYO&{$AkZqssH0cTTs|&)hEU|6DEkj@h>LsCoolmrMT)p0~#RsXT`{|62pgn7`pq zb^c**uXe8fQ_VU|B{cr2?mXL_{_l}*Kg-$N%XW4vq`o^f)S$s!!)Y2t$N6o)UM!WQ5!R2uV!-pT+ z*l*o1R~}~e{@xC=S0m}Kz*f#o3y-PkjowM!5`S{z82^)6-$)+fkE?Bs-YF-g9k<_} zSNlSJz0?^$cu(>a9#><3UO!-luFr-FNiTT%ZUZmn3Y`v2se6|C8i zi5;pvfQzN0 za^HX>+3oxQpP6FHUTE^37SeA*Xq-JURWl|@w;S*5Y^Na)QB%A7Mk?>m-g5>$4tvqB z=Ppb6lbngI8kRGpX`yQV&%98h?OKt`q7V5aKhvAy!pdI%**mq9C-Y?0rNuk^|%UQJrL&Wt)_w4+pWlQGH z^DoU>$lu^0hwA&M_lzEEFt7(H?lS%7`_wgmddFUP9F~U_lSr{F(oB|-U-LQCsrc8t zpq)9URJ?#Vt)jSTaRl>4kO-*CC#8|FKIOg8@+MOG8H zr83x_pU;@mggHey+F6B_|#5bnD+UxTT@1BEPMuK~}OU)Ll-d%kc_4oiB2qxnsIUn>_ zi@N%T_wo&hvxnRSWHR8SExW_=4Nx1q(x{RLsJ&f%b57ch4ZT68rT%JOH{VcC-2kgF3G_n*7@F63S|_7q>|ke;Cf@oL2oA3r+V+ZWzz|Lw=xli^3p zKX9>XZ&!=(GCbvuV{KA7a!GR1(M?9ClP&X44zlrgsMmY@`gp1WYDaJ15Kq-z>UeLW zZs5D0eYhvAROicm#oyH|xfkA}?(F01HLmWSV{I)G_{45W$#;e1dHxw{&uKD%ZT`ox zwiQ90f3oQKEb+;Q$UL>Z5AkK@sl$DIgFN~7scwCJy#h`5bxdzFwhhR1QAr-cLwO>G zOp04Bkwqa3&+l0D@yJ?E@H-J1Z^ImP=&O$kLFRnN38NflT6(OYD+?8HSzA{^^ciJC2FnA|~DyVy8VfjMqe#Kd9b{ zqSm%Nr1o;}l~8c3O+3jZkyYb4p+Fj6FaG7KFKkdFf)b2!#DdVwstsoV3wu~i?ML;+ zKCEu&NA*SW#h-peP^Z*JjUPxklqx~3Hy-7Q475?wR0Vm{-~FQq4Otwp|aty@cCTZ*g**?vAt+31q4LZ0=6 z>NddFfB4ELJJw<=x_m<>g&uJdgVLeCoD3-9B5>R4N>1UlIbbTUR!PpMS|>dAjf zZ5-emG;4X`v9@%vb0U|77Gbvqxdbei$jXsbBcm?uE0Vv}$SRO+5s6W;lCcJK8BeQ` zeqXOXE1y2rHaTcx7lwozNr`WMTFvs4mau2ko!ABZ&$wMh;>^G%4w)`ok>w(bHtZxF z`N-mtO$-ia?c;;k7o$rpatmE#707at>2M`IHQ_Yv>>~AKUtb>;KhPJ}y8#Of?Mp1e zm^|u{<*Szl`%dp14NiVm-7t_0Wb#I`+>4)6&vT#C@WQdST=7V&ks6f(Su6G>|F?WI z^5Xv>uSOoep`*QI_7L*S4QluxU!QRmu0FyX6r;LOz#AFVf(6o{0G6IRjk+GF{1bfg_7P!7d+}`1O+>xx}szS)w76BHN5?BC^Tq(@5XxC)a{mrN`P< z+a-8%GguF1s_p}PrziGg5{`bkV}fFl#Tl|#0v(Sm0a-zC08Ll^p}xp25?v;mwVTz( z!Bj=;D{8yk*Sw;Bl>7cyWzgsoQmDE{`}o12Xok}C@?&ik_&c%fMoGhXtz(;&EG8h2 zM{X9+WMqD162Dwh)oI9Lk@-d7^ed6)IR5iQ?nzx>_e@dbqbQU>BxIw_6d^BqvtvMZ z14dqgyhZ}z5?Kwh%(ocbq|UkGaEFlPzO9DG_(t}cyp@u+H9=i0OQf}1)gpABnh(^I zF?7__50AAKip|7st3znGlD0hT_J63hi$3F{V{L0s(3hic_(&Z`KW0Vsv9?k}FX?JP zANjFcXi`wE$ik83dDQuX2{(!p%j{3wLX5^H9$D@u>XsoaAc{X#PYxlS#kFet5GphJ z3-zPOeRZnWP~Y&*xx47#9yKz?H)M1iXG_cLkF`nMa>+djSuQfa2)Lvl%|Nyi*$nk* zA7+-)p}w$A6>y{K-kSzeGnAQT{NU}nlDq+ z>1su+FU-?)K;08d0_zT{^|4H44PU7bV|{&wM<42#pv|Ppk1WAXPOw6%kR=^b-G)(F zaSg}XB$0CYaX$8U@eOMFFyEkSD!)6{W=SPy1xI$t;AHg0hut`&;?j^6AxjDl0(OOp zZ4UD4@7?h2N=8=mz1lv^*Q-}TBRZoIZAO>)gE~sOJZpbZ!-q@0epOS4`+AL>{2K*E zm~u%t32Y7gzaMK$4aR9tXVMUpk*Bw)2Z#Gcp4V{HSuYqpqX7LO_({~Vtswt;W2Wc%JCj=lbKTbOt$JC>x-0qhqN9aFOd6s9B(TQ4ie4^ zH+zIHd{TbT<85h}h$lTbCu3fNJS!+q61kLB2J-0Bjs4zf&SNqnZn?fGBi z`N&rzpB$9ynpj{Jp{PWW+EHOuAh#|)9vs71H|wgaMV^8@F=!v5<&DU*k!J)8AzS29 zm|<)YD<-KaBk8_9FQuZ?r$d;|XCN-PR6RD*H>6X+WyjkJ)D``Fr*>Y0*q5yKj`R)c zlyf<)&0dFg^%GD%s;H^Q+g7RrBkBL+NBP2sFQ0b2EnX7BB_-06_P7R_l)hY&^H^ks ze6M2^178z5dr&qql!`tnMLmh$vpPk+I*Qs#pRRU{qTdx?sgADZ_g>KU7 zImg>_jn*XL)}e2j>l837>1afjG_Sof?Ao>qooAKl^VF2ljBWdGKHj!g`Z*Wo)?{>< z%hamTzCOKbmmLo-T98Yb<)Ul6MZGoJ*Z=(SxlSuWF7cO$KV(gkE-sN(BAa--TL%(; zEwc36Ri81wK7o34;bP1s_F-(pYfg|wBHMy&i)|ImR~)jOJ38jeQCms-hS?vB_XqFg z4#%53a}NK^VVT-A#`l9~@|9)l&h%~cgp`(DG1fOAw0rtx!8bEQERQvYR@I>HI>$H4 zlk$1l%jft;hK4ki9T<;Y$m+6?B<`O0y=8+g^7Ri5sVSQ<$u}z0ll^tsl1s7lM0{7a zF4?zAf*w6hOjDZ5rcW2srm~x72E%wD)ehs&vX`%wz-!75%(BDql=YZ{r6;0u*_e6a zh2&-0VRS89a$_(ZPcI6F@y^ZSB|ft3=N#Yp62|CUvCJM&HvJAejKO6~?i4SjWl!Jb zyPk9mFZ2987{=(lU>H~2Ctl*uDqFHjVyh{8-~l^~@ntU;*kL43{Rxu$3vnr>-KX#vqLca?-AZe}ik`&JGVO zwya&S4lo(Mp2KZc!M6Ra@LD2}_9_0?!FkT%xA4bsKJjV)Eya8@C(7_J_&HWJ22X|4 zU>(72@O+qw(~h7Bt}*OCfg?#E3nN?q2Rzi^!OydBfOP_=h9PKD@2vCv6!4L-lO2Ek zU*Jd=*5OFTU|sSb!heBf&KLV%;nftxNe=rk2k}&8N3$02i6IDA1;9D{B}ZqhG)P! zyr_-ri;aX{0&g`kvScIQtKES>m&_9w>@&CuZlDe70Dpn^8#U7ZMGl?Rk!O9Q0(p!P zvz&BHFXilzbjT~cQb5b$jRyZ4UPu9H{bz6n(e`)jkHHTZ9QzWhOQId@=&yux4Ziaw zn!5g{xe{TL6L8VZ{5M~RPi0va zf3e@na{Ogx0f2liYt7wm0@Vg0yw7jtIQCOElAwqDR<^@elzOb5FZ!)?hr?c?nU=W;`XKN! z#r&z?TJ9KJQ0B2B8{HKC3@>kXBbfWT$66gZ(3(iqOM<_A)5E{e8`z%Xd-;L5q~Qat zG$*{k+myhVf$b$arqW|2oIB78cl^&wc*kR(aDsVXa5dN=pMkkNQ+5~4BoPFFQ^G-4IPVSZJzgM%R@6*4lwnVKtdxI5Td7Vqh8KFQG($iB8S2U4N;u2l&?1lJGdK@UHu&pjJppU; zi$p-vlyZz*@39(5P=qv9vT-e3|3b8t;AAuN-&FJl*Zy&Mxe?%AIO{pr{vI06+Ktin ziMfRT8eINVw3Xz9H);bdFQYWt%5V}ehnBSb$!H#k1{3r!EvX8<>?kCFD%kpWw3X=S z*S|=K7#Y|Jk2ew&Ma#>0#!b*PTAq*abcXK^AgF%UHJJX2$BH0_eka0}@XD8>?Ol%~ zpbXA4O5iYDj9!*gqVM;r$7(f7Fdc3wbi?oZ8hzXFA4ozFXQcRVaAL9Rp&Sk~a`-)5 zZ$vPXuCS)awf~T&o=B1F5ap%ZZ%_H?v*Fc-{U-QB*j@{v{|&A&coU;f zBLD8ar<1|&+Q>;zAFxv_>n<+>do4o%H^H4@ouC)tX(Who$hJQMpN8IEGhlyaNT{X% zi?(EF8GMRiUk(q$UYE$9a1`8?na>XJJWr^VV+(@30-gzXb0T~X9s}zV=o}hq)jJO; zCBn&Ymh;e4_&#_p_V%I&-VRTI?L`vYJuEcXrikCJ)0v%k7-qEkM>~ghXk>d%f{jKN zeR8NZng2yEB_eI&&Mu)=iorX*p;oHFXLb#>(hYv7Td0)@2Xp`}r*J@S7|iM(YULVS z*(20iVeo*Sp;n&3%TEinRvTR3E7V$J@OhD;R-wUbdxu)ZYoY^oBa z*(CH2wbtT6Hom9$CI{^auJm{0cLsLkErUAp2ZP~&5y1B7 zjs~?c9eLM~j(lKfNB%ChBR3E0$kvFCJO>V#BiVCt9UI{fXLRJzqdM|39-Eqt_O;O+ z`Pi6_JRzYY|NX4cSseoSU~ET&ZiyZF%5ysMW8*sVfpa@@oa(yCHz4pY#+%I7qOE$T zY2A8$sI`STNDsJM;HsCStx8AlyMVU6DcY)W_-Z(HbF_8H;q~zNS6uxsuwW~A%Upw9aDKU)prPvHO}@c_d|H>@BmqqyP~ZDSiTj zI#_q;eQ*=3JM_Ry7{veL_TRa1zQNDJnUvTHQY;aiKAB3uzwY0u@S6rd>PHYq0QN?V z9PftB9DSqif5kVr`&u0bTcx9$IH^+ayyEK{sC<_t_J`3{xiiVF*upHnBid?k3iwbB zyQa_GS-tEs2E=MAz!}fBCx==|pG8~jZtdhQm>Oy|!s!nG3Mb<~&EfN=k-gezD?iAz z26f%5zV}8iPj&a^eaksifbAiUJi&>BW9l?{vOsRBgf%p6;e(|47=Jr2e|Ha z%kuAxCM>x^toiV1=s7jFLw^8{h3)Dh*a|oS)_M6BPB#2E!4uI(I{y2N55fR zXq6ZNOv4}zmIf)=yInlM_M8tt3+Ea3HSijBfPAob3VDs&mueulK<8_MUrdoe)>Lq4 zVt9HFw$SUs_z_Ou<>tBtjzZttNyOkc`7sy6ekz=A*r&p|=yfUl?M;?2=OU2vb4kEP z3{qfSY&+pJ!$a6xoRYx05=X&xMg-@;dFcB);bp+FyWIpYg4d(xAk&WT(YNTo6>7rk zl*h+vHn;9|sC9luzHM1Y)B}hEovw8&e-+|huujEm@D?MM_uzr(Irz3?`4LVu{P(V; zm<{{E@TKT=DNKcZ^=_(DEBXHbvoO%D<8K(m8V2{nw;1|zc(t1S2DvI!cggKF_4FIQ zQ6V+zQ=voZh}@2_%PZhJGXB{h0N)f;IIBd>m#}vuo}hILxqbgnPnTfBIJ5;Mg0DwOk?A zKsXM4ADh@1!7B~@RaAXXuA-8*EwkW1z>onHbD446cXy>6*7_9+JV= zwq#f*!TSg;)Je{b@Efqs-Xm}o>~Zw(z}2v>-A1@xb${D8s{291+l(syL!Y|hZ4&XT zx|v&`+bp+%&fS}3{+z9Jm@RAaU z;m|eyM|XKN22O^j1Mp|CZVPX~ld+#A5uv}9L&G{< zQbha&++y%eg`DYi;dil|b}6kN+0+jt^KB|%bBpTKnuxAoz!{>`!g$G@FjgJ;V*#xx?RgMDGH{)@Lb zuQn2N`r9n6jR>c}MIo+zbtP4ClFK2Sa3vVwX9eE%SSyZmqC}^b6kq!(OU2)#trUmz zKIcg6Cl37_uB>C}_y^s|;n>|2>7Se^Io!l)a7i;;V~2li@>tE@nDzrC>lp3f2yKNy zM&b)Rj9?-u4tI*I9?mv+@@&?caFnBe4$d_6L*{ZgVDOjl3RpMR2Qxw~`DHoHN8vo! z36KA}IFAU7B7GiCgYD^=Ht_?T1510B)*L^d#j;_)6pql17X7QR{%Je0Z-Mns+zF3c zz+nOY?MCaF%Vr*dnc~FEj(h?CVA9l2;vY{p1Nr(JGzN;+$G0lpYV1Y zEQKx|XBqq(c^K~SQ*avkvmO2bJ_PHI*$j`!aL3RAH4I^})=z;~@Y{Ri@h^k)gEg#q zCSzb9IwATFgEWIL`jn{z4|Xl#VKv;WCT!z*l%II@4E)Szj8yP>PP(?k@*{qFK==ce zAM|6OvGW!EISYB%>+m#Ke&|p0%};Pdt@B0QEL+D@hq>-}@aB33i0Hm4ov zFw%!ZsIu87t?;Cya|qrim?hwpmc|C;A(h{!@V~%K$srN zIeA@fMDRVlvX2`;KMvueBHal0943cdW7!|rtq=YDe3*m1K zP7VCQ;Eup;-udcoF;+fhE-Ch07iv{FKeH%2I49I9Fp6{@9ED!@?`M~VTG1xo z!cN!V!?%W732?Gg0)a8P?8Oo24qOMz?>cHux-HbIh4lcj0ZuZis0mJib$>qdb_Nhw z_vc&SX2bq9xSR~zYgmtGx)pZ^Da62DVNe2#Vf_P>Qe-c~51|isXr3a&W`cJw@5tNK zc^}XpOXj)l_9Nz*&9L2n2(pYvF`Lhdu`--OI1D$Ap+7kj*8m<8rlHsK%yf8*;lBWm zO>kSmfOmQJ(=UdBFj#5R-lJVN^mhemUvr2!FsA)js`XDsVLFPvNFqV!wK7f_d?&mH zwmT;Jx8Zx?Zca1mJ%Cm*DyIDyDj6<_cPr`LYdK+Ai-F(C;j}DxP>jXnRJ&PydJ~7r zF*F;8|D;w*jR30fpXHCSW;i*D{9CB?G6|UCB;aZ|WoV35?CAaXgjy}JZiaseAZW#d zZWe$1gCkXn&>r&0(YQRO1*1ssfY%ya0WTjO(|*RX>0a7xoXczOS> zHncie;sLARp-`*A$k7fsV!qokA`8edtQ+Mua2odZ;7bWT4%foEU+jVR7(C$NQ0rX$ z>wYmCb~6+jV*N#3S4~G~!A1|@y;-qY3*0!%*Lf_z!Ew*?5cG1l;a?BO8~Uf=hRJTj zKgdH=|I`>O-Dzg0aWok<#qCHBze-0~fr0KxRXn7OFaqqtiY@grH^B2)kkuIhX3K&t z*$wcW?^)rEi?M2*2(SK`P-~OHv*3?l{W$2U z0D{*M*j0ds{qWncJ%_>rAEoD!0Nrr^`WWM*!S#>xu*2Z(%+6_yz?^bfheBcF_P%+PYu>2;l<~mq@AK0#D>_d03t(6}O)=QtuX0Xnk5o1ks z7TQ-{MeqAdj1}Run=Y)tQ&OBI8uRv&2Sa%^hmPRr7p`X+J1xeFbQzgjq-0E@)$pn?nFjgg4*KE|FK1{Eq+4 zaQ)RxArzr3EN-D$)GUaxSism^BF$u8jJ4e1=$PQU-4re0PL(F#4 z5fAHAjuyCjm9s;!LaeL4&g)Kj@X}#aw({=idXX+$KchE_23al3g{|F$+GE)3@2|bn)ks^}_M{Q(?F}UbO zIwUM@S@hSI@{kPHZSUrn7-9_m0L~+WdIUM^Wo9-bzQC;rT8tFF21nfB4k3TS<6+%a z&)dWxYH$G7KddcnyAsyFrY-E*%+yEtdWe|_C*$84Q3mrL?>pw;=~p_k=T)`wbKjuZ z6vetyEY_n4(qJ! zXWa#67Q7i-T>vk_@kKH1Zzrirwh`;xCX`hpujWuAj7L&KL%*O&mARedDR}%wmUGT7 zp=K8w;kD?4O(WYtar^#U`T;jI9U zL@zb)$xOBtu-&WS?hJR6VZWmvG>gRx8CY(I$E!9kBZxqdYzsoHyOv<^NR0j6Ny*Xi z2MMYm#!7QK$xzyC-IFm^tdrn{uhIl4!4}7V_t#Jmo^I2J;c$a%UdKOdw_$nJX3QIm zZ(0C92JeS;BR;7D59B~s$rQN3$npKKrK_79*T505o)%AilQwPWuYyY)wqLb*6hZZR zh5@HrABB4w5sv3^iuoqXox1TTK4BX3bR)v>-j<0fZPqR;%k zlYfc_+fl*;ckyuMU6yB5n;cZ!2Zy7Nkvt%I1^y6DaCjeVEpq$h$-6nRH~36At;VTk zLip!yrsW9)@J}azweNA>_C`$mdD?s?slr-!EPcO>&E|(OR;APIE-hypQ5|EYIL)pW zF8mWLcF5-7Mw95jkqf9Z=qJL{(VuRI#tGB6 zWNG0N<=N+3MO{3wk7B1IaO+-_?WX?r!#plg2Si+sSU=U>iMU#I-;cQ75GQ^w-=Ua* zIAD=wZLJX3|KR4O5Iz;XZvP*_u|^U72DcjaZEzy`K2F+)H}bUVM>o7P;pyo0C^M^( z5i!9qSb)K`80f-z5Kb}lkHa^k@9add4c<&6(d~8$>+Q@24kXdbi1#gzI9d?oCN5l z#}U{^kJl$hXI>U+P1GX*)7mn)z~H+B4CWPkoFRi0e+XAIge2(%T+3>6ue%bs9gbz3 z%yAMlJ&lzBdTl@DIubxnw}&9Ydl1f{+f+ODyWsKY6KVERLV+7t`xF}i9EB68(-gJ-oeBvXXPW`f8Cm#-9=7v`WSN=@RNZY}p*H83L?1Pub^8ZA4Zp0vX zg;>Kdh$MiM5J-SCV80PyK=>EeJ`avZPx!X|COE;c-wV$$?7xL4qCds4@6j}aZ=D(j zeVcgc0t3Con*`?@`f2b2Lw`G5Z0P?6-?2=6_O);1!27YYtCZw@kG$2eYlhdTf!{DT zuU8Y~wpq=VTcx^7ZXc_s<+fA3Be$Q_0dAv@6QG`eAN-jYjVQ`~PEOv08{uvaH^4{L z=x==^uDEn3dxd6qL;L{T0LNo0J$fe``K#OE2JYhU#^4*_sNdY<{jF-lx4yZ7akseT zK84Pk*5a;QSHa`a>(ssmr@#?T>JGsZXT;fkI>hQ^o%t(|;{IfekR(x)`Ebsyu6-HY zXz;;bX*dxG<~RX%{f+eqJm29S^`TZe5lUN=E;SR**9m~vz?KdW-VL8(*!SPVN}3Gm zGMW#k>kLw6JNBH)xgvrjB9KCyet=O<4gAj6chbXrj3hI9PHBdVVEJaUnBIPnxO1He zpST}|(_p)B;9YRzR+$~wvph3vJHoQ7lq6&!jo?B zN4{dv3=jScn`HXkLyYRM-k@IaHH~Vjo9VmZQXMIUuvPT8yZZ2NI4D+EH2SU|lZMzH z$;kVWKY7av){Cvat(J8TJjhAw#qhPammO^6d$>I^?r=Ny+oUP?4&`a`jqLuo5x{3W zS}0Z%n%M4CA=cgLx=tZh9jqI09$aql%WyA(*JZi~o(OCE@XjID41>>vbMW8EN#}L& zZLrVbe{>ERWc?k1F3*=RSZ(lbxIqm(!b>n!gsVGRX*df?Bc5GwKCIIfb~0a1TkfW7 zBphpSDqL>(zZ(uW^d)d3dZ|WflRHihQEf+j0|TLdbw`6t{^wvy4}PHzBk9fMa1k85 zLacY-L;?+79_u4G&(PPxb?9}XkHe9KuM0EQOW_(k-5bK2I0$sAwl#3P(%o%r&ws~? z0rnH4G{&Fd2qKJkc*bEGCoH8e`mf<|9RZDT==aR0=$$2qwVVX#OHQLpy_^Z@O9Y2b zFo^VpSj$i4hcz*h5?KZp!*+mhDO_UkPjD%$OYj2zMQ2z~w*)VNXOO_)#er!6K?5Fw z7hkP{6Y-!UcnRJDCt)B7IF0|x7=Ncb5ncfMVO_)v;jq*A;X%i~4qjvEL-`%jm9TDi zfsqI@4TDrT0P6;RH=GOWnY{$Q0M;FB2b^N~w<1EUbi;l)+)R#jo0tLj474XWUYc^2PuXn0I7m(I3BjA1^81q7Y<$_)-E`K1P3o(9TRf}VZdBKjR}G(5<2&e%S#{$x1G z;8WpLgZshd1`mY`%o2g?ZN0=#3eQClO#*716c@oOj0A0fi;V!v;0!}w36~oD0bFkI zXYhW5>*2_|sB$}gO5hs=VNq@lo5aB2qi~kNVW%+<8QcwShIJ#I4d>nMcH{fth<^O= zypzH2;oScG`sr%B0z#}ydokho-2_|-*O5X!VgD6w8Q|*gfm03p)$nA4AA{p0hxWyz zD7etjZ-lG-LxTC2Dkw)#Zy3A_ml^?7!`47I0XyI(^k)-+%xKo>v=MTwN5bK7uE8_l zEk<~=;F5s>H^2o5itrHb1o$9aYee|C1Yqd5!L5e=6Znv!KMF?=a>EamhpK;b!ygGx z4j2Y!Bk&srbKpb*)bG9J!}r6o*p?iZ!6mS+qJwZXe43;0+M8Zv*eAl_gs=6pe&i%R zjDbT>pK~$LmyCoDp1|*%z)dIcfIc1lPlaQNP$%#>w3GjH?5F9)q!0u5U zBRuU04=ZB$(QQ&83ywK(;SiTs{>l~s{T4@`bb|kz;N?S|1d_qB0D?ROe(``Hq#p|e zicGiS5pbo!GvT!c2jCi5H`?dnBv>wKBef3egT3SMbo7!f(FbDtGm;_D-Do;o0(W){ zmcuW@Ql#QxJ*+ROf-g?s;lFdr6zf(&4!qgmx8O?HPau?FzzT2S2^fO3pun0Aj~~`< zU~Pr#NPwL~)^rs|gDi=V9b(vkjtM%3J`Ml64P5dk&kzkhvx9x$NZUoN9Gn>j_rog; z{u0hNc;GR62OX@puY&jjamNYRnDhcIZ+2IwC+L0<_^ zUg>tL@8MWjx0zmkCL2mDczLV=aQ$$1AQ}p%V=sHJfYj-91Wks)HE^rJbKslspx1!+ z!x1Cg03U{<4SoX7!CtqaD!7#d>BHV%;2!8Xjh6L~$Lc?jkq&`gR9*^Cf~96f{{VH^ zY_x$rlu$DzRDoW);m|gUoCMpeUifBM?B$X+l0$g~{dl+ry&hT@z*`J`Htf5{)jtkfXSm@P!O7?YI)G0Qj5iGG;I&2o zq0vmIhMwrtqdOZeH1tVuD|$UJ-3XT$`W!gzA0z1hWLc`y3% z;Vp)K4_svE!(%8BL*GLfz0Tlyuy3SW0++z8|6rA?6R-q9q+zfej?Hre_&1zp=wE{K z41GOZXz0IztI+Eb>OKTE^nGDp;Gb>;lSDAeO<@Y0Z0PTRGYtLT;T7n01f_7kp?@7N zH}qe_n+^R>aKO6P4WRE(1`5L<298IsOXv!?!O&j|Pd5DjL+s<-3_JiIA_3a}oA7cP ztz1&&-wtK`ZT#ept69KwG9)ih+!Gmz45x`q;j-juDBmU)9Ni)3G&>x30(CbD!{0!CuhCTs~ zJ}a0Zd;U8g!5SmL8{lNeKzeG91YiVM2(LEu&%<%6-3WKUO@@9yEd5^3|K5>2u7sJA zg7g1a1Vsq?JB@HQ{4VTuI3I3+2Rd8^M>Dxd9%LXn2xq{<9qu|R#99Sw|B3Ks_;g1< z7p{l<>G^*Zf-okFnU2A0a0aZmT8H2jaI~X8C7#&~)(IL1H^BP&`aC#{v0pE{SHrzv zeeCuIoCJ@T{jcQU8wAS{=oEJ!O{<1=4#&fF@EFH_0UXWHs=Muja0aZuRQx8q8XoG{ zH^5b}eqi5o3~dY!=oBX*h+wGHRgeWI!g@)z22O>w{T4Xiuy2B&hh=Xk8HzfSHUppQ z@MJiekx;)akprK1AM?LXQ6YkC4D>V1YWOx-*I5f(4C@?5Cxlq-BH#6Ulpi-T9dIsvJ$f_0s)gr9?Tgr)F1u-;zR z!xjTok`rP0SWZe|UBU@)ZUBK!Q96QRc!1*}AFhM-Gm&yQjB!Cf1U&>t!Ma2u&Zbep zx>1gYvtS*5CcG9N<%C}V2kH^%04otR!#co5*iXMd%kdDI$p2o1wf#hRIjrro;bK_t zCD+0&@My<>6|65=CI6nt{I4$&#Gb?K#Xu6g_;0oFnz8QCdoEmsUQeg<;7UWk2o8V1 zt&&IKRztrIUTx?dC`nodstZ`t#xOhJGQO zYv`B2`G)?90D_fx#4p(5H zOCT4XXz1^T4;lImaF(GjgA)r}{|Dg$L*EFep$}$|`Tz9u7-|iJfpBiS0bhcLOAP&0 zaDkz}3obYG_rZtI>v7>#xYf{C!jm6%^fLc{k09wBw+MfQb1~2*;6I-tHT1*bLplKb z&xDH%{q=C#BW?ojg<{mA`VV~^?Kqja0(o$=l{DAWFyd%!v=T_JlM%W9b66T$td(9 z`Z+wo(T{{D)97>rSHl?wuY^|^{35&-4(J8NE(F^V=pyViksQI}oCxCKu{1iJqif-G zSSRQnI1iS=Tk7~FcoVG0{(86-j&t-UUCi$K5$68{M=%CK4vk1pzt_PL^7GsT{c(ba;gdTCa4qaR-$@W< z_6nRt4t1~C2S>qr-GB0>d;tQM3`+^0c`5V%`9_gMlfyg`u+qulb$HO1ByiOU{4N|v z0;EyN>G^;uEaBiVhp&Ot41N?&H~7Gm0Nn(EtXd_2k(V*@!NH3b52upA;Kg?~MSp>- zpA0t{_9<}k8rS}6IKr@>4aXY1Fn}P@@UTPzFbwX1qYeE^INQ+Q4@VgKN8kcO{}kM6 zWS|%>H}rv*5L6n1*Wo6E--FYQ2tJ16lH3y50p}XL56**iiH=ETvU=2g5Sa!Sq4!gy zlsNx>8Nn6=nN+n@LC?#H;6nEq&=NSuNWgNq6@BmuvHlK!M+EwC`bD@2*0bkMIPxOb z{vd2UrW+yizi%q77=f1%rB$8{N5VRQIdGB@z>RP$dOf>60-p_ccKp91_J;pPILq+= zE1ZJfo?B%8_fKQ2Hw=csvoX*^@eDWz);psByuyg!d3cNAe-peKz3zs4;U+`>E!^Vx zr~UICvlOOJ1bXjw9=rwCLv1Ep>v$0Rhu}l7o*mzUlP0=F{5~B1xVta-8BR0wf5L;& zGcE+@{~=efEH(_{;pssGyGpKw$HTfx?tznGUF0vpb%y^p;7s&-v-u5tmto(1Iz#it zl3;uM3$gkl*kVL53H}GH_i{JGYhhglYvE$U{(ZO{)@|r#IK_@Ynkfwyu0^k>_n}v^ z<`jK!{0*^2BlsBuJyfQ_;cML@{s&xb1o!~l8@-OO0&Xz$+u&&Qx&)5E=fQe?5H*9I zHi_r|l0He{5Cm5k5nch$F(OzFkHbQ`a9ryShtDwaHU~i3OAzHC9oUbZ|J{LlIAPob3qVXfV z*3h@W3(@OwVensQbcX&6csY8#L`#KN8R7j6ejL`*??yNfKH1H2If8#VbKw@l{+U$9|87sZt#~^IQLv8i4>-#RAoOY)m7yOA z$HBT=T@6ox^~-B3;S|IEML6Bi@4A}tuf~Yr5C*vz=tHSfuA%Q5`rhz^=yerMgkvvt zOK>Xu6nZ@}-Ug=``oF=Y==F)o#sGpm!=N1g2m?LzekC3Z{SWX?^m_7%yq0mn&<}ze z(CZ9bE^O%k0(+ivODJ$Rf+(iT;Kf$~;2Bfg96bz=zyt3!*h6t8d=jin;Cr|ytXH|c z(wIGAU4;|iSi^r7TzFMK zeRud8^tw@xhgY}jssD=+WMiPmfo%96ux><;!_9a|CIPZQIe8Y76?#1vB*1H6o#X4_ zq-6J%%`f2uN>~qUA=fi`!DmZ`Wd0w4V5PBQnF-e#9DoZ8-6DShE-<|fg;^~u;Z{q6;h*6OR!sIk-Gy)M9A?E*1=ZLG#9;18VOCqRv$NrG`FeN- z5!yL|zk^pB92XvD6_eu&B?ssi!;QKG;FsZS!+v&GHZtg!I`&_X0q2r`zka0c}LcszO?-xT=Lr`iAOe!UDqmf_*A@H9N=eq9Wg82VB;6TR-& zyWuKB{}p^EdflzN&0_%q>u!Ax{Mge0cVNjtQ1lmfGx-i&1M50#g=-BycRqCr>zz&> z+zk7rN-d^pZy5j0+kIL6B{-cblWr$f{&2T2D=lCc>_LzZ%ls?`LrT- z&+GNNUf1h-T|dut&inl~6_|y+SUAhIzYDp$|8qvcK<>e6F=%G0aqw0$m>MpXd$ft( zt=ez!j7i?D+Qu#sR)f)}0w*89JOIbL1r8trg|Mk$|LBN-RjCv%j%K1!3f*IvxfJJL z92$Yea03oI7e7J*4?5TDln=n89`-h!4RDr{Z@f6b`m7R~QOG5OSzg00VLzbcUEy<) zn=RHzxJ=29g=eb#7sItmJ`0|Q-0Tl310KW( zz<`--%YzPa|9>qBS?7D>z8Nlp&9FJ}GNw`tn2G9GxS!&S;X$xDfGC5HfXz0038SF# zyaeZKF&Pyf!HeN685Q#W->(dd4u+BWr0yXsm#HXB76s&WjDkoUGQ;Mfo{VES-j#2M z)0KQJ4wy^ki67w!7kKl+(U&u9A9wbc^#3sHLK0F*FdH!*C~I6qn@_ex&J?N7JD|@#JTvEL%0+J&P98{3n{>? z1$V;BRe>+TwMze0xDNRM3`hlc!dsR6Cpf~cAoHIn#9z_L+C&D^t51cussgTp+hNn` z9)feGcnVu^jGExXVbf>+go~B_{XsXx7o#)V`ur!G@+39c=Y&vy0oDB!e+`g5B0;MqGO2Q83xCR!%)v$9h z>%ogvlPwcg^2gyCWiR3?ng}-Kodd@|#`D9 zPrFjM2!%4Ga2FhRvFG6ZVo=F9z}ZUvF5HgXJhJ%>&QtR6f3Q}l{6qf1{5MxAj6xyh zpI!~7!c|IM1m`PxIozP+55XnKjRTEvlahZ3*C=_Xz_px8DTS_Zqf!_N?@;nAVI{v5 z?oje8;ixA(2ddzROS}j^0jDT=U=s<^O5t-jS1BAYk0wy^ShyIu=_6y{Y$ZP#u2k|l zaFLQ<5AQ+l_91@wlZ0xe@En}~WKhBS4Bo2b+u#c1#(@K`qsEtdHS7!5BR5Tu1NT<) z@o-9wvCsN{9SIYZ!Y%OPpaOTZaH*27hFg&v2fl$_9nJQ=wi z0lEJlPeQg*m<+cX1>_6i5+%P2E@nA3!|-2li;_3M)yPc*+Tm?V{s-LV%I)?4aQGdbL@`wfW5!jpq4ux-njs7IK z8VgrF17s6pK-vTd(k9PT4 zxUGiu--Pf}5_;3?lU;?#o9RTb*>VksPlHXLxB#95Pj&Sd!5_kAhqMyzfG>CDU&0sB z>-TfH$1OPc6!-t;@c3vFYEc;DDs*C>UdX1Ajgh?#KaMk-0(Qakkju9GJ-C@Io4qTB zFCxFWWZV59ym(H6)g<|eVef@(^=rL1B#ws%1)lLHikT#&E3SZ}$zUd$SK&Rgy={2U zTiJwCK(;tU0W;u*uyfJ=a6H>==L)l~fs2*=1~^c!6mBD7t5UcN&b`tzct1Q>@p8CH z@d`K(hvO+x`pjlH9yT|doo?g#KWv)lh}&5Ik0!y~4xfcWE-Zl*0|B@gzSZUOSWYfy zatuc!N)rq?h+8QlBE4GpVz>g%a`_p!8IE`PSD5#`orrQ!d33J;w_YgN+hPpd-HSH9 z$~$;$g$G^jeX!`CIAktq<1gU6>l3V1baQEfLl!ZtR1=;6N8Z3Lni~s|&xi9$Ik==i z;SB*2Qtsj2PijQM0gG8ol!0`(0UkoB5|Q)a4kcd*$Gx85d{HzSFTq)BD1aD?z3p)1 zvtA!M=yp1y;=mXZvN330G`bkhPzq&mlH#>+zT)rT8Hx|OgHEY93!ba^Qn-25v=e3j7&vuk-Q`Si;o(p(no-?ojsc zh2u9TSS8}HtbeT}>`?`Dz02_!IZ|FSg{#O=B^gKwz-6k2PrzBtp1fV;%Ax*uQwH)< zH~+=LZh6$7Z_p#5_#=9;tMD0|je&Sr10Q<^&V&~$hp&fMAun+AH^A*G(Uj;iV#nJF8#fQR8uv0z` z3?iXTDGY%lTRn#|;6aLyhxZVnLALvR(=!}Th&#J{FFY7FQ~N7$9&Fwx+yR$8$NF!U z--GYt+z$nYIqvYAB=9z6U?v}JBTo)iA$@S=U5?Ww$%Jl;rNvAYhvc8p!bJ+Ca9Jl~BN42xz*|3S=GI%*`3VZ{8 z88#8vuXhBW|ECw4<+B|HbIH`2@&FGecO+PC;m#;|0iM(5KG7hkf53yj_YRegS;jn} zcrl!!cnh2g@1PJFbq_wo`XBd0g58NEA@X55As#vxFDAhi$eoMVbl{91Jsu3FuJrVW z!Uak`8ZK6R0^F#0+{4U&#lN^mtvIj(g&C{7xx5+9R~-Hb6Af(Idh(rd%0l3LT1c&P3jj&wu z@VQezhw;be*Qt=Xq!YKp>A!j>qsKnR^i74Gi~Ii^5=u~TF5ZF?e$i`!dGK;2zX`5W z@>;l2$zO!GD*0BpUCDRC@h`dd<^I3-<8+eWJO>8AxkdqbE}X68XTkH7yaX;%@>}5@ z$jv-a2Ujck8aU@=r-|+Le;WyPO5uBW9ty@lTs5nek|)3oN`3~M`ERcR=fY8|y$Ie6 z7blGp zD)MMq|76(RNkWEFxDU>^6&(3GxIoF@ffp$Gukb=84}XH&b>+YixJ=12;AWA_`YR4h zBcVzu%!FhA<%O^UZcy@v;R#CqHr%G|YPpD)~Y1Fi)FsqV;-b^Is==60sAC`e85%~dL45zr+euhQf(dE=Rcs(&^HHo*;8=#?@vecZ-~!mZr1~&i0-KL= zy#ud)}e+)Zhtt9c&!>5H^?W@s8@x84<%a zo zD2?z!I+X$%U~xbStbuD4{|v8IoP`4m6yF9nDL!1(~TjaO)2ESElNHc-lOF6;0`5!9FE-2E1(vRUGLfdL|DnU!huw! z(Bl>EOq4=zcmi@WFPs2RR`OhUxypYvJVVJ#;H^sjBs@pS>t130vo?4hevU$kQur1g zq~x)$awp@4REFKLaE;Q>feX<$!*Dj-q~zDZRZ3p{YJiX`g=ZxL3Z}-N!V~uQLi!CH z@w!()&)2w9Qt~)BRmsP~%a!~Lc(Rhu3y>f+GBe#{a06^kwcdlb!sftX4{Q-q^L}6A zIu;|?$j8GOuvtB?gHMC)yJP;XhVx+Q+7iLQ2P71ckl`l$0oTB0?oM9MS^%2@C%}?@fjuygSo5U%XwMXVLBMjmh0{{!CQ z&Lz%MI1nE6h8KZj;5;Qi37(+jv*0o%{|8)&-1LD*;VLD63a+>1%s*1&k4VUMJr)jc zBDe^aDvA7g_->dMviWm(sp!l4BMM#KX55o7 z+2!GIIt7}u-SgqGuqohHxDYnOt`1%fn@#KIa08s?+B@K#PS$U*ark`t%mkV+5RZba z=a13mb4W1j`v@|aOWM4^$2Y^7eZAFhBb)=<_9*7icUcQy*|tj`ITfyZ(~IDh@PfXH z^7#)(VGRijRfYpLQX_bQE1v|n!_LJd1IJ>}xx%bV;T9#I4JY;U9M}LCzU3Xow!zu` z0&JnEsCbz79{c?GMCZF*;RoP#13dl(uI`^0e2jM1`%Jay*W!WXUkFzX^dhhYZp1+| zlSX~O+JOURSdWA!1XMx+2@Bw^7?eJ-2%e+lFTnM%>D6DrQX{!UziSf_X;cNk?JEBi zk;CRbVG$g-m<02L;sp|B!={sb0pAIm8EpQavru3)65jeoZZrh>TVRK0z zTA0Yw^~A*B4{W@f$ov00NLVKm37v3W5}V2+60Ny(3gP5rcDboAR)lMP20wr^(!4&= z0uRCg=i*zn;5a4UhP{?yZWCf}_a^2)bBTv{ps;#`+vX_DK7!Nm^u*v7i$0waVMQrU zOpV~{^{4ToarE3mfL^TW{cMg)8b`Ecdi-o4+Aa06^QO%0s&j>jLu6(bXa zKRA%Enbi|^F5aw%*Qtn%hBqpC;CK?^M|pQPDBJs{xMvJ1E$kOG}FtK14H3j z#gpKA#W%qz?|L_{wQxS{Rw!V7Lc$C$!P@U5Jj8&sqV(!vaGa7)hD%iex4?T8KMO}G z{ZHY!u(|(_{Fq@Jlym<-oP_L?673z3jN`lEj*Z?-74`|s?|U9!2^S$ZO;QCnDt-&z z1)JORpWznRZ0QEHuzC_vduo^U|5Os1Ntof*_)0jB8fCd$1+T(mGpyc%UswDy{2^=> zmjR!4vOa~)&1NqA9c*sbuZBBdamZf(A10vz56!s$YG{Nt*R(k|k9~&m77P)JCxi6z zJK-6~?FfiG4LN-%kC{v4r^AKF<&sA9%zI~Y zH#}J?#QG~9Z8?TdFrMz!=&)m%cxZFG*JEJI7>C7(INatlc;IJrTGdC6fm^Th7N6VT zJ@7*EOCS3f&byvrD(k=W^DjwA#ej41i3K=a6zr>$^)tKxo*^Mb|Lo5h=PX{O$c5|R zZRAgdWz>8Q_kQ2&GY7OXYGBi8N5EBZzznkj5*n4lBDh8I3-Auu%mZJ*eLnCGBBQ?G z2a;fO3N{MPfz1YFD%?(fsggK&JB-7o{(PG~35h6}QSi)hd>f7lp)?U(aATs?BsCUB z-(1qBowtN?l8@h`(@t3GZE#9PVs9xSjF*sN@Kj%h%ivaOkVPrt@qO@e*xV_tgG(Mv zlpj2?o1pubOvT7egfigLDz6XR1lKBVhBpS9yd6pSR+<0>)5g=_^oPAReg)o&zG=f9 za6D`_r3Zh-Y6zPR$MJBn(w_;}E3SY8Rd_6clN!E8!b6I8!4E4w39r(`8(Fk8Hj&i3ovq zlRa}H51SuP4E~yY8wHq4`ow|Xa70s^XqAXQ#hwS3eC##Rt=};JE&tFh5S8ap5H@Z2 zDIE2TXCQGKFR3U4XTpn-n_>6>9QS^r74H`K3!J*yvp4WtQ174_V z_#&LN(vyepV)j!741uead@h`?D!3d@T4nOn{<}yhPzDa!jR6!2+%}vBcYNkKcqbhB zqA|ed`QTy|frvI7R`S!}9jZ@V14q8(=9lyD*GR}#ePFj3Fbc>=e@`1K`E)q)Wv>rB z4OgiMeGFG1Hx(H41G{1s;XJqlxkQ-#4|k#@M5+j^hv%;LYS`mP?sioHN5LJ)O#utw z2`WOhaQ+%E|8KCRI$=UPeaex`{)h09P^v%0Okfg9B@x>s1qTjABJ0#W}a|9UU~*>HiX zz>RR@dhY*ATn`&bs81@GuFLYM8wPr!;u--hXf(pdyeB*C01j^&Rj$Re_h_%s0IJ5r1M&*&hn84k(3d zNZ6s;a5O zP!2b!5Wfc3D0#OCepOQyFd9yI*ULX2E>;nGDuVg1289B*6Lz3bsv>Y$XTBe9qi0|y zT%!uO4_>U~U&76*iF)iu{`b866X7Q1z=8k?i%~Fb_zs++YWSOEU_;?tJlWiz18KHU z&J|{LgI6heFSu-zCy$3aKJfADO?FRDh|Ng6yFL*GTyfHcR<9 z(3ON@rEn0uSaE;2T5&SGPVsQKRq-+K9>rtf-XD7oo&l!|+vVfHxg_K%h3RmS;>+QM zim!o}E1nP6E503WQCtppD1Hcz{e<=3nMgWWPm+*Ig5l@kT*YhQ8m4CRK;m1t0XBzB zu?G+V*xc)lf!ks8-0%`Onwihstlk4>Z07#oJh`kVVFC)~x!!hoE^JP{dUd6bC_WCZ zhD`xQ@H!h&tz4x3}Rop7}L%BAtBH?KISGWVO)?i1h{u*5{}jxU2NVDljI zK6o{399{=+gUvzXZaALR&^(ekv>WpVY$A3dJUKvui9j(4b7Au=_6^H%&AX z9t4{T+y`gFCdBLE$*}AQBtqZArSNc<1ASwe>q#&ly*?SX*dz{c6|RI+U=!kp;5>M| zD}NiVfycOfKWE349AKE|h`)+G_mU%-`#1|u`N};Zk@x>E8~~Q?Ntbaw^Yw zV7cTFYNgNM$8gKP6Ri&Xl3TY8xe?Y7^z8_tAJ;3?;S+sapgBND=8@2XfoLfZlaIlT ziZ{aPha|agEby(R2NQB79}2HlJP|$xE^zJ5hs`BTP(GfIVDwGm^=!HSCu9%$6khi6 zW*>+3W~ThYd&_kQY%VEaB0NFK=fiUqH=G?|S-X?u3k$jb$AP?a_(H*7lB^O!AY2R2 zZA-G)joTcR&w2k3N!H?UhiAf-#vmbo3Xc3a$*SU?`+*R5#3ozCusC%8nLHsGnrs#EL_)aJ zp>BDy{z`#i=W-g20ehmLMkz+Ym7fDIR1Vw#=Vm24zl2VaZ@?8wUObWa0mmceOT zIN-3<--$q#PvKP`Z}sthaiIk!`S=tc7y0-Oo1OCQCaCo(yzk?7ANT4T>Oh8%C;51u zkCzF%<=YO_`xHL&@g5%^+Rx{JkI(k;93S5WoAR9q_!Qpp@pnG%+CS8RWFL?9@pK>0 z@6Y;gE*S+6`4rarc$<%7;zJ!c%E!}uyck~irMDq@AwCdl;B#Mw$N^#2{bVrf|8V$e z*z6C^hu6SnPj@T)rs6tyGi-K1pTp*o3P%P8a_e=XJM0+8d2k&pi-{~QkHC>zy=O#k z!_i;4!xD`SxCwa%`ZAFnb{J;@uvzcN!5OewTds!d6$c(7A%}#kT?22y8(}k({RF?K zIDSx=^}ga$;SUsF1xMka$-n+KKAuN~;-x~&e4`ifqZLHNc1X^Dt|h_3fc?lNEX=xV zF^^(VkV__>CYL2}!Vgh^xg>;d`grj95mwnL$-&=-y#mfVH97c`&1>P5T*IvYKl%*x zx}C*joab@e;Lrk3^zr^Un1sIBz+C2&m&57E3-DT+^b5F-2-y{u^Y5++EG{Mi9s!q; zq1DY0fU{0_9m2pz@Is{@p2+R=XKNhflJ|mE?*3 z*j$p~LO2h(xfMHukY~X5Hk>{&rV1YKjv6{yF+4%>hj1}GgI+0}@briHUXU}BIdxB$#3I4Sbm5m?NAF5*5+E^AR?w$juuL8{wXcW0pr)Rn99Gb_K@6 zy^-6mdQqWF?8#-%zY^k!BxIv7z%5`t+z6YAV+Gs-o3~mv!_(mlUHvVOF$xNktx7k< zol-)Zupiuen|J4v1Lthx{@>h6%_iYQ6y%Z`WcK2Jng?_t1pfHs{Be+b)60zUwM zs`xBl{wv^Z$W5oN9LoB?l?1t@(``UO*zPoNo6o>!6wrY@SM({cTWY9-hr^{eB?rGX z^Ab4qJMZRmz>_Ra3%s>uL4bsUZ@rmpJv@3>U+#$jwCbB%BS)B@P|A zBEnh<4{-T1xDB>n$v|EUi@tqE1P8t+VG;>u*rYubVZ98S5YL9|;r_0{dwey1*2nMq zc!!U>45Jfz5eZnsN!Un&X_NEd4A>k<+yWQDQ^Wz9WCt}Cxm;4?XONpqCbIW^{DY4V zNn;eLEQ1WK@Ampak zhYe?x7`d!}2awPY1+%Ff0oND>x2 z@8L$5?e#w{ota1}jD>e7z57XZ?4s zPS%YiY*Pv~l0g}$gCll%1%3{vS9tli!EwkoxQOQ@q*~m?&`x4%vOS%v8Uig%Kk^kvi^6FU<^czA%tWwZ8#LpRR$)(^jf>i zh`|MLE!@Qv0KW*Ed7~L_RPwMa%7eSQ`Y8btVsXH1D$jxMgY6p&3b+yOjRR&&wE{Mm z%o}gQdmeDl^(Z#_I5r&1+*>dBe0VaPNhaCkJ`Lw#&m3q3J|dw51vBh=ACEye-p#NC zE+m7A(93Y#gUMEjD<6FVqeRII;cbfVggampp_kyewqO$ltglE&C&6^W=xlz1Pw~;P zI3SmVd^$V_Hv556xD)!OjbDbtVe`!AiKjX5Hx=SO;s>}n$gF>vwS3wwn825U!I_G` z#-O<*K^iZpIq3!Wc^!?!ekQ6)F=XB=aQ~uS#uSCkG^mP z>C&ctxp4HuUjFGPab^VDcfYQ_k=yH^ZQv0v!+J8zg-a0x3s7>=k6iBQA2ya@2rpOq zS}yuEN`EQ(!g2Qbzw41!kPHovdIj{!;noS3VQC!F@&}P`L|&!j!p`MHsQ59D4?UTQ z2#&Jv|6K>P!V(nbp`Z&CHU{57o=GQ@OFE@o3zYmvX>b3OGsD zUokL;gp?;aFu<17a06T~3a*_0Y`Od|Iph+3=i+O%(BFf8JPBei?o>7;6H;tV)>7*_ zxafOtVv~FmR&f3=e;9+3;9O1tWl#MzTeYEbKNmd{D))2Ev&nAxZjDF?I#7+r`P4{) zEH(N7oU{4*^5U7BPH+yP5(5nc?(QNz<*UI{nC!(841N8?bM z%iT_A{m&)gNH-zlblMCa;qo-N5gzJtzvnpDqmyP)q8!`hz|u*JT)qO9PH4CimQH8% z@4%k9WGa8+^Z?5*!^8=>tbycL5xL=o28a5MAzjJs8MCqRlTl5jr zWOLviusIQV5FQAd3cLv)X*2y#+T3W{$!|`r@YXje^Nw1enPRZ7|Y){?r?{LjHKK~~MMd6s&@t6$u zxP`BSSD|3!|AKof`JZqSY>r;D8aTRD@*ChR*qkH23g;+!_!~Gpj{AR8KsE`5O5r9r zAGYs&aA*U3zA||4n>^DYq;@Aoz8RKzBZCS_1fOfKY$77lnJeTX(S zmn;tQcYJ;5%r!yr8uV8)5t$8!=oc&bHso_)y9w!KatS+^!=(X#g5nVq*nB;7ro|1U~k+SB4_-CCeY^V zJOi_Ept8f82`k|?)g-UONyyD=_ye2@nMS*7ZTLx#rX7zgmE`goZkMp0Ibv&!ZfmRBZVbh11YaI%9uV&a}(+4D^ zb6oi~utY4&hIe<{h5@y~jjDfo2?^ z3s=Kt++Ov5sDXB=p?jHOTHuS&poY+h`Pq8I$XWmFE12MLi{cGzBE>)pic+HkiI^BL zygw6g=e_;e#jq(w~^oeZWy@4=TIdq6_jDi{^vhy{0R!JC=5cu$c3HD(T{lZ zuQ|#mFM2Cf-(^|<_~`X{9J5g)GmNf+YZObtDUG29G(RNykyoQ94*v#c!P2Kp1%#ce zlXdO+oUGarq?Vgz9~n;p<}#x| zJ0!BCx4jApN51o)Eah`KZJPCNsDkFpC@|u;(A93T(yu_i1BdN-gKE4A&qZ#Jd)L0O zb2;TjZ}i>&lMtfN+s7IE;0B-E&n@qH_VZcH+8bH_&1$xl1gU{s67n+{*KyR??gQ{A z%xvO-y`0iyr?a7ukY>1TdLt|mF{|aztd8P9tSeu}#3mI?!oD#x(tD&EhnRrBQ?B7Z!4CG=^T0=VB3SWU@Am3+j zvXA3G2rW?a8`!HLf?dVF9-d!|L5a?%tUfZ)prW_ZYUH>$lOjN>|Ff76!O*o z_LkQLaEs!n;fOt+T=GS4^78*D)BjU_3fYQ3#$W{nnAht&PvxBu*xZPu!i})GZ#Wm; z0h>|K`=fB%0n^8xSV!im>@s= z6Fx6MCo>T!f{TnnLi{2;5V?$VX_9}#g{D)&kGC+@!*(CZC*iPZ{}}=8F?RU;pH~Cn zSRdE;xqLunxBh{w=Fn_@F8MfA?&sE)P`RJ8J`a^^9y5*6T}?&puH+8?RlW>u@Qkm(CRp;P zs0muz6Z`332JPGB>jbM;VQ62^^zl?5FZA)Fa2^HNYnZ!22s;;EaTNub-Tl4OdGJAk zJ-@jbJO#cC6M3=Eps;iC%?=mR4`>2&@+0Ysm0Y;S$Bl;Nbn9FUMEve82{*%Wu<4Y~ zzs+%vMwDcbmcM$Vz_{oP<4^$oX~;$t(%ZusD0V5zZOGAxh3I5a{R7?$!SWb;gd z%aTzSAe_I`D{ya|zAIGj=Qf{Q*cpGc@qIY35s%GO{2JU0n@+bAUJaZ3m(0)D72r?{ zp2)m#D=ZEh{t^}kR=e^lB2uLy@`c0vx)TZ#qJu994N*Fru{(5F3Og6yU4lFlmi(rd z3mf@v+VRGMFYvE+XWAQGghWYxfG=8)y3DQ9p(12mA@CKYI#i z;=p7a$i%Wl;5xVpHXlVD*vgzqjpO)F`oQDJ%_TKl2ix{Ip*2mU?f+WD`oHc^@2u&t znH(#?rqhYB)IFX<jbGa_yRpiYSxDYkd1j5e6uYXB)`GTufVK&@@vh;t)f#rvU zD)_mwPpI6_5pkjNsJ?&AS^Y#V<+~0z2_9G23LaPcxaBXnfRLxCkS~Jc6pPi4fjD57 z?>b;7h{WaS!$NDYZqQ$In_oWIr|;t?*eTyFFg7tXgXR~gfpkJM_ct+-NT;okPRiVW z7W0VA6ZS3|ZvB$`1oV4Lb(mL*zT#7U>S^IqaBL@@Zkoq`^S0v^fSF9z4a;$aru zL-_1($bf@lP`DL`%q0`m?{F3&Hmj$|QhXJvR-9DKTLYZ}<^?ED^GGPdfOJP0HrK=T zNrziy?&`G#z67}xEAno$!mNv6^IBpCJYC7f0m<)NPAAtq4gCp$p@&=8#at)rD-xqI z-KMzQdp2iVuzmgsKeCN4W-xNv{A*b9%O!mv`CCqcVA~#i!fe)mb4eQ(U@#I7<#N{N zP={_q9)(;-Bs0x(Sn?$e|L^=f`BPN>*4fMKy%kQL_{2<3dX^VQK9;N z&Qk_g!h6uS z&o6P{6F6PT_q&E&F>?EXtK9#ll2D)vfQyX+@|)l)C6{mx%JJIR&$Z}BM0tJU6F3Dn z4(|64B6iy0Ry8d{{rT2K5;B#-A~;v^3vjKf!545nJcyE|lSW<3XX2E66ucN7;L4}M z?Mf~VivwKJ{?he=2{zwOhIz_?Rq$lRU&2L-C4bo&p%KyCeIBoUz`U-t~Z zo?fmLhQO(crGWg2UV#&l|A9mONf!s7qsCGrbMmHUkMQE|Db|bZScH#a>{P1= z6~YyYr6w5{c=qo=UX0vK)oE;S@&kmlipt84CW;-7)F_F_3I9q+C4*ejiB@62TqdNt zfKAAAV!Z-lOK=D_z5X1y3O4h=QaDgcf|=<)C7}_{kOD1Uh`WJ_6I!uAYv1vd2o{A$Kedc@54EYe}`8oPP&OssrXEIuHx(A3dMnck}yLh zNR8@CLTlvb)Eh(Pnwzj!)F;KhTb4c)cQYH1xD@L^I=Qf1Rr7=S1J*QlK{#W9 zXYik7$i#pd#~;AiibcOv>Hm(r0J#}OBJWW0B+hP%UAg^suPCJ6qn5sr8B^Pg3Avu9ti%>Pcv;%*I9@bhY)+|OGVh35D3 z+{K}Chwb&paUkN3Pz66X`s9AjD-F%>=MtaXW@r85k@2kzlYU-EB}A1f!&%5DAlGdg zvBWE|1bLxPUZmttBCk;L58)J=C}3^`tlQZ0kzih^J{(>In>Vu0f**#v*bPR1fY&L0 z5{{<;lmA0F4Ib#~cUr`gR@mGpq`xaaqOouyada* zx5qj19^Xe;KPrdLfPaDQ`+pp|8~#bjH^ILtKKKVFGNnHewgMDrYIr{hf1+S&)aysy z&{hteL&(f!*8e8e#v)sHx7R23#;Nys@(mo>1R76wkK3t1Bu$Xf->cCna1v~HI^=DH zG*j``?`RSnH1f%Wv<5bBax8;)DEW0eIpV=V^WmFMck=5VMatkr=KguG`J%=9;pbrc zW)cVTiO9XMDPSr51_cbDs?sM~;3$>9UpqT0*#5~G_w> zTIrBUdS$s6!o6|reV+U)?7f3MyNUVtVNO8Ao;)a#KG!3#_&?iJ8%RN38t>hBoDDC5 zjlmN5-xOd+fYc}8IOJxYXo6GV{%(c-fOC~RkaRn@RwN8`6~@CQN>tH8BwEs2|O7VC(CCc5fT*A)faQcHD4=Lq-9v-ChwOsP$ zKkVu6jZ2MO&i}8*pme&!(3A)~1cwtMbL7$pC&OkJ{0n@Nk`G+MmP_$C_%6kBVRM;z z!#KeD2K{VRd-5U-L}9?RX(i)a9N_Ch?P0YYPD@C!@~|uO!jPXLtQ+C}QXzO2 z{7@pDR(@Sr66#2pfWdq>!!K|Ryw2sLe&$weP>S`cYoHtl%q1ax)yF%1-23iO{Syq! z`Y#49GYKx==i_xgwhLDgY5s=Z2%E)h_g?ffl)mKOR_8namjvgcnp_K3dHfv_5CgSQ zPKYyq;T3Z9D`gZglO0+XTEi24T=D9rEi>r3od!nF-HCzjpUvJEA>V&hp`mumo!r8GFj7TMI~N|IJe< zhIc5w7Osb7iy{VYg7+x-ox&Z1?G1&0|8mx%0_!`QQ)n_%6N>of~}7pSD>ZDkWJB%>BZR zUy`2!x4Qb7TiHXVA8voUm&kvH<+#1bl~4LH%sOs@y`PX@cj#<46b}1?4^G~fY@cWd-_#}C8g!!ba+&bw2QV)vJ}N5Qnyk32Tey{_xV?KQPmB)b zwJ|Qs{3`_vI51S9BsScds|%#1OsD%2j{AME z)!~-+9V~B71x%;d$WOJ)YcctZE^+7=xbi{g>%)bA>>F-B8=mVLc!|}p5&0aKzc?=3 z+IoiP&`BrIImUZD_7ohTiQ--Tp}FB!(;xi0m%L&r1zbwP>g@^kn@hr3<8Y{iAJ23% z+y<9@mteocX*&oHLchY5KYd!bCGUVly7pcSjniC)|pUOtfz_ME*S7+%v&i?i%PD*#^@J!madMlY=2FgX13Z+W3H}biyi+uYfa@eC9MFpyc0P z8XmB3F6B%{9C)~hPBAXQs&NbKHZ$Dn=$c^v0ISGHUKVaGxFFGfsZ_WI-gtxa+gQR0 zm$OBiK@E9CBm5e?t}wyMaVM&~iW$cJ6YSUVMSlLQK)6-Uk6+nyF$piv3b%T9O9&Ql z^6YS{`22+6%(h_;5sGkru~iK0cNILrtMPtUhg-Qyo^(A9@yg{Ow?d_G>aav69>>AM z12|B{@0XXl3Hz6X_S&1^)D?*qO=Z{U`5S10ykx7)HTZ9Mby%W(+%66^&JSlM<)^A$ z{gW0jkF+LO`L6zBaOBy^)&#e_!2UN8!Y>l+kC=&p+3;e9-8NU@dARhO1gpyBvYTn+ zf<*hBP|;7nCEQA)NhZ7UyWrGq309-askh?b*9rDhG|~SQj{Pdg0c-4S;np6NA!$)K zUlkoxu(~e}w;I0n41NMvp6>PHggY1oif_0t+^SPE^%pU ze3>B2b-*?-n4LuJ7CXV_O>isAu^E?i^H)+C}M619pa3@^H z$8r|C-1n_;OFsV;>GGAZJZp|M>;GmF4c`OH!)LQ4`wf=&d@Ei3 z$!`-u#s7lkollm1yFxo*d6=Ez>gT=V<~QqqEeYB{^t)u}%j0x6q+8x&vALJm>)p9M z=L47s#kzc96T_ArPP|({;U;RV`1fYoTgr|N@h>4h)N*BQLP%6o7l2>4P z2vz3l{|UOm6Z#p6`B(`<+BcRt;ar*C7i8pu@Z7O)Ub`6V$J z@|oWXc4S;K-*z?Ew{rpkhU}2 zDmg`VxUD@gxLb03{Gs-yIB9Teq~3qpA*tCyKx{j!D@Ef zuo=!sNw6~AiROy7aI0u!f|cd+>hD>82P6cyU{C)@0g1G+>(EK<%&ZBC!9C(mxVTRu zFD*Ldz4sH#Z)rDg^&0y#ZN`qs^y+8e9ZJ6cui@5&+xUE+YhXUyagdjPzu!XnMp$0c zX>}d`;NQ&sgPEw@{P)VYJIuqwTsK6k!g)5+0WbF8+ril(nNIy&G#x!B(Q0?)f&3WWLV42pje6p*uu5D9UWZdZV@u`Ak2;u7?{-SEKldZ~Ux(+hKd5!(eGlPKYnNw# z8C)_h7~z2R*`a(mR`uf1eW)QfB5`hkmF%~RnfXi&j_(&?&0wxKO;ibQ{Syb>8uc2; zL#i}y8~y=2h$b`h#^l5JWvD)8;$r?QBS9VpFLn)Vgyq?9gX=)`AfAHpQmNTOeGJQc zLUK$eHI5%lL~iuB4UQ~G4o2XV1kRGFV25k(Q@Cz{^T{at{{OT@9+Um-jpN4-rw?@I z_Bzrj;O!&$DAoK#tAsB+kpjCM8OqyzJaH&}<_m7uT?dz>@$upokKc#qos?*QMAKgX zA5EvmpLq&j!4tktw6fh{xMBpyY_yrIpW?u(k)iUEQK6iZf&N+Ss@?N~qN76j_@jgD ztpAG`;3?A>r#$$R0?t2%cfHR`46bg4$8vV7_Wkd|%Rl!VK4c7iU`wL??H-bUGMxPc z`P~Q{#)P3asW%1Lz5o9@nBX{&cU)+OOOBWI!7K0ySl@UIIDwDVoaKCpt~hW*HV>Dl zc^i}sa73Z=eJLXEaw7I*wKePiq?0hfjYzW_vNdp7o44g!GnVhD?Ve<9b!&8L4o^B` zlkA69VsJaGn{4&Tp?v!(p?vte7i@HJ1m|e!TK~Q zcw-Tf#|H>T@IhnO!HIAt@@=mE6L92c@7Am584SZ?`HZKlzW^SDT+W6iLd|gGDDTcG zZ#?f29mf5CovZK$32m)MSXmSxQ}0n{GH#E+0XHIjCNNJNi~%+PVz2|AaZs`q?bc}1 zSu{yfvQ_WeD?FPfP3FrxTn?LvL!U8Iy7{x=Re=-O!?`tDMZ&x;+<5TrwG?pZBsyUv z_iCW)!LKO}y4CR>V zq1^MrQ0{e6DEFQb%7atKi_VQ3Zt~iv(&I;wz zt_XxCoH;v`&zcj;=Uo}fmtGah#aBm!oC6lk4dvo%LU~r;AE5~|uMOqP=Y?|db)kIu z^`ShE3h9H$+e<=u$qk_#xZ}pqgnQasBUUpL`KYDX0KXFSaKf5rL>u(L=fK_li zy_|bHGY|X=F5=$KEWe3&u-vM<;~{r4*DFpc4dvt|p?t($p*-Sl&8+|FWjdjgHR_&F zKI-03KE6DZvnoRQ*!w~`b7?4#zF)E2{~ukc65!Dfgz|`Gp`7|)XhcqVm>m+g@A2+D zauqBuAY`~a@DX0k=FF$wov13A(_0ogU*c!4|A#%wOm_=gBzK}&0>@2sz9d&BqOak_ z=O%N5>P$@OkKw?@&aZcf{3^Jl$U9zt9Im(sd#?VQkF#7~PJY+^SJmX7$<3^MySEtl z{GYu0#jpC*x(anqvHGd|{rIO@KHv22-%o+9N^0!tzgWxS!*|@*xivoj89qA(C%N4D zS$4^FIOxut$HC4)q`UsFB|*NO8^>&ieuUe&J(hdD7;Y{r>sakz#BgWpOIW^GslY9u z^m!JmP03ca>rnqS?3#H*V^+(5!t%}0C9eLEf3Ypcp(3;X*O4Ia|8H{*oWGV)!MA(P zb2D5F%hzU@UGY{}zU9x{H)L&~#xHUl?}mKvJABC=ukjYU_KIP7qoUB|^-YYjw>bZ= zcMB-l#OlT)mxV4zZl*wL90|uz??za@xyf{@P9L+{sS}M0VSRt!0P6#dV_J~6dyi`7=D`RV#DCv8k1isw0{!zd){zXsW)U&+w8d@1ELC7`cs3 z%-{(q~6yk=kC>hT&zL@H#OTpO(ybx6Q!cywvLXA_9QL<0 zQ-hj;eHA}EsJbuBVV>1}ss>#>ZQr#@`}-aYFQ4^n_t7hVc(MC=odT&-ho_C0QkXt{ zN@3d6j430hj~F&8hPe$`&M-uEO6P7ed~_+`yK=v zVxLxrWnlG`mE%@-ZyXw!J}tFyWX6=jX`|9cXQUPmPaQpMO6v3}X@yfVhEKh4%7`IB zyZhAidg8updOabqFV#^d0{bjpYUK=sec22)*7RvP`>6fMziYJof}P#37&yFe%Bblh zN2iXQo|c+%;fRdXVQIq|y;CwqPfaV7(K@XBq21lj4h*|Mf_2J-lhcM>Ai+5Pc>V}> zj@g@Q!QLLCx;M>?@+IGOA6~w_z5B@WyT0q5R$jcU$C&aiySvXQ zFS(&duktlX(FgPxHgf8)(W#?GXN<^5n=)!@`GdQ=pA$3O)O)yF?eYWKx}R6Rq^hpBcpKmh>>YiFQgIEr)7*x9X32YBV*d=Vbg~Mr0Q>_ar}hNKw&M zGlvXIPaiofEq(a#5yR3)Ff*l&N*!Ikq#}Co%AC^ZT_+tlEPd2)l7w^mQEx`WR&CN^p!1(Vh-ta^geegZoKwpX3A4B2bYh% zJ?5!>TS;@g-HVl#sdvO27}aMl4Q^d9>9k>^M_o`p^wJ&)<=34Z)2+PY?3n2CCv&0? zUb$*%OrNj=_mZo;^||PC?=9)st^BkHV$R>I#@YvBnqvMVYx#gVF=xl_wdY-y6Ei9B z9~n|d|IMaKb8Ejh+ke-@@W5ZR_uuQcY3cuqiGZ`a9Pz){a7_GF&;9Q;NebEIX8dTKD`hPSL*xQ}i|32xb{nhHlbeTTw@++nfFP?Kn`6=sq9$23GM|9Wn zKkw?ke|exOx_kLsr^WQ!>xB5?@|dE%3Njvzxn^&ImFpgj`A0(e&-HAmpK6SmQ+{k? z%&hVwc6HA`)a|&VGBVOejTkv1ZN!N5QNxCh9GRM4K5R$KsPdO~b?;Sv*xNBD9%qmB zeQw*$+_^V{PnUN;vb=P6_n5yb^|E(j&MM#iZp`HJTi)v4t-Scp=tIlfo{8yIe!y<< zg|}l?mw)(JOw!8j@5DrOD*v!4X5=j;8)H_MZ0s4|rToEl9SaQR!_L&;1pA1{B;b^iXx$2}9m zNPC$7J2$6CSp&*v4Uamoy!GRr(cSjIc^nnWSJWI^{`<#0`*hCzs+(2dsHA?jUMKc&SAOZ#! zC{&biihd|)kU>QqgpH`E0Yy#q^HTXnC3?E=HA zCi|zy+^AT`{D)$iDb@%6(=iV>7skT4Sd-Y_tVJvTOASWLgZ)trXNsbXZ);-H5jDPG zioMp*p_p;}D%cea`$^A3B5(bj+OhQm40~>)A@XqlzD5p1N&9N2k#_s_*qtJG>$%!7 zt!<2Zuekq+*v6*Xv5m(V_MdS>xg;u_cm)RNKz{?f)l z=i!j~SHUds8wqpd75=J(pdJk0npHc#m52E0{>KuB$gTY+6CE_h#M)_$YZ=XoCL`pV z{U@3PLx#&4Qag>+pV2H$8X{ltf0*Qy)2ntGqcfv>HYmkVpA< zG;>Ihn$}Ju#riXw&ylD3OPf3Jt$MZNTZG9Nnmj@t;a`^=i~`>CKdwS^fzzankO%qK zr8sGRyb8@JPSe8CbL-2iV1LZ8+on3Pk6Z=&ErwmEr4#$WRj^-S*k@V}kuUkXra7!+ z?5>^0*guZ>Z(XB?v!~CVK9PVT+ubsy5F`ALBN64f7>stqn zn#a=4{WWMfe4an%o1y;K4vldiZ!38sB7X5(>*M_$->OsgW1HVp*;{rxqoXVKS(8pd z#l9E)#84oYgp!4&nv?#Roi`|f*8XMQ3391FcVyEtIp;xlm`0hDzdprZVBVm3r};09m>_>zmOFAo zt$4;q$a5+V-SqJjRDcJ|>K=B$cD3Dy-v&By$ruAU%2Q#N^Z z4YW#zhMu;5r+l)^T7N5%^UB(9s^KLZ?{kLNtW4jActgu}{I>>P1>@&sqj=e0uycZZ zUD=_X{_qjxXs@GFOvU-I!ki$lV*caZTf=`W%2DbWG*x5wjCPX0*gM*Z4f>fL3-63y1_6>UL ztg?#JHSkL)zJY^-A#u@v*Vzg3Ps~c+pS?HSpbS<2U&u3XqB}ncr^vGpH!T}?p@vZn zX4F}BU#Hib?T1!UR%_Oa8~rgyselR2VcCY$eS~x==I8ZgOi%;O*0J)aaCw~OIaD?crVNym;Yee7fE+{B zgmwvXkI0o-^Ux=>z)Ev=g4~?Qesfu~nxgZV^%I~XMV>0JfXo*11bHa6r@6I-T*E>P zTk2lI%9q=*!{cZ&a~&|4+G^Tifo#94U$boK5w=kDtp2$mq|$tEEmvn z{~00om50IJ5vbQ}#-Za#d9^AJGY^iw3Z-;>ZL}*Hs^-Y;aAKO(DD;>G)8x9coNg|;Q7(*-;~?TzG+i9z-72>l5;sS(6c1TQ zIMLR4j}{|?p`w=3#W__Q-mPvUaUQJzms+$7H%Xg~VPQ^h5LoFmj@EI@THb>IY`9gT_z`^Cr`5LW|?^7a^O)8)`u+LmqB7Z49 z8-DpaIr9Bbd%+s{8{ruygPfHXYW9<4<^$;F3MIiRE7WH01-XgZ^e?J4wJ@j~s=n$K@vSQ8Q}2e4i__aZoChY>@j2kHd}&A$YeUr!}0wLNi?ogAPKB8)ah;WM48;& zC66($?2&JkJGr} z1M(}vzXSyz$*ss|(CTk~{*io*OVJmaNuSD_mB<6En>g}t=!85#F$S4Y zpUayRMQ>{E`clpo5w3hCXQzem*-%$C-;Pd|L3wzJ1EDsU{a3b@=RI&)yzF9 zKcdLn%*t=&$Lq>(!Gd3~`QX}fXxAfj8}YSJRp&{*>QQ+`%DWCJvhZSJ)A+bSV_9`v1qMd_V#}@_{pNXsjHOA~6+J+9Mq58*h^$aH{#jW{fVS*RlUbm(oN1R!57i))nM()K=w3$ZdjL z-ZW=7QF_x_VtbN;^-!LvH&dQcBCE4wRk9La{b)UIz><#21e8?SQTfgl$)+MYyFo=4rFVnSqo2g!to-HgP*5zl zF}+=t(e9pnD%eHY(*o$6`QNF|S zYWg+GJ&G`Wp6sW5Cif4`iM9q`(aD4Np?bcw6KrK|ZEFW8_sF-H^9LyTG{2t6R`L~$ z9z6%=eT=EG!<1pMY@($}3_;Zs?CxR8BzU}Bjy9VPS4PvavtWcWS5c%y^W-SyURlu< zGw)jEc3F`wniZp!S2X!mST<29Z19>#qe;=SbIy#{A?bQ$l5D~J>y=?0Uc(kzbabNK z!0OgQTggzulDUF*Tv^=~conLyN5^>GjGCmB$!YtTzi6zA#41OkLV{IfsLeb%Sy`;1 zm1gHF?cy-%_!%*TwH$4d3eds}lA-Na_;-J~5Sjlpw34y@}A?P`tViIaI*FB`1b72v) zY`KCf1FVBqDFA@=D3?6cT<|Cc0In!v9#=N2k+IAlXzcCVpk!4)npZX`*-Bcd znS1+Gth^SwC<#`Mp*C~+CS)0z7W9)nTa!?(5J%buz8_wxfQ`gqsmWyp0R@dH^M>Ec<+S}Nor1{F)8x1P( zk=olzsKDj5x0OvXI9u_9mo(o$lu)g`#Ty#YFOyOzxwhxtG z6pZh@k7?MyX83Z(l=NqVNE*!l+vX^aCd-3 zjNi949`>D5nl$Ab0TQ$4XtWtEU2T+8apw6`w1mnrPku)Q3^j*;k5PlalYhVw|D-D3Vy^#7 zaVc=$?~2EKL3Txw*rUiCv$-y)!X=`2nwi4rO5&zSAfIE3UIDKCdJpMIpL@PgIiOba8w`@qWicWH=8E8dMf7EeO>is zwlA*vF2U^PAxB`+j0OU=poI}Bzy&R=I43-)g&ymKQ!SX|c+AXXR~(w5t~of>l`6}F zVRlPb6MHC_4thYK6?D*F72tvn#@kMKPzUKPCp@Tw@g|@SkC`jds7DwF=y;^S{dc%7 z%ERD9Yu6-OnLK9Zdj%$384jN-z_~KX6yGRx!ciFpmmYA!Q5lZE0KIdK*|RO`;+7bP z`5}d>`1u978J2YjQ>&xEPE@Ov02kE~103NYwYoU*Luz$mYJH!9E~6M7?4U{O915B| zHk#t)2tf<$3ny12Xaq6T1ucv-PW+%2()SSao-5z%*TppllgCMOS2x$FVDjJ^i07`N z25X!gLmG%-E^4sRi67FSl-WV@wFxU2w|zd_*XEm^8heKrLvYrwVXE3nSAB4{9Naxd8ElS{NOe7Hvi` zi?k6eauMc_4zoz5z+2G85-&6fx=3Q=BRr^!5jJTDb&o-S!AuP#hOVWEi##Rj1s81EjWCT0Owj%(fvSa zoD+_=U~ogs2Z)baaQx9si?1d#Ta2`|XqxBLLU#*X1ugWy1h}9@c#H=e0T39usmfNCc)bhR^bV>_qVbqLTj=!I2@$(F3i&xEsg;fN1K`?oI zgEv;-&~2euVN$J{am(Q~ z&A?^KIBp^erm;@du8dwYaG5gJ*Cv{VmhNBB!3mY_Oo&u7UOBvGyfS8vTT;TfSYbsr z`Y6YLj9cQy`P35nTEP;7VAp*iOR$N-8ZPvVI|+vm6yV$v6)bE=JK;Di3~uB);iwG9 zAH`g?!TrothuHx$!UzQnlcuWzwV;K5MSu%hgcsI9EhKU3M*N@_hQ_pbbRi2{C1er1 zRP>I9vx}T|kzNuc3mQq!3vfXr$3%_rphlK>^Hk7Ce}!o@qL^x=n_Q!(mtZwL3Q8Xe zg^t7mSqxaN3y0rSLl=t$vN%z5T^L*ntG>}X9KQfc{TRr9E=7l_W6XA?$x?mfEySc-=}vf1D?N>C^}-{}jZT%b(k8)rvka4hH+GY^MT^xzI4KaYUp9rcTf%Mgo(zXp?usdSX&*++y<)zW`b~O zsQ?#*>)?b3g;SjYxu(B#19JB zWkBJNnZImg_V~m0i8fn9KEc#5#CcXw!w@fb^I_qAdc`R&+3u_UvJ)Ou!`f?BZgqXE z$Scgf+i~y64vR__d<6mxm(Ag`1UQ#n%IrVS2}jusuHWT^qil{p*VLbJ4O2y#QksA( z$aGwC7G&ye1$=IH&O0nbgEIA2fHI#n*Y0%P>=FfAp9_ox!PYSWE(n&sal(V0HNJAf zgMy_>F1XHaS2w5NM+E{=@JazL3f|y^hXjY!!Xd%yx!|FDUDqh`&E}GqUCo2TTtSCT z7t2(x0EdT#jUhn^bBmhGRtB$S*~;<9L2dv|{=z=jtHGW#0hT88L=bHKDZqKpxqz@$ zDE6ESsN=-Po^$+2F8JR4)nm;B8?Orlf?&fG;DTVQW>L!o=m(tmLBZC36MKw7HQa1{ zs5+=DW<7B!$z^l+9Zp_oZG#2X15P-0n!)w^op6-R@$WNty+viWHkTX@m)%965oL=7 zE$=ty)kDBXcu01Z6CRS?&5U`EZthv{L+c|heEH^G7<|O_mmOyo^S18=T0sXrEN%?D zKgLf2zMz97zFmOupbo|lfc<~c9Q{G{pfkbJCV`P4Sb9u=3!M+&$PISh+Ump)3f8x9 z!Q~&*IGbszpH|1&E;jO$1VXL=hl}yY6)0dMpC{n+o-?>U)d@!hIQ|r~K#j4(qh_u0SX#V2OLYLZ_t< z1bjgO2g~1ft+`0-X1lGm@Qf>@gSomlGZm{3jQj_KT~pLhpH;uTC>uffofrQGsU#xTrwQ znuRMME?f{lq`+RTfbSwzV48XGQndmlEOO=ug17=4K2v~m1#+3`YZfjHZrtg_M+G?k zTrk|~ljfPq+xB?xV_#p+_a|MR}MHRSUE|S$y z=~lulAXX=$0-re<8o?fkSs4`zDe#>WKcv97T!Cj?YN(82f(>!!O%QCXb}|YIwl+H9 zLBV>d6CM<7J!zupQ(bs$w55*vKReP5+Gk^|K*B|HxVSICjjl5rO%(8XpBY>at8Y*= z#~;5ZO8t!9%|8*XhLQ{u;drG^5N#2s2<$auC3&21>@|ZsPTx?aplB&(Z4~-jodzln z_eFD{r+T=#{5J)DqWsqdxX^V;%*sO7jdz^*A^C4J`M1QXq1u(pEfVm#+yZ9W`vkZs z_aP@d)Ne6Ki~TNUa-T_1j|5X3<1cj=_y}^P3<1vNW>S6h-cC5mW$^H0Z0s+`@4++7 z!e%OFn9HV>Ty1c!K$XByRN%A#7ZteRgohLe%gG@He&Gsy)k1CS?75gjMZsZJi4p9{ z3s(`m%Lxw&-pK_wXr&Io_sYz%ZK_>8kC{^3so@H6_zg~ms6aBsH*R&plWn+kixZ9t zaQs&)(%)ya>m@`1oYR3$8|LaKZs;G@Wp zDjz%HdeCMcaoar8RmEawlzF;)wOcX;9B-5g3K%{o!=M6|xalJ(pogtJg9=!Wm^e7N zxHxYP?p-ZAmksnFK?ax2;bI-cLn4Oa*Ror~;I-`5aQq?kMa++{;X}_@>s@LW={Q*9 z-C`_^9`y47y`WiNRadNukk?mzr@mx(%Q=v8r*T zs{CkT-vteXwdp^B-cOB>?N4uMR+Cside^i5}P})yzZohudx?(jDy23vY z!Qqh*GmxsRQJ~oa5vV_D6Cfm69(EofZ!t;AEnos-21c zIcM_i0A!-q<2sy&UD-}@>HXTtr8g=0y^8cJ6iior!B;Y&u~*F&`ylPT3jHoRYDixR z6*sE0V0w<)yxUT|1d4Y}Bkk&3`cHlmQTeDD3VXwkkY)59ZZ(c|H|)((d&|q=e2$tb zO4h}qMKC_@Su*3_J&1PvpkO`Rt<(pHb-%cV`a1P<=>aGmOx1r*=sw=)*gizs$IA>2CVCl_<>#f9sAELc4RP~9=r?*R>-U2rsq8V3J5#+GI*d}Ab(+dvqhhkGv-x!hzI!wfCkc9S zQMd2IHYCrfYSIrQKE%7u* zP}(}r?S1>T)ZQ&&*R|?SJaEVx9g21)!*K{Fl7G(0zZgx)>p}7ujP};BeN5PJ)r>U8 z7B4oj(H=0Cn(S9T+7}^eoReG^*Hwaa{dsQjZR3z!|B83N*?9HZdfCk4c`VJ}3k$}p z{UVPR<-|!YFF6Va$E$Nh+Zf`8ioo7j#kE^Cfok^#)vgWvF+sf%&x!J`bE+sUs^O5C z%(oU$9ymBVXfQpD_q7g9422QH&~K}qQlEjRRLL;>di8omUjy5(SJx`WV$dh4&7uQ4 zQrm7+c&R}eK}kK57H`n`Ub@eNuH`5DB`BfK)~B$2lG@JhEtBUsE#$rB@WBu>4I{7f zWVN@uf)X3^xkaCutope5iUMf99#hn;ru}G`(ChOiz2fU5I4R`@m*J7HY)Z&FypNr( z(#JM5Uv-0&8&t2NPvj;V0q1WBC0b6Ncop)7U@VVp3C2|Q2F2Z3dw@r335HC$Wxn$MsOUK2u8q^k4C`ZY9+*yd}Ans}rla93e6f!D)*!et-Dxdm(t?E2CE5fA(ydQICs}l?RhN?HFn9(R-3(h^q!rH8cSlOu_`r;FP zd4|tj7-(1{(CUxV$K*F6_%08-@Xa!UpKQh8tmHn&?Ga7q9J)A9Rbc3CYEL^7SPzVD zHAaQQJJ25Vg0F9*BQb^d;QHIu;5V2!Qu0-Z8*>|Wn1ePn2J^gr8LrH6T2HT2JGriK z*=q|>w%$1uinoc1OBZV=mVScLJJfgVvYV+XeJ7yuN}t2O6yUt(czdq8 z-@)gYfG_fSSAZiQTzzmppK?BD?o@vi`RJB_FYwXDf|9R17#|}5jpnIY@*WsIPo0TB zyXUDBaw%CQMwtc>g7(F(Y`GCbq6{6x~&E{zj7&b+s1cr&+WIQl2JplQt8@a0(y z2akrOHK+d==^J@SVW}-hkL8GKdWKd-T%lvwy@no=7gWf8w=;kWRS3e2qbMx+-e+H@ zFslONFWN&an}=b)Zal7!r+zR9xyJ8-zEX`Z>=mjn8Q6LUha$p53WD^(SBy{67p#R2 zzlAXzd~fterw+!OY)BL7kXF!1nGY%Hc1>tW$NL+|k4vZHxhvRV`#tK|-X2XCgki07 zWu^K-T4<7I_S5(z?;Lum49>4oCkcyE-rF62yC~)AJcAcqYA#AS{dTq}^;9oP8Q9vI z9|g@8tIeRa7m0%Nezl)4!E&xoqM__J4TTAob6pR4tJRsYtU7e|!&q&eSgp==6}kfP zWvVn&I`9VnEqasxW(VO1?PvSgO;yg|)M8EewYq}V%w{(2UB zZ}5{{`0mcnZo8ap%%#;SttqW?b4_X1to#_FRZFwJ=h6nlx>B|GKT1=%w4odSrL?ga z_(I>TV^Fe9jhA!a!;NZ}f0AbW%%wfBsa9!?!P=zOuVK#qJd=jZ`3CRcFo@dx&myHS zsK~kD<5rs`r3`1^q@BEPLqXs2&w{W$KQBe8RKdWGsa20&pYgZxMYplvphnWi2G~VGM(CF#Em1eMzy`M{a z>FIwb&3M--%@_%#JJfbC=@~WoZ-Ro!(r@9ietf2;tlH9x{&Fb2aO3vo@h}36|Nd=y z;XNDArM1~nQ(A37VQdTQSu1WwFYMj%&vw+aA?jH?F0sm>VyD^`?tWHnujtP~@=lgB z_OZ6@{1HdyIYiYrgRu*<tWw>_&6AjKd0s>##)X%5MNkEWN9UT9111$ z(Ri3Ydf_x{E#{B7FSm=f8l3YWSiei{pDM8x%Dt)S&r7K-H{xDVrj#nt-)hfX`#dGP zi<1q5$2Xp19L+2cmW&dC@Rf4@zgFz zn(P!LeQpby26_9{E@}TD$ht(G3}W6;6BYed>hVm+v-{C^tr_<7G;<)fM=Azx_r9YJ zi~SZ|9+U7LvY+7BAu6cC`p;m!qrQ^zok>^X#oiz2FV-hjeo}xhvM-c*b)ye8*B@4| z$Isyq^U}K*nS#?Ny^p&R(q$O0?-ORLzJp=J5|esJO(!P>G@MNbC1Q!RLs0_Ndyb=LcEiQ5|=A0oKuyUt4Gw zXS%N_dB5b5@d`KAeQZd4fe$H8d^YolM97??#rG6IMU4^tuhjGg829^a5^s?G9U=DI z3GlN%AE*z?%}{0}k#J*4%|9543zhb`&ly{t1o|9PTd0@_T>03 zREeU!{MU5=3O-g>DcLhXAFjnU3p|iTYe09Pkgiy0r#wElohOX0(Brt;d&Jx>??tPH9`!%hI;YE}efpuJsZ?K4i z_xLzCrx^0Gwb*RN)4Mplku7lCd2}^7)5(9_5{_H^kj-c*=%1)fVCQkwT}J@U{zPqF zxH7fn^O7ImoKJ0mzeM@^lvmd4|c#Lwjk|VDs?o=2JC(VlC~oc?Q_J*!|Jga$PjQFQ zv~OS?#~=R~{q<1$8lS4o&L?hLkPlu_Q=1e%#lbgi4}$4% zV^?uqD|R*ZX^vO?Of_DCt%lW$tFh+4nDE1f=fDcyc4`Mbn{%q@TJF)}=-37QdB$^$ zxm()>`Uy2Y^7+tX9({Zv^l0E?;YIrB*Q$-rR`bkJjSMc8?8ayglUnqkM-zp5UktKE zN2|x_w(g-u4r$9`*i~rr+)H;ZijoU$FJz6`_w&YM*q9kcSactHsBC*^Fml5@(6Zs= zW!|auSC~=}!DzVn3f*V*xarn|UY8Bcgpk=@+{b&6L%%tMAEpq;&HFlUE4OHmkT}NK z9@uXSJirBN2jT4JY7_4vXSC)9^$T$HZ_7D)&YSExBIgiphoXMDQfl(Gb^@~&!tgKD zCJo-=BpM4Y43d>lHCT%s#Xh`24pvrV*9)ozEGOm_}`cqvB4WGVB4%D~O> zAzEx9PhaoWWVj0zW9cix$?(E^wq~L9$iG7*Y4%{gPqVVq3$m~0ZGj59M=ZAWz%+lI zQ^1U)H3eWr7)3AIQj0%e_KGNHznFJ$3Z%Bhy+JxgTspqhI8v9=CTFEcqI5N?EPV!(Zb~smP}}-1lF&^o^RIa00)h zlS9YCuStk5p)^+Q428Q+s@)Z-BkVXyS3bYPrIYG5TEmr|!rD%nj$gA;J1a)HS#?T% zMHT9<-DlMFM1$R_@u)Gl`xRE5oIj&J*4^qr>qJ*t|GBBj8|Sj#kTst(D;E3C(qGSF z9~OIbGfJMzW6PQV2Y*m!UK>RF$wvF16HOmQS^o{&AH(p6!-BKwu#_O%?`^g}IMHya zLD34s(at#0tiF7eCC|lT77c4C5F^u-R^2Sxsp?LCXNx%?=;Tvsh=|3G_iC$@az}Kf7_$;zBF_8G8JrX5&h8 z!B6TO`DgR&PwGw={;vN;{Z)>QWcn8S8u;l){7YCte-<*^lh#miUhUVQorg%SvdCxH z`4zo9XC_}zJ1KSf=Eyx%I9Ruku4c)v>gy^+H=O8sSI`Hs=!XS=vh{AvU$msh@2UQU zwam}3>@T%gk#??WMDD}IMf;7o1%3y11;2z&qREE-pEVI`pxPDNOS!=IaYV491CBhrE)IAZr4A^S+ND>OjQ4!93#~! z$JoN5}p{{b7D);kzbeJgg!lv_JlL*3)C0()5*F+9gQR{#lyzER_~oSBrw0 zgb&jnAwebZ+EZ#ARI0=+UxZxuKg+>w7uKua-2bju*7w!In8)A3dvzWbMUXCO|6oId zT@-`NXVqBuF6LsFAvY3-`Xa(JJ3_~T_L zppVAq{P9;fRELaKq!o}}MwAu@57s3k(2*uMjJ4^1KyEa7IZ;1ZG)#`p zU;A(Z&bY)+>e?)&&Cs$w!HuzVaHu{Rph%4%Du#@SZGxL3%{*jbL(E%EA(ze}`Wm3dS+IURX%AH~)Pf(vzy@SMw6{xY`o<)l;{%DXx&djc7>!M<0l5)(J$67#4_S<# zrrY5m!>&oEhcK z+Ek!t+VL*7S>ke~5s6DZP#MgdJa;0U=1q5`PDWECnN^L*O-k?-f(0aLNAqTS3(`K6 zIQc|#ArvGA3zEB`vN3vjD>xXBA=x3!NZmt;lN$+diqJ!kn;VCvwX2CUzIKW;^0~Nl zxYYP>#l^6^R>;LYk?=3Y>F+zm>A757YiOVN&*G%nU?h@WwFZ*z3k6aIn{ZCSjwF%_ zt(uT{#rP0({6!;P*Mvs@`}{E-cF{-UE&kXVB9h4U;oJ+7XqevOV!Q#)G$&L3W}lH+-%5j%%`jJ3 z8TIIe;Urj;OwyYfgFL~_JUud|M!9?_nY2)hFW_u4c~8N)y<}))EF4K8>B7yTQr4gS zwcadZZIbo3H;Xv^t9Y{kE2T`jtY^8?akGfw7_a23p_@f_w;+=hyfgV>3({H9AAyKe zlF>}6^31zX-%paI{JAgU3EM(mJ!R7TWh{lUshF0m#bBh8ELzuDQdym+LuDWwLKcd& z4=$yWQIT#}dH_FA>T^SGOY#7{6Is!c%vGdEX(ibPZc8JHwXj&1MprFT8 zXhpp4U9@jjAzW&O=^OpOPiyR>z5-^oCPx)%7W8RDM#bi&X58WOlm2L6dT)iTv2vlb z4b9-g;CvfY+BgoS*G4A8z_!GbGMHzdz%ZVo1Gzj!KOa2CpG}RBT}%HDw?$UgFxr37 zgxK}#;kkAsS<%y=q8*7-q^(fefzE$zuf}Rodt{|&GE+7**xiw$G+*_wFrGJcAjyeV zB;Ab0djs^uijO$6ioSr$u%e-)%AEvi26g5Q)NZ{R8uZ)cc>c058W^(F81Blz0k&?2 z(-|1M`X)&3Naohbz7(IzrlN~b(MwCzSn>Tm?CVJ0zFj(ttN754J6m*X#pAKu#hF;c z?-b)?@&TK^rt`M)oSJP1Zmc=E1g>>VF5gfd**f6l(#>qsiF9(#Furm0?nO!~Rsi_M zho%{p9*u6HBhmuuQpO(G)rB;XN5kPRBrD~*uz}7CO*0a6)FV9a&+8hN_faOB)xyPD zDWSa2#95nY>4&EFIM{*Q~{|IE!Y@+NjI9p+d)M)s=j%)8*!^0 zrqS(wdOwL@=#&QFC7-A)W{GY$I@@#|l6#R>J@e_FSv85($4_slv72W!`JksU@~udY zJ5(XodM_|~kuD7oYzbhgI~?pq1{F>hmtpqp(oD+L@v4l*FOG&z_gEjT4%H`tR0Bz6 z8fY`vjZ!DB)Q)Kzg=ZiTH`U@_ zB~aPfb&c7n4@s-%s9?Oa`B-~z3%M50PRBxHoy)S-cs|zT7C1NrC;8h=YRF>W9rPDB zROW|#tCD%*T)TuB8s=M9lV`jUa%CpZ$cDrjN z8VlF3-4IS@!gV8Ymav|*+h@V~Mwj@f~AhH)aX{n6wI!NqXQY-((QD)!G%It+T%IpIyljcC_?<5Jf=aQG`n@=7s zPzbZGC8@$fYxT7R-$i(v7A^RK!f5hp2r*`i1F_E-BHl(=G={F_Ucigtv9Ny(Nl+vO zPK+U41lEnmk{hD=7b}4G=Sj%iP$v^&{*t3iYb==|*Js(lTSy}ZwY$&kI-WF@d9tmB zQmbI@V7pv?QVlofPaxBRJnjqffYaCEwQ0^c1mr9vwuy!;1UTD!4zdox&BGH(LtI=H zL*@14S$8GY5^|&4UXa|2C zczZrcGUwh)R@&030sK*@QOp7|NU5EZIr{-}K;hP52BRiTE+TE=riJ7!s^x>^8)vhL z&Dq!wbNV9ETW)}__vO+L^uI+9&Cywo!7d-^h?JE+G7PcW7o#~6R(P~dgq1`@;@(M> z(*i5Zs>S41{H7I5UP_wdr>zz&C9f%oQrDui{ZjsFA{C|K!9;q0nRQ0P(Hy&+Oc35F zWUgUo`HlbPokE7At5CU|bisED8?7LBMy{mev7JtdF@k zuOD`={AY2v6BDrti|1-v<*g!}6ZNU#x3lcQSphp%k-mx6#M;|Ys_J)`-td#D0(U$C zxKqf8(^u1^xdoQ3#*GZ4$~?cC`rWV4V=ZZ>=?htTRuWAzVcA;pTcUL{uKFZ-rQ8He!Zi4lX zl97oh0@2!HpRjl!|O>?nDIF2 zpy-2O_2cAiTq&6dJSVfwc-2EX;YvtWp^7Fch<=X3qBIHt||!*Cb{#Xj$d zs5_Z1%~?bZ*&OcTyLm*t7>cMoCa7!3#U=LqB6ab2*@WYp(Zl!J0rj#SQ2RpxRl@W* zLXDXOgSX)1ihT6>GyU7uyZYC8h-N&K@|7pF}X0Azo5O3iPe3^z>4&OXp z_%gwFzj{$Mo5HD=NgGA)1TnARuCv~ezE!xm-dnh9Yyb07#=UUx71FnbROw1v=)#-# zm1f#VOpc^7|E?FKFkDXd4xGDzVWdTvw$37|1(`n;LtuYs_C~lbK9mr z_LiUMcwu58UV>-3kA<$U{!Lue;SMSFg3?z>FU8tuo_Ljfr`G!!&%4-+@A3KGG%Ma9 zZL#*)1Xm7_J&H6Gb{`~56@1ZL572FrEl?03og3==X>!Pq_N51RL|}J-3{|AjYs*PH zxgE4GC%4m;-}-W#VX?~l%o z^;qpnaurBsj=_#<`QOrDI#zhnhqI|f?Di2HW*@;Z8i{=@hx5TjCxcl-?~H-AZ|=cS)?QNd2JCduRbY+dT9hStTp35?cPYHWyWp zQKEaCI7-SDeAxv(0{@Z84@kpimMgSRH#`#G%n92%s`>z365sl5^dZ5s$0s=9-Ve$9 zxJUC4E*4cR&S?Ql-FMwFnlZaW)iJs@mIBkQ?j;&)Styf z47ET1x(u@=tv4AAEp+lz@*q`f)@LLiy*FbczFdX>Kr!jx2&&j#*F32Fj4Zxd%3j!z z{|lnVFj#T|=h5nmiIpel%#j2UpF36!T|X!78hk@H#@I=##N2;9y>6M&OlKcSu~mzr zs9o)Oa9x@rIU7G>!T-@-5zwsxFzjFulH`lT2cw zx3@hv;EkeEK6U6U7I1krMQfE%UfqnLfLA+!H4U$sb9-|;HyrjfLy$0*QB+b3)&fZr9Z>*l6WZ3&uMjoNHWX};= z8o!8BCHDTNwUwkvVJlAYZBtHBjD4dQyd>gOXh!Rrc*%%ogemT8QxgwMP`o(hXLpro zC#;dxc8A9*Npiyj>+M0VZx1rQl!`}H&Bsw&1&%V++~q%eG+nT(w0-SYceZInuecFWt@T|(d@QPQ#S(5V|YlAa5y>Z319^?4{XW18izo%w$wiR{bbZPDE zTU-L&fiAo)wmmvc7+s;OGjHtHp(bH=rr(E`2kA}LV!WBeTp}%lcQdCW`;ExSq$u)ap$mj#Xpm-E^P1c%B{LV(h&PvqnRHqzY&+7IHy1l13 z+sE~)Zm$x2!&nHjzQLILf?kAcH6y;(D{##0fjC;!aBBo&>5#B1aIDSeq1^FqXd@;i zqL}^qBZ{$FuRx~`UV&qg*&}!b&PjstB;ob3uq$wkJ!#C@f5d*VYQ^33N;P&SYwVT~ zx(J61X(P=P9yewdb`g%sG@{T~t1rUw{v^@>4#K&AACMgv;dtMoq3R@w?~ufGSR0Ig zyNloAKiDZ=dt+Vnz~DG{nmd~%Mcmy!MG_kx$hE`nfE~JrZTLO>+4Z3f#~0`*zH20Z zKJcpD{wAC}MJB{za0^RS7M4Y4Aop96;N}kxm<8YBszo6;LFxCn^2V>Be2=F!(o#%Qt@&+hG=8!vv${|ChTQ^1q%;Nr%f z#gimDA>*kDJxS6esAP+`S+MsknQ+w!*$x+}KV<%hidI4{{uIj0AMv6(ovbh_>f3iK zZ9n!YyuBQYxJ(*V_3(x?e@lV;h|1eF&2F#D{hzoU*?>*T2kvn4?iP`CcOg2YyEu}j z6-*6oPVB3Lvto4)V#Kc7d0QIZcrT$>V0oHhZP~MV8`j<2VTHD$Tbx2;qwNmU*-7$8 z)47!`6O0OE3L82pu~708>5Wx6T9~~IL43qdB)o&zA8(DaS*Hh_{>gC(rS<>Fs3BKb zbO!U3k;v;@nP+0uAKmWolm$dkA*ftD)MdE+t%^?Hu?gv(i^z{V#n`e&* z(RnnN+Y8ikopuPzlK#9b(Q#r%e4k>M#l}Ras3OC9dink!+aGnMwtim9TGIyElACbh zN5x>tuu;mokcNNz#$ez1E+g>`g0VlNLmNpZ2FD~>#v7u=lBDh>`3Es30iK!$RfoT1d~Sbf9Cph%?Q{Jp~*lO7xJqQ-^1vD6pm47kTWd8*k%DVcu8NfYTitWxv$GoerFB2O@0Q*cMLbvLj~A*qWZ7O*q|!aSj7^Cl>N^EY}zOx9Bujtu;HVx>kXH3RCQ6>ciRk+BD4z zPh7x-XFE7_fn4UfPQRDGmB$jF^niK(A|AEJUQfLsw72M?qFkf6+?Lw%gN&kdUq+X2%ccBiEe3-j0}3wVrb-4Zxs2=H4A^^_?&zWzhUDi-y3F~qP zDEJ+BRrP^Tl~kt>7!^c?L%-v8bUSEtg*;J6B@=QF*C4RKPfBFIFU3D~$@k;*1e%w) zwqy#$#qHv$jAk*JY40Ni1D$>O*+Xbv!}TK@TK=`m{5o26s`R2%rftIk%9J)gvgc1T z^AGZ?8d)5F2bR-v|4DcYLZfEPRkYZ;>1qaDho-jNf<{-gkGo~0ZX+3~TS!KJL(QHV zNulYZ#v@CZ@eG!b|6-{XSJ!?Yj@JU0c2qI`hYL{cZbdq69#XYmm2nSoI^V;7dLNn5 z881;f+-Aq>zCY$oUa`@Iqb^X=p}U z)F$u@rf@ZjX%<)yC6O9l7g>k*Ewv^n;Y6f%qe9<)t)r#lFTEO>Wsl6?FG>dYHDBkE{bt?`!EyQE! zDBye2gX?M&5;ijwckvdQ4q0+%&Bm4BwkYM`F5VQ{7Uk5J;cQ(kA63td!j9nu6}G5M(lR%;$rzRbx7&yjHey4X z(V(=cI|XiQs71>!LriCPio5d9zcB0Uh1>_+P2Jznvf{vt5R>JOhklK;R?+(Q{H3bG zY@_<#gydhfST~P^=b)q!dVn4P{TOKuZ#L3A&3tb$Ot%l;rQ%B>mRcp2XYPYbjkNBH zRsor@T4H+nd#UM16qC7=_AV~@@U0kJP+%pViVF+o5!&7FK>^|pC5VfmhRZ@)+E5vI zWA<(8@VIMojLD4fy~E%UzQfduJb0TlHF+8@YnXhAzPY2WJt;S$cl=a1-4MHy$u_3u zfa=kPW*Cn!PQ-W6q!NnB5&DYIyUL}{Lrao{7H@yAfW+V60-hXmvCAZx$vD(xRaRlL?q$-b42Yb^9{thG_f zKZV(iwa#&_>3+g*FLVJ;nPie;7d@ z$SIhdfKeokh0+9!F7FRek)U-}tP!9lB4yDqXq~9#DAFJ(NYoM&b#GCcs^l-l`vhqR zF-67TdW3qGl?_`GwYEy23MvwD^o?sEqKP(AA-~{FPi?&7>Vj81(ZBJ&P(>3hT_Kk# z9$scnLLpK+$V{R{tzZ^?#t>hYq>WFsntRkma#7kq>6=yL7yL)4zoYg+SBNpMBx${5 zMRKogsda*zn`slFdo!&WR5sIYP>hS9H`n?qgn-dpds*@R27QuI7yZ=QCzVD}nvCvj zd<}b((Lz4_7s#j{5h+@Ww)$rwdF#m)ly|`%4~?0%nAD-a_?AR{7@MLERmyQIKSgWm ziA|@|%RRWTR~Vu%&;Tk@w8ZWKuK@GVbqsr;>g5wMB~YC=5^2QgP!M?@qCqnT?>n+BDM8deMP7bP-^8Bni&8(pp4o2-`35U@cCC zq}E!Z1J9cR16!kT{Kv%$TBCV=O<+lDZEiGqxLRA1#qyyy5F z)gA*1-7>emmfp}?M3+%n)Ne>YN5MVTcEC9B7C~|cYN&x=wMUl^K6?kl702^%=+Ob& z2_BszzUI9a`_mNi+G}wGMAqK12yey3cqicBZS23NV82@PzsXb-Z{q}};ig(TSH;Iz zH}p+MkjEyQiDWIXxp`U%Uk1twTL$7lVfFJMTL!W|kz0@|8v0KIGCZeXu&&!Wvd`3u)LbqJ0BuCq9J_vRTXMD?*bUuQS0uoudfibj$p=# z4lHCc)=;~XBG}bYOKcWkeaT`l-(tjd*?%v^zwwJ$Xw+!isGM#YL}hAi69Ybab%qz9 z8}SuanNO6&+YfRxG0~KFhmuSjYu^gy7f6e7x&jAb9F%6#P<~l}KLTenwH9zgCrxXO z6}n2_m^GRI2X@jeM3a$|)kr>+|LuJg`gEc`upII_Vb{qMFdv^=;4omII(c|ERrBzb z!oE&gVnZ|q4QR&Kw*~oTGqoDxaE0K3r_eWa22T{>WC!B+wRPGFdS{#iM1G_QhrbtZ z5BT7&&RXZT*bn+XEZsRs$N1rWqalN^{`9$DzIDzzkhsXMl*9w!n;kb+TBwwMNC?+TUpXB)PT~T^5 z=-=q%J%d*hweB=*LVY63piy^iu2TL34U1TKqPx~0n!L{(ojdn=*w>vp^kk^)j!BJN zLV+1;^4tk-FP#X;CJK)qLGyH5He+I?h;xO)WH1!p=4y6c7vgoYZ5@fM+S`BEMR+^= z?-($$uo?{rYWNzWO>EpiBgAdRaRYH+A?{6Na)tuAsk&2vTvQ+!bYuDC9D_@O=ULvhJ9rKj{DpNF z%PgW`-#FOumzD;P_R^kD42-8UmM0RaGg9yseazbEeK>oKU)u*?9=x}=)-swB}e<$ZyIY0yndYzkcObjja(l|5;|DdX$ z)`pY$Zi8f9>zsJtbWz$OiP!x2p?X^L@1ixo{vFKLaX14$vqabMGfUPxtQ>DT0L$?+ z{jnUk;z$BKJ3#BK)Tcc zC>W^4CBFD5_6V<};h`*so}YdK$d<+1x2|_8l=C>}owFV)kiH>#lDDtjKz}`GCHe`U zge=A+u-U2bF56@m7&4l6qfNAlGu1ZJFZ;w6{w;A}3zt}v7?J3wWGlLf!QpjI*7*Y4bkBdFQ-k<0Z1QU*^?#)qo8L zc@K=i==I*WIZgUuPE*W&{Sn3Q!mhzuMnm#GZ_i=gk6sP*n>&dOw^nd?wJjlO2@d40>Xl)z%j@H0ifOvhoeQ5I)ate)3Nwe*E%s%`OZTyO@`$zEM5G>TTejLsN zB8FmyWyvfDKdOx%z;W9V1ha?Yg1_6RY&pvO_k-xr+U#V>7swi;_Uz=y-=f~u15x8WCO5Z@C)zJjFTTJOkm_UI-kemHKwTFv16 zaP6K3<;-NozW>o*e2J(E7L3q3HzZ$kxc6Hd{u5Xuv=`~b;(0iL{|3iMx`m5xi;u!^ zw0@KlTa};h^;0Ff6_A^S^ zj?`(u{fzI;lxwvqxKmUP#%Qf`9p5?DYj^Q4ux~UHTYDjC3|dX!0|V(Ve*JUy7%d}F z-;F0LY_1FKl5nms!0s`)ABG*0Mz7i74j@C!+jU zI6to1g@VmFzi}7x{?5tbuJ9p8ICG(SSDY?{@MYuajP)n%#^27~-)eWE8GmtpA4!~F zP>pmMq9$lxE3P?EH9^CFV}&*2Lt)7C1*xYu?a+93M|zC+b*BJNO0gIUcm@p`No z(yzywq2hXN0KUapV~dA5?}a+hev;Ot=l712SoV@a(I)0`J};j2vrl31gILyfpp>_D z!#ArZp~H=fhV_%Q^uFHuwuUjhBgGB)+=BO^m^fcU$9*WyYaMSp=2<%#S;fXe68-HK z2R$ZhEpleWW8SR3$;87JKx zaf!7Dl7j8fXo}WF{tyOF(V9noz@b_M6im^wFs^C(a2Gd*T~oAnvCenH=u}c%-V~~) zXzwY;pJ3gfB@VEzU^i3`-h4=v=$HE?{JuKB?&={%gr69A;>b=LuF&@;>9ts#T_f1# z&C>tl>|5ZYD3bqYCz+X@*$_h#0t5(4UO*Bf@0WNUMt4!DL1QA4P}y@^#oddvzn>DWfOK21#V_RG^~DSNeH-{;pEIyvlG-0 z8tqd($0X()W)c%?peTKpLmil@Cm+$DH}-P~=ZFU;bR z`Jlc(TEIK2$M6@16=SKxWHq}_aGda~=@YE@GHhG(@F_LeH;VlHH=YYe<&&YwW+=}q{=*U#8g5flG>uFdO_uWS23)CcBlUe~& zZQjdc5lTKWWhkZ%)711Hfw`DcIF6Pn-$kSivbGVd_@X&=kA2IlKA z8BAxUVT+FBmtvYmnDI{!yuIB%u8^I(ernNO^OhG6d>q!yJq#n2Yb6qYmv7__j3d zO)Y;l#Hg}L<85Fu1sDBAI>}2p=wmt`3#D=vub7s1E3$C&CTa-x^ddF?Trz#1(vc$c zXXzty&INhW2h>Y^57P9xuo?)wP5b7mGiB*@>NO9OmcX9#v%^J6Mf22o37%b8xx{^+ zAcecTAVqqS&dgIMBzksOWHkG)U|(7A7ye@7^jDfSU%f^@-V;(BW6%lOHD6sMmp()q7oEe!oiXfNPN$K=oI?{C#bcLHQ+C3v5(nP zOIbSZ7un-eW0Uyeb5x?(P`4f*uD}H+qKG(8XrA(^6CyKwSoDw#>pU_VpHDQtHC78j zINyjO!lVlGc0b0g3?J5W!V(mT1hX0?5Mk0S=9v{}b{U>Q=O>T`o}VDl-(0;48fJ#4 z#RU>Hzd(X!=CFIwelh~zSqXS26!ePhec#q6s1Ng;B;=4tf84LSWd#NT<>;aK_AOV- zWY4GOo^th9M}iOcy>iKMRHY&1OXk4`)t|9C_BYzMM$N%YFVxq%9WR_Mwk6?M$<|0jUwmkujT6QC%YTQQ0;qM!WcUH9+rgF+1M?J#DaMwu8J2;3^oZvY0yF5MZYy{ z_)FlO>`@72(dWZshw4J`tq-ZVVe2*sG#hU)nQ}h@-ke*Jmn?+0nv+0PfJ;z)=i?3b zxFFtP?}LsD(XCu_LHLvJt2zC=?a$p52<4xWz8jL6YqP)1s!C54#&IfW#4bt*2AA4{ z#%dVMoy)6W?gjIVI?Oa)s7#$M2*33(c!dW!>v`o*yCAPTAF89$s|&fVFyD_fPm7JO zVvH=AK|MY#~KGim3CYBtv)Mj!5JPyrLD=wmIJ5JtafTlJ}wg4t!1BE)xM9x#+<_!U}OIavZeKri?Q*_3&QU@qK-{h zW-}Wx;6_?(0ZY;{Q2gLrXl^!plvdR16RU|gV$UaPPNFjWqJ^#bM7>W|Vkz%aHCYWl z4vn-G#eBvZXf;)Sif$Erh<4$tdWS)iP7ra4UO(XCQDqSCOR=&CMjqm7^Uk2C&lr~X z{F_qXQ#RDN6R?+w-?A6?!io4@&>*oHE#e0N))07A?=ygP+ORiM4PcYJy#UKyxgoDF z#YAR5V6ov09I|&Vxoa_D32tdzk)NpPG_zJMPcHia{Qzes96Bm0s^`xz-cYOau_PH~ z^@r*LYW+E{QXQsopJU1fr6qftVYRVfA!LToKFEzYdg^mEUiQ61fzQ=-tleZZ08-Tn zGi#1hYy3vs?CCEWovt(>ktuC`^o?rqVbGLq*jkpA+QjQ3vJ za$N0xg@x$u^O1X2o{wBwLA{P!%J#Wf6QqOOOnB`>jK>16_Wttej5n6Y8=H03h*=95;nVe66}K0FX|Pe+>-M zbrw|OHy44L{S9+&09U%3p8Uq5^t`6=hk)vBL3R5Nq}e$QsOUdD@xg84|51Bnd$Pa> zRG_4ZinVwHU3e+F0*8a2k!)HlDjZJ+pX50^*J^Bit#&)ftvbalI;qM~o#LqYTXjhS zo+Gf3h-r$20DaK;9nT<|hfe)~v47w`YW*WDzy`iqKdFJ;+*n%uBbHwx zc2mud>XhWb3s?vFJ;J*j?e;YGdW&Qjc%BlQw_*VBPoU91@v_Yhp7*qDCGp(A_iUrd zj|lTTL%V)r&E?;8>?cfq0yu(xO6{Wh{(;+RzNETw4mZs@1#(~_xcZcOh zFXM!YGN&iLahiV)9jp)Z7g>SIT#Eli9is^{)Ok2W0s~9`Dq#X4vh|lx#iE(W)VmI-`kLamvVp1qn_;C#AAy}7c&4=H@h>hc&0|Q@lb;b;r)i1l z{};Hz_Gn$1TJ+(t@_M&W-fz&bg9F$4wC0Yjw4uSLV7Qdf?~x`kJWUV_L$E~?c4{4UF15pnOQtMm4{KXk}mn(aH%F3Tltw9Z;=k($X`_h|oRLhrK#L`TcI`VLw9B{`TL zr$BMUIaZ1hv*r}Br>iX3+mnGKz3pjD1Q)9V?TpZJ60ox6-e_mIQDzt{M|Pm9;aVE? zjzo6Ye2u;=j(1;QYbsEv*f=PP)Sd{fC_(|N`<-=|hbdLjy6}Qr?l*czTB>LxhpO4< zJ`84+$=?{i4E5uX+pg6 zB8|gNb4^2A2@W~0tq9&JU8oXxql38(ogg?|G=|vlFh3h#HzBu*er3}j2S+zF2_-!J z4Gm2qJRBppXcFOJ-kZ2xX3&qCw!>y9FW}TNLj!rV)2Wqov=*2ff^Wc8%dPpHH@4sx z=L+kD4ltVXbS+!<-;85mTKmiGWLVm;uw5r^sgae0(0wX#Wr!0=J;Ugju3a5U5+Xnv z!nx!}DN&)-mayEslxt``WbY(eX=qs27)VuymME5v3~mMe*15FtaTp}9N{aP^`nHuv zG0|vS54f}+&n=mhf|5nY8RwQP&=!~XYh&ft+E8Q@?Qa)Dnn9m7(Nd#%t+sJ)_i9|% zx_^fGWVH63BKr$zO}uu6U0hfR#_=q|;?kq}suCrb>yN^?$c6TG#_kqayBOfggC?#^kUSWz%V8Gp#H-IJ$uf?@TUp2IVAZC0bgRR8guFoBI;9 zTOC?9PKZWF7n`0I+Hps+e3jS;kREbH;azxpGAWcwUV%gQX?8lKRTQU zo(FnUR4eTcO-PjLnY6l<)+0MOiX}ybvfBaeMmC%AsO_J`%h;G4VksNaCJW(KZ?YHcd6)MhgePVmtMGs!8S3_T7xCMz$x-fho-?= zmq_PbL6L2=nR4}mIJAZ48-Zgw{0*+8nl|Y1IAOpC*V?}KJD-Q=D=DOiRLrgHw-kFa z5;gcYvs04R1FH8a?0fd0N84(nX=+<7iDKNq?K@73-CEak`R1uL18(g*S@!*#s!}u@ zntG5W8xgB!Dm6ak%`9iAna4L2}z!E$ZE)5RCSu@C+$R=;VhKkqjV-s!-DDE zlsiICqZ#R1nv6ZO@^lSD@!x1mx;8XA_?8$21RsN2a8L*%Sa{H8>d;=pjZJfKueSD_ z>?xpv4q&ZkGOg(V*5VHQogFlsnwm&0Izq7dCQx1`f5*|0Z8+4wrlXe7BXC{A7QYlP zrUwBb?sFj+Y%#PH`?%QhZi0cZMig)u)pi6Qeb-Q@3@xKaU{HPwUBwK_f>Rut1?L$U zk>+sZM?EEX^*@ifyA^Na=uhPtOx%@JmjPV3&&!+6Il=%QX+XS2hV&hXx!ymQV(AOq%#Id?i1~>M_mNd6hU*-uyRJR zjcuIn!P2v+)TXo*Y2`o@+IP7&l`nYjmaSzcdm{6rx4R-Tc1J~IE{%$_@$r6%T|SwX zXKPse{gbM)(Lp_D=~y<(%!y$Rw&%qM7ca4Q)Oo@o02o6^yB9kF zx1LryX%?#IRZO0l%^DhzhM zXftpX}rej_JLR@ z;_kc_Lt-G4eC=cuX_)pB1GvM=8Z%s5b?(GK6w`ak#KhoDEUW#DYsj@LFaWwF2YMi6 zH)M)|K~T^x)!~lVJTVB40gsj7e^3VNVt=a)C+XOA*jW(u&>}>b>CV-%v6FfT>KFzJ zk1U#rmEa&1jD#@v9H3nzp=C;Mn}yi}sN5rP(j(ljqrJMFR@>kl{6c)u;bQlf9p3Ss)G!KnWQsro^pX}Q} zwWEQn0D~qz#vSm(huvv>VYx45^`sK-soStD<=uaa>xfiJ-I$ zS6^BzyiT&3NI3qTlb~Dss~hwr^u_0MAX zCv-9ooi^|hb(^duC;ATOt2(R*&~m4w zt=hT-+?J&*g+a#WP`Xg6a?z$GbHi+HiQ^n9%nn7`JV=>?v|+AxT=u+5%jYp!=-BhX zSm_0F&gZhfK;8I@7nbtoYdMKhRYc2n9pn6?p)@$$ygg*);(M9`4Cnbbot&?|sY;Jk zL`m53ze`J?1H~G4OJJ&9to2C>Jd&@v&O#?s?Q0G|DjKYhyC;@6JPTMSTTgl7yN-Md zSYkjj@E7kL?OcEvB3H;lt$$llK99eFqW;*83sDp(rCAHLj+(%XTHCM?Rq9z{?pcU- zB1_|_!yVdylEC$G{(}(xxMGPp<`Y`RC^XI(Oy^pnzt~}(k#YX`ScJ7|2$OQ-{CjkS z;if(0D$)i<#QBdk!4{cCiG^=?oIe$6{carisK+-f&fhJe;xeUwazmhWEuFao)CC67 z#6>)o4xpWjxVk-bWD%FYpLu4H77LNw5jmtnexoEY{yt zbb>N(ya-?6ZAN)ZAqVaC1cp_x`_8Ku=1WVpKO7w)+G^0KYix}gEybeh-$$LwbRpW9 zWTkscI#vp;(YJ-%%ULeK#%(#b6zsb!*ET15=%`OeS7$lGMm-RL0*?o`HTbbmskXxn z49=d=Wa3oy74rGDRoq`XGz=`%qD*UF0&;4>^IB^#W=Sj11j>#|%76xP(%Q!12p5*g zB0}RtoZ*hZc!UFLJTVBR^OPRNIMI+!X^rs+a7>5-J5>X|nHbEoYQxNSwkmi~hKb19q9B z7}DT4g|P;}c?{noERch%=%Iojtf9ExIAt_g>p*y&4TlT03RZ=NQ$l5Oz>1O4-AG4V6D>rv-(yC$5H-MHurS;?H zA3pV~c?xoZIq*+y%Kt&to6+9y8}!a#ci7?a04)T^{o#AsxvhB%=#6lJvNQ30M=|h@>vD>r7U1yv6*qb|A^$k=Jg) zdc2=4)^DKz*GvCj$^CCsCv3+d4f|3|m4*}lp*(o}#*Py1dF8x3UsI8-f*gm-My zE{|4PqEwMqW5!-dxS3%n7g)2kA^jQbA0$4nwYVhO?tVt=9m;~|J^tYOi)WGc>^bx( ze?iZVXHn|lOP5~i?%O#bE)c#{KJVDBxh-`_S#as8yYJvyD!cTAJ9dP!_5c55`<#}R z=sk{BESq0)D^`Z0zU@_*AX*ULXNCRMG+D{JblRGkA=-lTEHle7KTr6+8*Gn6f^ zOt|EFT)Pu2Q9k%ZDU>mZ4bY2iL@O;D%tzi|3`L#hC*4I|Coyx>PrT; z&9emu6kK*0X5ZXsjJabslk~==lk^J`Qop^I$bmav<;Jk_|06q2=*_?Mgm=8gZB$%= zcX4U_ApgVfId+)sT)V*KlYWn=IYv3UO$=(Mp9ec~YTAIU8k5y^SFG-hrXm3Nm6J5#s*v0!@ z$2XX|RhLfPKSV;j$8f1E@AxL?xbo5y{^QMta#`|Z+{Me)`z`JqNB)nhc`MX*l$n=K zPs@GvsqeV-)DP|Bp0fPX6SjPt6INYn!X$e5Z7o&yUw`Qd6W>8X1$!=+R@KN+B>eZK zCro^oNu6}*2_Jq}Yui>d4u8?b>;7Xco&I=NbIaamE^n{D{ zYdB40&A+S;{qV&aei9i6wB^=0H!R`ceAm_kT6$uDuT1Z1Et~J|A{Ob~V#@gnojjl= zWe1**Gd{;6rvx*J&?~k)L-y>9gS{e$SMa30lUQXjsn>g$f_k2%;`gv(QthD=?_t$g zIY2Q7wL~@eJ612}Q_LZ)xpF@?yl@ugFlM#N6R_+k689E`pPkvkbB$mI`8cT(gQT;p zq_|r$Fq3?Tv;_@8M=->>Xyuped2*@$k&+7p>+J=0AJnu820zl^4nNI}h z2#e$u039xV!Wh1aA%jN%Im9Lnrpke9ETq>0GRH>x2)RFCr1t=HfQ1ML_yZp6C#<%m ztMTF-R;Cr~U(ND?fVKur1de=AyTw*7yp>;tfoTU3_q=v#1nV zSw=-79(J<0e!z+!4V2h_7U*HeEM-_l`j%=BYt39iF*(H52)HqUYecyc;HlQnxqwcw zi}eNNe#kk$3COlKwle^2W9I@BQ5XSnD{<_j0D}g<1SoDhVWez;nqWh=0Aw@qTUG{9 zr;iv^1!z+{9*rh&nZ>Qs0FAbg; z)?PzVUZ#o1a8z*YCt3?xYK{puS8+S4;=rdq(bk`fG56E|5#!IFGREH?=duF~&L;Jk*6V-Z zGIn?HWTwSn6AbQ$W&eAq?n{^s1WIV@agEb59rr3@|M>{qmi`wEBd#q@9jq zQI;C>3hg_g&7R_!fMs1BYxcbVA(P0@HwMelpd&oYGdfOjODQs6@#DkB;sZ$Y11v1C zktou5MnxoUbj2xakS;ttkV_lBhM*3Nq&?z$EuH)tOUn>YG2dtjCDP!O?EZTFvNZ3q z^KO^K14RIPGfaaIYoiFWc!50^hfN#S{Y6+{Aoc+O6P~Yc0O-dc5{ML*ycUi9VJg}T zrlQSCQ~NiI=;&xxN`L!E(P-;8)?Q5VHnGtscD;{%qb*DfbVI3P;*|Z^Hto;*aiP+7 zHH-hFMMoqk_Nui{s&HY&8r2sU_;PcqpZR|n#aXZvA?8Yby^9GNAv(T`2u2- zk8e1&vXVY!)9Hp*RR{w$!10cj#f^_B@`unKR7`!V==%d3kJQkXAFMsa`t?_|D$kGF zY-_o^!PvxiN=rAt_)#ktJNDUO?GrIiGjy08k=ge&R_i%1tRb7rf7YI|14DA^73zCN zt7gCsVU`FnzhE;VFv_Y~4;I!@7D+6skEHTnEX##3cr*T2*zQ@mHCWvEe$ysk|F1P2 zIjcR#k?CPHSN^WuC*vear$5+8M5BT~upKfm0$bKvs#)`g_JpHNW*jVed7q-bcA4dM zXIXPOy0+X2V}#nZTb$TM`D{m>vl_M?IQK6*vBkBEj>*pC4Cw_lS2W?JFeUJyj=2B< z=seuzmZE+`VSGP8gtMP4nXoB$f~=?4MLMx5^G`~RbS{wtPtcQ*&K?PY4cP7C?SI~} zw9(;R*t$q3>{A}1D8)H|FXyncvw9b2>A?XIiU%u)pgAtqxeSeBD;G5ELZzG;Nai%9ok3s0LH3as%U?n0FdG4cq@u&`Fbv$axM`ovH&IcXYo+WYmMr^3_ z-6r;h9JNB4Ve@czN0Bp^O@#UGq`Cy>2w9p&p5{(Gs8N{GVQD<-vl&Y+k(re?pNgA1 zKa!z+=C)v7OrgasaQmbLtNk@mROgRu?KD~VlzC6%B41}hlJ_)HI={&S~J1k1Dh3N9Pv~Ie3=VoN^``(qlq6 zs>+`ffM51(pkt?;zsg>RS$o>~Yg7E7BbvTS_Kl|LP8}BKqiCg5e_RgSz&Fu!k-dhQ zhp#Kavl0DXK|8TFNkz+(Drrl+z9`!J6Qm9H5_mJmAB76hA9qK4?&Tqa0^CETzEs;? z|5vLT(Os9KEx3S56?@1cOu~`u9(qQS=dOxKSm9=@LAjTUjw))yLNd#&>!E*&&H0-u zKnmJ30DLf>7Dy-3v0nP34Bu#MfGenSJe61GKU4_L@h&fYq@^>wthw~jqw z42*r?_gq8W`sgFDOKC3eqpypM4V96Ww04RTsfwE_2kEUGpV2OS#Idx@_i*=}RH|D5-P=K$V#wo>Qw??XUod96f;zx6g#Ga$xXft8@JrSdBfH>RL47_9y&Z!$Kx(y2b{TC`5TMf zE6u2D^*(Z9aDZ5@7}F8_3BE3-99GxqOL@cfDbe2lq+~oGxWO0jQO$6@pX|qe@(6tS zi2Mk>N21?*Q5=;c(3FDLTr7Uwb^7Cz{56;pp*Opw{D+_86OP<+u-}bdEXeYIig=h5 zofpniJSb1+g&zwq#=2Yxh2R^o$`-m=h2d{cD|7WJN&at;1uoQhAky@5>Aj=HB*`j$ zIypz`5Pu(HJ_akMNJmQ6WJih{uog+*(8Q7YJlQ*#YDQWuCyxFYsq4KzM{j9pZm)@^ z*u!c}g+nZpTDvicxYxQ_Jz2e$Jfn16h5EX673!u@I<7+9CXOw=bG<&A)?KfQ>l$&A zZx|Jg)_*ikj}SFo=Doq3HAeq4qW6Abc@Fwu<2{m(ilyKfS5M(ruHzfYQnDYAEh`KM z^v?Pg^%OlhUVm7w9&dUk=v^E}@J1VPfw}lbJv&nN7Mfdc)?bkM$Mh-s^@`&V?V6^) zFKbh2&2)W{e5lZjnV|+Q$u0Z zn<;Cye$W31dStfl*M#I#XPMLI=y%B1agNHN`PM_eXx+K|u$S+x{8%MYa6NL&yb8Sv zGZs&T@GEJ>m|0oJt^{mgZ+>f-8#A6rWj=M9hb*i%a4YSar~hK*S5{>1ny*JV9EZ$6 zvEI?aAaTl}BC1=Ux3oO|B8pk4-{RO$ix=uQ*<{Y8+J*XX%QJPZ+3hxclcTLjJ7!)= z@{_;;+UnZAoZ>!cO&yfrTsm{R{+#T)j;ij^+XLOV563l^mY+F3%Nnz@@PJLXl1pKvX<-5q?dVMLjwB~gbQ;X z|2tM1*re3M`tPDhzusSPR8dM`x~Pwe_It!LKBt*(|0>$**YAt=_X8rlDl5YLG`LLf zeGPKM)d{!^Ef5I_fKl3yF-^fOjsWzFW)2EKB_u^-3P4pj1$)c%tLiC;TA?S#rY+@( z9FRIVM<6bvUMuu|=|SYV22WO@h$;MBgay0C+^|A_+EG%rw(GgCy)%Fx zH?fP8+2T@q)f8dP)>~oX6$8ZzJ7kB6Tk|8Vu)>EdIKG+OhijP_pZ8%atd3i;!wT#E zNJ@K=Nhb)vZ74y1OJJ^LN#o6-FVh&oR$2yX{Pguj5hIteB6{$j; z!vS!d>V1-m@6ijjWSmA_CKsEv_vrJGVpC`Uq&kW9$oXL@HdE2P`sZ3YQk1F1=D7Rx z$Du^SwEli5Fu`YVFP@HP&;BLm93r*kZAcxg!kiVinLzijXlWWAM@2|02e;8`eES5S z<_iR^xr=zb&lLuXI9tyaczh9IasQ^;a>%IQGv>qx^y6}ZcpOtS8ezA^1y}sfo8#7C zG>!I7YzS0#S%(OoU#H_WwcT`Z9dyvLUF0M^J=)%VvnuE{>PuW)JWq~qG&%wgULsBj z!oCk-UXv@)4y&dB>A3S|U;|w6bvjG>*yvzwLl}0N^VaLhNx?TTa7b9V5YMhRFXchy zwRbFBg>O>jday}(i+17LC-@fZc+Y_?eZzX&?DQU}UFXET_PT{<(>{uM2#VA}%6bTB z4(&s)I|sD%RSR_O+xCUp;p7CYINXiuLwb44yR_jUeY32546{PLOLXv9N_uC}*>I5i zFfD&r$2rw6FyMw*a+r=htS2Q{Vf?n7IC(Ev=>L#n9>HL{;A2|;h(5*WUc-6Cl_?)k z-6Q&>=wNHn+c``LeoPZLpemHzU;JipXZP_%SF@%9phBG3e;hH{`5@ zYONfnPL+D|-ut0;HYkqsg&r`k#?kSEA{S4K`iBTIv2?x3(4tk$g>e`^|klc-Dk9wn`T zm2aCdkL!?dk|_-0XFQ?fy~HP=Vbnf>uEHl!p47jS18Zs6CVjt_Cnhy3&D72MI!D5e z?<B$phP_zS=`H6_`hLSCyPO!Y1hU(J69t$s@HGj_)Vroz(7yND4(8;OTk@Yt^cWyP4|vq z9gL6Bn}>u(J&k#UyZfMfVVJaN{4cHlr~Y_?CxiKDH4`ibctmUKNV!|}RyaezS+3rc zk)NpABZ&787U}|hR%mGQ{)g6V)i)=2@ZN@vN`Ve!p=wFF|I)8uR3586i(pS&eiGj5 z^s+H%cz6KU)NMlpsQ#B8)5jMRu_;o@kB1I5nlEza^R$hCqbwxnhI?>-%hTu-*!ddv zv_Aj5y#KsN-oMj{r}YVa0>Auqw$jfR&enG-JlkwK{%_rTZr;8V7tUMyiu2B)hpY7X zKGM;@CcyLAg$W3J(wKlz+s-E-u>ZmYcxssO*?pvU|Bt-ix=7w{G|v0MXY@{n@~z2j ztt|Kl?R!R_DF^?gUeD?`BH zr7^i|i7>kd;WvA(}Uzg%OPp#;d(*2jxAdPc9L~^DRBU zH+g)VZ$sWe7t3eSOIbO@C8KudW}1ZZ$O}#ol9*L^q?E`9grwul<1n}7`z|P#%PuLU z-lcq*ihOkS+LPolF?M>J(?nBmpVp%^Er?fj{ZhncFBbNfN?%DT)*iB?(ln(>gX$y&uz;<^w^{>0I^ohU!9`q`;ZP+yxk4V;A*r?j9>&qL69 z#_&jyF26R4a*r!5>FwwB-pRq{pxaTQx^c=z)Y;l7CXIvW~iutq2bO*5?!Yk*B2jzi5zV2~QCn5I+;gqYmRnC&9-n)_B+Nkh|!N-%5 z`~Y-toGjugiKs^<(aPGN7>5a61@3soX`?q^(6bVK{V)o}GO_uI?;8=RUVE7F<8G@L zAzcsHG`Ga4!$&G`CxRgIgvp5gKx`GFHI04|^VkFAdr`+8X-iuFqK;P~+HkYuq};&b zlw66yD`d4z{qq!@+^Mz{;m)aT%rh_Qqo5Vzj_H^53`d4HGv)D3nD%}4D`$waW^S>$ zWf9S?p^+)6RQa-wBmT{;#_g~hkv|o=W4Vrr_Kc{9SN$ER7Vxs)O=n(a-6V^;y@Hy= zL-!M3;pM)c>KisM1PRW2@b1kkdXI$a;f)T+bBW5-apVkO?vRsD69dqW2YyMb1FTd{ zF{=VPZ)Uzlb-S@(8+g@vPWZW3_0@9Vd8_>lG^ysh$awO-rbn}3dHHKVA>BoR*C1hh zc)fLxUM)+rsAiA;V5+w)PI05JxY0Mz8ar{N`zEJIYpkkMymM2M>E*o0_9Yg_rt)f@ zRc)T9nFBT_5ss1xP6oEtb4F2SG6zL>MVCy;wm1oOu>k!74_?)Cb|x=6TAYQy{RWfD^E9wK>s3I z{-)luWtOQ(J{AvM7wnKQW(XB6rHPV3c>^Ndbm~n#?aC%QGO+6Ko9G7$lqhCO#?lb4 zp;TE+N^#qAEnJBj{g&Rjtthj1@rAhxN}hZR>w?~87mYvl7TQ&C84cd2cNAjTk3_fc z!q&hAo2=bc z16VN4aXCGCh?T=FRC`DtDtqpstoJcB3*ZD^JTBABl2V@Dltp>( z>l2Jk|1cSOS@2)9=Y9QUIk3R0&p58nf%9qW2YUN=o#9p`rmtCX;(HAa(ev!=}iv3KVC@ar!g)Fqc*_2SL4`xqZ zZCIfCx$c3O!cEwEHZA;IZy`qx4PO%~{$8INyQA9X z#v2wly!*_P-|OE+u#l>kaLRsO%EP9i5RKmV%&1fPR%v$ zoWFsU@E8Av9WL(&wEZ_MIR%dj_5JCtMQ!d z#f3BuBVG2sPpciqLiR_>mOo22uw8VJDsBH>+ut|BiZ6&T$~gX{?T?SN{2L;z_&t%v z0Axc>#dy~7letSVE^{a!VFlzPTuW(y9gEg!#vYY?(C$BwyC+f=| zJY&`*8E-{6KB5iD24+3K(#~W9%H=QSkz~&1BeN>i$iSx4K{}FdF(Iw}^DFRGO?vrRjdD>zA)eJc|`A z!s-2kja$hH-t3zAY*~n>> z%KsaU?rhxbP-%N-qX%b(0=l^X5oX>=(OeJ4_6gGI>WNOSO7n2iD?2(&gex} z$=k3*h^$0T-c%S^7;PgQS>}^h8P`VW6=pM5Ka>Z}GakcK9BZg52aH@x`}pId6FEj( z$NS{G#z-kyYQcI-p)Wbe!!pbFmY6y)4#m6NjxVcFYC`dEgvGD0^SV1M{p(@zk67`+ zN3l#9VdD=r#Fqru*%>@sp%jGxUTXkQR@oWc3j%O4n;>v^Sp0o<`~zX}uZZ|GEYPv#m^WzU-wHPX1D&DMHt+v12&$a`{?sn9xoBaJTH4|xO;)u>ca zV5BjE4`#=VGMYQKQ-@K;V~*!&?#_=~U~vf1F<#l^75SMYjTC|r86zIdwglGr$?kMleq7WX{Gj5k`f zgmEFR*b&7Fl!isWK!e5`6Xby(P~~`xRv7HYO+b>0ilZ~VV&mIf3C>*p4`6dIj3q1+Y z9-g=D+?*H5?L`YkZ5WDRS8`4PimsG3g>&13_cuAWXD!ewM?=}XJ*k{Qd(w6WWdqPD zMtcV~oAOapxMLA^P@;|dtjDUjtEs_HOi#XXxvW{`Eya_ZMn~J@qbCcE?1aEw5N)t+ z!t=4rm~yeuu$WF18c^9v%(kRk)Td1w`R1Z0563NB^(7Fs?mN{8ss_>R zKDA{B3R>x)7$JMwHUf*9XSC8iR-+FNfc=HhTpwtAp<1#x$MX6I<6%K~$JpL+RLp@z)0G;>~y#I%?XPbi;8sA}4 zY#Q~t9d#uY(Dd8EHP2*o&F#!JT=cnju`v}8XQjyX*eml!MBe1bhgn6;rQCBd!< zVa@;MbtOitl8K@>i&*J~@bYsi(Qz!^w60I7oVJ!MR^c$ipq4%()-j2)d`8MSZNfs^JCqE!Hh)4zJ`AsURPIAN!&T@$H2wsh@u;|D z(`PKuKt9%hrqj5k#te?Z!cP$kq8_p`ZQU{?no6yg8CN*|M#GjtR{f3kE`zN4dkBPz zN(Id7Qlo2=ooqnX6ZQ*u327(oD}};~C%~5*SG0UVtd@in2ObGTvAr)+!E)$`7zwJD zVtUhRgY&ko54VP6{-$iG-G&M>k8o(S{HEJT9-}F9x5oq z0DZ`eUttWC@f~-!;c~R8MpiNT>lC?k)7_4UO+y@|n}d=Gaw_}_@KpLL%x3&`bY>Mq zSv9r3$GEZ?CJt^faX?`;MvhgVYMONq7+6ia?g7KADQh)qp_(SHHg4k_q$c@m47oII zl_Mf;Xjl%)>r}Ve%3=DwM*DEoFxwKSPgm2E_ZlByLb3Qh(C|7{-e*(*b+`L5mwBCv z?ni$HfhX^WaIL2JawEU#>pZi;gu|}gve#*4xzQyNV>8C;3S8M`?akKL>prU@Cp=(8 z(I4eT>ct`7u7~V&Q6PU!Jx~C%hJh3j zaURPUhFb*piSi1_$y%-vsA8X(+bf_Fv*cQ9{J~SC*6YBPW8_(fo^y=y)*0V%Xf7Fj zFdH>jlX08usH4b-!7W?~^e|==byWGVF|g#gjq(IkGCOCfyq+p0__ZDXp9-bUVNoXC z7Z!igidVj`P~4&Pt3&Zv{5u6>5lA@O=yAT70;WZHVR9$>Ttb=LXyXBacwjujy!{d5 z5y!1{`Ga)Wegz_N6b2o`Ev3Y7^z>vNC}ZlN|9iNTpgKiZh0(o^7iZDVnwyMgRZbmW zq?$igmn?sey8OuJQ1wtgVxNmliQneQUl|!|;cHe$zP~{%;IZAm89(7u{;2S6ebktv z*I9-1{$!>;X58aIY*nSv{_;AW@d*;J87R;+kkG_J+r3Vd)5rnyH=;AtQMZj~qIEQJ zqj7_y&fLBc71l(laC#)OJ!oF0H8X1;H|9jNYi8$(z5ObgYQ+OfA2MU@@K#i`8RDlE zt=w!}({w0jQ=z6`C%#(3WUAe4q%>`91y{GTg4Jv@{_n>67G~8eMz6*4nW6N}m9Cl1 zH(#46wSge+=1-NJ_(sC@eW)YN8SNTKPxo~tVe<8MU)PKBhr`TOSGj(b<%8Ezna7pk zaG2XXuAUA@FZ#N_tE;>-my!m!ddQU{Y3u-3j(lPyJvzYErCG~SnNli{PMI|)|CY%` zMTc`UB{wad=4wH?V_jXT(?C~?cH;n)2cWwglH|rW8WEa_{(X3jw{Y#gS5T|ARES-_g&*s zWqF@$t{dX&qI8a*lqn?x*?72UxR8JJIsV}xKm9Vo)z%SDEw6L6Z5o1xMkjUW)HDRa zh@BB0n}L|YBKD!{T+g=IaHv7BWk#=r*Dsx>$4mUL&=^}Y&9z8YEm5%+}{Ucqs z$mNr%-ze8+IerQ~I>wbiXGggPwb?MmLb=KQ*2JHKvIku`)-~A?L8q^GO>0`5pDEn| z=Z7nYbDFn~c3t6+_Z2YCq57ag3*B(~VN8gF76$pBh4koH*K=*ErdlA++uws%o|EI> zL2%1)uFPiZr)5fsDE;c(w1&n;;}IqAn?_~hTH{o49d%L7v5e}m|t92 z;10!|nPWbh=fa{OTK%U}(EJ_U=*t3EiaxP8Q#AUSX468~_YOxCIi|Vh%f5xQaGGnO zd}<+mH_bI$zWX+sG~M+KL{HNh==`l{$PCxD_^h4bT7gMio0+bwV>jH9DK$a<|G<~~ z(_44Y?3u3Pj&U^R7FSB#F$8}NcN$Jw1nv*dr0;WFm($K$T)B>kq|b7-Dv63qmnPns zDYZuWE^yo*cgChm2jTb|a_kSeP<+ULso${l-RhD46_Riw@S97K)w}~LS6U3RSdy}f z!SBVflswy&ozCGQDO=YxUAlF~>>0N%xK+B{4(GUGv9xfuE4ghr4iDmea4bj}XSes- z(|>MpwJCAmW$~yz0x?cXA%8A@GtWZ)q4+%jjx*|jFK2WRJPyU@z#q%u2;)D!W{#L`}y~!gmE4sA5Lc%AQuJAE8%~(TbYAT!!g`G`x{D=Wv9z!JYkO0rnX9#vfvKm_h|dezf1Vv>ac)Q@N-zW~5DX4TdX%TMxGjZYAm|q#B%TlP)c94J7pKT-TM+%MrzY+{mZ5rgzr52FO)D zS~SmI8BcXIwMg~jf|dGqGX>*Fp!T)Y+6 zrH6aeoCU=*W={)6BHU-E?UdX=%J!6WX&C(Rbk%%Ub7Ln!xZl0GlqSu0^_y@6{+`00 zDab3DGq2d4m*<`_-@Rb=Ewks`Hd~TXmt{&SU^4LK5=M>4l(2*#<-*T@xf$tF0bCK> za=7(yvzF1%^IcuK6ayv!Fsty5!#B&FKYjA-*@d%io>9=p-BAj~S0SF|$IHuTLa{5k zmMC*k5RhkSv{g6jo02+jw$8mHlaCLCqIs*W1Iowvbop7~qC*js~ zK@))63wIFiES$3|kiqqZD}XD4TMV}nZVlWnxD#+O-O$6}*24whBD({=J1tt^N;FQD zTFf(+)1wQZ8?;`YDJ6jceeiYRYlSD!nFX%+*gOQbYaE%h(3Ks#0pZ;I!V*nd=;{}H z1mUb5s{VRpPcL*O8Cmc*w~)WT(3LKa_R}8=U6bU+ewuWfD^Wh;r$x7+;hyo+W_+_# z%g)W$YDu@wm_MJJr(NIf!r28KzNmU5v z7Hoj8+|l#rpqb|v&zLj20ar~uE(>M@%FjIsxIbFtYE6$LgV@NstqhX!Wp%`g93YRo zo09HC;Wr?>CBk>$%S0o7=AB4)0)EyUf56wSz{l@IVcn~&!e6%Pwtg<PaJfu7pwL_`MUZ7S7oV;sMSLmjzb@w;k>X zT#MfD!>xzg1D8K*2AXAkE6VG1zg3{C?N=t4(Y!0$E!t#+SPeA`_Ro7WP;V z|1kKE;mfrUQI7czz87lhZp3j@N80M8uCel z9X8Z_Nh*JUvP&Uiwmv{ZOI=CIUdBU{7rGKIE1EZF&Qyy9l62w$dax8NIp)DkDaE2! zh^|5KbBhK2-<7(CcAN!&f8n<(YsTz_lV{B+K*kGZ7Z=Venmn)gjsRfdY4UBZ=JJsT zY0+|If9642w;a+azQU3&Ir!Ra`FXi(RBSQ)eSr39d|8SiyGPf%5~KUL^Q6NFvq@Oy zcTI_v)?`XNN@n8A?FX_+IHvo3lPrkJeW|}Iq)0c55OG@3wK_Pv9&$}JEP?Q=oUg^hjAtxE;8e<9iD}6 zxa06}KmY#gu#$!Z49J;?j5wj4VI_WtyOZ!24S*&Aw;iq)E@~jO47dWg?Qk`4(jX{X zaJR$lfs6O1OCGq1a4X@e;Et5w-x;|09F!VvG+Z%UCEPB!!*HkIVy*$9aEsyA!|jBt zg&Q;&#K3KUtARTUmpTL)!A*qQ3zs_->EO1&oq&tH7I?3+w8Chf&{g&a^&XUX9DO&} z)hGHOBKeQo(%GwpikcC%K2y31{;p8ExUG3v3msE5ZQkU9!WzIc9(IRsra$g>C0-UD zcI<|9`gpLbWs~qg4-H@C>e?tsqI*}luIaiD=y)LHY2rS)y)=Kpl=;OoiWd|Y-aNf< z#{{2MMs&`ix9@eeY793io&Gt@mDVUQYE(LXhQRhrEq5*^Y&y8l zqZO+v;iVWhIh`_xyEZl|MGFr&H{3NhIvn!JiM08CS5C|+U}Xh|OV$aEkXNe)($(dz z&Lzcv=)|VQ;!FB2Xads|nQC0h+ z-wbHvjD}`Lia07LD89|e$jHb@$*9cC$k0%+NJ*)vsIjsRb*RidEh;KB@~D}QqM-7D zkIIUSiVO`6m5Pi^i_A>ret$E2u@~NR@Bf~=KcB^(@9+0p@Aul9nI!I#2yx*eo0@AS zbJxv>T4=@6bk3UQp6;tQjJET6(j+JF+8fCcoPaBwOv-RoxJF#)O>_ucDlQ9`k1N4d z;Hq(laf8#)>RC!R}LwcR~^jCytwXT}#Sa^DzfT9jgKa@9n&dXaltm?@L; zQ$ZQ-%Y4?t;{MiixFX!ExR7)bhns|3kE_RdrqcPQ^|2ywa@S5+JFVCJ|91EN{|8_u zLOv%?XXk`#%3xTs@AA3U{#pY8gg-gawz@_7|aJjezxP`cKTpcdr zHmVXgA6J0ejtjY+jN)=`@6*>R=R*@NHH*<1S595)9~2uG>U z{^h>Rm0Y4aJ?9?VuNsx^Fh#dWy6%`hFK6l<*_fI-28zd?b4Ru}Wm#(7bM9e-yu@UV zv4Lf!GrpQ$WPEL&=03Oc-04&2&6#bg>Tgh^l)G!I7*f@A;Av-} zJF?RRSoR`1Cgg3OXBo8sxh$jL5zo7O4Jd_WZxBp)Qo4F`>R%7ayx^TTUFMiN2~Vwi zo|SCj^X|?rYq?teJS*V1I=sNWV7VG7_f^Z)_!n3iS1#A_sQZME zIo#nz_h{Ad0z37n75)8ZqcgZmQy`Hj$95`!FM|#FZ7;e9_G>^c8$H*`fc=cQbMBiy z+Z&h|<)lXEW~JKlqWiW^iP%ZW&g3o)>dBRAR1xdh^{^Dy7u;n-WxcLmE^?1<7x8+3 z>mrbJ94z7lAQP7LA^g3m)z%dT8L0in&0IvhwUG}u4cdFp4+Jro(7L!71({^ z>9?2M4|d9i=OF)%dt2^A_VCN>4*BW9l`p%;w2676KVSMf^>+8UzL!e+TT5}Paqr?d zpttJhv9Q6(T{~gzv|jUndpG?1S_1vQ1!5*bK3C+>@&AKs{139^yZ(3EEW!wMXtox~ zhZ$j71Wc2vd$D_1_rleI4aQ3Dva^4SyF7o{#yzOzk>)_vJjv}=Pv7jmNc~mp?%ye! zkfJb?;5oRr8dj?jOQ@>v)&w@{U$9A#4e@tt)O$)9| zbRx~OVA)b?z73XmHGAo4((N^$1xq_N8GB!gfZxk%lLJ?h);3;a>2mH`U7}?uqRp-U^I=6W&s%N;p=@g9nPgx77I882Tz< zDg7VcQjfhxFAXUT>@?xkueryzi-V=GCX_1IGVJHWG71!~QzMr#M3tAS$;&wIsX;Eg z*`G_*%gfxOeGzX5!WqV0(zEI}CaC}5>i>f*@%R7Tw%WFnyLM)HT5rpI|1mPt!|9(- z3*dkBZze)MkMz>v-U-xx@;ko3o>>c~W@OBrK5w2?M33xDX~<+z`+8q1`>tuX+&=wY zza0O5dFCqNo-=Ry+*`8e&YClKR?fYIQHY-q zA0KF8mWNL37ucKvr`my=@`hjgSeIuEJ^%b67q+suux}#b@V{77;4*Owapkx=T*Pr! zNVqKAT3ijT^WUtHQu&jMTYy`ItHzzcg`U6wmw?N_72ry76}Sdm6V5tGE^*1YY+NC( z1a|@#b&9<(E(ceH+lH&coxm+l~;PP;H1$LL-(~rFB$^wn_&ocGI z3Qm4P%LBa?-nfGKJ^_|PS@_Tj_t17(u*_C)zm?3x%V9Y)g(t4WzS^;WY$eArA@2sJ z*huaJup9TTIHunf(Zdsc~c{&wGJ*wEX<{)NbtCO|s?K zby^5(nfQKS@c5H_OB0-aM|RG=-t4*4XUxjY zdSAKTkPeQGOz(s>@(l)ra#*Hq3HuH5T-OqYdJ4VEvtF%!!`-h<+baWD%^z>L zd$gMb%h446B3Cmo6~Qv_z*APc`?aqXdq2ypbIl8Q3EL1Di!j-^nj_oU^%~l{l|kP zu$;}o~##h2yGAy9qxQ+r%faMqy{$U--&!|ux-gJ-cRe*dn^3%`c zYLLr0iTHoh-A5I_>F(U_7(zMV3kXNGOV}JZWro|n#bM$CSRyInZr8$XZ&7;Aa;S@f+WA_Zgi4%L-SQQL=qZ636L@9*8VH2Udv#tSs#1dV;&OsH`ojPpNyT zZyj8Q+ko4Ko7ASSm4VB~<>B&ii*Z%BT3iFJ3FmFw*Gk4^Vci4oKpcnz~-lk^1Lz8HPWgLN5zQcp7m=6NufR6Nv57ZCuP&*mOWoeCF zhcarf0G9Cv9tmGu4ohwBCOj$q(00_4;c`M-v*<+T`H)&uS8e1yv#K(8n6EQ@DgODt zdw&K@mL8}1b@V1*#1tc|n}N6VAJF@zn-fOyxkSR|3hUO_D#C5Ug+}zXI^z;?G7fID zZRAe6)h*@jE4$VJvTv#9F5T4qQGfrktkXwoOSyYmJFQRrNDX|K!FCmTS#fOoNKJW{ z8mj$Bz5K4bmn&ks+VZY@q)$K1OWYnfZ=cJZ$gI@vG+&(DwG-A(>oxzkciVqzOMw4V z0A?cO^9f2x@8u(Uu-8Xc8_`$&dZ+usvyP#ZOL9`wy|4QGU+zm?1s|)4@6%rPeH?g{ z{qx7_!S{I^;EYeymiK9IiJt@(ahac}Q}4UG`0`*`s%LVSfEEtv%hTt+{=0nEEHW+E zpZ|aEr-kS92l{^t$V`NMP8!kIO2^4vJ7Mj#Ui1I`p6PhhhW}jvtrH=BW%XD4X`toH zU51X@Pt|=J++EK&2GdaeZ-<2~##oA6T>0gF^-*grM<3H?-#RCQXWIkk&P%OSqc^(8 zU%b6CuxFBvCUb!1WLS0qny-Xq*w#E2j#hg+c?R}wkv)Yh(Xc6n$NO1DZerTheh1LW zW$@Zwsczduzv8}flY5Kn;T>vrg?n_LrX7JnsQu@G!KoK_*^0{?s*51;bG5UAJ~$ZL zOK{_H*W;$)vT?=uk!$$_3=lZEYbUIo)@%MR?~__0_!0Eo2?(1tEgX16Q z`)o)4Pb++jJNK+ts`^`*Ukk45hUF73R za22@PuhgOs+^5Dyd>yEZTj$=Joim50QQ4WZZnYl`N1>CcMo;=|*`&i;iO6N$p2d@j zoXmjnq_5SX4_S0%eXZJke&p`bHNm!- zJ$>d>c>v*^%VX*cHuO8yp^qe;J5{^wtfupKs(#zuBiby-evmq{#oaI1s@tg+ZD&di z`$oOPz1{F{0_khKO6|wimHv(D`Z4;#Z`7!d-CahlM=#~UQ~1EnbZVA&Mj$$?8l4t44MBgnL1a8u$tCgRH7iW8jh7@GJG8{j&AWqJm}jZPlZb!xXJ+Ilo0_?NTpG zcoDnQ#!o1(gk5U4@T6VpINUXNSL?Rn{|5o;X7MgH@Kg8D$W`cNt*7&C)?eK&_28$R zBcH%V)^(;0Z#xIFj@-LDFw|C#XGf!gUUQ%0;VpxycTDGXgL%oj)gc0LW$jj-D!DJ* ztwzYbbhnyZ>5d#xV|#9C0QTX+G2}9*+%Bsbty+y=SKPO1MzwFyI|C7(M zvDJJjpQS-;*;}@^$~`{F6 zYhElb-aJ|3zNuZ>kAa}lepJ8JxMz1-Z?oKGi}&S^YVI!g>~_N%0%x=F4eH=7{^e)= zk80>{{*z`c@_xp7c->BSnA)`4-7&fz%~V40;)da>^2s#r7|!!}tmVZGSAXnw-_$1i zClb*T$RL$i>pt(o%;~u-@~kR!x8hx#44ax6om=t!ux#S1eo}|Nb>Dq$&cXf`+gs~S zTr^JegM5|)50g_3mT+Y|sr54T$gq=hP`y*@zU{_@pZi>FwRpLYsKJ_aOrCL9(NC4nwa5D`qAQ| zSS$IZSSu0Pv^jIKrca&C`@wXH#=v3A5bhH7EZ(S^$qSLFtfbR)5myJ!ceE|9gpx#t zM69#1b>m0tcrD=!d2Q4xXjGAV-Mf7qf9Y>c!QgvRBtyS8)c15RPw&zl`9kbvm8!^Y1oE zM*>HASI?s&$g8w8afy5`z)5+COCuTfTFJ^ru2=Xm@5TmRN5V$@>tvQ!$6A-&H7{ol zr#-x^)GF-Zlx^0mX>+H}y;t3Tzqi9p)?&T0tP z8+Sf#4DMRo3G_E{pMlH9J%IZMZZWPHw+^=z_XX}p-0!$s2=^5CGn!Zl;kx67;}UTx zxTn!iY3lE@vVdINKX5PLUc;@$ZNP2EeTJ*2cy-a&P;?EjF5;5SG}($k%dm@W(7c?C zLG$L`I%w9ML3hl_kdcx1hK>f7MDy5+df}-VcTb&tt6Fw|2|5>@Opqx@10`F2)L*i$ zV@K7?4eqW3ynhCk#WC0?e2Fz;yh{F`XHNqTW|MH<4=x^fg`1xto>7s|H(bYSBcFeIQ3(vxk#%vx#2D1{FJVTjf~Gy zHra2+TA9cjNsCUO*#bi9t>?VP_<58kXiDVdg5pI(0*aZ18dA^?lQQ0 zr`?+~eV%v5)LB{6GhnSxI<9{BndMf-an-hw7x=dvS2G&jquVs%Z&;u&e$eP1)F193qPTD|Kc9gVbvigytRy-he+@86Keb+p1o9`P%j*k zCF@DG@eoVdF(=ibL+;;vV@?K^tOrR1ZO+OM>1Wmd4{ka7Qp2Xg`20WlJxzbb|1q-d z{~^#?WXU+)azY>LXD!U{XEi;omK}Caxyjoc$joo#L>@5Bn3^?DW_v9^pXM#k%ry^$ zd%?17EXA)}BaP1$$fR<(t6Pq^W7~g^Kx!wBw%l92bcE?$`_uO!@xzCYxM2A3!50j> zVDN=JSsXEBgw`eScusnm4(3jR8EeNU@yIG8*Z(GS;4TwT_%-xa?r-2oZVNxdXXc-> zi+*#T6V!cOP@KQ{CR`QxN7q%{rO$0b9^^j}Q!oDRzOa|u73W_dbm1<$f_v;~F9DW$ zep8S-`a7=zX}c`svS>u!r-|lM^B3O=)w8YVJhiut zr$dWuWkA-Ut*2d!>~)b{(1NRNlfT_l+BtX4y>+^G9y{~t_Q8O9 z{e*i!r%-pCf9cwtyEM-e?bN{&?h&JB!_vUVkYZWJnJmM<<_oD)S^8?8*}`htN%x3O zb%Z1KvRsyXox5!1Nq47ESKZlaV;j#vxgTod=_mKDZ9Sug)}0;aKk>W|V<|1ooB1rI zqWL(VWi5@rC))C}YFd8pX?5e%id>A%0HwZ7cAv(c)A&v}%1FT7@C^n(0?Q<)GB6pVj&^3Ix_F+Eq_IOF97nUc}1$42Tif-o5y{4QBN(B3m> z)Ox!||BZ>Pp*lsx`AfW=mliW4M}`hd+jy=H^#0+tO{WNTu)Qa;iv;^0#?HtNo)KLa zVk=QEc&UZ zYPrWhs&>eI!DH%>+)MtUIz)K7jI8~~$>w7ccv6SNl!t=yU5^L*=Q0_<%JWY)&kyLl z$)e-4#3vsj9#>N$h%f7Lbzg*sgSG<otEC|i4+E50t(C5_NNUAUHIdwde>We6p z>_)n33)QF|j9;GTPd0B;mv;4>E#ZZ_);_OZjwbMh1U@%D_%!@2a?774)g!xA7bQ|^}3r809qB_*W(%j#vXC$eAuE3K>X z1iFQWOiDfM494hJ0;PV!>j~`|R(!HKMgmQC>Mt21Z?TH(N$D;uR-<})dQF+XJCl5@!ZBgOQnoPA;+-!%ossfNVIjq`-LAGC)We z%h9F1<`lZf)+5V9ro)x=RE5&Eb6!&eyL-B-ie8?O^BS?h(0_?V2(w2WvI2E!wCCKm zQDDk4b-WiD;QjEfy}7SisYY@SYE*aj_MAPwNKD>1*_A- zTiZ+i>XB!yR`2!pbRAjY=)=r`FoMl*#2N;&KpC`ZtnujL)~XIso-VTnuWeng8R+7X z>3Ws&$wd}(nq2`h@#{q|m)I2}OE6?oN~Oq>ktM6CT|MWXSq)~dJK4O@Uub7GfpuV} zTH^Jb8{e6UH|DL@35r2B*pS5#Xacf$WQzlXX1ZD%;|Xsk(Pg43ep`)-ru5_9QB&kz z^p1K^?)7CdP;_;blm`Zks%XZ~jCW5qugBx*?KOhN5b|E@b}D%sj(j+BvwV_~MIn;} z$R%}}hAa-5R|Ixn5_yj8KVRgoNi+SuQ4|FzN+b{o*=QUk$d_+y9gx4#B43NVN&?~% zSrxLZO^j$#>0EKRdSrPO>b*Xmfn8EQq^SLxfG&o0QSpcB6gpS+Cu(3{I%nFaC!34K zCaJ^1AX=!TEg!r3Pt_FBXI7qUE;>zLj=r%{J%xVgg3nGiuQl|Nt_JiGJDft3f;xfB zgDl^rcF+*JMsS#sQ{@z56gGpA14AcQZ6sf z!=`TdPijA5PTqF#WV0oeoD~?&C4a&cXP;_b9vCG8%i8A#ctXc4Jm*w% z8W!S555g%}S0m2~$P+~_MU{a(rpu|8YVsn>MV8z}jUT|m*%N-Mxh~LWy(+sK3+IJI zF>zbOspjH93HYOsplb1!5_zg+c_gyKwoI}km&igW#tg$wbm4xPIyAsDaCDm2Nsid3 zq02+&<+EH;3)%e1N0x2Wf^@rl${Ug^0thQnLqpdbPQl`N)SZLr|CNJ1q5bBko@yQ}3E`3w=}dbpLMEjzm*hMKSxKroHJE{~37vmXHZn8` zebO~*;1Ew2*Wzo`m?6|w#&v4O5c=J!3F-;B%dv^HBx%}Q5@rK_j!jY<@zXDBvJ;;_ z4GbhX$ovI_ZHzc%g_G5(A)JrdAfF~x%*UL z)q-5gEEnD3d(`-0p2$&&_u8!pxx~Lp{2@Cm>EaSu1+wJ(ojQ>4tC3~guT~PiuMS

wMX2t8{Oy|6@d5;2!r~;9g?i{e1m2zIWm- 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 anyhow::Result<()> { Commands::Genesis(args) => runners::genesis::run(args).await, Commands::Fixtures(cmd) => match cmd.command { fixtures::Cmds::UpdateClient(args) => update_client::run(args).await, - fixtures::Cmds::Membership(args) => verify_membership::run(args).await, + fixtures::Cmds::Membership(args) => membership::run(args).await, }, } } diff --git a/operator/src/cli/command.rs b/operator/src/cli/command.rs index 5b91313..5efd6ce 100644 --- a/operator/src/cli/command.rs +++ b/operator/src/cli/command.rs @@ -89,7 +89,7 @@ pub mod fixtures { pub output_path: String, } - /// The arguments for the `VerifyMembership` fixture executable. + /// The arguments for the `Membership` fixture executable. #[derive(Parser, Debug, Clone)] #[command(about = "Generate the verify (non)membership fixture")] pub struct MembershipCmd { @@ -97,9 +97,9 @@ pub mod fixtures { #[clap(long)] pub trusted_block: u32, - /// Key path to prove membership. - #[clap(long)] - pub key_path: String, + /// Key paths to prove membership. + #[clap(long, value_delimiter = ',')] + pub key_paths: Vec, /// Fixture path. #[clap(long, short = 'o')] diff --git a/operator/src/prover.rs b/operator/src/prover.rs index 1572701..b59916f 100644 --- a/operator/src/prover.rs +++ b/operator/src/prover.rs @@ -89,23 +89,27 @@ impl SP1ICS07TendermintProver { } impl SP1ICS07TendermintProver { - /// Generate a proof of a verify membership from `trusted_consensus_state` to a proposed header. + /// Generate a proof of verify (non)membership for multiple key-value pairs. /// /// # Panics /// Panics if the proof cannot be generated or the proof is invalid. #[must_use] pub fn generate_proof( &self, - root: &[u8], - path: &str, - proof: MerkleProof, - value: &[u8], + commitment_root: &[u8], + kv_proofs: Vec<(String, MerkleProof, Vec)>, ) -> SP1PlonkBn254Proof { + assert!(!kv_proofs.is_empty(), "No key-value pairs to prove"); + let len = u8::try_from(kv_proofs.len()).expect("too many key-value pairs"); + let mut stdin = SP1Stdin::new(); - stdin.write_slice(root); - stdin.write_slice(path.as_bytes()); - stdin.write_vec(proof.encode_vec()); - stdin.write_slice(value); + stdin.write_slice(commitment_root); + stdin.write_vec(vec![len]); + for (path, proof, value) in kv_proofs { + stdin.write_slice(path.as_bytes()); + stdin.write_vec(proof.encode_vec()); + stdin.write_vec(value); + } // Generate the proof. Depending on SP1_PROVER env variable, this may be a mock, local or // network proof. diff --git a/operator/src/runners/fixtures/verify_membership.rs b/operator/src/runners/fixtures/membership.rs similarity index 64% rename from operator/src/runners/fixtures/verify_membership.rs rename to operator/src/runners/fixtures/membership.rs index b3fc716..53816e6 100644 --- a/operator/src/runners/fixtures/verify_membership.rs +++ b/operator/src/runners/fixtures/membership.rs @@ -1,4 +1,4 @@ -//! Runner for generating `verify_membership` fixtures +//! Runner for generating `membership` fixtures use crate::{ cli::command::fixtures::MembershipCmd, @@ -8,6 +8,7 @@ use crate::{ rpc::TendermintRPCClient, }; use alloy_sol_types::SolValue; +use ibc_core_commitment_types::merkle::MerkleProof; use serde::{Deserialize, Serialize}; use sp1_ics07_tendermint_solidity::sp1_ics07_tendermint::{ ConsensusState as SolConsensusState, MembershipOutput, @@ -20,7 +21,7 @@ use tendermint_rpc::Client; /// The fixture data to be used in [`UpdateClientProgram`] tests. #[derive(Debug, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] -struct SP1ICS07VerifyMembershipFixture { +struct SP1ICS07MembershipFixture { /// The proof height. proof_height: u32, /// The encoded trusted client state. @@ -31,19 +32,21 @@ struct SP1ICS07VerifyMembershipFixture { commitment_root: String, /// The encoded key for the [`UpdateClientProgram`]. update_client_vkey: String, - /// The encoded key for the [`VerifyMembershipProgram`]. - verify_membership_vkey: String, + /// The encoded key for the [`MembershipProgram`]. + membership_vkey: String, /// The encoded public values. public_values: String, /// The encoded proof. proof: String, - /// Hex-encoded value. - value: String, + /// Hex-encoded `KVPair` value. + kv_pairs: String, } /// Writes the proof data for the given trusted and target blocks to the given fixture path. #[allow(clippy::missing_errors_doc, clippy::missing_panics_doc)] pub async fn run(args: MembershipCmd) -> anyhow::Result<()> { + assert!(!args.key_paths.is_empty()); + let tm_rpc_client = TendermintRPCClient::default(); let verify_mem_prover = SP1ICS07TendermintProver::::default(); @@ -57,37 +60,40 @@ pub async fn run(args: MembershipCmd) -> anyhow::Result<()> { let trusted_consensus_state = trusted_light_block.to_consensus_state(); let commitment_root_bytes = trusted_consensus_state.root.as_bytes().to_vec(); - let res = tm_rpc_client - .as_tm_client() - .abci_query( - Some("store/ibc/key".to_string()), - args.key_path.as_bytes(), - // Proof height should be the block before the target block. - Some((args.trusted_block - 1).into()), - true, - ) - .await?; + let kv_proofs: Vec<(String, MerkleProof, Vec)> = + futures::future::try_join_all(args.key_paths.into_iter().map(|key_path| async { + let res = tm_rpc_client + .as_tm_client() + .abci_query( + Some("store/ibc/key".to_string()), + key_path.as_bytes(), + // Proof height should be the block before the target block. + Some((args.trusted_block - 1).into()), + true, + ) + .await?; - assert_eq!(u32::try_from(res.height.value())? + 1, args.trusted_block); - assert_eq!(res.key.as_slice(), args.key_path.as_bytes()); - let vm_proof = convert_tm_to_ics_merkle_proof(&res.proof.unwrap())?; - let value = res.value; - if value.is_empty() { - log::info!("Verifying non-membership"); - } - assert!(!vm_proof.proofs.is_empty()); + assert_eq!(u32::try_from(res.height.value())? + 1, args.trusted_block); + assert_eq!(res.key.as_slice(), key_path.as_bytes()); + let vm_proof = convert_tm_to_ics_merkle_proof(&res.proof.unwrap())?; + let value = res.value; + if value.is_empty() { + log::info!("Verifying non-membership"); + } + assert!(!vm_proof.proofs.is_empty()); + + anyhow::Ok((key_path, vm_proof, value)) + })) + .await?; // Generate a header update proof for the specified blocks. - let proof_data = - verify_mem_prover.generate_proof(&commitment_root_bytes, &args.key_path, vm_proof, &value); + let proof_data = verify_mem_prover.generate_proof(&commitment_root_bytes, kv_proofs); let bytes = proof_data.public_values.as_slice(); let output = MembershipOutput::abi_decode(bytes, true).unwrap(); - assert_eq!(output.key_path, args.key_path); - assert_eq!(output.value.to_vec(), value); assert_eq!(output.commitment_root.as_slice(), &commitment_root_bytes); - let fixture = SP1ICS07VerifyMembershipFixture { + let fixture = SP1ICS07MembershipFixture { trusted_client_state: hex::encode(trusted_client_state.abi_encode()), proof_height: args.trusted_block, trusted_consensus_state: hex::encode( @@ -95,10 +101,10 @@ pub async fn run(args: MembershipCmd) -> anyhow::Result<()> { ), commitment_root: hex::encode(&commitment_root_bytes), update_client_vkey: UpdateClientProgram::get_vkey().bytes32(), - verify_membership_vkey: verify_mem_prover.vkey.bytes32(), + membership_vkey: verify_mem_prover.vkey.bytes32(), public_values: proof_data.public_values.bytes(), proof: proof_data.bytes(), - value: hex::encode(value), + kv_pairs: hex::encode(output.kv_pairs.abi_encode()), }; // Save the proof data to the file path. diff --git a/operator/src/runners/fixtures/mod.rs b/operator/src/runners/fixtures/mod.rs index a651d5b..c9e2bd3 100644 --- a/operator/src/runners/fixtures/mod.rs +++ b/operator/src/runners/fixtures/mod.rs @@ -1,4 +1,4 @@ //! Runners for generating fixtures for testing of the programs. +pub mod membership; pub mod update_client; -pub mod verify_membership; diff --git a/operator/src/runners/fixtures/update_client.rs b/operator/src/runners/fixtures/update_client.rs index f04ce80..7ac64af 100644 --- a/operator/src/runners/fixtures/update_client.rs +++ b/operator/src/runners/fixtures/update_client.rs @@ -27,8 +27,8 @@ struct SP1ICS07UpdateClientFixture { target_height: u32, /// The encoded key for the [`UpdateClientProgram`]. update_client_vkey: String, - /// The encoded key for the [`VerifyMembershipProgram`]. - verify_membership_vkey: String, + /// The encoded key for the [`MembershipProgram`]. + membership_vkey: String, /// The encoded public values. public_values: String, /// The encoded proof. @@ -77,7 +77,7 @@ pub async fn run(args: UpdateClientCmd) -> anyhow::Result<()> { target_consensus_state: hex::encode(output.new_consensus_state.abi_encode()), target_height: args.target_block, update_client_vkey: uc_prover.vkey.bytes32(), - verify_membership_vkey: MembershipProgram::get_vkey().bytes32(), + membership_vkey: MembershipProgram::get_vkey().bytes32(), public_values: proof_data.public_values.bytes(), proof: proof_data.bytes(), }; diff --git a/operator/src/runners/genesis.rs b/operator/src/runners/genesis.rs index d949901..39ff266 100644 --- a/operator/src/runners/genesis.rs +++ b/operator/src/runners/genesis.rs @@ -21,8 +21,8 @@ struct SP1ICS07TendermintGenesis { trusted_consensus_state: String, /// The encoded key for [`UpdateClientProgram`]. update_client_vkey: String, - /// The encoded key for [`VerifyMembershipProgram`]. - verify_membership_vkey: String, + /// The encoded key for [`MembershipProgram`]. + membership_vkey: String, } /// Creates the `genesis.json` file for the `SP1ICS07Tendermint` contract. @@ -55,7 +55,7 @@ pub async fn run(args: Args) -> anyhow::Result<()> { ), trusted_client_state: hex::encode(trusted_client_state.abi_encode()), update_client_vkey: UpdateClientProgram::get_vkey().bytes32(), - verify_membership_vkey: MembershipProgram::get_vkey().bytes32(), + membership_vkey: MembershipProgram::get_vkey().bytes32(), }; let fixture_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join(args.genesis_path); diff --git a/programs/membership/src/main.rs b/programs/membership/src/main.rs index fbda402..bd7ff86 100644 --- a/programs/membership/src/main.rs +++ b/programs/membership/src/main.rs @@ -12,7 +12,7 @@ sp1_zkvm::entrypoint!(main); use alloy_sol_types::SolValue; use ibc_proto::Protobuf; -use sp1_ics07_tendermint_solidity::sp1_ics07_tendermint::MembershipOutput; +use sp1_ics07_tendermint_solidity::sp1_ics07_tendermint::{KVPair, MembershipOutput}; use ibc_core_commitment_types::{ commitment::CommitmentRoot, @@ -30,43 +30,54 @@ pub fn main() { let app_hash: [u8; 32] = encoded_1.try_into().unwrap(); let commitment_root = CommitmentRoot::from_bytes(&app_hash); - let encoded_2 = sp1_zkvm::io::read_vec(); - let path_str = String::from_utf8(encoded_2).unwrap(); - let path = MerklePath { - key_path: vec!["ibc".to_string(), path_str.clone()], - }; + // encoded_2 is the number of key-value pairs we want to verify + let request_len = sp1_zkvm::io::read_vec()[0]; - let encoded_3 = sp1_zkvm::io::read_vec(); - let merkle_proof = MerkleProof::decode_vec(&encoded_3).unwrap(); + let kv_pairs = (0..request_len) + .map(|_| { + let loop_encoded_1 = sp1_zkvm::io::read_vec(); + let path_str = String::from_utf8(loop_encoded_1).unwrap(); + let path = MerklePath { + key_path: vec!["ibc".to_string(), path_str.clone()], + }; - // encoded_4 is the value we want to prove the membership of - // if it is empty, we are verifying non-membership - let value = sp1_zkvm::io::read_vec(); + let loop_encoded_2 = sp1_zkvm::io::read_vec(); + let merkle_proof = MerkleProof::decode_vec(&loop_encoded_2).unwrap(); - if value.is_empty() { - merkle_proof - .verify_non_membership::( - &ProofSpecs::cosmos(), - commitment_root.into(), - path, - ) - .unwrap(); - } else { - merkle_proof - .verify_membership::( - &ProofSpecs::cosmos(), - commitment_root.into(), - path, - value.clone(), - 0, - ) - .unwrap(); - } + // loop_encoded_3 is the value we want to prove the membership of + // if it is empty, we are verifying non-membership + let value = sp1_zkvm::io::read_vec(); + + if value.is_empty() { + merkle_proof + .verify_non_membership::( + &ProofSpecs::cosmos(), + commitment_root.clone().into(), + path, + ) + .unwrap(); + } else { + merkle_proof + .verify_membership::( + &ProofSpecs::cosmos(), + commitment_root.clone().into(), + path, + value.clone(), + 0, + ) + .unwrap(); + } + + KVPair { + key: path_str, + value: value.into(), + } + }) + .collect(); let output = MembershipOutput { commitment_root: app_hash.into(), - key_path: path_str, - value: value.into(), + kv_pairs, } .abi_encode(); sp1_zkvm::io::commit_slice(&output);