From 54a4f3f17f13e1f12b62232c8a6ca14df9c332c8 Mon Sep 17 00:00:00 2001 From: jseagrave21 <40873301+jseagrave21@users.noreply.github.com> Date: Thu, 11 Oct 2018 08:27:28 -0700 Subject: [PATCH 01/30] Fix ExtendedJsonRpcApi (#662) * Update ExtendedJsonRpcApi.py - add fix provided by @localhuman so original methods are returned as well as extended methods --- CHANGELOG.rst | 1 + neo/api/JSONRPC/ExtendedJsonRpcApi.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 74d74cd9b..c30c7afd0 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -9,6 +9,7 @@ All notable changes to this project are documented in this file. - Fix return types of ``claimGas`` function. - Update compiler version ``v0.5.4`` - Adds ``sendmany`` feature to prompt.py, integrates with ``send`` feature, and adds provisions for sending with a negative fee and bad from_address +- Fix ``ExtendedJsonRpcApi`` [0.8.1] 2018-10-06 ------------------ diff --git a/neo/api/JSONRPC/ExtendedJsonRpcApi.py b/neo/api/JSONRPC/ExtendedJsonRpcApi.py index 6f5f8db08..123a15161 100644 --- a/neo/api/JSONRPC/ExtendedJsonRpcApi.py +++ b/neo/api/JSONRPC/ExtendedJsonRpcApi.py @@ -58,4 +58,4 @@ def json_rpc_method_handler(self, method, params): else: raise JsonRpcError(-400, "Access denied.") - super(ExtendedJsonRpcApi, self).json_rpc_method_handler(method, params) + return super(ExtendedJsonRpcApi, self).json_rpc_method_handler(method, params) From 0f96dc31b48f4f2d6db2157118f593e28266995a Mon Sep 17 00:00:00 2001 From: Erik van den Brink Date: Fri, 12 Oct 2018 20:16:27 +0200 Subject: [PATCH 02/30] Mute expected test stacktrace and clearly identify why an exception is thrown. (#663) --- .../Commands/tests/test_send_command.py | 40 ++++++------------- 1 file changed, 12 insertions(+), 28 deletions(-) diff --git a/neo/Prompt/Commands/tests/test_send_command.py b/neo/Prompt/Commands/tests/test_send_command.py index 6c6bf0906..15ebddb69 100644 --- a/neo/Prompt/Commands/tests/test_send_command.py +++ b/neo/Prompt/Commands/tests/test_send_command.py @@ -8,13 +8,13 @@ from neo.Prompt.Utils import get_tx_attr_from_args from neo.Prompt.Commands import Send import shutil +from mock import MagicMock import json from mock import patch class UserWalletTestCase(WalletFixtureTestCase): - wallet_1_script_hash = UInt160(data=b'\x1c\xc9\xc0\\\xef\xff\xe6\xcd\xd7\xb1\x82\x81j\x91R\xec!\x8d.\xc0') wallet_1_addr = 'AJQ6FoaSXDFzA6wLnyZ1nFN7SGSN2oNTc3' @@ -41,7 +41,6 @@ def GetWallet1(cls, recreate=False): def test_send_neo(self): with patch('neo.Prompt.Commands.Send.prompt', side_effect=[UserWalletTestCase.wallet_1_pass()]): - wallet = self.GetWallet1(recreate=True) args = ['neo', self.watch_addr_str, '50'] @@ -52,7 +51,6 @@ def test_send_neo(self): def test_send_gas_mimic_prompt(self): with patch('neo.Prompt.Commands.Send.prompt', side_effect=[UserWalletTestCase.wallet_1_pass()]): - wallet = self.GetWallet1(recreate=True) args = ['gas', self.watch_addr_str, '5'] res = False @@ -65,7 +63,6 @@ def test_send_gas_mimic_prompt(self): def test_send_with_fee_and_from_addr(self): with patch('neo.Prompt.Commands.Send.prompt', side_effect=[UserWalletTestCase.wallet_1_pass()]): - wallet = self.GetWallet1(recreate=True) args = ['neo', self.watch_addr_str, '1', '--from-addr=AJQ6FoaSXDFzA6wLnyZ1nFN7SGSN2oNTc3', '--fee=0.005'] @@ -120,7 +117,7 @@ def test_send_bad_address_from(self): wallet = self.GetWallet1(recreate=True) address_from = '--from-addr=AJQ6FoaSXDFzA6wLnyZ1nFN7SGSN2oNTc' # address_from is too short causing ToScriptHash to fail - args = ['neo', self.watch_addr_str, '12', address_from] + args = ['neo', self.watch_addr_str, '12', address_from] framework = construct_send_basic(wallet, args) @@ -195,7 +192,6 @@ def test_send_token_bad(self): def test_send_token_ok(self): with patch('neo.Prompt.Commands.Tokens.prompt', side_effect=[UserWalletTestCase.wallet_1_pass()]): - wallet = self.GetWallet1(recreate=True) token_hash = '31730cc9a1844891a3bafd1aa929a4142860d8d3' @@ -219,7 +215,6 @@ def test_insufficient_funds(self): def test_bad_password(self): with patch('neo.Prompt.Commands.Send.prompt', side_effect=['blah']): - wallet = self.GetWallet1(recreate=True) args = ['neo', self.watch_addr_str, '50'] @@ -231,7 +226,6 @@ def test_bad_password(self): @patch.object(Send, 'gather_signatures') def test_owners(self, mock): with patch('neo.Prompt.Commands.Send.prompt', side_effect=[UserWalletTestCase.wallet_1_pass()]): - wallet = self.GetWallet1(recreate=True) args = ['gas', self.wallet_1_addr, '2', "--owners=['AXjaFSP23Jkbe6Pk9pPGT6NBDs1HVdqaXK','APRgMZHZubii29UXF9uFa6sohrsYupNAvx']"] @@ -243,7 +237,6 @@ def test_owners(self, mock): def test_attributes(self): with patch('neo.Prompt.Commands.Send.prompt', side_effect=[UserWalletTestCase.wallet_1_pass()]): - wallet = self.GetWallet1(recreate=True) args = ['gas', self.watch_addr_str, '2', '--tx-attr={"usage":241,"data":"This is a remark"}'] @@ -255,7 +248,6 @@ def test_attributes(self): def test_multiple_attributes(self): with patch('neo.Prompt.Commands.Send.prompt', side_effect=[UserWalletTestCase.wallet_1_pass()]): - wallet = self.GetWallet1(recreate=True) args = ['gas', self.watch_addr_str, '2', '--tx-attr=[{"usage":241,"data":"This is a remark"},{"usage":242,"data":"This is a remark 2"}]'] @@ -267,7 +259,6 @@ def test_multiple_attributes(self): def test_bad_attributes(self): with patch('neo.Prompt.Commands.Send.prompt', side_effect=[UserWalletTestCase.wallet_1_pass()]): - wallet = self.GetWallet1(recreate=True) args = ['gas', self.watch_addr_str, '2', '--tx-attr=[{"usa:241"data":his is a remark"}]'] @@ -293,7 +284,6 @@ def test_utilst_bad_type(self): args = ["--tx-attr=bytearray(b'\x00\x00')"] with self.assertRaises(Exception) as context: - args, txattr = get_tx_attr_from_args(args) self.assertTrue('could not convert object' in context.exception) self.assertEqual(len(args), 0) @@ -302,7 +292,6 @@ def test_utilst_bad_type(self): def test_fails_to_sign_tx(self): with patch('neo.Prompt.Commands.Send.prompt', side_effect=[UserWalletTestCase.wallet_1_pass()]): with patch('neo.Wallets.Wallet.Wallet.Sign', return_value=False): - wallet = self.GetWallet1(recreate=True) args = ['gas', self.watch_addr_str, '2'] @@ -314,7 +303,6 @@ def test_fails_to_sign_tx(self): def test_fails_to_relay_tx(self): with patch('neo.Prompt.Commands.Send.prompt', side_effect=[UserWalletTestCase.wallet_1_pass()]): with patch('neo.Prompt.Commands.Send.NodeLeader.Relay', return_value=False): - wallet = self.GetWallet1(recreate=True) args = ['gas', self.watch_addr_str, '2'] @@ -323,13 +311,19 @@ def test_fails_to_relay_tx(self): self.assertFalse(res) - def test_could_not_send(self): + @patch('neo.Prompt.Commands.Send.traceback') + def test_could_not_send(self, mocked_tracback_module): + # mocking traceback module to avoid stacktrace printing during test run wallet = self.GetWallet1(recreate=True) args = ['gas', self.watch_addr_str, '2'] contract_tx, scripthash_from, fee, owners, user_tx_attributes = construct_send_basic(wallet, args) - res = process_transaction(wallet, contract_tx, scripthash_from, fee, owners, user_tx_attributes) # forces the 'try:' to fail + scripthash_change = scripthash_from + # mocking wallet to trigger the exception + wallet = MagicMock() + wallet.MakeTransaction.side_effect = Exception + res = process_transaction(wallet, contract_tx, scripthash_from, scripthash_change, fee, owners, user_tx_attributes) # forces the 'try:' to fail self.assertFalse(res) @@ -356,7 +350,6 @@ def test_sendmany_good_simple(self): def test_sendmany_good_complex(self): with patch('neo.Prompt.Commands.Send.prompt', side_effect=["neo", "AXjaFSP23Jkbe6Pk9pPGT6NBDs1HVdqaXK", "1", "gas", "AXjaFSP23Jkbe6Pk9pPGT6NBDs1HVdqaXK", "1", UserWalletTestCase.wallet_1_pass()]): - wallet = self.GetWallet1(recreate=True) args = ["2", '--from-addr=%s' % self.wallet_1_addr, '--change-addr=%s' % self.watch_addr_str, '--fee=0.005'] @@ -412,7 +405,6 @@ def test_sendmany_weird_outgoing(self): def test_sendmany_bad_assetid(self): with patch('neo.Prompt.Commands.Send.prompt', side_effect=["neo", self.watch_addr_str, "1", "blah", self.watch_addr_str, "1"]): - wallet = self.GetWallet1(recreate=True) args = ['2'] @@ -422,7 +414,6 @@ def test_sendmany_bad_assetid(self): def test_sendmany_token(self): with patch('neo.Prompt.Commands.Send.prompt', side_effect=["neo", self.watch_addr_str, "1", "NXT4", self.watch_addr_str, "32"]): - wallet = self.GetWallet1(recreate=True) token_hash = '31730cc9a1844891a3bafd1aa929a4142860d8d3' @@ -446,7 +437,6 @@ def test_sendmany_bad_address_to(self): def test_sendmany_negative_amount(self): with patch('neo.Prompt.Commands.Send.prompt', side_effect=["neo", self.watch_addr_str, "1", "gas", self.watch_addr_str, "-1"]): - wallet = self.GetWallet1(recreate=True) args = ['2'] @@ -456,7 +446,6 @@ def test_sendmany_negative_amount(self): def test_sendmany_zero_amount(self): with patch('neo.Prompt.Commands.Send.prompt', side_effect=["neo", self.watch_addr_str, "1", "gas", self.watch_addr_str, "0"]): - wallet = self.GetWallet1(recreate=True) args = ['2'] @@ -466,7 +455,6 @@ def test_sendmany_zero_amount(self): def test_sendmany_weird_amount(self): with patch('neo.Prompt.Commands.Send.prompt', side_effect=["neo", self.watch_addr_str, "1", "gas", self.watch_addr_str, "5.abc3"]): - wallet = self.GetWallet1(recreate=True) args = ['2'] @@ -476,7 +464,6 @@ def test_sendmany_weird_amount(self): def test_sendmany_bad_precision_amount(self): with patch('neo.Prompt.Commands.Send.prompt', side_effect=["gas", self.watch_addr_str, "1", "neo", self.watch_addr_str, "5.01"]): - wallet = self.GetWallet1(recreate=True) args = ['2'] @@ -486,10 +473,9 @@ def test_sendmany_bad_precision_amount(self): def test_sendmany_bad_address_from(self): with patch('neo.Prompt.Commands.Send.prompt', side_effect=["neo", self.watch_addr_str, "1", "gas", self.watch_addr_str, "1"]): - wallet = self.GetWallet1(recreate=True) address_from = '--from-addr=AJQ6FoaSXDFzA6wLnyZ1nFN7SGSN2oNTc' # address_from is too short causing ToScriptHash to fail - args = ['2', address_from] + args = ['2', address_from] framework = construct_send_many(wallet, args) @@ -497,10 +483,9 @@ def test_sendmany_bad_address_from(self): def test_sendmany_bad_change_address(self): with patch('neo.Prompt.Commands.Send.prompt', side_effect=["neo", self.watch_addr_str, "1", "gas", self.watch_addr_str, "1"]): - wallet = self.GetWallet1(recreate=True) change_address = '--change-addr=AGYaEi3W6ndHPUmW7T12FFfsbQ6DWymkE' # change address is too short causing ToScriptHash to fail - args = ['2', change_address] + args = ['2', change_address] framework = construct_send_many(wallet, args) @@ -508,7 +493,6 @@ def test_sendmany_bad_change_address(self): def test_sendmany_negative_fee(self): with patch('neo.Prompt.Commands.Send.prompt', side_effect=["neo", self.watch_addr_str, "1", "gas", self.watch_addr_str, "1"]): - wallet = self.GetWallet1(recreate=True) args = ['2', '--fee=-0.005'] From 1e5b4dc3afb19d97646d7a1593914f7a4b7acbf9 Mon Sep 17 00:00:00 2001 From: dauTT <30392990+dauTT@users.noreply.github.com> Date: Fri, 12 Oct 2018 21:33:19 +0200 Subject: [PATCH 03/30] Add guideline for adding tests to the neo-privnet-unittest image (#661) * Add the option -u (unittest-net) to prompt.py * Add unittest guildeline and add the smart contract source codes (UnitTest-SM.zip) to the fixtures package --- CHANGELOG.rst | 2 + docs/source/images/fixture-tests.PNG | Bin 0 -> 37686 bytes docs/source/tests.rst | 116 +++++++++++++++++++++++++++ fixtures/UnitTest-SM.zip | Bin 0 -> 302358 bytes neo/bin/prompt.py | 4 + neo/data/protocol.unittest-net.json | 4 +- 6 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 docs/source/images/fixture-tests.PNG create mode 100644 fixtures/UnitTest-SM.zip diff --git a/CHANGELOG.rst b/CHANGELOG.rst index c30c7afd0..6ba652b10 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -8,6 +8,8 @@ All notable changes to this project are documented in this file. - Add ExtendedJsonRpcApi, Add ``getnodestate`` RPC extended method, Add ``gettxhistory`` RPC extended method - Fix return types of ``claimGas`` function. - Update compiler version ``v0.5.4`` +- Add the option -u (unittest-net) to prompt.py +- Add fixtures guidelines and add the smart contract source codes (UnitTest-SM.zip) to the fixtures package - Adds ``sendmany`` feature to prompt.py, integrates with ``send`` feature, and adds provisions for sending with a negative fee and bad from_address - Fix ``ExtendedJsonRpcApi`` diff --git a/docs/source/images/fixture-tests.PNG b/docs/source/images/fixture-tests.PNG new file mode 100644 index 0000000000000000000000000000000000000000..e6cacd12949550a416932247328f4ae7f617e73a GIT binary patch literal 37686 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 aIXV^Jb>7(`YY>6`WC>B3$Jrvf?*9Y8NqUU{ literal 0 HcmV?d00001 diff --git a/docs/source/tests.rst b/docs/source/tests.rst index 64e389100..9ad223da0 100644 --- a/docs/source/tests.rst +++ b/docs/source/tests.rst @@ -35,3 +35,119 @@ If you are adding tests or altering functionality, it might be faster to only ru .. code-block:: sh python -m unittest neo/test_settings.py + + + +Fixtures Guidelines +------------------- + +The following guideline is relevant to all the ``unit-tests`` which are depending either on ``BlockChainFixtureTestCase`` or ``WalletFixtureTestCase``. +Such tests rely on fixtures which are produced by a ``neo-python-privnet-unittest`` image. The image is currently located here: `link `_ + +- The tests which depend directly on ``BlockChainFixtureTestCase`` are generated using transactions between addresses contained in BC wallets: (``neo-test-bc.wallet``, ``neo-test2-bc.wallet``). + Occasionally we have also used, in few tests, the default address in ``neo-test-coz.wallet``. The coz wallet is special as it is the original coz privnet wallet with 100000000 NEO. + +- The tests which depend directly on ``WalletFixtureTestCase`` are generated using transactions between addresses contained in W wallets (``neo-test1-w.wallet``, ``neo-test2-w.wallet``, ``neo-test3-w.wallet``). + + A picture may help to visualize the tests BC and W: + +.. image:: images/fixture-tests.PNG + +When adding new tests to the privnet fixtures try to follow the following guidelines in order to minimize the dependencies between unit-tests: + +a) We should strive to not use directly the ``neo-test-coz.wallet`` in any tests as it is expected to be the source of NEO and GAS for other test wallet and it is natural that it will change quite a bit in due course of time. + If we create tests which involve the ``neo-test-coz.wallet``, then we should be ready to update them frequently. + This is not good from a maintenance perspective. +b) Try to re-use existing transactions on the privnet fixture for creating new tests. +c) Add new transactions to the privnet fixture only when required as this will add the risk to break existing tests. + We are aware that we have a couple of assertions related tot the blockchain‘s height and wallet‘s height. + These tests inevitably need to be updated after adding new transactions to the privnet fixtures. +d) Create your own token if you want to be sure to isolate your tests. +e) Create new wallets only if absolutely necessary. + +**The last three points c), d), e) required updating the fixtures:** + +1) Pull the lastet `neo-python-privnet-unittest `_ image: + +.. code-block:: sh + + docker pull cityofzion/neo-python-privnet-unittest:v0.0.xx + + +2) Run the image: + +.. code-block:: sh + + docker run --rm -d --name neo-privnet-unittest -p 20333-20336:20333-20336/tcp -p 30333-30336:30333-30336/tcp dautt/neo-privnet-unittest:v0.0.xx`` + +3) Clean the current ``unittest`` chain: + +.. code-block:: sh + + rm -rf ~/.neopython/Chains/unittest + rm -rf ~/.neopython/Chains/unittest_notif + +4) Activate your virtual environment: + +.. code-block:: sh + + source venv/bin/activate + +5) Start the neo node: + +.. code-block:: sh + + python prompt.py -u + +6) Use the following wallets for generating transactions: + +.. code-block:: sh + + neo-test-coz.wallet (pwd = coz) + neo-test1-bc.wallet (pwd = 1234567890) + neo-test2-bc.wallet (pwd = 1234567890) + neo-test1-w.wallet (pwd = 1234567890) + neo-test2-w.wallet (pwd = 1234567890) + neo-test3-w.wallet (pwd = 1234567890) + +(If you want to add new tests which depend directly on ``BlockchainFixtureTestCase`` then use any one of the ``-bc.wallet`` type of wallets. And if you want add new tests which depend directly on ``WalletFixtureTestCase`` then use any one of the ``-w.wallet`` type of wallets.) + +7) If you need to create a new smart contract consider to re-use the existing one in: + +.. code-block:: sh + + fixtures/UnitTest-SM.zip + +(In case the source code of the new smart contract is not present in the above zip folder, please add it.) + +8) If you have deployed a new smart contract on the ``neo-python-privnet-unittest`` image, please use the word ``test`` as prefix while defining the ``contract name``. +In that way we can easily find out all the contracts deploy on the image by running this command: + +.. code-block:: sh + + contract search test + +9) Once you are satisfied with your new unit-tests save the tests, then first restart the docker image and deploy your tests again, only then create a new image by incrementing the version number (xx+1): + +.. code-block:: sh + + docker commit neo-privnet-unittest dautt/neo-privnet-unittest:v0.0.xx+1 + +The reason for this is that we need to keep the image as small as possible. It can inadvertently happen that your image has been accumulating new blocks for days or weeks e.g. while working on implementing the new tests in phases, which unnecessarily increases the image size. +Our test fixtures are reset and extracted 20+ times in our build system so any size increase will add a delay * 20 or more. + +10) Create the fixtures by incrementing the suffix number (x+1): + +.. code-block:: sh + + notif_fixtures_vx+1.tar.gz + fixtures_vx+1.tar.gz + +11) Update the fixture name in the static class variables in the following files + +.. code-block:: sh + + neo.Utils.BlockchainFixtureTestCase.py + neo.api.REST.test_rest_api.py + +12) Create a new PR with the link to the new image and the newly created fixtures. diff --git a/fixtures/UnitTest-SM.zip b/fixtures/UnitTest-SM.zip new file mode 100644 index 0000000000000000000000000000000000000000..590b1116d81d6c8db56c6804a01ad111b5a82eb3 GIT binary patch literal 302358 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®Mc1(Ot=VZT8i4U7=P9tyHEhD6L-|*t|F}U3)uS zv~P8MPkL3)i4woP-0mH&H`9b| z`D$yCm>OONyqq99Wn+Shs1O83!E6UKecZQ`+~Yl_7v0$1e?0BKgtHzm)9UC5%DIrW zXZD3E(pcmo)w|$UgQQLK=Yg!zpBCB7|D@L*HyrZ^^rk{4&(}a#K;x3-ZpjuxB58wM;#97?gfYR1^C!cWCBAAs$^>oD6ysG} zPh3kP7#3m5ax_(#oXkv*1;Oy(C7HBudQ>XXRC1&p-C*Io6a0i&IU`!2{LmbFE^E~w z2t3r%1lku^oS~ip4RXo{LDq2i)Cj-b{s*jISy-rAI$FtsF~I0tE*)PE;{fwJBr0n8 zW>-QIFKPHqx%IjE0HVG-DcgxS=JcIW@vw(R`SD~9P(V`h=d%n{4D?~yff>e}d6Z3~ z<=xODwc?dFbMeK-GfXBmqC)53(dPHcRMS+`YIkNnv(_Yfjlw+ap0IZ73&;bX*Fpzv zlP>pB*EnjFG4F75Va_^o5HtDX6xaKzcC-HF@K$v@#C&%_BdY4~^s+8&x%Y8j29 ze#4<`(0$@OVoS~$CW0bOM4%X$#}lQ}aSmUTaYbgiR7}X_YTs&s1yTs4rt`69nL7fj*gJ-Ot<{w!0>`#ExnE2BemLi4BAMWZ4pD>R)Aa1(gnM z*nZL%Ag+q0zdRwUswoxKc^R}aRwvyqW^uU?5{DHs60Ai}c6>A|$23r*^L?x#MEK6< zG|VJ$W7iNFPSN$y?nFZhYwRR@4i|mQO&j7ooKTUhX8YVvM2aN7`xR`4GfHjcF6|?_ zDm4rb!uHmM&&1=qG3WHdjAPaZQ7@z~SQ!|}$2 z<*Hfk570_zuIagxMS<26-Z#`AF?-?zk7vel9Nfp!6fVA-TO+dlbrY4USB_fU0@>hh z>v#aRq6a@eQm2Kp)o<%MZ+$-52!wG^3u0jjeGxL*4m1Vk6Tpy=`lJ+VRgMDZ@P z(&p3+FVIZlfY&zDxt(h-r#u@N^kKN4nOMl~4R^h87nuR+SO>|~zrR6##v6ebs&d=l z005s+#UIBToxgYZ|6cfg<*=WmBr> zQpxrSKmN9NlLqtH6ZU)bpBDII+nE2}+4*ZZtIt^M?|G~L@QKt)QO{p_*Evy`g z2v&DBY8Omw352c#85+T|2U8bsO+RNKe^7`}DXwlmZ^dT&D{(vYj7^?vhsX71JEu1z zbwlbe3eKr0GqX?~!TBZ0#K!3ZiQ;wM-nrmRWzIEa!k7mlsP)1RPzAGe;gBACe;7)+ zWvbGZS<}jXTh_cvI1~(tzRLDssUJvr#pXJNbz0OnDLOw4A()?8os&Efas{|iR&r~u z8`R?Ih}M=?m&_1TFdwulQXBZAQuuOsL5>5g$Q3<8;|Fd=zhKGv>X-Bo5u(TUR~tX& zJ9gAFnd2M-`-vr)3B|_lOKm|Nr`~!Z95%lkRy(pLcBH0NRhfCaxX0#Jj7ANpo9_2p z!Hl*%WZ>Y;2h8$?yYo5;$Wsal7#<8sVL2mXGp_F8(ey`ih3}caOD83VyQyi~+ff@Q zGkQ0ZEhKhyWa(&?`n%b2YZ!`~?EK0xHEAajH4NNZv6^#!w!8lklOnv8#TAnED$F~d zhlbx0MXKf=$l8~zzMa)^xo)1IE#TL;#vyh>TD>=AaL=P=4*mpE-O#D!8FR5gw2ww} zx_9M>yRSUuE@MUQUspxI#1bbAzB&TpVbJ)BaiN1SjVC`nju7SStre*Pq2+iFL^>`a%uyoC42Bnl<-GDa&078tn! zd|tkGpT2W(cVd_*mgmXq62B1}3Atd2gKnlVil**vcFDA?ID9p=*z8y)>!6YhGZ4dANc-C)O+fud;$v4E!P7@ zbJ5l==hmSq{y@8y{ClMI!_Y?-4kCBeyY{zlTUCUonsck9V;^s~ZqCBnW*YL^St1xF z{kDm+S8p%Vk3OCwSDE!!!AYtDQr$H(KBkXrOvtgi3E6q`5|ZlVd1rLkzcyW|VpR6) z8n0SyEXP@{1T9ALes4rC4jY<5KBRpWeteO$ZrGll)oZoo_haqX{Du`_pk8`|JebVl z&YDHY)jA#fLs|1%KQTnhC_~=It-Wwg|EAW@wdN%<3DslBj9Ke zsZJL`Pl(6?9+|s0>lQrul~bb)s3~qx6MTypRv85{ObR+ek_V2%Hwuv0cNXQJ$Nyuc zEfgUy!iz094ne{)LnP*bp2Dh`yil;=t15-VqAZIY`si*z6d)K5ifGLgP4-MXVnP?= zR8A!O4#g43QxIRA{q~T{4d7Mm3w+iv;wtRf z(Dc^dBjh;4Gu($tS+jZGIg|3lNV5%p$<^+9?a;=FEuL#>9RjHxHG74#sKqw!RcohF z-H*jpRz|F?mO3dm+gqh~NJtVrXJHt|r^ubOPnoJKU_~^chqCqBF<@9)oRUvC2NqwN zrrXp@0oX)-Rrzk@KwlXUXYmXD`*FM()RXCUa!fHD8LMqPm~+KXR~e{!orAY59(T#Z z$aVg3f)Oji69fE?h55bn#bO|B*r{#$<*D|{;+|zn0tP>+T2-{X$6!>GAOsm3Y1ZP8 zXHpO~Q`MLX0`fPpwILKpEY3uhVdBfMweP9cJ6Oo!TBd+lsYC`WIJ3sE8)j(WT~7hIgdgN+Ps9u3RJ+B zQW-zys8P%w6<@(VV-Jv(=-SNB4ZVNb?)%3wT&3TU$)B(CG&FMkTfOCHE$;tPqv~)2 zV{fdhs|%z*d$K@hU_}h9j6T`Z(>vfQdBzSbu>S=N>y+$C>PlA@ao`{i~wwo*w5Xv^?5q7ad`kI__o8ehqP&rL3^o%-EGo|+BZb<~@ z;#<~Km3MDd%j9#EIb8cf{AKO9C#C>RhkN1@)!0Gl#oo)duOH*c;_TqE5-lreGCR-A z>+lcDtNhh;8f}M%t0hepT&Mk+_^h4pFdH{FscxynH#hE}iBE5jNRwRK3F))!HE)xV)i9c)&#j=T?4=O<_(y{pWBsNjZryT|5_)7Am5Yxr)9@NUW!AIR zT$ML#*bc}B@Z*xyik`o6+=%Sd}R zk^I_zQBm{`_tU`}<~4Qn`G&ZMZc2>Gj|2+)h#oOf`}wCl<(=F-)k+4tbP^q=IWA+F zoBS*3MF6fK-mAIk&A`w82T}T;Lj23P3=qB(5;SA9GUU>MMe5i`wK-|S%{p(MYCjKk zx?5pMtlqpN-q(WqR}~`BTlkI+3sF<@4oM|{s?OfF4kT3(XOd3Q;m($Oxb`zy7|oQ8 zPnDy)@*X7~m=quN!Vc)+VwJg7kYuAYG};ue1dZ9aJ&T{dDSd+*`q7E-n5bxYgye|F zsqV?9demO&!~7gHyq8`t70${g<;=0}oyC_!)>y+-PsYs3TwS1AU62P-?1o)(RC|zO z{YI^jbVp+>mfN*qJoF`fa>ITCCU4|uFo2P3MRw!rK+vJstLmcS4E7j3oAnTv&CxAb zrRb{2L=7fmu#~tE)P2g?Ia4^)6W?6eGN`F^ln-DFxy;c3wLbwb=f`FghsBW2Vj}iU7-|Bm~3v5N+6|s#n zoA=rE@;8f`XP98#)wc;_i>PYG4-FVdg#@;{68KMD`Z z?+vIwTfF>x8_L+s7C_ZQl!*+RZzG~Q{{j{4!Axv<~ z?}wpJ>-@3Z?tkC?vquYT^$aYG41X7A7(4ts<5^AgewJhe?s{bPeK}^a@W^*^O`mkv zB#a}elR~tSLBwvIsBZP7y;Ah(R!lhhw*3BZCao*rd}y%VMdMS9)5yap>0d%*{w3@w zb>;Q|`ZVvG-EFMIQ31^3ek97v?Cel}RrCEfW3C#U<0ub2(fZ{$dEdI2?~>EZvT*v? zk-dymG(Wp%sw(s0_%$QyQ{qs&RY!vhMC(B$cxMJA8j!sstD0H9ot#xOdH$`U#S;v# z?Xyh&(=LB(F|^-z=>B9lC@RD!`0q?bDK1qnPbMx!xil>*B}u+CEk#8mM!om<^A(h4 z4#gP1fj`0j-mTwX0RC|TeE$BkEAJ|h4vt3l|BeSnQAv79$@&^PaVaKxR#6sKR?xW7QZRDiqfwHfQIb-Uq|(tL zu_VpkJb**gkC1$P_UiNVKfL_wxfhnd(q~6KlmGN&#c%L`veV~p_P>H@Z)9cT_}|Br z{-cvo|47d#Ebspdtc|^yiJA3(=#l^G9QeP{|7_apZ_e@GgZ?k{KQ~ut#V03e#i*C2 zX~!g|C+7cY(k>A%$Wn$?(&oyCw|pOu}Rot2)E&X|QwpMjO0&d7*PkCl;?j*-rQk=@vs zo#yku|J^)SbXRaCQJ=T8Oh+=&UvIMd{qCr>T2EbRivMo)^P;o+<4CjO#eGR(Q%h+R z%D-=pmzNj+qa#94INEYq@brlaEGH&i2Hi}%whGL(0;IW2(yqkLzTYW6#QDN~8Udfs zey+Lra_MJUhS+y5#-tyDuSk9?{&py`lR0v+jul{uzwW4LzE+)#NZwA(?J9y+CUREd zGxY-H@5EWki=_RcgQql1x5s2()!a*{09hHGu2_6kECC{Qw8{Vl6Iug8W`u>hRkYjy zF<=Dr)J%b%$4Tb4zzgWi7ei;@TT+c;Tc4$3(*;-gYtrdEm0Fs z2aR6$c7ugQTW2?DZOKAmZd6XO9W4wGd}d@yl@0jGfvak@J_BKKD-V1EQ=en*t)J8; z`UdI@eqqgMQlK7fGX4wFQd5IN4Hl~1yhO{?0%dxeguf6?n2LDmst~Z5s;*JXlb$(e zi#~)y5B3a%6V+-I-CZmE=1}$fntCe=7Yb!(>9y&bJ31}h@;x*E4oeEE3yd?e{PWK~ zqE}xQBhssFb`f1Z5EPRta8VIFo9{o@v$8ZQ$1<@Rouk^jpN`s)1)fPg< zJz%0H?T%L9ATB5z?~-&o`uLQ$!Ue5gf$5;@3@AB`&-RWt*U{yHmxvteI%~+RYh`lZ z+47|5qGZ_1ErOwSr{bjN9_4g*!?viqR&a3xG!@yIb7b0QJD2g^AryaC?DC2-Ykqr{ zFyorTKF(6=ZGElU77Vyx=7p|2d;pMgTsn@5Cjsy#oV_<5BkCx;I_#K)e>UIMs1iK$ zfn>2(Ap#(>-~Zai3BS~;t?$1Sg1?S4lH#fokS=D?WU+rep5RCj|CLxqNp9jD8yFj7 zFmXg*4qHJDQG~3NC_#==HdK+ESdDvVpiEI>NP{>Fzb7RQKUkh4PLl#rxW7c63WI-& zIFsifPW1~*yeWI)J#@s+ic(~KXW1=>G;uLfo9;WDZ#<$x3ad(Jb)5V}H~ET*^i`Ph zQFc5GCj~zx=i85?S8dx~zxpWLJEGH{WM30dU!CjV+Qs0PpQ{-)Uv9@|c=;9G3&&G6 zq*HapzjuR^?{t5vr-^qN(mozn1)o{o!oRh0h7nONuCf`ocj z9T>t0&4!{kX*=U)r}Jq~5RxfQEV=z!A};8Ke`w@;lLRk@WC&69iwyvFnQrm2xfbnk zH^e2eQ)9M&`9b@sJ7e*}uT&hSqGNE#7H)?#sbb>Q)gX;?ggo0yg7-uW0ANsb! zA=<@|sm8lDwpQhIS>B}IW|^!R$|2j{!3SjpWBhtRbbmn#*e^97GvjLanfeR^cTihS zpKt=}BLSpX+|aLc^%nI$S=vPurF&6Dlv=v%BL6zh%Op%FD4pisG1L(dE#l(oWlmU?|j2iMk60T8Hd-_=- z!ZGWkOY9*CA>W{b(xceUA_yaz2JVKw@^s}UFa@jTOA3&k9O{B1^Xu+ZkO^T51Q8Gl z>bpK&FFN~&?M)i!0W@|dF?ha?-6dJsR0df`kNoryC7MG(G>yZ@7ql&bbFVbmR;&C) zZevm6ZL!!S!JL&jc(q!i@m@5n$SRYvl}+~T4R(VY(=+53(?3^t6l_TW;g zGb)ySdzXWjTE$oQUkT?s53IsVH>v1rmCVemPrm~E7r1Do@>3lOV1!ykcndkP%2?cF z8980M+6hRh^3~x&%B!ck(6h;pn8~{wwy1Gho}GV)37-mG!Fqn_n3IiZNJqk zYIDktb^!8@h&MKo!1B~;)eW~$ZXh3=EQX-gj~45bRt`47Jg$#f!G?;SI-6^(SxRl9 zX=mZ$flcp@zUF=|Xy;GI{PCR>Eb`qs#YbZdZJLpmG*}xTr{L>RAMfB>BV9)Q(}~R1 z^pEIq%=P<-(aG^H?O68n5NOXB1&WlA1o+^Mg^=@OzW7j;>rB+>Uqp%Alm!~$N6RJK zSFY-fVk|}Bj{qS_!q_$xW?98`gFg!9($1vGbjh4aQgMdftJ<-fE5RD-b)qcWPkAiA zc12nid03k6pr%dSH^#J!>c*{^JquU$7a|LlAsI(#NdosRCSI} zIlr}ukukvdV2~2K)hTk~5iI2Rp2IRrJCZ{mL3aV*=3=w&Sf$al<|dYzWsqG?DO8_I$>e;R&7O?iLC=?$^(FDuP ztyB$)v<3eTM?(w9LCg=%pNU<4*BeJ>g8V#pp*3Uk+;Y*%CeO;^VS2K#5yS?<@O9TJR+1}h~wCW{_JB`t!n9Iu$5joW!P1a%{F2h56Qj?0&ZUm(6R>i>>bTH znn|bI47ImAFOyaz&)7xADRHaAJfc3Z4(3Oc`-bZsYnnTpcUOjY#yt>sB$jN(IF=R7$B1!^vKp^Qj3dN2?cT3Wqi#NfozL9yB zMYbC`JhmypHt!3nGzrl-4$R(uZvY~Pe0V;I(>4KKIER$5vYRn|hCUX8Bpq7G6%rW7 zD6Bo}b+k1wVP$!W`)`JGD=Y0gfBSb#1-h$L6;O{yb0 zP7pHMa=SpP9hjw{2J45wYbbT~V&Zd2kJVQO|F7^ymkSvySWu+N?sGvvVWXK8+bi0g z9r}qE@=%~C&U>{mFV|d0h6p+JBdY3OcH~%7N96<1Yv%~{NN9s?SqgSiYSdkm_cGk^ zZwJEhRZo~%UVkp>K8?>y&)3Vhr$EfwD_oKpfFAa)lsW?r9XRf|6vO*iP!cV3iR{$9 zz`7m7C=Yk6J2=PNXI%ytyA_Z!wJs93Bb%AVm>t7G=MR6~Dxb`ri>o`rI2?|Oo@T^_ z&kbkAUf*dZnke_HpWLELDn#kx+)@L&&WzPc-jm&k`}{kUVNoiZP%BypB|K+Hft`U z(?Pz`%tb3+S#!D<2x)iH*n8o;VqQ)t>;wCW?uuVp`UZ3$-Z7~l!0xwHZBil$P+>4K zI=s1G&Mi9ck!#v|LCnE>rGtN{Z!(?Ymc^h|Z*pmhsYt)00{f&h-WZ)Za`x%<54mB} z2))Taod!fYnAYmwq?AS5{XR{|@8zN$U&dTbl9+zQszY0ii_@03Y)qxofmUpsEa1}` zz<;^#f!oE>F1kUqc0R0C+W+D`X{gkyRl%dab-hQM)(9NypWccZ%onTXv=>T`=ua6a zdrfDmZo?+f6WKp`kKM&fFQS$IpwNt54silCOcVQ#sAUcx*IeCK#_<)lWmvBueLJ&X zo(~m(o}f4E3*cnC^-)o#>};y$^vlmoTk$cya(<(xFbI+64&#Jf>?T^}5(PJPb(r`J zDqA*K;i`33?zO{2n0b+VqU6BM^;wgw%ppE-Nidy*U&Ud*4XyVVtE1@MxZV<+Jfc#53-=bd7n3EwgxI2MduOC`| zS5i(1zs7t#__G#|hnmT?J=;%A;C5HqvrA>72+cLWFI2RfW5$U%OK%ih;sa;&NEsto z(#s2VkP!&w+mgmydK&tIB|;weo3?Ch9O1LdJa(Apq^?3@F!Uh%nz++8ewzf-a*E>v z^HY0El0V19mm<~ZasVTX_XUmamYmZm7nmGvOzetg!P*@`a32J_68^`-zz2Q2+p}G zOeB7FaY&luz*+7ml+@X&K;A(zj44w)UG*N@T6qmFgQ0XGraQ(u(1=I;cvjC$)9*RTwjz4uDc|t5!5b)d`%`bmh zyQ_M1CMUy=xVuirg*+rK65-GzOb$Vd?{@UyfjC6DSK476FU|MSr6P%p4AmHFg@jsu ze$2}(A6AR><)ZXPI>IGWiG9rN*tx7lhwQ`KE6e;Ul|Do1n27;23iMHNOlC;GzPk0r zkD5qyAQgM$Tqv9UhtP7iMWV0_?>o3|M9u~RF!oHO2^mj}qH`#?+6ZNdj1HCeIgkb@ zoN+amzDrLLC^TF%RLz|$ivzxveVd;%j*8im4Va2Ue4DmC~eUQUkm{sn~hiF z^#&`oqv7q{z$vg`>JOkbjFMVNhUQ?=kQ>Tt9^bQ-i3I9`Kmf(|6vkd$0~Qn8xz&Pt8qZPbGZq9Uq1bsA)U zD?uYTt8HAC@*5>6UNjQ;;l>MOZW=nD}gK{)GxYH)PdAxJP2}8tNQzF zKs0Z6i_*s6MHy$Afw=u4BoMSusJ`^u&qJzC&aI(TaxxoDFJ6PUPdMwn7rU)Em8T${ zhfKBR%DGer7k5c@E+L*dpvS|ZW70Tl8prfS?ddx_>Pul{4g?xtrfzk6=ecHdyQG|=CpNcs#2uUFj7fw!8(<> z9!!C0?=;6hPXm5$J&4)q&r0s=ThyM$P%AkZ!M5R8t<+*o414N1w1j_6bV3C?GmAB) zWI{no<-%wPZY$k7WlSJ&BfIgVQl;ckX`H+)CEJewA}#wMpX)&}$w1l8^1NZ_W7)u^Y0p0Wn-7QdWc$#-9!+5bl!xM0C$lTX$KJjR zqEuC+0_VV}f{|^5+gDgF#?wsuQO4%V8AUTJjvET@ap-V-ygClw~y4X4hb7EnkBZg=9qy8vw!y6dPgyd-1xsJ6dqPS#tE$;(@0DD0i6 z!wlA&(seIr_NEaNYp7S0ZRp4CE_eckQTwRTo zeME$Y33cKL*?6c21gHB*hnEDZWAhc%@#LqRB+@d7c|b{K)Lp81Vy)q=-kk730?h)1 z?)MK`93(AmF>-WjpRzVNXUA^|#7H4HW!e3%I$?O%oQ}Ce8EqRg^(I8PW-TQablVPq zI|(xo!aPiXXWqn&C~Vcksc|08zMEz!Z7ltvPTG3H3a0{M^lCq$&}0{;EU7;x=dXh7 zER*a6iSx4ME3Z3PRboYC(!D7jhSkqa_A0AEQFX-}`<4gavo^w{*$+_4R6o(t++x~s z3h+g|^sgerloIHI0kWIL-rH zlak2drVe+=;B@8hW~;iTeRr{jQezAT6|!lKYuxz`D}XwWU>eB3o(}=P0@gAym<6bB z@?$ico62?NAJjAK8L{3FZ0(q6ai}pk=IfutZ8A{2z7(7H_KZce zDrnJMP~O%>y<5BqZP!=0*j8A^*oqOfNh&+-kz2CwXc6T zN=S$quix5$8vC?-`St-mZ47wMr%KWJx;>V#pWGCNLzM;N#(kvfb+=x8EBgZJ;n4l? zNHdiGZPuIbi~_yHMtpiv*M~n84w@2BPK@)8XMWaiR?@9i{rpu#q%Dk6hNz z{<7;_t-PDZjT|IP4+Pajj#}?UA$Hz)^Y)P~#;~gLzAK&bk7jZI0Lx1UZj!y#hpS8N zcm@xT&av?CnHK+HNmph`X3qX(2^8jEu8dJ&SC(QOIz$A+{Bs>>O`Z-i(ptFb268PN z8uP$h;%;w2t@#2WUfEB}qhymOEz@4+W(wU95G`H52dbl|AK-qAjoFv^z=27DYy%c@ z!~7im=X3G{@aZRC!TWpMQER4hwn~yWhO^JI8tuvNchGy=dG~v_|I1j5>rkWHVQ}88 z^l@j?LXK;2#>O!s<9o9Nfa$;3&uO0lP4wj(M)e6GHQMB$x`3V$K!jurg*7IZnp@_P zY})7J`id|dxj?F$n%_mgRnc~ZiM`G~7gaiLYcd7I>$C*FsFCgm)fmKnoUxD%I({3v?+QMK*zN>)y# zCsz6u2*mqow?CwBltbB}k$D$@vi|bj8bC+Vu_x(R!*Z4sOb*^>$_NR+!(wmu~$70@)z+O2p+oc~14APiGdE5e3s79#urU<~@;luH(iQg3C|0 z?@d-1o&+oWK05X}`P~jLD^E|ny*abX);f((w8=9uHzyduiJ+kUnV=KHHDp9hkyVJY zJHj4!bYxFM&tEOlorRTE2C7K2i1q$%b9e$e`jbg6y{VVuqM%=0+BwvJ__N+;fBa-T z!4rY3-U|glHhytM_F9rhiRu&46@{#0-2POomG52Nwprg7Eq)Q zcR$nOaUue-mRdMA+!UrSvf=Dq1x2aPOV_8F$waZOR~4CzN@E7vi$v!Iie$zNYH>;v z&0P>5wRLqD1-n=FE}_!DI0uAXu=X+rFt-qn{PQ%pA1TGB+Lw8@1s7SRYR|3PD?d7G zhqybk&+_iikM5o-L9IwE2M4REzGRJSYI!hRl?H-KMc?i_D%6<`e zyddS@J(1ERAoJf84P7~fq~-5d<%VpiBA5yiy21+}GZ0%q4`#6Q{fSZXDD|xshSM9TrDoG$3&jVn#)jIF(FO0w6*q zohcV#WMx!4zU1MgJp27Ft2&ii0wK6oFQPn9C@F)Qm0E(^7?ol!G>9?5!P3x3Ah2j& zPFaTGx|dRbEUPOQcIQ1`SoxOubj40+39y^!EY;i-T@p?7uCyJ-!Vb`8v>(`Oxqx)C zyxxtDN0Zd?JVjJs%+sfP-V$qAV zKj(e2XfZ$DX_eIOL+D5CA$lZAa;}`+-9>TtSk(s4ffSq4SU76QJ8OJnF)&IOGDE8@ z`dj^L+YvLJdr{AB>z<{A5#@po-Q)ZL5}oV2-;^EUw0>#{BE0s=j)TQ(ZI!u;0y_5G z_{G!Cc&EXBv7wy~yl`NYNS-c>(B$Pim%V==ZzVf=%2zf%gc{JWBojHm&Fda3M7G^>L;T{t!Jl2>i zF$t(XDfV1}Juo@^dBj}dohMdYRtjkq@JGMbTtcnEkvv4^y<9fDM|MiIHq3wi+BxbA zlQhfa0SLK2c#M3#d6&af>9-vs{0Emx1N>o-rbaMY zPHlJ>1crtY^@s@8i@#rS(5D#lLJS=UIVk~Uex#(fiD66}C@%GUh!bVfIGFtsz56;O z15U0q9Z@(j1!ZFHI2XOdM#p-CDcWQCE1vYlt(MjiXs*w-<~y){a6G@CkGfu)w$&3t zQr6hQAy0oedCjuv1y|VTPyPb&8DuTisxFgFqcF9CS5;n71$(%I+;R5*nSKyPIPjYa zV)%gU_}E0GLP(1~(wS?iOYtn5pF;ugtz5C9dF!sq;e4fTWic?g41tu!?#MN9385a)-4 z#?t+UDX{ZL)J???RM4f|%prBMUOd^)N>I?! z(4i(q{2eIGXj3NLtq@J{V_IKI2flqFlno`>#i4WN$aY_x5Z|@BIkN75WZVC$l@6L7*}gC4+HP5vD2ugs4FZc5 zRBHvfyuOMQf8y+_N6KN+;%9Q1Lsjw|$K5A*2h2Qe-u`$Z@i#cBB&>M)pg-Z2g5!Sv*wf&{(t5YXa6)6U$ z{F+;HW_LDl(hid3Moe6}$1ZP;fbkI|Rd<_h!1xcd+~4v1eV!5<$Gf({Z}!?pU*Zw z5KCzR7>RIT>d`+y1QD;YIsaDhq~L#Ty3bp`!Ceqw!zL>za=XvoniUIgp}m0i__9Fn zkv-U438P37hq25Mi^2lOB{F)*;}~_BDDq{&>O!ragKO|hhoBKGy5l7|HtIFk35Eg< z5TSqvzZv(!MvH!}OpD9&T7gdIwD(N)@V(AnV{WHjZ^FoNfb`d-nlXpw#@$l(r$bzC zQhN3R(?hN=0V7a{ZyVA6O(G=qzi@FgcJSYZU15Y9F+3QMD5vN(##&Dk9gKzxTc3P? z5MQvt!_W1&j?@m%3;c>FxClGqRouSLuVxagGKF?Xl9O^= zuZijZ;g5Kb;NTEkFSv`Mb;UxjeWkd$$eJ_{YGS_Bv2P$Ala!b80q)?@0L%WrW1LI{ zpwO4ks4N%D()->mlMOU65fvo-Y(=-N-}Jzqr+alb&9d%Sk~7DLK2`RoSfI%k7=uub z(j_X#F-Y46YmHbTOsp)0Rbwh>(}0a;<0l}FgHEe6CS@d+f>1>%*(8)0v|6E*MftHk zjogO?-9! z5z?9J`jXCX2x!9dDi-Mykn)X0lM5$aeUstK5&h2FF4Z-q1jGc5$Ul&%HK)$N zxqicry!>E^n1SlMuvf1h4*oYN34J~85yqP{(Y7}^UtI8B?mnCxxasKc*QKuC+pT94 zFIPt!HI-n$y^=OAT+yAqXxqwiz!2__y2C~O+DE2^eP42{yC#Z(YOq1X|vvOWoK5=}_iY}+FQ(bk^Ad@=H@tscE9+?HDe9C|CZ z;KJblN#8)3849-|ulHP>)4_73c$2z-+X3-!=g zv9NE+Y`++2B40_mp3DUEUh!)IG2w`~ijVuS?z5xSc7lv zr#Ai=S)gH?gJS`Gy)gd0T3pjkd#7zgbEpUJ>DV5amET+iF_aBnNvi+wlLS0+Jm^> zf>Fdz@R99K8t3aBz>c#Pv2_LmPiJ&BuB_+jw>c2#h@QNQ>>|AE<{3BrhK`WY6YT+Ldk`dTLX6%(=5MSr)qY*E@E3wS-)AOM;cb{vzpU+Xs7j%z zYGe2)-eH~)7Wo5=uYLX@?#UnuNs~ipz{v|{BJjxcWpYY$thqJXiMpw10k7q5lND!A zQ7tLHA*^R=2uM3Mo#4TcafpqY20Ax4DI8MQJ&$c%hI{^Z+Vq7tENifbE-K1Xr|+*a zqdSgm+Vr+(=!V;w9kjfoZI3mluz}1*4s(Rnw+~^K1!i+Rg?zi+Er4L2jyK7MEFh=!=i&O$D|m3%o9C63jGEP*g-jCO(Tix=6n1-UV}#O;T4^*}2^{b|(!e z44RQ>sLEhen5wFXgeoePBCU9o5K-8!tXP8e0i87jp&^Zxh8T_ziX7oInWBm_cp3CS zgA5~jGpRfvBzj$8huZ)f!ejEFxbx3K`}lk1o92?Et9QxEJ0udiA_l9d5|IZon&4iq zg)Y4C3UC)rDh;sxbkF3*=3`TN7=Y|21KoCB9o*v$fzfspwD&5w$JpD;18Ryt8x#-A zTPU&?Re06iG}3!I83K1$mhVjkh7bBc0AJE+ zjG?fUTX$9#S2GP7>yQzg*w zO0l_CJ*UC8tZC7fy+YB0M3EUn{oayo^7zto z^<3#)LSWw#Kijc&&Nsvj!vbFJf69OQALS1x@YlO^41|!|e;7sR5(t(fQkEJyYQe>y zg8{g$%>7jivmvxOIbYD13g;;q*jn(0nuAg#LDG37b2_W5JB)1fl(XEK@vs_NsgM$a ziVzAt$BSLIc;=SxxMlOBn{DSZ_C-CVcl}}SYIRlo;K-B4x=SPG^iJBS5i$bk*n5*H z?2|tIOV=~vYM>?Z4T!%%a_~P}5-W%>@Q-A;=?+4)$k)b@h`B?24-D0{LAAt{`msms z?b|d#VD5>u(B}vf!UoY0kP;SgF^=fRg@9CJAdjQ0jLoFcWsYzMWr_+XLX<&U7eJWd zqRAd5o+s-sK0RIBc(m4{zIvA&9awPly=eY$u241{Sh+(ws$Uvav)UsnYpSNwuDispTG5QVh`&8UsS`)4JBp&`G}c zNyOYy982PUPpoz5XgkKv-pmJ}#LmI0`|JIlhG%-zkJfxn4poaFVK3m9qOV>u;7l~L;hk#6aZ6BVlMG->$ z{qEMby8ZGx)m?Ui?5hbfIssdbl65QwTw#|MS8-NfEQY}PRlcTn7mL@GFh+rO)1RU2 zWOfkRyr-8C7-OsWJZS7n^z?>#l(s9ts;WCrYf-f)7Z^qCyC_X7vJR>fy__EWk@{ll zo=Z@rRnPb{TXSAnP}{ei*CBlwPB?(P_Q4?{i9`S61TA5JqjOGt$Vb%d><+A{pL3yn z*{e~_*qY~cBM*g6y(><)L=&Con59|s>Owt$ci)6`Zi$fnZ(Y%`@UzkXBqZ$K9P*CXeAwx**hvgmL!S=y{Gfq0|SJqagTxvZHVylB81{tIbjmIXs%sw-N=ItHc6q~QxnBr}NcnhPB zj?gs>IqSPNN0WX)4chjg;-{JW?sbQPKx$@adDz~PG-3*(@ zfdB6XTC#-6@{UJU`d#OQ+dAF-&WM>EX+U?a7eb4&k3yYo4q|ggE4y7`HT4Ioj@vJ0 ziM`l4Kh~lISiU26PC932xB<&61Vj{%a*eQJ0`tkak2c0}duzoc=2z$g*no%8fv)6# zboQ{Ww)5r)z%Nffa6h_)N+T}G8NlmErP?erx+i4QFZG?SJ9}NKK7Li!rv5M)^6l^D%g-#HJK~>b zyNKbM@|jG||4s7t(%U#5&;NNF%{Xq_v&}wy&?!AbH~W@0{xPy~*sJH-RoyWD(OGw2 zUDUQ{qDM;)*j>?W`+8cgQtj$2&l*+#lV$R3lI1HKjbYo^GF^JgmGxUUhsN@WwCbLe zexsHW!`B?u%T4gY_I7ljmApb-vaOVT(#W!Eh1|2}lD+kOAtYBm^`hE~rgF6SwBAS6 zT~aOeY33O7c**hY&*q3(mZ;_3(%=Tnij8SjwT#^d_*JUTSzNPSYW3+FrLfM1>Pdm- za;zmjlS6W+_9pq8nu;gvoV)8oO^-v?sWz>iG@I)tnfT5&+j=8)Dj4LS?7g}U+vw4W zn|Dy}d1m#M(&E=yWOQYdD&5QD znz^hP|K?rXv4OY{UoFz%(8=s6$CGiAtzK_&C>v1E)fswc?TB4tQ0{;eaCjda24yGP znYLD>z>iQme&ldfFMw7qZ*t^ zAX4DVXco!Lx2+a?q|P;urYTB&V7DH|SbBDM0r@;9s-NxeSY0T&?d{%W#z>IECGsCIn2&mGz_q2@xUW-!P!R`qHw` zT-oD=zMBWgDb+NX*3qxtd7iZAuv1$-1}1%*h5#M1r@sQq#Wxuj@1xDcA4U1a>h?1t zV!oaqx$LqGv|(H{ilwN!nBmO(*!LbMeXGuM^x5kg$QR-Ms=qajRORTp2_4ZqYxTxX zz#z26`Vxe6eYwwcI`-wD>sUa^NYjvu%hf$mi3|*!`VrFMFI`E(n)*aq1t8X6WqK-of;=a@x9Vu zeJ%eK^rD*hGJqd`L{E?u*G|g0p77bU+eQ}B<;Xs-p*Ty*gL?|#O#%_-O`yYUybBtW zAL6&S`Yfg0c3i7%_}RvcRrO*11aGKR7l4%(nfEEuH?2W71e7^NgQ)f2XG{ga*9I*i zz(ILYU!bvj3NfYIq;=Y#Y0SZaK#$??=jZdkeqq_aJcT8y(Zov_O2Bfe18C2Hj|B#l zAydRp?A|Bvei;vKc@&Igv__0K0)Wm5RzJtctKQKw5Qo5G6(v_!XiW1Lq1Wd!81gKH zJI}2&?OTVkLx9OdwMeN6fn&P#3rTw-CFJoEr-&y3Zt}(51*~adYUI5YK^7VTWameX z_67!HW+vg#Oc&kyZbmqXPa>q*FU4_z&R(zs#rb3gLPA2#seQZ9x(!F8l|6L<%eHCr zo?(Tq=Azr7lR!dfg9!bElo$_BnIgqwP%R_X3)ZriM*=1I$6ieGBAUYa^EVhSC93Ka zsmrN^TY;2VIG?<~L1vs1&>7*TXal1#ys7Y-?o+R2X z;T%x~3k$&xM+-wL4AE`=;1p&|XQXZRuJ7;V%Nq@rqC4kBmfEQfoUm4zW8qI_%DX1Q zN&>`4wtjO)G$)4R3mBa5uc_+vg4XCR%NMEj3a72jOfNL{1X2n?`n?i!$N>e> zsB}0Apf&bFYjfPd^h)3M?UpZHy#Y*SUARAlzfC{!{`&qKw6tDXZX)jIe~)yQ9+_U| z^CvFa@7~8{0VXZ9Tb&a**xQ(yD`nN4eln;wf69$&b-1`RHmoQnUttj&%qMAvZCe^2VV-{CaztB|ZX!hG zE+jAe2)-%zDn;I3o`GcItsqQu0Ht@I(p34HN3)kTW^%DT_u9`jPM8hprv`SvMZ^Ma>ftdr*djy=c-{ZAt3|@h6Ld%BBDa z)m_z3zUR`yQ*XN*zr_Dp0>a%qeyBFwVa-xd>xSv&1m$!Z2`@Q%OqZll8S7Ub7|U%eG*KA# zVAno&V^oN|)mjrGRioCzrUTK(csxsLCm3Sl)=vEr#z^tX-!DPJ;A@;#K<;E>(>u~*UWr!lsV|W^Mn|MvLg*Wd9Sph}^RqQ{ zclHpDv4rP^{tUq`Sf{#tFfj%F2G_K}aLTedXtj^&PsaIe_kWBVdPqbMpnaI8PSIU8>== zQ?4%QRSH(sj7%V;Pq8Fo79Bo?fyw0n(rRi*sd2>Wu}zqsqlGN7Zc5^+vX-M4gZK*q zm`~sFmU;`+azhOcbVF@G*hhjGsIk-;c}5#!QgGEIjH6Y4cpW`vahMQ+m^e&*Lt|2o z2FzI4-_`=2JZ2U1kgWc~6MA*=>{IeEUT#S>Za6U=9112erikAj!YTJadmxpuDJpzk zkaC;md$JL1^ggi7zn|4 zl<;&sd8#k-iR6sueVtc;PCMrYxkmz@DlJ1J(yvHuiaYf&h}7)ERNstmqZJrOs`2~% z61hJ?s*gEh2e}}{n{lL3R(2K~F)e-?pgJ6_O}sVF+r=)T5KSJekQL#kQh_%Gb);Cw zr_zQ~r~O8mfYQO}YMF9B+vptGd%xKsEF_94>?C*-ezUexN%xPJE3?0;rqAd+pm3azm;EDpB0{Id26uE>%jsnZiNs8CY z031gH^HY6Z{47vFTBsnB7J@{48xRqj5tE-zu^w<_weiT^Us5bJ6)0|4)nGh=lB>^T zzB?w}LMGyql7xhesiq)&Oliq;69juii<%%kBBk+*%^ZBpz#k!&1`@5Gw;1OBW>e)7 z#YR85)zL1nGlj^4eij)MycOM!glI1GrM@(Jogq|jC3fh|Dd2aI8KGR%-%J^msNzPJ zqCSm7g(&+KA}9)EShC!dKJ1wZqxWp!L9076yrdf4a!Nc^sN6frMyJWRqQ5?(x|Nfd zmk^!rh))Q5)-bN=t7=f&ciGy{qShmq6B78`8M?aB$hH222v8woXV91`Zq1wJ?3ma& zA*zMYgh|5BBnkZ~OQ;aF)M+&;K4&*Rg5eUYdGUIxmG+c-}7w1qR?~K77VXWLnBKA z;y6OpclR3Ne7{zG0&H^1!eL^Jhr~we5lR&gLL9p8ZUyZx41&CPG&j|oF;2f`C#Hi1 z5o)Iy*m2AL1rrbue;(74(-XFQmj;6O5TE|+A3|o&!2(A@F2V=!T@J$9sXS4Q_GA>{WKeXer%^wAs4-9%SDDfl5?>m_fq1of3d!X_a-epf1UX>V7uq#RseFP78UTUv1)Wc=R=-6SkF z7?1B4{+|ctx5<{0w*w{n0@WnQ;*~fHCldQW@R=8m<`%-k!3~@u9ld-@qTZJt6+-1Bf_b+u#E&V-Z*1g zQ6lIqtVP2{4Xa#;gs|?2IH-TL8KYHM(p6dF^vUt^(vUFs&mKm zheKJjM<@>e%#!pJ`v({yQJ94eiCRXEVMYY8lLwJiXeP`QU2vf8F4qAqGMdTXV;5h_ zDJ+6)!MPrN82)!}`Q}P%Er1Y~vvD3o$8e#e5DXdEaw?ug^`<0rPK>Uc^lnNdjq9vm zVf0)WpSh;c#GYlD+IuRqTVxyB#+K4(LmDbqI7&x>)j@|)!$AD*LzsYOq~t-ZXkgr? zj`IVl0C~T9tc6k_LW>(2V|kyccFBSknC^ZH-MfQ99dLL;(Q}Ji*YupB0&5s`l%g>U z_}o*KBiGvjV#m?Pp{To)^CBe3SZM@n<#sJw?24E7a$HEdA_kQ)tJD!8*SxM=husuT8M;4QmjD`Bo6 zI~xa2!8}IB&y+b}{kHj8x*;OO-v;SOX9`3q=E_X6$43w} z^0tM8G@ytN-?dSeI;ebw+_(^`m}abGr7DX67#L3V!TK+>JlQNPi3FfTqhBGfuTHNx zGDtmD?6MuZKF-q9|G5)|nC3E*GQx-@A%|k?A>=-Tt>6}7+W9%wsn=wzs5*U5mvcgw z4g)1e0>)kgiZC)k1GXfYf&9OpRD@ANZ$pepwDS^$P%QI~M#M&&jZGS%r^*J!O2Q{n zsh57gQ81ki19E#v+pw+13BC2cWgA$_ym*nb5TA~oI6|Z6DcgISZB`X7t|U_8c&M-V zF4jtxo3;SG|$y0j61w(S~wB!ip5+1=arldge@oS_A*R5-TuGSn7+l zM|zk{2k;B(ul6=;By<}+BAPRbKRIJ^E841&5^KRsWMoQUNrD>wC}d6`y@MQvI+;$3 ztLj!uBgT|wGPxjEF2Nhq&&6#;!^fB7DL^4oJL+WcF+ENXau7!NU#ExEWk}g_S1rD& zr5Zq^M#Oq;U1`CIB*5LC@TKCMhT1bB`sK}HrYe*qhq6|651ylbnB1AGu#gNSQ%6;+ z3lc0irRPYx4!z6x>a?OGy0Alf)C$QbjanTAFt*{c5~Zven-@jvf=Uu7u9wTKWy?(5 zQKZz7!9ZX^DlFlnVigxxj!W2&gD*PNGmrNpYeQpaG>GVoXEZsY++Xp)j%PCPRt>S4GghoZDSpxyK&DGB3A<)5&30UUCOO3409 zB10k%Sl$8cA)2#4=QUV(sIY6}E6_r&DDoZYUvbFcA{F9waiM;Q4x?`Pd*=;`=#*{7 zt4gUg47x&6h9|L0D7+iE8EhHpA=e~e+Gk%+l{Wyb3vP;$MzYbDF$FI)O4PF2@G2wZ zty@sCWSiT8H`yxJ*ppn-b6jw1ZS%6LU*dnI{L7d8ISlhUfV`+AULc7;%S9!EyCa$K zVQvshD1{DUf%NjiinLv^!q98dY_+SA2wbD#8}+p#F_Eh)Aszy27b2r5_!t2QKLJUK zIP6hq1_lTA@si^#2Id$f-$@F3#$EVCc0SCe9EifG3<<$__+ikY69y&H&|Ev%_8W0B z_z~ym_(~_!p;weoP1nMXG(0m)ycHMBpwcGRtL|aarP+owZi+UdbxnUKzdLuyt2Ssr zmpS$+Z&uD_uB{Cu#R=<~#G)%ML(fqKiLyaB3G^PU+@eyx<3ncNdMLE)Z*bVuQ$6S#TQ>cl|=sTZ9Up+o-CuzO7DrcqL zwBiQF*bTKok+m#Mf5 z>x*vh?NTEiG?%KJ9Sv^|A#7PW(obXw|Bn_NTXR%}$+?H|ZHH72B`$32_Zso_lT$o~ z7W`flNO45lM|wD>W5_wERI%Z%t6CDkksU~HciapnNg)_}`!2tqzh<5LC8Y z`9cbp&dedptQ14BwqkJ~QpX~F+(rb;Q&E@Ph{uQPODWmo9?p7+>c*8S<4{$XEt|S+ zxj656lzF5xiC^|H5wT^758Rj!!W<7A(ELa;su@0AFl@$! zbLzYD?#^>0A?4Wg5YdZtYYCVp0R7evb*Be$=ntmGV)LuxrU6|uQ$j+H&pfuOy z$|fWy=F%N(Mv^p;nh|Mo3+={aHcK;2T&x}kvIeynz872)P7>=o=y^g_8*94kDC|Ze z->ynMuA%jLTW$AjI>&)*%7=WCaRMFgO|-V8tBzp7O)7bWNh0kF=Ab+T#dD&7+_8_J z;ABCJ1gnmf#^4y4&JB=O6cV4CTFYgQZ{zaWS*I;Z5OW;xK~i7PW;iWzc7jS2c`j-e z>UK3>RPPiFdJj&V&a4psW9JSys`S1%56K1&v6vI!Lr$nrOf`3`aS`^IhB>KW-5sY7 z-KYnS_a3eL2)k+BR)=fkP83)A<_7Y(e(Z7HL59k>A~@8s5Tr){^tZ@e0%|x1WfWk7 zM`?MwfN+aj`}|o!F)UN!KZWGSJ1t0JZ_<@tAiss27q`h2&WP|aDOb+y0yX0zhcdy&+rpvzBW;N6`&5b6&b7h62Y zw(=sHadkOaLA|8sV0mQXY!_XCet8b|_cd=sDc<)Q=wQ0Z$D;DiZJ=2NKXlxlm{H+| zBlxp~p%ogdi!ij~w!Jor9{Mnh0FwFfOW`Q_IbDukHlFNt8j`3=T)c~60GKM<$Uh{# z&$BM#oA5rm12}AC&rwEL3Nn#w0kMs$>Kbxpa6GAFRQH3^2pgp}JRwk|;c;;;)e>a< zv|-;>Ole4XZ>m9AT{uZJz{FjdMrIxI_rn?wNauEN+~mx4*^aJJD{sz)3uV?8M;~}D zz(& zDN@kMshYP;oJD7FX33F*1c9x3RxZGD*BNY+gK2agKI0cmq6OKqkU{`>f1yTMT3ZG+ z(Xr_l>HlMjB@pHCnOk+D#)4tx=wFJOzCnNltpAr$ZpXi(vRaECJ_gdy~Gb{&dZddyL&GpMv=T@%BhYv^$`jzCI- z;r+J@c2J5+;t_G(2lu1-j*&16YIJkj(9JMF8Mb6hdrCSi1LUDvFkR_}wq4XWB2K>F z&G^Yv;7Cky5m$}t<%V5WogTmrrf9j=fQaMc>ID`hTn_FBFpgWHtVCE4*vjZ{+x0+f zy_V3&ho~rwjd#>P%E&`@zmJ-Tom#?;@iQYO?;3@w#|B`+F(QsHhy#3Xyb&r1WsMAT zK#iQ0@~9m-=&Gu6vyy>70g1!Lp3n;ns?B7KKpJYRbaA7LugLRe_67s3G-oN#26XVu zppA`f7>+ArhM_bJ|NKLevsJU|^d`6;!;|Po@@;Fz`k)EvFCo!HNQ};Oa3uEzpQNyD zbQbgHXG!J83$YVcMT5$gVq?QRKd;{5UfPH#8kAdrdHgRXu)x zit%f-;)B51ddFFSlHgvD5BTc=j|~GkKCBnG5*YJLhTyMGD$rCh}UN&=I+{00?Cq5E-K zElF->Qp)Y8r5u(Vax|Y!X3aumF2zMKxlV&WNr0OOEQJTdn^?$u>TqF$%ws8P;D&j@ z+0w!2p|}7Ul3F-&Sbls=gGkN!s14Ijdk3u=|yf2n-r`Xl#3}VzVyQ-}!IXs<~xl59$lOdNTJ}ZQ9 zbj7jwkV+F2=lTaww*wXp^4#?sNUlYa?fVxzkum2kN(sYol9Rj$64JRi2$-wKk+@)P z`Qe$~;v)08>;ac{DUSOpPA2N&BY1K>0Tav_GyXdl^>?Ge#M<)bRlQxUP;zx(Hmko4 z$#cYoYF*|{+YEi~bJUU#mCt?erwr-AXb5!*O}u~LSWMS#>U~yfrmT)i=%jlqz%qv8 z)NG}Fd}2(S0EeT@Oz71NiiJ6`^itX&<^H)Mm4D`>4_Zolgi4S;dvs2`i41jpI0)=K zWIJ<-#!#<(#NxMp3zrILr-B?REa;}o7W8F+# z;myco1W);hF82f+apOlyIvPwjm=<#zCU9~anxJxeDg4ZwWVtCDW@had5a$dZaZiHbzQn5S3Ab&}F9Os3$?<#1jty8yQND z_m8#o9@$$s+QflZK2R9ulIlg)Rdemxk zO49E|C-FD!FGF!at?o-Iu2ijdk7e(c6Q^f>>|EtmKCp##O0j!K_It8bCXJl@v4&pb z{_;dTd-7by+D`bMCw`Fo@CLcKL97cuAX8_qORf5e(;l45kw)Ci&g&klavGVh7^6Z^ zb5~#~Hh6Uas&uKHEKZFL1~(*PSVqh#0OMz+^O#`NO}f75{7+kw5?9-v8CTN~Z8BsETCZqc|QGvqHs3;er%J z(ZW_FkbG=)L=b+2dlZH7lgrM2@;julL^6LtA{~|y`1#mw^t35sx5;}%p%nlV5C1tP z7B{%iM`kpW;)nAjGTjx5!G!=uq?PCtl&ECc9E7*U=4r(KaxoVHOd1D|^;VkUo1%TZ z!y1=*6lmupH6tb5I%ryxqDB`;e9xW6U0}%yIh2KcvY`k=xh_Q-u1Aa;=1cS8kf?|dzKLOtR1z;)*KbWexdYI9KRi8Ezql z9|yuYQ|(6^sKGiNBZjt`VE#x`uu7?$J$J?)8<8h@IvMsyr;DnGq%u796JOe~`y#e= z8-{v?c?)701V?97p5(2UP=YipM?LL@TnwGAv2qYpX(We@*Wd<2F$MDUNx-O}QgeYu zb4?3akXl3<+8sGg=03n70EUtiR)gDYzu`KkIwTZyhrv_|9Zlont2!ibFNOIkRz@@W z;{C>Ji*1&=k>*}hhrp{y5*MdC;0_mfO}Q;8CZDmu=jo(}QeoJMHxOyQh*pbt&ZK^> z;L*Oh4=>56fBgDfln0U!1P8Y`N{MHcAKTiqsQ-S1m>#Z8yLB>=v$IDSSQ9CL&2o$& zmzfSqph2t|-&i`t$u9HWa~h)VKmJ?tF>C0y@Xa(=U$idVXxS+2=Q}lcm|WBQ9G|+= zQK=3)$S8nB<$<5Z=4=OY9ekK(Fjrg)Q%JUX6B(t;apj~ByT_SMcTgQ{_4>yP47a-X zpE08QzQKy^3;r@!UT>WJHk$V*A&Ok*lqF}*Kjd+CJx_*_bVg)924K$ zS-#uiSjuhh=Gze>p>DCSj}4uE_ac~|^4SI_Xof1jt#!PCYb|SwO<#7I`%a8h>K#nx z8iWMgh!oc;hDZe;J-nvs!nKOCCK& zs5n24O(5Tb=`Eg!XXz~xFq=r_n^7sIcB$y+>LeEE(Z-+o(Uts%E(TcgE;uI|Rt=a~ zsxw`U+OT;no@Vs=rwdec2P+fbrI^Blte^Wl#s8@g&>NKF5h>L-l}H$oagd*I+Gz0Q z39U~(`dN)BK^Sx3NF;~Ep!J$*0{P_ zS8IJ}?*E0;rN$@Te&TwdrER2aFB<0Wy)N%!NfAK=t>Q)N$ECYU=;d!0$(^MeCb&P_ z_}fdP@CeX!>RW_T*{TD`8eL64u!Rg`TrlR2ed>#a%x6gF0C4(W9&kuF9;}1&p+eh@ z>%)YkZP66In^&tAebkGc8$bYuKzP3?MTB@EM@LD?-_ViIneZ0=qefyA1Km-c$&n}F zMkb@O@c?S->FBr@_e9lWu%NH}GQPN6Ye1bf=u3#@g<(h62v=r=tBHnn(F75qp8mUz zJOe*)DT5)E)Ev8uVmv24xuXuZE2wf18V{j-4q^;}ql6GB9ng&lbaPl3=WTYu6Rh1K zMxCj5nuJ36*m7OFEQMQy<4+zwa}2(SuAOR+Aw0N1qL}Y{`NAUo1#Sk*1o>o@d9uUr znLR`LSV9Z;T|GaRe$i?$Wmxt#OsWPn#U&q6jNYj`K?$$!-f%vDtVXW*LY=wg4*{$` zYRn|AmaLmloonK{|EPYbst0dGhQi2PLf5huK-WhqT-Y)YDem0~K9&~X3SpD=G9XG3 zc7MO{rQt$KU$i(}MBInj-7J~kC)YR0m+9Tz^!njz^8V%ye@JfcZvMENeoT{x8~%Cr zuZP+7LvlO2`#67in7vEhel^qE+pGEI^zGFwxte~#my`Z=IlFyGzI>QnCpTFB%lv+p z+&@h5!u&e;lX^kxq3Id<1bXbqTTt$sDCP2SQ9*EbKz)tpX7k3HO^2D|CAZgl`d>wlcxU4Eb+r*G$1bHW!stMz{V za7|k_0xySwSVqkV>%r^pCq4BRZl9^JPwe;r2XXBtjS|ze0Zqgz=R~>?Zkm^KSkg z*P?`Td2{`F_VwPxSRp(IlAXT20b`uBg(*@MnAHhCil0q z%Q^l*eBYwjZc!Qw1|3n-(zn0s;d6~uMckhg2 zGN#-2)A`k>yD{Nm=Nm#HmSh5qZbF{8KTi!VKbgO$tu8<4wIu^q{+fKCt9U!3$ENQ- z&zT){9|Cf&IHA+=3W`UezF#in+amZRhNr;$gC><&dF2D4=R0EXU^yVgm*}78!O3ENz(y~giZX)zNX#U%!9pSFpf@Nq77P&)+MOi>dQg6r z@JEYD+mFY(9{G>xlJEJ%7YM_DALP4EQ$~@Lb3M4y@~=>N*JP|J0Bw{(((n4PFR%+= zC3fWu`pId{kmxxcxzDjB&0TB$rEf>QrKx5{+D>K|p>S`_5p`b%s(G=ZGs913i#f!f z+eBzoz9%vK5U=~Ps?RSu-`IU5jcdeG6jf&$3=HP0Yn}3zzpDwHa~!(ORyZ0U_HS?8 z!(>rOw*?mwMP>H#y_RE7foST$e?6?IFSa(FMijl zM9#`OyF5>R!*sgeX$M}ScI|t=%f1i#y;fJYF}Utu{rAQPmt1ttAJmkC^bH-)C_ZZ? zXYIhh(1xGWHhk*bn1j$lsH2efqqAYV>G`2&b8#F2;hg^4RcoXdT$2ua<6_yW6O(>d&=-ig5h;<#S_E|&-vjlg&}UTn;M0D zL`>JdvUylpcY0x+D;Lco3%C?_kcb_X4>tL2-F4evU%lGxb{CITe^ED&uUxsutKSKr zDN6UybQ6y@!4MIVogDv`PmlA=d&K#gy28{bd@Cf|qH=}K7Awka?1yTVbr}a+QYYoy z$5t}nqv?$DD1XM455?WU7!2F-+(sF88V~Hn;2LdN{Z04%{V#Lk0UgR{X2$9C?fuQw zr-#|q*VvPJ!*{CJnRI(1(EsEwzVBXKgyqKk98?F(a$8~_2}};yn^zES_D#_~lJF+p zZuuexgpiNO(t5u|xRKL^iT?_rgO6eGZ!7(|uhqw$&clJQC*qw+avUGQ&7aLDJ@IO~N8NHPJ;kxQ`gCLxXQ$GT&}ivQ-vd!JJuGLC%N zIr^-mSZMf#dexq}@#Sq|QuC)wDv`ryB#jUGNTpjmER2Lid_OWdY#Y8y?f%e4y%LdJ z&QKuM)W~C6{jAqso9$%mFZXqVM;RF+p1HC}AVDBo`nbc6nkwov45{DD(ZyXnOZaH# zY7ur?UVu+`ySf!13oczR;_{6-F_~OK}R1NjaL3uzlvZ?64a6Yb*F5sIPI7_9WF zd(A!L=l72NImXsDp|x+`wSyJY0Cq)J{=WE7+uzV+^CbyvP6Ulb^o8X!vAbo4A*nC}r->KSo*|G8hMDQRfS2VH0 z2g#PnY5jr>B=7{3yWSOgSLpKmo2wmgjLo<@uV1oT**?;30nYhGDbPPszxfB3rsr`G zD{8?NOUaDH7m>M+-y@S{kx6M}=vYT420Y*j(Re+=9jxsoGLuULtT8MBzm_n zQ4g6(WRetD#t}(I0*{v$p0}pzI4oR!?6W=YutonNt}DEZm*|HADMpDup#h^zK1XJV z5yKeIhz;>Rfww1Q!B?bMc#Nj_&)$E*U|tFtS!1j+BGsBEn;dJY`h%%Q@ay$@ZpZ2< z!gwZRPTe!nSYSmL^E*O$N^Yqlr8lHR3$!8mRU{?%;mLC%Qwh3|yi~T|mMJ|YH*P0y zOmEJFsAcg%Tr8|motisngM~V6!T!LZvTht?X%jS!=opSrl~B2&h%|1rhumn zbs;z$%vil#6u8+mXCyqaW7^K{0G5$0@P3oqfP5k0)T=8~Bk0qxp2KC$=%!M0f>skB zs8~`WsuAF}2G#U54^ib*l3EgEHtQCs>(X_rM#=iLhv(GgT**Gn4l-^w|1V5?SpFTx zzQA#qss(IYlIPB!`t1t)$NBol%1iGrU5T}numpIVODrwPFGwx0u(dVRGuAWaN~$bL zP0mkAwY4?SGv&%l&DTxJPXuv{^~|{nDnU}kC6zfqc_W~ZAr}CQQWILdMtGb>RLic@ zFc97QE09>Cx`~st>6I#h5NlWE(1GjG&l}#dK?dmhoXa~l=%}n-$yxJOu)#nG zdYy<4(`z=k6lc3qJn|#n7Iy<5bg^~3VMB_b>>Lklb3GBEWvY` z&Bvf2P*V-XBxS(oF)DleuQZ{WA2}l%id{r-l@Ds z-jh{X52c|4Tk&pEJ_1}FbAvB}<0rr!Aj^g)$(-4yDZL%9GwBAV%-Awq&En!NT5GO4 z7Hi!x7q+M|s6$m6R;qMFmFOx%OeWLQj?v_#542rDmx=iKltjMvA8A^O{32hLON)-N zh=B~~U)-BE=p-(DEbq~I38RcqIx3`SemtK;!#uoh*i$GC;7}oVK#V=EDd@k?mr}9# zIxckc^$Cmpyz3BQ%-3@wXL7kR?iNWlZ;T$Ae5r!nw2zxKu-^W^p}V^4k*iCKxB!j%6GNZ_c$_mdFfcPQQ7B0*E{V@f&W|ri%`M1DEJ@WXsAR~$ zReot9r@UbgTgsJf&6(4tTvN^f0HReA|Gek{cmbtX-*4MC5PsKR!FCU}J1=Om?WL#( zWNA7CZIU4=Fcd{0&=Tbckw}4}lK8*x9e-1ny)5&SE#BRC_ucV3xsswKYeA1{u9y_v z(G?R%Hv?C7%ShdJLMn20$BO%ZYQ}8@8!?h-#ird)z7^ z>Bd9730CW&ZdA>C7p)Mypei#4oIM>WanC%~n=H$&`4>rfUolBmBn6+(ls%d)$&8kz z%&`FfLka!06;SzX0g+C-PKpOM5r~=-?|LXsmX)j`ca)b6%Q@?QKb{xrX-P!KBt@#0 zgvw37c$Z}aK6MpN$ZADqoVINCPM_hqWNMI{e7XK~ewAOHUY;8_*6cWztf*Vs^!uDY zoS$7>o_@aF8=&8|Ytig;zx{go=k@2k&PpiS+zwsWY3wB*av7q3F@wp}snK}+6MMQZhwEOn<`+f{R9U;yb;@5B#L6jnQzNRV*Wg7eK z_`Cgb@(l2gIFSM6KPR9^`o&qexqd+c*7fDkO(Pz$#|NrE33;XTQ|CMlZ+mX9&PTWt z45R|D(j&Mc#&7(zuwJZ5swzkXI{m@^99$yv|Jy4%Nmp z4{^>hY5>RMPJ(jJU%MeBN|2s4)vMPFFB@p)q(cr+K0d$?N>~0s8&ElaRcr#m26s&)nfvG4_1s!*d+Xw?G~Z~e1F^pFu8j+k?b z;)ES$M`1LM0Wt0ykrtuq_a!sczi!1WpPCP zze_?NXx-2?Y{h%F1kry8JSp@C^e(iroCXdVd?nUy%|8dTeF9^>`$bi93gCCgmUMp z?x+H-(WIq5k&1)vJ0(hJ&OU*0e($XuaOa_vPWw~5>nJKA>T=DThk;LST z)cANV0LVlOOtbC*c$}42e~;s~5&hqvV!GQxHek!w?p+Wp;#@bEO}fBcZjoKIC=LsQ zmS~H&5~+}sy+)Dmo;M_A$(Iyp4~w%z4(G?4nK#tspO&4o%Z<`YsrS?#eP#4ya!EJ! zK^z^mR&J#wCw^)asS8soy^E^wEQ^yG(@GuJ&1tO_zM4!bX(g?~OD;B!f2ZN4R91^dPS@+L zs^xk;n{hZlN>9F$R2#jcQo6#b)+?haDCeD@Z*RW;a7%n>a!|eswxi0=M(HUVoKqIX z@}|sY^ONhVtn=H&*V&AOqwV#C@Q*F6$Cg&K&8-yW6b?-SKGPt`-mWq&%|aDs;bqg- z!pm$v3A>l{PiY;_J93rj>JkV+;z+^A``i21uV3XvKNt&Ck(Q!!EKT@x@T`^#XF6Lj zzEK^=x{oSJ6xKKwla;qe61oigtu>!z;X^X!*p}&R<$dd}m&=$@=*(lmLSY@yBzvi#{Ku1umvKzV&is>=IL0b+`(@(eeZ%{?gQsdko z!Myr%;e_Mk5Lo7@5lT~K8rh;W^B~gMdX@Dd?f`GM$pQ8fsnPPKsD$3h<$ur9O$U$B z8qy1H3|4HoaMDZAj{^1+Ku zJt)h*mwQ>8wqfqTp6?u8Ul00w5Tdp_U8;iX=TMo5USHdAU1<68JfCHgnFH@=Ygf@UwK||K zD!ND_7bG@d-`QaQeL4$EA0O`MrbTdjc#iiEcaM~|&n-W+vQXP&==0QM`<`Lg0oS#G zW|{AD;0KDeUKL#}EEAsV&Jyb@;lnXC04<@~p6N<<{xMbm&h z=sh~1Lt}Cz=?LdIe?3P3e>w0b9e6sm#=qF((nxn+4ps)5@#bxidzQz8v87vOfpPBM zeT=LF0{Td~*f+GPP4SFY1&x%Wq?bs-(1-s92nA^CbLTJQ4sKMu9psDSb zMVb^j48I!r_!xm@ojgd-=IeBpPq=?h%2(&xV3xWoFcf9WSD2ADIEVYal7nk zHqcq^B_^p?i0wE}p3y-dMsLCe02(?#7Ge|B9M=tc7EZPh?=Tq~2IMq#l#6q*?d8BM z7ht=KAvN!zlx(LLUNsV^w%muhP=F~`BXc;SKB&5;4balg13MJ_=18q-x%PC@_4{5= zvU!}97=BvRM_fY4Z0RCxudV#0Q&zeQ+B;U6^$AED9Fhx{1Rk66`u`h@VFu)N!Hd;p4hy%b)gv@0FjsKi66vc8uC8ET0wbjYT^G@UAMK4yTX zFKL*GVD==Lf5qeoOK#4BIwIZ|n%K*z{mhRKH$UC|aQpC>;~9hGAnQ6Z>t%9o%>g7p z14m>oq$Xf6mdWv7kHzJ$V>ZA@+EsKWoW)y!OrHrB&Iq1CqNwKVmc#uD#SAX{=47xY^Ka%v|F(Lpv-_-zCd%r;V4u&}o+`4M2J^G{_>F zg-7NW(dS*qiw*nD1PSlLr$qJ#yn`Erq3j!XgeQPNy?na_4+dzWw$o{J^)&1E<^Y`^ zmV@%A*}#MNO5#DzK*$$abm0O-F&GpD6F=J3g7ffU;<+MI0>W(t9w8-3)kQjW(NDCT zZpTM^JK;lM!8cm;ZF3sj{6QeNzmq!dU+6FJ9mB&CnGgAHtx9+FhEq3knpuFwys$fb zg7pScafT??(Ur5}j8{cc$|AI z`&f2EJrkqR<_0Ex7Dltl8`umO%{M<}W8we+gscczxMp~qja9*J+c*%t^D740LwA8# zitRXQQYY9V?IDMz#lj2h%^p)Di>*X*NlLM?=)doXl5D5F)CXH4-@JMAI2K&!V?J@>s&maGpRAy&V-|mta@}lxk z-Y3)9!tUQiHUP2A?1NaA^B;3PlYytl&#8Qn>XY$$_jBU@k$ig>Cv zM$KVTL(2j2tM3}qI7#t6V?VPoS_m$M)zF>~PO4BHSY520_eas*~}3Iek6K9$^#r3YCU^5aQTFwN>K*bnK^Asqp|?0vQp+ zzIpD~sxmLWPf<8i!`5IrARMUL8W#pmay@K(ODlul``EwH#Ma-8FA zHoe-!3*M1-7tuD3yPAB;ayOfe_%GU%NRv}?2mM=IvFNZSo)wnJo%hlA}hF3vXk@;cfy1yidK*pM{sr{MPu_Sn;P}F*AFin22vht=VNt5@d&WQqGEc!;;3PkS-Mxx`UP#I1H4tjjjBR${L~4qKfGEe?g6Ei`Bz@uL9U7DM zvHRd`myTy>1v0kPaeDt+6|XjT#}<;4o4}CkfhsZoui%^q%YdLQ1Bw9x3^YiyE)PwL)mZmt(9)4iSRw_I zisSwI9bP0+vYoU-5KH8_eEiOhi^U>(dia+--anHKG;K{aMC#}x_-QVhM(|W=A!#)zesiC9UmwpT^(zyDeXVJ}Z-8r+ zRG_z1Df53^9ksPM08g8f{q6NP=3_3yq5aScJUx8<@E7Gp4RS7)OK~g|tq08a{X!H) z1(f6qaubUdq(48Em0D#H!N*3$yksqvv>}63MwFHqbRe8!R76QMz7N|NcY^PwkWHv= zEN7%<3K?-fsECW5<$%yy@QNIn-cPML6B2YMxx;0i-AMzLlAbb)LxSpReTHOu4DCWs z)qaBW&aAfC}irl6>S2oDO{s%1mvY z#ClSqu}e$4wF+H5md;`_!RfK~#sYBWaY;covV+jnvtjVa6eQ$`DT=mCM%F?cy4FJX zJYvO+%uk^N#c8wDDd0K9VGs;u*5qPg$17t`W3S1ACNN^{`^h?JC2>H@SiS49a6XHmnh-r>PM1!hmd)8LRu3HMUs}vshq1LXbfx3SpWD+W{Ie z^?{FUJ3jazpiEsWr5XrjAW>CV>7%IbuEsjWl;&lQBz>k95ZFA^;V8u zJRX*ew#`yqr^_bfG#TGztp~7`P~nIG`HuO+DIY}Rp9uBnNNK9O_fBElI6>>=$F0*B zya~}=4c8sa2KA`2rH#Og&pZ}hZQ1by$F4ZKUOG9y|0k_gKjg#2&D@Z?GUG!LJ6YXi z)WX}iGL416>)v-iyQY_cBVG(um*?30%dQ@rdfvFu*XP6Nz)#{Y9o`yt{p=Y)Emre} z=nrpJ-s-U)fEO_p7B3lRn$ep52gPzVnTAF04`)fm@_83e+is?wklWQoso;=4UsJE= zV?L_6U7X`vEhgoENiA&eGe*WCIm?gee}rJNJ>)@$CwQE7Q%!FYK^P8L3oLqQA|bIM zjw#9RA|WxgF_LgV3rZ}|2*!gk+hKR06K7{Ov$HMeq4DBbGcobv$%9uDe}nN4_!B&M z^wgs|3kxpP?&*E!eV*t2+&}qmxi_zKL(W`4(YPYUm;vm1j0+%1qS&50C2fJRIXiZI zNYH;`6nQ%<&jSW4m?ugCZRik1X3GyhsxR3 z1&7ohB0dF1c2gA^`q1+@JDMs(LfCOg)1Q4gO=J@C&V}zu!<3iT4zm63!$!yIKIt?b z$?@8cTN;QyjzqvIupzb3*gk}GgbdYA89*VRedr=8{4(hC0Gaai;`O3oR<#9r$T(mg zz!b#Wtx7jtkRR8t$j|9iQAs)kS>fz&&Xk#lI24#sm4uIcQ`6+H^~z>ciGw`CCTfC< zEQrY6)Qv(EA0c7cnA-uFYJ`%Z!q-$aseoJQk`Vz_7FD0S)Yh_UJ+mp_rSqkT@O)xh z9F4HARvpb?R^AHbcRFXpD87Iq@Xse~pUh`GKTQiBK}_Hvv|JWYai%mp{5K^~s{uXi zI<^tLx&X(PI0gCsGSo1WYCNAZcjZPhFE44YmTuv_*1V>YQ6|Fkoi(9jiUo!Qzd(*| zR%Ic(mDvxXpxnz|eYx;rQgf%(Y4uz6J*(dCKJN6*)kA}hV+ppp!Sl#kjM-Gb3ex@p z{b5lZ?g6WJc%18z-7mW#iibBRHBX}?zPKPYFD12TaxAOb<|rN`CIG213Ou-Rc$}3~ zZBN@U5dNNDaf1&~D6d;Jgv5tXB399+RTH){RRlM2sYPN(wzHOLKYnK?=^Jd*qQ1nw zyXT&JeCM5=9p{=T7K5T%Gybe#DkKmNzBgz=C|)SXRRXaT^F)!9Iy)HROr^+RBFHi0 zno5x$`&1kUT1fItfn~Xn8V(#M?B98Q&t4iyNnBXqe#l<9I>h6Z6w)EX!?ohVAIid$2f+ zM=_Iefl@KSmp)-Xbh}Y-KNxh4-`Q#Tz`^qM6krz@8CI-G3aZHS^wruQFJK=M8ncX~ zs!=0${7%?GOt;s+_d~=yZ@mk7e%vycrK+j|G^b+Z=3)*+sUo9r28l>hA|Xfdt?EtN zKY~+0l`+Am)5>LuVwnWdz#B%s*Dqbx(*I|cXQE6Qf6H>~2BphZmW(V|R%AdjYz+;s zqOiS^VUwFaF+Gv8jA@#Hw9T^*sFtbg1c@lY5fHiCsZl4UmP+`B({o3WH)?-z{aY{U zc6y!AyNQOV`3*8@S-sy@J)hz9q3B8zoF|ihHHO#Se)}#8+^!b|p*u83_qo;D3Z%%< zgfY%E!**0n)2l}j>HQ#<7QxOmS<>k5;|S6jK~kdQZg}b zR@41hFB+E);A8I*^KvPvE+oGMBXejbxs>0Gu2m9JI@PuX3}$^2D=9Y6s>wk{x74O< z!sdK6O1~vD^n7Qyj%uLNyQH`ZstUzBC(>elRLhKI1#5+xe>X{#xmmZ$Gv{Og(h8vx zB`1>9omfhvSJGezrmiFFzzrSZLQ2YYRNVmol4HyL@Ty8>jf3Ld(B@WDV_m9H7PU&x zRBubPB@J?`u4!{=y*Yn8@%1`4y2dWbgGZghb%3p~^@J74KWg$DcV;DQzn}wn0i9Xf zZW~7ueb-ks#0N_;L(5s@g@_C=GS?9-lY+>^HVk9XoN1D?98NPmGm`oDd#b8?E+nN5 zRzRW)yDnXqQ>WTXXSZr$^&rhlYTPvLA})XQm3FJ*a(Jfjb$)(+ z#y<>q+UYHSG|Z4-r4@g(OXVYC3RPMq;WDl*#Mv6oIcFmrqTJcVe@tAer?gzFy{(+O zy_qT`3t3+kBJ50Axm^4pUr^OUHD4Q*SK9@`_MB<8v`!&4^#w@SZlajtg&jE@A(QB0Q~=V0>!=x@&qRG6V@sbUU%EiJwrKv$?d1ierBeW+-Lp6!M+or1&mDIOWA;xFWZoue#|zLO zd#9z~KXn@!Mi|1Bh9om7CwnUOX0azoQ1#1QN_nVnPVWI+>#+DkD(9inJiXHa9@B+6B(dlRI8-4MRva z9Dp*T_O2R#BXhJUzmqhD%8mFcy&U=i+4OttOyx_TtUO+8{7q+5gB_PHuR3xH>P z6sH!2gu$pmz!$VB9ooSW4;5vLbuHt9mRV~V*rU|~6?ZT4Lvq&3d&=+yrMw8WE7&&^ z)7W>w1c+NkpW!dcY5b%<=2u)0H2o%~%?TOW5+e8QDq47VgtfOSan^`i#dcwx z`V-yjcQ@){dAuf@VeSE+I_=mH-wXRf?u5j0`fw$a%57DqVR1 zKadDib%6X#in3!~?x5eaw3T_NCP-X!N+?_Is9M$OM5OkC`ohb}ZC)R5V&xMAmgr)51hebVjy{weO>|Q?u;;{K z8k1=5OWqElm%vJfaxDR$IEyHim`u)Bfz-IW1-^h?@Y#8y!Cy-eR`gqtw@dszb_;J4 zN)->5>HEc;H#pep9{SWYNM0ziJ-6wIepb3mS-T%PT>m31$9I& z(LyYW^1tKg16D&a7rO;H4Ya5OEtN zwwOt&VyqTnnUk~NDHnM?=U8Le2N9^Cx!WPz^6X)GA?`7*${s< z(E*eQPkBt|e>yIGLjzSxIj-l9L_-e1L*Brh+?zr3=kv5d$^=*!<^Oy@=oVmk6%^!& zgXR8R(-iqT)sBf%&=TQCkB&NI$#uz+?4>JCE%@#q4iTH)TFcGztFFz=*A^M^7p;+nD4yt4%papTyyJ(L@p@bhkrd_0H zzWeySrYx~s@#7W$MlUXMpDsdyMssaTjsFUEb!m(bUf4U>tf>4zlG}>jB9UuGkL5HB zl01Qws~GJb`JmOe22`~L4iE8yGC29_l_wZy(srg zy**7`-&;N?Zgn8J7avHQ=&#J{OEccg=*zs-?58K!@97rY5FFyKTyI4_-RWCiktX@= z_AKeqct`Z3H$7f`p?xVJ`WoL1(NyQS1$Yi$cL-Em40kiz+TWeH@Vle&ihO0a#P&yD ziBbEoBoMe@IvG7xj7X%KDQU~B$Tv12&zdbC%+#sGPhmD&#ZqOnUk8fvO98gOTVm{d?k092RIxr9Xy@UvatY~sNu^5zNUxEA? zgwSPACeGviu=cz9z!~eJ0^b@YE#RP3jeA(I-^xD9nmMa^cekCC&; zrv%l02c6y2vL1)LXXknD9iq1iksKo5m!M;ubNWnnM3Na=p|da+mf0nH>jkQeWMpx6a9M?(J$QHY zamASTCn2V8r=%r@@vXAU&ATl?1r0wtHCY1%zgkUx^xEn&e>I&>*YWXkNm~uid4DE8 zYbQ+Jc=WjyJe9MQK!uV$|IC%fK`Up?m;A*{H&y>N{p)ubI6rGO6L72)%$$5(B&^K@e_ zoP43??xpB(uy90Yr`p(4p<+RJx9*p2#gjJ8$O}1n3w?7Fc?%m09dQPoap5Qs<6g}V z)nwh*>Rygb<~I<B;&=j&-oN|8i*kQ8jFQGL1}?z)}l8#|^ZKAvg~ z>BhlB@%dfQna@qxv>d%MTNk!YXEbk~dx!I{@DYK4Y{a3_9gqN4w+tWwVEgj|^a8X7 z6^N$UUz+MT!2B4MQT5m@KOJlh*CiiM4jcl6Bi5F}{#(bP(bE&-G-1)p)Fno4Y)`Z2 zGMLqzp01Wv)X{DBza-?Yg@r=v4)We^6ZQr&lw;aZ9|aKe5Peu1-1eUJJquEviE=Fw zb5Cy-VWkBm>6E9HVwB73s`l3A&GQV>JK8(1;guyMd|WK>#3z%gNHfW&81QDxJ>B|Q zERAQ%#;3~lEU1|71SEN>%`CTNYhe?&Z*LRlUdz33B6mH38U<2jmq0%nw~Y1CmUw%? z3~{T@bA=_fVP2_*?lRY{j!_bo4ByKEB3Hn;6+H6+aNP2*n*SnpvnJH}_WM%QsFVgV z8+)z2JpiCS3R!x9+(_z{!6Vx#2`YeOQor6(By+)!G|-J^fC>xSJJrYDBE{rE?a4KM zaUh5%r~t9ui>7LDcDM2yjHtymKnZReZhQOq+VuDDyx-=I^u^(ewN?xL4HV(Zxle3W zt$B7JVyq2VYd)*O<0er&SrghR363t-qh|HeZ+gr8XOgi3YcEf+*6{gW8eCJLn95?u zQZ8r*+W1a=-6Yfk(T5sWXH#cF*`v){t!)JmSg7rGu=cCMk|_xO)XBH)QL9jd`{1H- zmfC>eEW8-~!sP;@Ds!=6g(+{(s9Cde(N<8%n0rD zHnd=*%^W0|@Z3%>V6*TOgw_>Tc{HYOi=77T&fRlW6lH>e8R_b;aie|u&Sv}BQ|23;VM)@qyCOs*~fkLs=C(D%{Rhlf|> z&aF`Tb#rptS(7ACXQEA6?TC5%cwW&2Oz)#97-S%7<~tv*7gPSI{`?+up;_||?sI1v zTW9SCY*f~fTW3J?p02KGgVco2V;WK`B&vn3y#N;YBh3Yb?{74$ekrccjFWu5;c{6U zIDxS(PZ(-_+MvhBFD@I=(7tBK!rV(vxsm=c&fTG9F68c}5=$YYIzr7kNm5Jm9c`?} zlF3!j81}9;1_HU@vC{fy()`+U@R>%;<&>|Gh+B2bg7(UN`assG@tZ6qWn4hRYX|LQ z9?MH*0jp6wq72Wqy9C{fq9xOJ)aJ);a03~ZlXO3K4U*zn+W4@*;ktFJkGCchDnfnZ z7%HY46i6{ZlQ6<*k+MfA_sb}Z`Eke7s85Q3AxKv2 zG)>7Xn}rlX0!=lDug4E-il2Xqq!Plobd9_B8mWutpC{+1{sb+3bG7)v3pD?^!EzgP7?orZ6fCY3Tsf1` zPK#xeO_Q*idnZG#F?K}qYW)Ii*XvilF)v&f*A3^@O{9aqbt8SxAMma;@$60b_IhP}XLo#%T z5E58Jq=rHrH?9?z^lulc{OUzMPUcxr zk0@#Ci?|(HXVZ8x$hG*Xl(??rTg%yf!FDCJ`I|O-q3PVi_`Lc1`jffYOP#9EKICR{ z`u?6x@$GwZovrfn;AShGaueQI8GZWH)rfPvRIz4$R-NvZO8laj&x;7+eIdHArGw6L z+i08a*H(B_-zMKJAFod<<4r z&Lf^xu5@*12UMz0zB^F!7+3E8EVn%WEMOB-%2=`fEwb_TQE&eBNI}*3ruzG(O+;Uh zGx=k(%jB3{P-H=g4sBJzW{;_1_wsX)-#a5;_wyc6^$w!F>3!}mqr#)*@d#LdMC}U!M;jV_hXFDV%bYBctC5bI{yDI>agy4Mlq8#}ukeq$vh>9CS2T=Bwh-e<~_=!(@@{e5h3xUX2 zSC`=O0BxIgik=c52APG31-F&ZOGx zoCEP(M{501Dlf~}Z;F+RfMBk(+*oH>v;#E(y~4CsEjL;ln}P4Tt!^)@A196{q5~{x z-}#ay&L}@@I$>L63=pi3Vgit~q;($LH9~R2q%pB(zGGo{4po;HxTDQZtVMj`_Nr!ZLbQ(4t`c_` zvER}!-2$#*bxZiuv$tDWwg$S4&?b(OaeKnlT$uhOo8pi%q_)y11M+oM|9+P94{evw zGug-cWCZ}jN8km|;Yt7WO5Zq}F|naE)B1sX*V71IC^ zdfIwhf+s;mWVfHqY2bpcWk!-rKYA=79i<=yO0Aukb(ty|w493*wu(ru0=-W~{9Z!= z?s^tuPan%RD`Q8bR~&}TgGTG>4NPE86jKK;%7Qv|J~l6Dl7O0H76mOGsTMQtF>7%m zp29TK0>)TXnM8DV`b!~hsp24qL%bE)?0qUDoxkL*0xuTm53;4YICvH#%bfP|N|%u9 zaaAAe9CHahQSigaENBAL9)mt$$(L2m>>!bYFR|#2}?DOUr^8=u%KLfR{UwO(lN6o zpg5xD&Ztiwm|ZENY*u$Sq+2mxnEUi&cwibQ38I+qN2U7xi%A;v5l!uIm{XvfRY%+0 zYi3W}%Z4U}6q9k{Vwo&QjjegjFr!%4}(%K%u|bWht>_*+B<4AN}*S;J~B-Dho|~gLuCjd7SDimg>4H#j;0_+c330 z^n&j*0%_>+o%(V{T@?b!%77E5|0yD2b8Dd=!3;DF(O7Tg_uTcYF(CYO&nsLDFN?r+ z=ti*O6b_hhO`$}5P6pa#s;z~1W<#C63e7y$F8_4D;@TdEQa&eZ$7@fLX!(%LGX5bt zu?5<~m#28WSz+3Ww6ep(xw{Sb1jVm9DlhzaZbQPmR?GXnN8d>3s=PZ^u!GhtDRTl% zT~Q#!*I|Tmi}c|lN^*(EkXfRB2ecxmJIvOP=FR5QeBcaUgBbesIIIm-B&W1ydbr6- zgR+**AvlfRyKPa^1$+pfdC`+d3`DLEAdkRS#Qd?Z_4I? zdYvXD*%hSqh!OR{kUzp`XiUaW$_OW*4b@ld81=y}?7YGm z>k528-P9N3zr|2}Dqx@b>b1+~H%)LhJll~aG6^VYW1#*Pp7!BC(1^D)MCL%>G?WfB zi?@KL9SpHc9(`31W?58;nbp0vh1du@(R%$zEwSx|%7_`ZYsQbJ=yM4VwUC^;F@}NR zTHG#RM+&}uKnAs5F2f;aUF!=PE$-U7u_X|{bNzUVx%Zjx1yu7vHl=sDf}WIF&4u}e zi!#~Oxz^pFv=Pe4i{*!@pmt%Tv3J$l44{SGm@mTXl?>N@nq;B3%rPC_~Ry6gYxXiA&i_poMB@P5#=g%5&Va_6-F z0L88nYGV%v?LWGqYyA`b`XjH{-P(6tAkL8DZuyrPyHhQ@q8`ZiH8=x|hQjQYIXJyu z=nZq85LAktT5wEYLA^2M<71MLovzx7B+{46ZwM5)dx<%oK-Ip_aDMvvX$p@M*x^1| z566N{SN#=|f*O zbux@ZXhKhlHi;sluGQ3HitFI`^eM*Va+#~MVNfb@YV*9jY)!UGpy99a5Hwa0XPgzK zsx$71P^1Fodwck}(Pzlvoc)q?n;N!j#tV3xnwr}9L=<*}NyF|RRP7g~A^_>~_Q-Je z?kMC>+$c;ts9<%56o7$%<@jt15hKmUV!ehJIsQ<&ifEj;cbEG#;I48h zLpEpu&Sk@7+R|?XHxd`dsGOFICn+EFElE~-E!V>oRy})|HDWJqW02L@-dk$l1D7Yb z|FxWczojc(H=H8srYq{~7X-Y?BdyVth+u1;iY#0*k-Lc}Fs!pP@O=D5) z=T07vDBG^NvYQH2+2i{$Eu2=G*iTy<4x%^^bH-3N9#7UQ zVz6-S9cw8oE}hR&t@5Qi zj1BaHBM}vTJu`ahWeMq_7Zmj?f4-s1;)lPjy&pD1>_W9KN74?YZLtUDWCTRMyVS%oXN)qe>yf`+2*z z&JvU(B1d_&)&}AWjV9*v zQ&7%zEHww%Eu^jK=Jxsx7wC1HSq-QD*I8Z6X`1@oX&xAjT@zU?S(=6K4qgU!hn(%IS^7=g`(9Av7 z>TMCu^Rb7P)!B!{nu>dSy+iC`ESn#6PSUdR^;3u%LY8C#RV5kq5za2IP92SWTA`ld zqPPqdRjc=YM(c@g(hYOyQmm$r->0Tt&l|DdNt7Epx;}r%1+fz^!@P;>VbZkg6)5)`+v5s)>IDEo$)41$EFc0_h~OtC^$ z@+uM}t?ju&#YkJ!H$zcGG)t8KWrQiLvtmKT}k6!9bf=T3En;o;s%^l|7R!VQ}xao zBv%SK3+)Ta0%(B#APAiKEX0ZsBUFR%svwDCehJCP6IY0JV+QrO=3fXX`a++$!&_**9#SdTt#D9rJW_iiz97AnY-?Y zZQZn-7uaQA5Z_guepi{Otk2sFJV{cld1wB}<=Pphy`ZRGDK=@9J$G*Mbs`fZbINoR zE;`Kqf^Lx{EfW{dyR%_=PHNi!Dh2N(Gtfgah^CH85E%}q@>gtlp)Rl$>uX|BOR z`2e>R{5#dm&GLfe4?KcI52iAC_jRyYqk6(2P&GVlFnLRw86p2nXJ+7*zG)CgT77^O z+*Bwdnn39I5!!!hH0(m(&ND>{86m^3R@c|O(l!|8R{11`t7P1dqI^<|=#1tj-$}xMr4g?nZ zIBE>La};>6`hio=*q~e=ybRaL_4^gH8L1Ysa^&daj6(%fAp+Hb*dO|GynVkLm_du} z6vO4yEe&9AsVvri>EJy44j(j^nn!R{h6Oj~>Is2&kAE?(T5%Y#TplwE4Jj^k=rqqy zEY6EHilJ32SF6hHp&@ILeY>Wz#uc}S-58}zOLOxZNklUi^tcXl?k!=Y%c6Env0P#t%%E0Uf$QTvu2_dq6@}nJ zO1YeT8MTlUMc%Uy{{dZ8CKE9DkgR$_jc%Rp_hRs`}H`gyfGE zpuA}#^AqimjA^aT7E?yOhs(p^NH(JMRRWSv)dMp1js~C?S$2DMZ0B5oTueA~<*0mt z{Hp`WTt4ERN7}OD82*c?WEjB`i5RA_^j7Td%Qrp4@H3FrcdtMO+{yUXV5FKzM>d-Z zmr;+KnOj^SEqUMmM4dG=|BOatYtZy4F9STQHfbb;WAwl(=(T*|GtoF?F;cr)-ek*s zy-1gr4}OGa$`sVP+1sO2)!@WaX+ATamJVAZD|w{#KF!^>T3!1>uXn5MFtW`=s#sTk z(9gaZ{qOPN4qztmqzUV@K%G>oUo&`LV`S~d56ZY=GL6uD8U(&ntvB18H8JprZ4vk& z2(8TLOp3B!+(xCnvWC;tX>b%;+9{N_Yxl-tOHGsfvS8pdUqF76=)Gg}NI43ti<~&nX&k2c%KJEyHvCEy+EQAwTrd zS3fZoSRYv{;$gzc6AGzO&oV~;0B6Rnfm`V$;Q%(ssMVi!i?k<1d}I+}~qusxTfJ$cFZN&j|P(4j-4swe^AED1KJ0Lx?$E3HSqz zUK)4TBSa!cugnmdO`wCRE&D#9ERp*6IhfO*DWw7R|C;ikS*J+aUwP*A)FcocM1ojY z=93}TW)_XpRra)J;jP$hi^_EI?9)kjR)KhTo3_U1rd4W>-67q0cni3qeL529$<|V46S`g6soMRa6v0 z6@v`o+%k>KJh=F2-*fvlYumH)H}U(WOxt)WBE=W9K>)MgyPrLfB<%21Y$}a)$Svc- zRZx6}k~2JDGSx1aR|OxY$P9yXq=VDo3bBDQ5PJ%Sd~kp}y%UX;Nu1Pe zMr;yw5n=V0p#aAXP-OS%mOSQU5AhbfBi(G_!!#L8UuH@BV23!%FNq50lF59mlPufg z2dqCQc)xnkiSgi+1>;M8JxT4O8xO*!95?f#$oUoWDbzeUXcpCcbUS2axxtf#moVP5 zL@e{xpi^fw)=`5N+;8_Sb-CY%(RNJvt&ZEaGi~i&th}vkg%b6J1My)s#lWAimtKC@ zMUsgtn`h-RJBh~6*_6f+E_H{`!Q!W8dDBDBW*NKdS6b7@CcWZ)7`FC;u)W1ni?acZ z4^Xu${@u<$g^$$#^Hnc^7+0u(|ItMkzYpK{H>pxf^()VqGqmu3ZMdP#S;7F?I?&QO z{GtC?kCvzHUJJ%&ww%5-D~OBv53#4qMM>gK-d}KQ=GcwO_4#Gt(gr=vVVOTOo4j5< z&p8PF`A-TOQnv(%i^8I#FSgy+O;8;0e{wdFBF`y)?~}wsegMUjbQ-v!^o~&w7rky` zW7MGuc?CX*r_A7{AEyK$+u+{CsONWADukx?L=|L^4y3BVzR+Kb5#**{86Lr$QRHQL z`XJMK^n%@wi)4S`>fb7{$cl%0U_?Ah;fLI&Fk|}x-KfcQqXEV&oz+sZ7+0vSmhAmn;Oq1-+l2#9kHGgh3mKy> zjDgmw`Z~V*3pHk;@+n?jX}~i%GQTv2dq7FCdeI^(BzOiyn&0LCz5Lm<^2g4;BC_7e zM5yI(9oWz^`?w5Vb{fRyE&k*dxx>(AN`iC@2?zJ?)46&hD~?9 zHGVR0u>7fY`35WrZM;u_Kc!vL8cExUL6=mZGG_f0M?kFG^M_@^i8{!w8-gWoanhQ~ zi$j0b%DD9$e~o=_Gk;PjJ#tNPhcKRW$ZK+arLhFnqFRw!v)r?`G@;Jm(`ELDbPPqQ zMqZR>bWgn4Oi@(LHQxqbHMHwaes$D1YbeW<*jy!3(8Am{o9&WVI#L?5 zGKeqmpQqXD$04Tgim)h-z7w5Pv?sUgtFzaRr6R2Zxx9}9mUL&KvXIholq~~J=H&1D zy{o&&Bg9`yL8UuJ>lKN918*lHt#q7s z&=q#Y99O`$k}V0~$Y>Q;%x*wR4CAiFL^+?DO~I-a0s%Zg(cm(PKfRVaaXU~&W4nj6?C(6Bdedhj|=RRM- zmJtkX(u@LqRM)aNH3(KvIc||VK?n^6J6E_1L%kM!z1W7@oGpu8&t%m+ zkCIPx<8fX^n-K#sm!;2GFIzKE+1J{YWK;QY9xP;qA>m_G(gK%q=Gj9N4uKOYkQduS z+8olLZ_IC@zYK5Pm}r3H4@=Ff$tv z7gPbAXczMMqVRk zK3W8Sp7I)^O`#7Frk2r;$!AvSBY{OIHKEvX5O%wQKZa&r`=ouX$_os30c#>6&V4Hv zq|``XW1!ANry+=de4Yh*=B3g(#qdz4Oc(jm<8OT9e9*F5A=9HOVM$9|fmUBwNQ1M> zD)$3fkY8W!o&2JJhRa^icSTl5z7s~Whm@kL0E;IDL7hvwnV7JyV9E@mv|sfRovCP2 zT)`mqt!5wTf_kt@xaoc`6_#XD14;Lr_b42E{W$EcJZ68i-6R8G3KAQP9FD`}Drrz^ zYTAwG4sKt#Hiw_x(E{jtrg-*BF7G-6S$O@mDD7}b~VzHha`mI5r>3r9tA&Rw{wAFZ3Ua}|i;GWR*sgtWy z*Yn$)Hv;VC`AUH2A$&_Hbtt8A2d~M8O?irPquz79&x$%k~?gjM~+#OgA`@Bbt>wH>ADE;nIrSB zNZ7$&=T90IicCqboLIwi1iE>i9p<{NaKH#d&T}kczvF%>>34LFToJsXfqvU{f9ooc zDByPKvb`r#(_zQS9Q{o~z~iT&$J@VKE=lid572S~c^zvGR)YHpF*Lju@EXLNSB=V# z28;g51cQC&qZGqil?a{3i`W}HO|Yv7?GNL%80awW$v__`T_N%qw#XmQ9hUgS-BF2m zooREGqxf}-(Z#k|Z-%ciecb^M$+<5+)Ono=bRZFwinsAMb|b!oQ?kBRoea7uL2__h zq@+jkYbK<8@HcNk0r5+UXfR2|HYP37cBW(9>Trm6rLT@_CBY4f=BWIO(%KgR_7&$wR#%V|lOoLS54BaXfdZF9Z3o56d zK;hnF;$83*(LW`H0-)-jooakQku1;KP7#~SNBI--(o!DtJQoW3C_q@XS zyjPs+URVGCLfl}jPk^L<4^ljJdEqqd+?^oK{Y9lzmq*tKNt^2t=I0RY8Aa3z<(5k9w!_JP+>*FFp&?$bitOvhfp zLI=w6+eF7+*bUQHdWKpcpj#96;vA$z$1NkBkVDKakowMu-2~G9Jzybk?~NOr7915c zIOgqqp~JwNPwjJbKDF9*%5>HU2;fjhK)HY^LHkp`RnAs7>Jt|0$y#KIN_a_h6$Ru~ z2E_WKFCVmOOQs*&R~aQuN-F_I$&yG-j!4K33x-UKRRa=JdlFjjFzT;C6G@Mbl8+K8 zRw(>PU|NHM-xTLjrI^MQbD1R5^d90}p}P)*D4H8p7*f0frDEA@b8;xUX&51`dW}SF z4oBDe6s?d{(uso;v4Ehl>}CI|;r$r?)bN?@;%g|Ve`@$LtDiBUpv}w8eBSf@dw_4S zu#=Jzg`|GhQ$KC)tlL0-Lb`^3d#@w6#Af)II|1$aL<2d48^So!o*FCT4n_T$1mEoQ&kHERbgHf}$2C9-?79NEGI>vWayW z9sCxTCY~p)(tyinp7>*+AGce^x^4TPZ-*pS(^T-OYKsc+koY)~h-|9^SUf?#p8$h_ z|1!3Ohx198;g6bMJkHVFnCI@LRc+G{fE+)#m^}1U}b&$mmu353WF}U^Zjo&aTiK!X*-{aD>V&c_7 zRMXfme0A-VAL|@f!;8jYjmt=6J;PG40RDoy7U2E$Ja&Lds}mX(?%Eq-3Q` zM-nqtI(KpQ?}|1+L+GZj#}+p4X<$W=XC!3UTL*8KJ`?VkHP{rmh4L-QvI2Z8_@sH>B^bzYTso;SV#4Igwwq00Ut4RXo@XrjAjNNqhPR8xJ1Umi4oMMI5;XZDY`?2Nor3=TOzbLQpV|i|D zC;_W3@Bt^lP^G^uhzKu5eeSnWdhpZF1PBB?9?|8i$#$U60}O5n^nWAH{$JaSJ7KX* z8YQ!ocgnfA+oEE3%k8I!ZgwBx{#!`&J)Zg%@sAZs*o zjwxNv(Hj{8Fp`ALeGVGP`Y+jACcZ5LyH$cnSRLZ$)}9N1%N`BNXb>Hl-RUZu6~Goma`OE^;Gl?e3DWuNeT;0w-X8C}Wb8U;7K6yd5FundA zi%w9rSLa&kH}-~1o?b=k?#|`=<u!j(+_V?#fQJ zW|~lm1oloto(w#JZ1RwFwdG4_Owy2Wo1+A87nAhKeA0_C}JjH z`%caeUjI2p#1U|Il)`s30lWBGO30rE@S+J<@#;uS(oi6g%yeb_a~7B~Jy_skdRTTC z^$w0}S^5Im=j9`4i$OCNN6}+W7bv;hgF(hfATVNU;6Y1rWl{$16a}VMJ>vqBLQe(Y zBz9^~&O9@0QrkNwhG8FqF>mCc;9?CmfbE7r58gua_X1 z{3oA{l=LC!e0H@On;Kr1-QGY8u11GTUO3zgeIn@P7$ALUrNj3MQX4bQJG(yt`ykBv1;cVWaP znxN!)ND*V2obz@*AS+A6l;=lOm+RWV^oJigc`g(4z4;zu(xcF7a=UhGD^n{gm^k=& zN&LOHscWD?*Wb0tq;$D)e0tBk>Q+K|)><$!{ted30+tH`lyX>#!M(z`0DxBuNxKC1|LZJ-E+F@F1*8Im>~EB$ zGc|WIH?^^KFb2@(b*a65rz85kE#T$dcmIL9|5=8J-IrjFp|d{% zYsdJD!0aU)14*jQC49X8Kv+N}NX!C782#w-fubJ>2Qjk@uuOVZwRfZ^-11hNu5dE0 zL*g8;k&Uu&2>KTz7PLzJdHU)AM3*OZf+aX(f&1q`-M~b~KtaaB@ACyo8E_G;KO9&- zdIgr~AKt=Ny|ZWl3Alzq_Phl8dHjbN7nbd6AFH{yZ9DUflaJChU5RGNPYtve0tR8= z_D+C_{{mpewDr0d6?2K-!m*B`)*oe->Lvwtpn#}M7|ktW^R_Sc8IOF9N3T$!M5xt{|Fo5AcafdMf8@jc0RS4IzO z%_1RH2<>S0eSN;KjU=sqCCsxBMEO7b|Ns6-#Q%x^-MVXYl)r_D7*A$9Pm=pOvvTV`wVd27iblCZ?`$8O~WtXd&L6)A7V5c|H1zTMmRI%9mK0@A}_k8 z>pBq(bjbs<0Ovwz)idBvnt!i8G|XZzN=t*z26f6q?xZa9jcVe3mmZL23O9f954!uO zESm{m0(*Pi2mKthuVQqW(>$tc8Ktc*^^8dslBTDg{>Dg!v7nLHpTM647dILsP=;WPS z6G@*}OWg@nl2v7(X+le_%k@~c&JQ=e_M@X!K>zDS8qjh7K7=0C{zt2b(*Lqn5sqm4 zy07*4S^|IS2A{2ilZi!|qap~1co7Y5Hvu?MaBFZO0^=IaOpy?9fVCLi$_X&Y>Tglr z4%|hI5H5c3NTPBPM@@3wQfI2PfCEzdVNd=iL@7ocJ(cXK;rley-Nfm!%zJ}hu6q2V zY`l_YbXs;2wA7>4@Pm*iAML2%>DaWYz4J`zzSqU1q^x5BL@5S^dK~OTXRwJzAsOs- zYX#>UC+naA5x_Kt{}2EAq5jJu@RmKMNal`GM zf`vQ$u`NkJ{J$AuD^>9cPJkhl|FT1~ z?B1)+)Nq8W&#gF0?HfJk#{#Y=K#4vA$0aZb>TlEj2UO~#DYdlh`E7GNq@6668)MWX zxOc{p#5xo22OxA`f=4O+f6GoG4P)0KkDAs5X#&}YN5*3hgv;6gMRte^S z{S80N1rx+IV%CGVhTD|zMc?;-ojX17-rj`o40Lz{X2lT-FM(A59yv03Prck-_SC2n z^hM5l!F^5qS^0bKUn6%i5Wnt#_~o0sWq9^F`kMxl=iB*rNjT)WE9T`IYu1Ux`B+Gr zj2@v3(bE8$nqV3Cfqn%T{}>!$-B&)UNP|lDsi(Tu5pIl64A5kN(yRIR{m#@S(noVr zG~FeGHA1w+H2fNFJ^%LY)l3?8WMfzqjNL9VV2nogUSo z{BP0cZX?j%wBONT!f)#pELl8vv0f2C; z!zeZs?ThS%yX}yom_k9t&;$*TlH!$>mA83b)`o%5GjBS-J-l!GE_`1seYHvWsbox$ z?f&zva1@_L26u3Yca>SEGvJBGUuSVCLc~gliN6T+NNxOUcA3Pm^_h7^>zsmmulB&& ziO_IM3O7E_b9y-+*XQm0arFgH-SHmiQQ+M+zT4TC6D9F&h)wMoC#^fUU#CeDnksW1 zn7=npm$O@Ik~&OQ&Jy3%Ft@-CSfz9!d*2V!?@7gUA$kf!l1Ch~xDkOTBa7L^BkOP? zw`2MD_DQ^5LwLs};aM6W_xcvkH!g3RqgQ~B11QX<4!l` zm@ry)*0~*;cvQ;`;8N=5KRdITt?W=nzT8vl{rW|8PyUsn(TUd3(|kSN(m{sQw+Zq_ z43ZM3YLVUL*AS-4PL=YPd)qH< zJM3C_a*!o7JHwjfdj}e%nyenNa%VDGmO>%YH6i>=3Yso?Q#f!TC^h)*Kf=lbCqxoa=sHf?1pLq+@f);QZ%CD^e|Oh~yn z%T|`q$i=;|Y;>nl5!U#fe4K%(MC(Z1ENGKoBaS)goH~!3=bSRT;Y9bz_inDy7T{aV zc0^Bkr<6&q(z)xcG^L7+R3rwJUfdvaJ{?DmfF3~sE&wa{F-L84WGP{yCer0N!S+UI zmRjNMB+0u3^vGXDm!~r`(|W@9K1S_H;Iz2rlDqWH?g2_LS?|W!t-v#2Uf9pPi)C^i z&22QvP0iGWUA$wvYgtmo z(@IjoviqKu>1;8Q`9f8hVoDVKaulyOw@?xD-Hpy>5LrGtkfaxo(0aDcI^`gyG1)-r zf%Ue{N9tN^tSvd+FeHrzn5027qOa4Q#ns9MUmgIz{rlhx@x~NqT2(CBKH+Y8hr3`% zNhY8;PPWtwxH8Vk=-aQAW+ZaA#Q)qaBeAP$5NtjKP1ABC4y02ASw|-1fD>{K4%xUs zTt&HF8cz;AYPou$mav;5h@tl190y`sT9d(;Nd}{muxO51bbfP`fU>cj=f^xYFgc#3 zrFE_iO{aiuwG&_#Qu!8>^lJxMm!w+-|sz-owmjEz$Y4PGncNE-VA5KQJ-ouP`-gw+{&;Vp0_HR+=t)^9iEa>dn9 z@oXaDWy6$qal#Ax$7oFuZr|aCDYrEiW07HFN#@}?jCNnbTlz*>P$)+fh66|rDea>2 zC|Db6E(OkY5cpf>F-bE$a~3C!>&&&xy}Ke>arJ27I!{oYA9Ebc6rOe*j}#!(;=;HidAMcpq^>ht#@W z4=DeCeD>6(-K6oxNr$0R>JWba+m>7(1xsUQH=?S5r1gJoFk1Ki)TVwTOzwU%cnC~R zo0?_Y^!|VxG%C8|(4$7@63&PU1p;nPfD<`c4ZeoXgC?D_37yzE?!FC1W1*}DiM=A; zmGf*@e)(=M7RUyZ*1KS}YFnpp_YFBZD(vc)FEs!!Hdf|IO)?3D8LG+b-9}^Gp^_c( zV_?TLaos{e*K};U60LL`i39Fd9yf4XA8jG&GCBzEZ4m9U(=9FB3$|5}7NG%6tz7}u zyacPL{n40pzQiRXIzQxN%giS9W;U2*mYEv$jAY$7!&o4M2lska1YJJWTA~x_dDp~CaYI*03 zz(^a%>$4P0ZU1jPu4`F#JQbtz(Ssl+o2cnvqi|1q`=?u6%wOLUzL(K{Fs`?FZ+DO4 zbA2=g8sxt+>@7Y3;sKYMl0jTx;~x)4uEbn3wZ3PHP~sGEVffB1bq|Xih>%U#m2^j< z2O76ToaQuP(1pP4Fkr$8_R*&3ng;}tDb^vZ=@n==$$mNRA98AyMa%Hf zc+{H?ZtHr6x>+L0KV}!DC$U*{OUZmT;#y>q;#I3g%||=5%L+oQA1;S1~IwPbhK3Ysj%Zbe_JZFeEIdQKE zqH}aE5XoyMP{}zq%g(V1Imc%BITpR$7Raao@+smG?->~U@3vsX2G<$KYy*zD?l@+{ zwAKa3H~-ld$8eN1eN+@kWFH;tg`{Qe_IC=u`$zM#ttE4eL9o(bs>p$2$4vTj6k3L_>d%F&ipFkKm2iWy*wsW446NA?e#)(4-Z#bfpYJA?OgAH+MadE(F zx?8*bo7)(`=Lce7AjpJS`ceag@SvO;zfp$S)iU7n0G9`h#)}5&E9dHOyyU+6t&PhY zUOoBTx4*Rf)~)RKj?C{K{psuG+Yebcc#4w#xc7d&cGLLIwLhGA=hxqT^VzYH3zN?; z<$rbX_fuc|Y;Dg;k*{1cL8K5iCulj*8xwq9i#L(;-Nm_@q6(oV{Z zN_~bL;>kQZL&n5^F!3EH`np!y+j)WLvsJhfJA5$4l(W3*ruR61OT{q~8I|wt$2_;{ zxiQ#SgnX8fr*ab6r>e$#n9}w(8iWEF{F(knw!hEW&A!~l_c>Wn4JPk%vc1)y#YqP6 zv6~ymvfG4d1i9b&Xis9N;5QEO=q$TbTsESTsn69vT<>G`3>lcJ8_}Iom(|%R>=(D7 zfC>U|HY%M!kUkrqPCJ}gJA-~#57hYJU;CY%xbI3lc1UZ{9sN0e{1)lulbF@`Y_8fN z(=~|*_bO3a2|>p_7xs%_V^f0be(TW%R`(R&!cb}~@!YqW5@P-Xm-*Q_=>eWNc$~|~ zm=GfJrub)(kwELm|L;Y%Jiad~wDOR!4*;eo478{Oc$_mdFfcPQQSk9}cJ&K(Wtg(^ zEt9WBWTlyesNT}Zg&Dg~Z+&D4Q4-|p=;G_Dmz%<{qB-5(^~ewZU-`w0M2i;B-7go_ z3IJl&8mX|rLwKCzz0J#i&6eJEp1i6Ff{G$IY0x;5biM3)bCiZS3r0mE5hPUAu1Z2o z8u~>Y2nGaEP=^LYocJFYFat%L1f1wh)Jy~iK@c@V9qH$@pYEhPZ+3Ee5b^ZsbDs12 z-S_vqchy?gx~^4gt-62wU;CwB{)O|4Kl@AP7k}xG>_0aD_@DaOpZq5OD}>NW`I+y( z>yQ5(((~hg|H{99Cg${H|D&Xz39+S;e)2QrH~T^UdjI<6U;L%{3p~m%{js0_lk*pU zasKk3de1NX;$Qo7{MfyJlh65;_xQ{I{r{1F-M`NMe{Ya~@4x)>fAlx!JNUHvJb#1z ze?ls`{pJ177)nT?#OEhJ6Ml2P{%`)T|DW&we|`UA`Q1PH;fG)INB`J=`yc;@fA+8Z zk^lX}Kl=NA?qB@*^9w&8|InY9`49hr{>T4?KU{vH|Fi$fFa6vf`e%OrkN$~&?qB^A zCI9IkLfB>Zx?UZA?{IHfYt|Xpt|`@f&y9D#{nT%f;#h6p`_5V0v(7x>jvUV7uX~wy zgpp6Vr_`07S$0Zc?|0vN?#{X1UHp(8`P|fN$|3xF|IMHIJ^%bqe)uiF_Q`+l_up04 z+tNyJZ6m#{ygS_(`g89bXWSO{?4>+;x7cP~F~4J!v4Emk+FO5{U-Pg3LqGe!@zKBa z*MIab_2ztcJ)8FmJYw0;T$w*Ur;I$pyuH-0PB^^UoxEIoW__`xw#WKD`gi}mzwN)^ zqkr44|L7XhZllG%Vm;53-cx#O{lurgVfpwc^GYmVc~4!9AKT}&QAg_haQi;`kNju< z(I5UpKl$Oe|N4)9V_D_4cdy(FPru9imUF`#D~)I8H$>Mc^q#`%bF(>p^voBRa@q>N z!@UbJ|F8e<@A`v3`Qdl`nh*cUPrushPyYFToKO9ozy4Ey+J*kJ|J^_FpYo}H*RTK7 zpLUJ^@BjSw{Y(Gj4?q0fzixT|z)$s{Jx@9;ZD07zNE`T! z&+}96Z&|(nZSL=bjn&~#{Ec?^*Zr&iG`kC8+&7H+=5~10a58@o@T`&WjB~-2eOB$i z(VzP(yZe{^oj?C?{>9(^!|(c)-TfWk?*1_22AxLlPw&0)x%;NL*L(Amc4=)rsj>ACfdA)hw~&^g`E!RvBMSgr8q>|Q&- z%pctqEBr-fpH~Na_v$}}yLS`% z!p`GaX^tDpdEd?Ym7M!tSUaop#vgv}xBRqW?jQbD3;C;egU|kH1ISt+Fos6RWH;#S3W^sO6Zujqhi}Shqw?Mzy6#Z`%Y<~FRzxw?@ zEhPI!zdZhvKlhLPGe*7t3)14~=5&Y4OE8Kx=?s@>?ShH+JPgc~~C0JiG7$ zF|qczG&YE~e$unUNa3#MeHU*xMz5GY+r2c{aN*Tt50_ zQQIag#>zJ~pS`^8#2MmdQ&{VQKaHp0J7uN1=FGS)&$q+leq;IgON#vCt`p4Qi%#k| z7oq45R{DKj78g%`+g)>=jtBCxXTQ&kBc1TZG_k@{$Ghg!CMZXM3AJyGvd6Q8bj@#~7I(epz3Z9z5a~^WIBuF13oo?-Te!!6)_d zvj4N)M8pd3m~RFbBcD?N5DZ_;$A}5VJ-ii%BH-=1ZhY9?l!5onHbs{9@PWW7p?qz2 zd)Egi#xBH5LWy0;} zcwfR|!i?5ic{;!c(vfdYGmV&FN}25h#R05KTxQdWdqkK}Cr}vs&9NPva0Ej82_p#C z&{|%U%?3*5c(C)h0x!(=9U|-i!mhdJU7lbx)Q#T!_0 z==qJTJRAX^g0HrU(SXWC3m$Z)d!ISw`6s|ZYK}Dmq_A6TFK5|So*Uc29LQ?%HJHcFds@dU>o=+4vPO`cAY0x7SU8%=VH*oTXBZTmLx23!wQG`lp_P)F^a5p7BrGa;V4)HS(ILgV`EHpl0 zPT<3W+jbt)9g10!)o_J9B;s(o*#K>^u|w%Gv-hdkZpQ2;4*@O2Wh(q`KyPw~Dm@X$ zVkt9zh<9LrEGa&k*f)TC=D6Z`4pazI!#`f&3O8&oFnw9#UE%leN-R_*#g7I6nE#yf z*)=y}Fk%46ivvIz>As)>yM&cuf-FjG4Ko78TP11$!aLxO*Qgn8zoT!&1~^0B3UazXWjNu6={l7ImO7ORKRgWo&xPE3aHDxe^|YXMOB_I`Feb8SenDrLwq z310#BeAcKXH>g|*P%Ch58EPOg@Z<<$wid;{tuc zWbtT%0_p?*AiNMF!Nsvf4~T>^hkZhdq89NiP#!_|y|%7;MS_IA7ufaQHyj zHh+iTK<$uAm+vLq0vy;4JA}}JeWPmuZ-Q7qkJbfHpYtHXfyS_i|I841z$;e)YmBn(mrHUNi0b+f{-5OV{(8#WAM zoZ;eVYr*8eA-G9z2dV3KPNW!Qia165M;2q|CC&qy<3cyAx@3LC3CI-qi?}EH7R{#u zF#so)k&N>Jd}lXgvh#tg6@V9ky&GR&Ck!TMz~d#pZ{QkMW2_=599Y(pS8F1O_md zAeRk7T$OGI??xx!d7$zcFT5ebzXlZRK^)@Yz|G4Z_J)YqSZG8#c0$g(F+G&RU8Oz*0yY9TsM|BiD|@0 z4EJ1382~Ln(!b(SWeE7q7%0Bc(!lWXWl$Ix%;6>j6-Gx~TUDM=H+>str>B zke8LKIKq43a_?5GwGk@9@9fzXv+ok;5wNWf-TlcdS`}qhPQ>(tjv**MtQ)Y0j9`2D z-0`rwbCofLK+u-ZcKD7?NR}q^L4{xrm#r9Dl;*vW{n!tTS1poiBc3;Y0Qrelj2vbr=c%m z!39_blpZQXbSfAg_U=<6{g8P<;TR)eTi6rg{bC2BFj;x;!NX%)02*;ECX@%ejBhuAWIV$&Ox>Wo*_R+m05SrBuQbKs^6NV?`(k5A+AZkt8qgw$A|wvnMS~FU zfn{J~y-T1HlFux|l5^-hJD0=EWGJE%kGO=E?bAe!~z7c#3z90Ugu zE$~J-Hy@DK%ynK5V9<_y7<~OD;$dblK*3fMBOA;QY5>H*a@Znt(1RJ2LpUHx3{)7a ziJLhsuOCQ_~zJc9bqo~M{;qlfK^K* zViSy$X-+>%nJEJ+cyI5!cAP zozuEl85_2tQAkO`H~7G>9t55i1r01OzyiFn3kAvipqJYtyGD{m@M<7PD!etKJ3tKZ z11UQSk!QXs${;GNo*-*N>cM$?-!h6)W3H^o{G8Y9sW^$aK`2OKPbl}@AS@~og~TEx zH_=*#_f5p?TnhSvIH=tDiAb2nN!(umu%lD4o4}a6c4;hZlp- z45Rf6%|liKCkhaGV#DZJCH8}LgIKqdVTiF}I&F0#ZS?>OsV+8y_XsEuen}9CKWO@3 zny#b#VR$_CnhEvjs{ z->Su!LwXP;H$*d7kbGR=9<%uv8&+^J^%#l@xIsMHQDA%~A0Zq8#NPy*#+G29=T$zv zaS+pZ!jK@A4M-m7`emwMO;GAnZb3l-=wZk(ucGo%KDIMjLk!^hJVnMRH@tw?X8BFP z#>0MZ;+QAi-DJoGQy|0-{ERo6rt*o`fIC>n#_SP{!4ZT*o0TLZ$3GJxSwMtBZL{z= zZoT2cj8V#bFT9QDfqdpK7oSOxdx#`g>5VaNlq-%3HnBV~ln42MdyEVIpvLE0;$R2i z#SxB&jY2m0-Huqhd_Bf`(01lX2-QSJ{0~OsAq>WZ{=o5AMRVmyRH&ph`We_I`_EPc zB1_u1q#^r8%(@|DI-)G@Q00S!;H~GuUU|$gd3(I}Jyz+ahY3>F>dS>x@ zNdKc-z%bw_2W!;f@(fQckdtVB8nH{)nCK zg9=<8B)`ZI;v(pZfMdVmK*AM1FOIW#NY^ z{u?~m5>D2WU&BEQtoHym+0`M$LBJ3!m1Q=8jVY>}5GF8pB)tjp6hKjEG*kf%1PG%D zHND5<3hW=O@&Fle0Usius>t}}ZsHHJLokh|hQ1^A#xgEzUjpnNqCGV*qD}H}2~*GP zP12bWL?!Ka!a?za4tI-0ZjJvjD-q-2-+&yOOvG>gqt!~fc4mUey4)90TbJ30xLa3@qhiT#90)C^nwdLlN=o0!rgw&@D!>T&}inNa-@ z|6mgc({p)iA{I}AiJzW%<>Crk@ledY&VdsV(yZsmSZ^e@TRyeS*H5g(qo)JQz7^g; zxa1$)Yy-Yw8>{CT&coL~!Q@U00N&K);o?9RPGHRs%#rAQEIi|j`!z8KCTELAkPGq= zd>4!!_%VwOUkpgpZjuizjhm*}!>X9mzQp)-x+lST56wE84qYA}db$W1x^Qo#9H=qF zFs+vSX3aw-A0~l*YaBfy!x|sRuEZ~40x4OZn;8yyM&7MlQ%`StYxqw3ucs6!OVcf9 zdd`o^$)0O$qLI}7b@IUi<{RPi@*+C zEf1Lkgakk#(i9$R@iDSIQl!iDApmJXOJ%2zM|JA{!>VO}pHu^7UqH;AizA zF24j`H0Xv}V#pi4l3lkKL5sWT+DdFp>R!}>x#SsfpmCS%8|XzBwyDl3#P`Jm<7f{X z1`Ew*SO`RD86rKhfaN?dK{BBZ5V#B5QfpzQfPb!VkLFpNhh1X=xEOc|#K@-t>d}KK zB*gK&=>h7BvGDwObb%mBGDSrF@hnl23-}m+fX+kY9v1Vk4`cFfU=4rc`B$|@q@H|D zO`>GhunvG934Ki@->lVoE-XDY%f^6xbq#Ukzyskg@JdycXAZcu=@&CQaAG_vW~k*g zS6$J82*1IaTZpu9fb$YKd0_T6f*O;ZgQC>u)=^CNvst_!_KD+TQiQ7kKQ?jwSjUL1 z@@Ow=KO4J`=sR}#nD$o-lsu_`!t5_)ZgvVgf}CbVB(a|DkAQxGYT%1(2#+zg(9 z@gS#}R|E?xu4m*%hA3bK+1kW*dF)$Y0~I8_xHzUVtb2w2B@-zf8HkpGZM>F=bq|Lj zCsC;Pf826A)Lju!fgUm({mos9I|R+;&qvvwc-1!&2HW&HN(Ft_hBk zA}}yK=7Asb2~iOE&bN&F{BwCyw;&09*%w&Pp5QVGAX;oV(u4)TS>cw^LvKt4p%cv) z6C_!Vjx4b?4=Xfp46r{517Nl83dOUcviGTS6_h*t3r&VEfHMhmLt+yQE|igAJ6ZU( z->B?*KMAFl0wEs}5w9fp+&BY7R1wU_en-;W2BVq2|8Kz~Zaza4psCoI+T$hJsFbe*&L@Ui3huzRUkniCYM3K|N3j&S6VHLm)z!6tS7PPiJ{HZkn4rk{WlcL< zo?g_;gZ^njWJbZDeDQYa2yz$yM?mpAh)m=vR*%Et>1`ssh)PiRp7RoI3UR+AgW@~P zWG{2v>^twfuOSPO3=Y49vD<_%lKe= zZ0K&f4Hng2T!W|0uR6C{+iFGcYaO7PI6eHP^b4=X2NSl-3RpV}zebfT$cLV}#y)(y2^iLS5ZXOK9#$a2 zYSGSxr)L$>wnIHk)Idoh&k`!H5vmIDGeu0d2T;9#zk#8r0LOd~*H%}sVdgMbJD!4s z%(^2*pzXx4$=9Hphm`@ZsRFqJTk~Z&0bVo#&H*3=LIi=}-6o^~8c#+nakR*p0E!#o zXM{owDZGd(Rer#v+OcG5!1GT0&Uv$^jR*`B2-FX^B7kRDaGD{FNl+Cp!Ey`(RT9_1 zSYVepmn9GY-#HUn+^)Qe@K&t3L+Le3bocxyWMGA7!B+Xb{Pm%{eC|jgBi12^b(vm- zjQW~Z9AGSPo>ib$cq;rYCc_V{^2|Yd|nGJ`?RuA#70v^`$8XLfV z(=co~5rYpS?5Gd+f{0lFu9d{>3LJNX%NK6v zF-#^H@H8GKJ;dUA@CeY!dfb3Ze>GMT^PN*cn|D(wtU$La!HU)hAw!}>LLbZHaRb=R zg3g}4%!Of@r!jF&pq^H-oBFVPn60#3p|J26v1ALUtA`c2o}g?ZA5OfD?5qNT2r-Xe zye2CrRQGjf_p!4C(&;I|yvb9&7e51Jd65Ct$D%U7kMH+>WRml|8L4Y|%1|U&R%DSA zU(ITKYpNK6R)5K*V>aXN7tmY@iU$DU?7ILy4>64=_YwO|%k&<;3nzh063SUYJbZcj zIAE(r&w?FzmYhxKO?Z{O`{OCIt&Y_4_82>=F^dIWUW-4|U6aZyeckHS0&C&D~N@v9LlbmKKx(nFoFY za0h1cfJGO5zWJdnDeG{koEzK;W}@G{Qvs1edm$vybh{Be4~kK~2E8HFS$p20GB7-% z9$SFk#0qesvq36IAW|!;^Y+&Yg?a*$hZSM$Hz9+^n%3a=3>jx*;vo(%OYUpWkEw$W zjfkd>!}X}klsJS9p#{`Kgglf72Qf?((M^~#^4c03gbu+3 zNU#EF+I}OOufubkY`X#!qFhf&pf||v`jr(T;VRmG!hj@rYw)oIM5!%$JZ0p2KnX3_ zIC1H*>L6Kd_1H-EWusAVkQP)tI2=l}e49-#rl>s{fMw$$;5d@ktj@|1<=~n8i%$}S z@AG9c29Xu5g2AwVuyJ(r28(gR-f=@BW3#SeAu{o;l%E%{yLtw}6v$OLJcJ&UHo+^v zN7(#1;)s@zA-OYL#RH(!F&_It0gs8?VGAr0fsgVJL?)nwV2ITRtF@(R!2tFE3CA=_ zx|p#g2jC^K{F>Vb(co3UOtwkU(v-kDpN#3SY8jz}KE&hQACTMD&DpI`#_A{G9P?4OYr?munTVEzDTiz6`mWF-CYg6OJWgfKWdagy<%@d)fOnx5EHHkw=;9YxN zFmPQ8IR>Oa%V5*FKbks`tQIT2%>&}m)+L9dnpTo5IS4EQ@)IHTmN*njk3L}+Jo zw3Y@}g^?8#RVEgCiSNMgKHu5Kqey7zY)tgaYny?u9$hDunCDJJpKYEHMU8BNFXy@gZ?4oP z00AxLig7zcSqhJFjJJ6dx2Ie5hh}P?!BkZVJDhE4fkRm8c@yaMBpejw4UiCqp_KL( z0QL7(0~6N@EChqIXq-rDgSET%@J6c!7Gz-p=qB)CTQ zCyUMdnr6(I+iJ+UZwv8crXkkxvEX`j`c@r0P|pD?TSI6pisYTpk!NmccD8q018A_ zB94&$j;}9h@q>8o^_T{bdpz5Oc4MY(THe;NKE&wum@30wKv+0Oc-FCBuS1(y`-1VS z+B~oC4cmtde=S|;22{X{cWb$j1na$Gv;Sa+$aYvugz~yV@PHWsPQ+c9G|p%u9mXMJ z=4TZ1!JZ+EsI!-*;Q)Uerh1A5>Bg}T<0;IYR z4tz|7@V>+9WpGZKBr%29U^N*Ifhb0wwB&Bs_ro4~aCt52zqs5oO^4xKL{ky9+t&vd zqQ^l+qX?K6K|EROwLAj^cemv}>jjPRM&(pTtmTXVfm&l}z!vX^Hn^6A*uQ~NzQ9W3 zPY)pUM9dzN6{CgwahbF%078YJv0vbdrGeHHyk9d!{rY9#v(?^%_BtD&|9E~3K{Y=G zuz}2cV6=j^TjBz9h4k`i+hT#Qh_JW=FsbJw`&v5gu`TsB7m{ zXT&;qd%M%n(!{nU^I(HmI2c9C_7_AVshz!<$6dX9{C?m=P_RgZ>t8AkX_kjHaS#?w zxBZ-IEDo-J-Oe+)r4z^!n2Wi;!Y=E}edLWsw_ zgpOrb3CthHNhq~kroPaP=$^CLnm&MzED5HNjtTvR4zQZi^K5&hI$r3pMn%hnnT!Q@&ADX6I1$FtLy0Q0dhl!NpWGX2c45NRllE22A0{!q8Osbr`E@931Lcj80qv z_tFbtAv9Lc@78m$iD04xWoxhH5detr@azGyM7I&Ckxgb3s|hSNTWLWu%CB4^5r#54 z&@>N9BJ=NlA<8zjAg3CdAA!$5#F^LH_9GEw2$7n!&1g+OTRy$@#1kKTY~ZpO9_+@< zj1F`7qQwL{(T12w6eAp=*of~0Fl>PM2>3xA%&SLB`G@ki}C>OVbHyqbRVK<>*AL0AsPO$|hnyg;&QC zP$_4x7*^EG>_!SiRG5{O*t2*fHTh;tqAyd%hDn$xl+GgBZR=*U11oEIasoLFaB-KX zayZEXptFsd2)Swn8nTMW4*9}YEcbhn=d3HT$udKz0BXWs6`S*6E_@)|h0Ou9@~REz z#F=>!*vQ5az)~o8d#8Eg;86!02ps?)fnlN{(XY^JM6US`_SgY4*em;sezU5m!y!G} zvVe0=_0&rJYvhC?Jf4@U$FwaXhi9dh(+-CbBCw~Fy0Y)hzLoh@0#AKUMuejuQngB& zuQjE!c}&xGbwNPivhBh?rbSHqfA#d>D>T{~LyJKc{{ZL`4ubX%apAKSJ@EP(|FRNTUW z%M)M&mu;$kKp4Gc7x}q7wbr}`v!0U->{M`0X4a4fgTYr+ULe=WW5N2{92%g zCEKD5E3^YTeA9!#LxSnsAfs&ZscShh2Jb_SpRbn))3X-D=nYl3u6siLrMwkHv@R-d z848AyJ=DbNjw2iFcjIxoj@#fl02;ezDaC7-Dgs6)MAH&{ke=3fLO;~NwgK4>J)C~v z55oGZO(<>}Drw{f%VS$c**4dH=LpN%N4@(fUSLNs9ofVx)<%Erh3c@jJ#s#>-_4Sj zPxGOs(O0=aIaVvy00@OFq!srU0336>Z?G%>bUQ0O7pj1~v86iq z00>GvlMMi9rS?RVj1cW}Eq%aK_6&eggKRw>?@sK(S);>2JwU)Qv#>v*hGVnUd?3uF z#Cq;BXRxq;&?+FQ0Onr9|jy9PJv~ykD)pD2Z9bK z?Kh zo(P&zyyhgk{MrmIWZZJBju?f5v4fCvWOPY9pSl>GUA_qu${A|~leSPyI^tcR)Ihp4 z7BJfBXu=GlRuJFO42GS?sHw4Fz|cLz$NV~8fLn_TQ?hqA0n|htK5^RZI5knsBOI7oYsqo}UXAr2usoaau9c!M&{0IJWBQGMm5(p)#G6B%iL48DmcCOR z0wlhNU3#`)#U?-k4ch(efHvkj)c=ewgllGzqcKN{jrqsBmo*aQG(um<-78k6N}Shb) zuSJKjeCwodjI~w&yLYE*;0ZRxSxLp)qv{A67^;2E*;E85i})bKzqUm;%j~P&W|^-- zm1!JE6k^k{LV>8?@py-qIg!RZ2fz8)3FSx=9K9eVm(u`Ek;&_}b$-kGqZJdT%v++< z2lNVRF%Ni>JvW447Apy`6r^QH(@9A4+S|i7KgZKzKy8~+$#!fZcg&$}r&Lw*NDhg! z?4BRNwku&4(quYu+@%(E4@@n}vfz?dhMxzEvW?Z*GoEE-&uQU_9+84N7BU2>v60_# zMfR}t*Df08O<~qnXO@IF0f1A#&I&ivS;VYmvzu#bQpfoLo>xeOY?>|AUW?>ht@fDF zh5tqTygL@CUl^EN10vH|avRvvH@*%-WhHH?gcoEpzb{~stxakZVaH=W1O%|g)Q`Ou zFPe*`_^LT=8L$ouW3*;9u=EEF_*#(ES*C44^zx+3l5;eht$t9am!N6>&E)d3LIicf zVpxIt&GbpiYc>qVi&VREzTv~(0#!l|N1ve10RpvTPJDH#Zoh*6mk1P9LC z_WHMA#nuBiW8Kj2NSH6z@}P~)r%4}Q#jOX%28Hp051?m25vAYqUuST7RWp(2)J9nB6JCIPWr$1L*%_q3UIC_I@D2WfFO{d*uZbIUyZh%Hbop`TAO?iye^D%6%5Vn(zb)j7x$3; zaZXRMn$*l4%is(l)yqEY6ACKH?_KJS`nTNGE?R`4sTG3Kd#c9-(DVL{5j_?!Rh&L{ zZOZgH4AF(Q*>NI9OP)65>urf;5JlO?e^u=-(!5YUP!5am`5 z4y=RpTfEBV87xhT>GDL?J8KyXQ-$B&bRwnfa!|Ksu!D4J~`qk|sV z(ol7$r}K5<@vs|ZxCUply8O&8_cOHx9$JR1^)k^;vt($Bz#F9pLumC=EwA80%-XT@Dn*hk`T}zU)EQ za{N_wHVHlzR1?sVVx3d7VQe^*!ycEiJr7c++S3wSGHI|TTEFCMNBwJ!VvZ{D@28zG zYph4Y`0{l_e@(DN05X~CfHJ~IE_%x3$~emzl`Q}cPnSmgmzi2;f|9jwASDhsSyj8Yy?H@_FK zSGe)CFlrD|p%MA&?j$WoR#>dzd4_pZXM7|=3pT%4)7cNCmKg0I8;D9yrkZUzvufO+ zi17k$kZqLvmoQCVc+n94;7%yQmn4B|9z%dspoAuV%y4*|3^3dZ0UmG6aIdc)`Im zJx&YDB3rYQot>Lz+>6!h!13Z!n^FMVsLt?u97h#-1~auhfvJxKC;|>3Azyjyo@CKgrX^< zoncr=50$SbkJYk-J;?OewFRxn2XBIF0iZm3<$F-2H-1vR;O2+mXy^nh^LDI~eOuxp zkngCR??hyL(-ZqvZrw-8Z;vIw`{=mf2;ydEG{|d$AHia;h;?Z&W$e|_A28qGjn-H5vxiZ!@_VMs}A_p?WEj@cm(LGZIAW~zQcr5Fe6+n7{uH# zpRtsr-?_AtLH9Hn#?O3hzsvmQH>L&(L>N3a-L3Rk0D+vtO^`^uiz#r27x6p6DmCM! z84Zxigc|(gJ1ev%jjv3OHcghGCsR$?c7SQ>Xvw#+bh8~cm|g4f9kf#+gHCS5cN{gr z+v}>2we$NSY&ciaArEj!c&&PMv=8$vbw%*b@YTLWO~<-HsAo653&yqwp6YK0r#Vcb zh0X|Ph7c$iYBkRu5>{023#IU{O_<5TfJ)3hluo$j+Y?BJcmymw?R3(s`nsZrd1%0n z;BEHI@aXIvbP+f_&EW%?Pe(cJGKN{vYhlpy9PPMDdu;eZqg7Z2=ubY&(E;MJpw~qdr4Ak8Ekaf^Mp=vk7G= zJi5sJa`vCua7*V1_yAjX&gVC#c1Y^MT&xL%w=pi6WrlH1=*2fuYJR<*!71CG$g>4J zgAG`7quxV2p6=Tf?m+Obn2Vk1POgGCrdqyc6PPgp%b`yT9oiiS0|#p34yd;$bo$*~+@;W7G=WpnkgE>P~Z{=)P_d%-lAM?HCn@XxUdA?~(b_(#Z z7Ue*CY^V;Cs2v;*%61(K9hc+e!6bgWeuNn(st~sII(R+@&jn2KInZg~K=%Kjhj=)< za}$yXF5%>oj@k;&^@}#=I-|CKqwTU)?`ZHF&9;nQOejLWt&GiI_J5sZ9jK7wNzOwI z&a4Ph$KFprFQa^&4c=@^D*Um7E25Q_kHeJ+VU{O-B`lU55`Kth5tRrdodyr&t0%SQ zFzmBIGEAEXU;C8ti}@vno-D#bXNffN%iR>S-e)@M$+ofJIN0p;f6EY&Uk?k)Zg`SR zJPK|pAzW9~5j@L=1x$U4gig%^13v3lbm452o7ZT^(u=5>(* z!^yv|qtFmfF91KRUN#-xoDXDDt5=H??2aUgbt!T*b8dZH`NoYy-=;%*@V0oY0=l^= zpdFON!!@Omd>fTq!`ZdU@QoBDWLaJ}?3Q&> z&+^U%a|vh>Xfe=yZJpc5e=ChE1m#%4iSJ@t(cV{{&0Jpwm7+w5+vtqlx z%Yj{%6(xiFH-wBe!N8pzb?{47+ov7zv10ZU(zUS5?lAfOI^JA@1JNepp|!tx_f9Z| zqB!Nti5#yJai4FN@Fe(dC#GQ5<5*rrtiRSDPwCOux5^)^=r~!Z&B;!I0)kDE zHc1yR^Ejw46pQMymg#_|W~XZV2Ey7j{jf$-aOdUN(gfd0tUTM%JRlEd+au<7oV)=S zZMbAq2CzYiXp3sXYmO~6jx+=7vIia6SsUgFUjS&a0?}#n)fIlE_vrmSkwXC zbTS(7SL|AchB{8g@z0hXIEs^H%a$xzqs2aeyI;?%En(j*JOiGcWq8LJ_A-C-Ankp3 z46HLqg7W~YEu?^e`AjEX;Ai|HX!%WM*mg-5HHnT+6gy4{&nek10znG)%EBn7&1G+t z7(2(W*%E{%z+SQaXm5kfUC9h9hGXjWy8MoHO^&|DRyRx^4;<0ixfYy9T=o_gqFQPj zp*IlFH`uptRnkOe%tEYkdWZK}J@u3kEirLT*iz6==E|2#`7y}}sNzxIz!+$bsyx~_VTrjDL0&|{^zs$J-)$((VC3jvf^P=A z1DGs!hCdB2MDSR_u6?vUT5eh8NXSd=#4ksd9>08GnO?#G2AU@M^o;G$x7+B|&2NKQ zgqvV#mbLp0Rkf1?hrUJtdlD0fVG(hL#sNI`rm-FXyAz(idJS_XK^hG*>jdqaHjNP< zIA{*o#kTOreo&|5k8h6HtN4!Qq^d)S*qhh>9F(hr1QF~+g7(d{!JIRa4G7LfUY;cEVtbPnmGD zzno#`1qWmIxWTVG_X5=1PW3;RCS<=2|uXov2Qtkv(ZMuhBnM71CdtEdT!yM zbig8h=Y`XGH-xa@R5D(Anl5Emow8xB{&niNWOrIr1pP7gI0)0biX043y$GT^;z)aO zYzk|LR&$bo;vGK$crC14yokKZg3j;ufZJs2VBEk$iaoJJzCIl3JP2B^;D=6&R_-M{ z+DU_!)BqVXWm6Z>l;#kW=c09pE(<|{R9G%I7q6&j7Fw?`tw<6X~L9pnp9 zk`5gY;JP#H#&>+|H7DK%_3oYE!QXkIoe|Ilo(Af2C1IW}c`jlOCt6KBy)=h^4(wA{ zUx{4##_>Rpp0N;>pv>13kyzyLbuyc!a7e?GzYH%=AFPl5h(DYQ%yFdn>+ZT?H^ZC!IZ)tOFuO48+WeIYkfuu=?P&Ju}u=Ec|S<20N=EVlB@X(>d5WEN@J5QzC&e{~&| z?sV`M_TR0r@UjRAb9L(^ll|!!c#X?_jVk>_OQY+ zZ1c4di`eP;G7=tk#p~M$lT(KrPY-h7jeZ-P1*Nep-W~@8u|Zb$21Um)Un0WBsJ;G8 zk>t?O2cmj;c*x9Vm4T4%u(5UQvt~h@*R7e);@u4~Y6Cmk6^AZU6=iT$cx8)qr-C6pa6?(k5M|HGNg;PW)WB)SDA zhyrLvi{@IkGi?d|&OmpZOLFie200Kf4u5srRzF`@dABN=BJPFzvyz|a^@{Tfts`HmS17_~39BqX>=u^VbWRHib4cnGxCzA2;+R1hZ_g>B%KFj3&>lHI! z;#a1ah_z6%W;8cPi=xP2O%XaA72$m#)9bg0tJ&daU+vpg>%pF11u60D+D>Hg2Xe1l zAvNqegNu5HPsO|!Pwu&G)}e+Y@gzr5HZ(ta!3eUZyckt#bM=fUCOo<(E z610b~RKA91(1b$g@orBHSSYW;_~!1LMs_&vaXA+X};e^L4lvMi;_N%-*!0g=g=}{s$_Bu|Oc;u`Yr`>#q%65do!(V4@-TqbC z7N_G{AHAKpnu_B?yFDuQbAPvVS(k)V`r0uqicHSxa_HxJy>SWE?4hWI0q71mE%A>~ zTfHmum)Pk*%m};Hj44 zLi{|qwS67_>CiRQ&;bWz72n-j0G0PnVJkehW2`+cb{sq(kiQ;SfbYBZ@j8Ty_=XCO z@DR&>ykKuQ)H~p7-MMHjt0$%x3cOAh@l~oNwh1{mWFNLWPp`E>drTW*yVZlo@gC7h zzdvS8s`FD-lA@#YYR_?2j%s8$2Flb+*j`p;gW0x>;!D{$YYQK8IvI3mf89Sw$!kB! zL8U-z-sa#%Li0m7W#0;v0TYQ{XyV!1w*Dv>9z5=3p)Jc+QB=*MT+7(3kF=N$x4_}N zx1#-+cofNn9VZivO0@H6|GR^uIxA=Llq*Es7^bj#&gM838b5IN6wGg z383m5ezL$tr^~tq7NHs&46}S8Ov{R)^>qrceZg~?1Id6xl=%%N_%5Nlrfj0)$~G|N z05VUQ94lpI?c8s+W5`1ov{}H7!5l#9MZSkXNCEVbp6Hn$r@-NfmYCKYzF-H7eH>(y z9bYN8woZ(Q%sUrrb(V#SPH!g~+b`a|?#wy{)PYR-}tTIiI=hsI z_0;*BE+}92%t>0xFN+81t5LTqkVkj^7`P8mT?$?=;gNds z&bU^+J1;%PeTVKL7MzCNoP6mNNnpYfrdI4Aa>M{)9$zdDpd;j35S6?n3n3Ow`8$yA zX&%BKn+mFRf&ewF>iuyhTd z7~blEq1R=F$Eh9;C@$FwD1=FlUQub2i)kD)M;QW7K=pD$nAA7cpum%1K~5d$PG0Vg z-?2UOafP23>xG7}1LpnK>peL2sB97(uN*bT$KGafXdfUUBSEt_Ln2O&l-ywRj1} zao>~9``uyX)gacjCwtTgi0DL%IFdk<&3G4USpW)94eN;Bvpc*isrWwwN}%rZl?Y}p z*d=aQ@tX_@dw6e?NbjY=7`gsGtuY3NhS$A1aMnWfc1?!Ig%I$<&XS#G{9taGzq_`|>CJW$K~3)>Vg_1X}RXvZt__SzBj)i;uPPfzk-7qAGV;5RwE4UhGr&?MKinG+ono%rhj zE(GW6On*-;!3pHO;~R%j=9vod1E!fUViP7^Xwe zvb_ynb>Hcr}lkH9Hbxe2$@{_Mm#?+?z!W=ALA4y$SBp3c6q z;pQuVtEdw-ZWs?LrJU^ex0h!cLrZWRj+co0tq39@0z2}4Nj?xWAey)SjTU#LWJN}K zMJ8YE&FmH#Koy_pZK{vg)Bw9klwnFi0sW4$Y^U@D4e#HU+(ACPmeT`TK zTDiKWqXxWR&MWQuck|YEJEDDGU+*EL*9k>iWG>$X6_u2wKK2uNG1~Izsebc@2?EKx zB9=E}c>!B=#Hqtf*6`vL4>BFDh1n3uy=0(9q+jt$1Us?V6w|Diw?0a1J4vqR2Fc6e zi<1D7b2u$*wBhx#o>)QlvQ_xs@SaWw>lJfcC<#jpj&6z$z`%m7_yarl;_&1&^7;(J{ZaiBQ#c35x1(i88@HBb9P?|0{w*Xn*sN;M2;=M!_z4$Xkm;%4Eyss@b3 zJ-um#Z^JZ+US5rKytL8zlW*~g&x{iE4qy~n_Byn8IM&)~N12BZz5^J%e9USv zYc|{QD(*;tVTqhQ``wpf*Gcz^&E#oKbGV5#eR?B@y*WH@bQ+=)j9Bhu)_Qq9qZ~v~ zJ3sw%bdLpJYv1j&gg1XTyE<6?%M_cpx9nWD?hR!gD85bsAY59xSscx0?~-@II$g?% z3e7eiufW*BQ+%iR*5ai(EIY1W?H2KBlOq>_yF1_JT(5Y$j-~n93%v;SHpfB@hctm* zuO*J=gQ4Q=wiCiPoRB|trck+<_wr4x-1qe4n?GpzcKP}xUZZ97RujI}dwMicmYHY! zrnZ_zFwy@2JwU?0eo3bvFC^Xal&?8`Z`)Ti2@}A4vOUYskB746o7?cn2D+MTDuDzb zm1J;EKKsgKy}QHvahtbRJTSrR!1wLQId49HlHZOI+;3LnvhBWpm$rUKjUGR_2sztP z^w>A+tjhECRGB=4fxj|D=TUiP3x7<_c`d9dlItN5BuE zh*J)?vkCiYW=wVS*C9UkyFLzcQEDsyJTK$vKk9YiJJ9oE5p5dw2bo2G( zX!Zp8v_u2=cgi&M#QTNA{kl@wW!v3ZSZm^N9p}ngOXl@($D5i4Y|#58ycgJ$MvbW< zOW2xgpFFG8O*eu%Kq|Bi;EG+5U@ytFZ5fNS{~uXs9S7#WKUj%gS=@vv@_~(tLhA9&{Kgh6v<; z7nNI9U6TPCkM7X#9H-ZYU$3w;i94Zu&bI7su#HD{uA%ZSL;|xrHhp{zFEx9>jI6|Y z_BS(Q6bI~l_do?F*r%_hTLEnPM;L21KWr!K!B|0Zhpryj^k=V5sk?T{Bj1t*OTm}& zMouV{C$G_YHQ!l@VZ;j0;C0)M_`nA0@Nzn@;!Wc_hCn9T`*962*ST|Wdv9TI>icq^ zy=Ij?u@=iY+m^ZTcEQ>>Y%Duv*t=Fw{fbKA`rta7dA+XreJvM|wO#My>|fsKW!I5> zrG29`cXYVVSH<_;e%_q!>n)*h;Divkm$-^=AL|_5c01wt$5-+>wnHWCJ@X1))8bCP zYv;SMRU|!LyW_wNkau{}_{}CD`Z%6;JATYl(A#b7@&?laBRt-`x12^2ztosxBw=Ro zoQ_fskJpw=$5L1vHPi-ECdm&Liv`&T@7qghJdQqw2YK_0nYcZ^0fM&H5zP3vy*-u; zo$6J-+e#7ZW+XzMAywwg0uNng>FMv(l zwLPTzF~Ff!k;$taz42&TmF87C#jBsPgTOA>X?>hMfW_G>OEdTmtclQwn(JsD9p5~r zGeLk{`zw*uV77xxS%9x`3`+Z5|7nNS@;>1s|Ma%L?-Eco?(zl)K1}ztTy{H&UsD5g z2$Iz#I+5N`WIV{b9?Tq{Ac?JOk(S)ro zJAPKQ(TN2Spt@zE}C_n+hIUbWex6K=hv)eD=wZO4w(MmWJDtAo80+*;uB>OQMM zfO>m4EdSfz^_E0+mK^3Vn`g?Or07uC;w@+1!V^VAFS*RPbEwWiv7X%lwO@cDe1~uH0d4eR(IO}SzH`1rtnrn%Q=(d4Yv7t zw6xdHT6^JiJxe^o*GuLt(UxT6^^gg#4Yq+32Pn4KXB(VP^uj23TI0u-a=yxB5LjCt zjODWZ!`prBs&UE~1Z_GF`Nyt6shZUk7BN}`VbMVv_#%7~=(gP`c(wMAQv$1_*-WWo zSe9+r(CzHU;FVnCo7^9rWwWZ6vaavo5XJ25#p2nrwe~!@6RRHkg@X;$;4qQMmdN)T zy|ScaD0eRt^-%P+lEJ%%y-bTRZd3W=fI~0QO-|DO>JMiBu|4@ZCsa=xUW#CYj_3kO zmG+~KqW66(`}r+13iWFfF*kBNGy%sVUTsb7a^ecEDgj{Uoilsfd&e|>cSPB^h0l21 z@o9!1Q!~z=glqe!wj@^bw%A^Dj?uI!?;{wtP9din7V1?U_&P{`Zy8gngmq) z!jT;*AqfhXMXpW^GGp>3w1yYz!F5}kp)2id?B;iqiv2n(${SRdw_Vz^fJ35Ny*(&D zI3$y^`B*U*zk+1IUB}qH4EPzl12*p3IL8z9rm+>9^t?7KHXte|m;x%Xab#gTB z)tv|Dg>S?VPYogOafh$4+A3f?4_t_j0mi2Ad5oMl__Qg3toX37Cl3d$eD(4vkFk(5 zj@ffwmpy_|3s&Xun#cm@oXz6&sGgmP*gVGP!T0!jo5GK!0Q|Lc(TY_Db{g01Jynir zGWx0PyeDpX;sZgoJc!`iotA@&)s33fT;3ClxeRUBD_mcXW*+nl>*BEi>c)<&w<-<_ z&JWQeN_zVsQR9OahpEA0Ey-J6@38KTjtzWYhN^I(VJTv*G*Z=CI}Dgg~^V=d)g^1)rY6)Ghz=Eq33yC zI_Lx;IHMgV4wi~K97Ne6(%CX_gypjEDcUjlHfYUN>NF?mn$hQt@9{z=>k}MX6xAly z=Xp#5Vn0r=F3u`L@YzW2Y{BuucnE;eqN8BdA^Pl%cIa13v`z1|VhE$<#y8Q7(`yEm6@t4xXg-pu6%V#8KWZ#G9Se7%=8d_DOa4+V9A zO%W@q9e;4=$1&rC`Qx{G6r?Gl5wNQ-QTD#tf!yH%RxPb6PS|_wsI#}Z#_vYU4G}0_ zDrG8=AI7HbhHT$hMo=P|N<`WcEhD5D%JLi^)Du}ga;P0`KE?-lyl)f%^v3bQ9;1Er zw-y?DRf}D3I0=ein#bdR;Kk_zNySE;W$$+TTA8XNtgCG^+47%sp+faIdI)Cr0+Z<* zpRj+WEzLPL)p-~ZbowqOnesVc6CddIdpHW-Dw$yxq<;rC*Q<;8>F)d=UKOd!&KA#x z9$c0e5T=2S?}Dvo9mf}YeIY&;!Gfj$m>%^JKk-~gFODJ};*8$nG|W4hR(61zHmm_tj_J(cl&y~rf5~6(pMx&v zaDHF{@(ik8I$$CC3(WIOUS3qJF6quF2Wc%X@6%p*FP^zrt_=?CZT#kgc;Z()!aPn< zomSK1lYD@;TZHQ|*nyJ5y^k%U73Z{J0G~Bb4lg{O)iFuvPjre`5qQP%Esj)iSfoX< zL)7OV9m3-c^VRt%HqsJ-tv^ClIhG$tBN$B6RNhV;qu+K0fMZ(>;)5vI@o~)QI7SE* z_P#LZr}TJ0idVhqMP1Gf@Lq4Paq0Fjd&ILHctBv7=HtH+ke(SY55JbTz#G%OPno^i zZ-OAs-)LnA`a8`iTWdaAdd~Ax8PoSAz=}2)H0W|(~44M?&4ytP- zTD2PVb#i3&=72X>px2QK6aR_R7EipVd2`8i0<=A<1|ujuo93;kUaAh0Md8Oiv0VAB zw>VcjoU-ykE+bd5ZiO|JZ^&7i0T00OkYub5r*!gOvc!y6jY$gYJ*q)sQ5@Z5cLh8d zw}~tl>|%c1-IVyhHI+FEdW& zo-1e@8-jG25}xphJsp*#^cr3;WkCb#%cDFD+nE?ZX?H*yA#7NA@OZbN3Kz;|GcQ5W zL0(xkZ5tr7{E{;; zpa@^ra&?9_f!qsI2!@vX;J+sRc}YkMo)f*+h6sObNC33Fb4X>ktul5b%yM>g_osQ2 zbR{C)<5)I%^DO79be1@IKRgUfH$1wvOKYc?`nIP$BVIBCFKO= zZ1&4Tr3B_LufO$Tb{G)eWtB^IK>m|kQeoHfRg{_(jI3vG-p+-+m`Ad_(bEdY-Z|0A z((>f&%JWQ!hzDmdVvXV3VRzIKdUG1t*_+|@Sf=u92>z7Qsmq#`ZzP%?tyb(kNqMXhV9KYX41s?4t}?1M zII}#+%c{>;)nV;Jf23V^dXqsff_!ZA8-9?C=0{q}Zy3l3BMw83cR?jy;bl0ft$9%( zBE*T7jwOa3OyDm`0lho1UQb})$u|cX?Z;B)z{N00wB@!toh+di#KMgr|d;KxmgO~9fpoWi>fUzBaN~uPY`Wg z3SLId9t3aoa&TG&zyKHHj3#7b*nU0#6W z@|lQ%q=dd99rJ7%hFY{v|7Mab&$z!vtM{Nz#Qh{$KS_21vr}c{zFgzBKD|<+y+W0}cnO`DIoCRIitqPfjkeV)vyL(cEHwGw zi!sbOC52CH1xqjkd9$r|BxFt6H9ubhy&sVfrNl+P!?uCa>e%JqCG|@J(9|o>8_n~~ zPs^R1WYvnSIkBRUYAcxPwZo}(SL>cqh>0R8fH$SO{~pBRiH}#P*C}LVMB~?55=`@N&b`K3Jt*%Qant@@-RjetCS{iIXJ~Tvkgq zrBJd5)ARha6Ui{WZlN@k&vo!Q0wkbh`z)5K2Orl8wx67Q!!=Y;TiBMnDE^GJ?`gTP z0rI?8eooSBa?H*aA>9Lac7C||U(@9$_2pFLZ6(OteYx<6JNI<`!O@5LPkc^!3!OOL zwkS!`;G_m2|J+)xlzs%GImxR&e5&*2j$0|LM{S39dp^_K1Wk4@ZptT35pX0oUqqsa zzt%zg_ncJhTUG#y;4Zu4T;wkD@MHovs`g>W#NmV3(t#%))qIho<1r16a=D$uWIu(? zYxD3d`7jI*5(BrKp97pAf%ne4efI&Yl4pp%YJSMUEit^(JKMpRdO9OoJg-2LvzN=B zgt=i;kQ2gl8qa6;o|gvP;!~4TOeu!xvu%{DeccY69SfsDP8sFLdHODJj|Zi8n3H8<*;%|$LTV1h%p z7iE2Zd^`A8tP)g71)d}J<`ghh6L9X+^sWm9C@sI z_Y~@9US10LWoC%{=JclBSZOs6?}$P#&5M*X$$#l()9Toc9Ox%g7c|F(ibnso7do3@ zCv`{UU@jA=XeW(OjOBty^-R!wQs}xXDDgSIcS?WE=S*M~!)OIAnbL3dns)94On9lR zw6GJklN5|I8A=pDnEYr&CuH&bz+7aVg$q375$PmYl-GLZ3|p8jjbG!4gj1B z2-nAS8FtPFpxlHs`a%a|LaY(Wfl<=pCDx_7P2JY>22jCE8tIMNE>Amdl#4nsPx0n4 z2_i(WBTt{iAJZ%_8Kuv=tkmI}@l-0rMniD6VhMi*U)c~R9en=2#Q<~F!ANdNNWbUu zP~O-kZpdIdPe_Ai1CssLi83{8fq9?k;kFckt;1d$|(jY5j~Y)S(sKLx~h$ zjtCIQMTsZpi>MS*XX-E=-(8_7(vE;L-7LgXT@j4FZNbxsLwIZdQg`vK*9Y=?|Z?YmOaz^*@KlWy3e_1x0DB%yuCh*m z7%2_Vlp!a+y+P;ptrt;(!H9;eS)$cPeT7$6PpkqpA@#YZYijFNCKm-VZ@1x?WYF}S ze&7ePJbJoqb2j*%TnCU!+zHx}6_hv~aV`;-$yHL~FHmTCc0{mw%&}Tt=8T6zaT<&r z2sPRDWzS%qwKK>&MyCdwdN~yeGl+d*6-Nc>Xf1E|b|pwOu9Uh`QO`z;HchG;0%RoL zVKNe6H)63o324%u_~OZ%iR>prDiktj-jhwzW+A$wd~a-1O>IHB9+V00%?WYug}pzZ zKsyG;vvnc_MIPEZnm6A{8hV{R`S(=aQ>fd8;3=f(PdX;NHH^=bb;up7)`bYBSPvCL7vSGF%!D zt=*c0l+LnUw{7@}9iRKt=qz0I%WK|KebOaLFEET#7K^hJSkX+ZTKwBLFkxJ8k`?JJ zxN00z5rHJxwnre$15p+U3yhx9&3Tf&x5)kgD>QvJWC(> z<8zX1e0)G@$3Ef5Y1UGT)x`bhp?tn^C&*bz;$wIv$=xJ6lF5?I2^c{l4zu8coZSNU zvh~i+A<=G6HJvY)#)^+p;sq_ABsuc9yt3{o*_uB>xMOSd&+K!L=bXzup`@ub@+AyX z&bgsqtZ~x>QLQ&vsEQn`j68e%!6c{jWjCLSI;EX0h0+shnhQIMG&b9U5Kcs5J=r|t zMcp|=sSVNq?qgs;CN#Gs3++%ohw))zMeE7u`iv@cheR?-hazkJJ@gN~~T@?MR+(h%g7CWkVUXp2RJ5_$CU5hgE z(FT3;oMDZK7VrznMZRl#N^O!mI^c`#@Xl0&>^#%MCly#mBY@F?Pc4@khoWKr_C815 zX^DCxl>n-ivNCN~o_RuNg1m{X<15l8pVT`?uBSp=phyg*k9$q~N#6sbV|n?_X*IX4 z!yhGRt%-p9o*M=l*Ywc!6oieO2nl)8Nz%!O9Aj}4nU!oSgE>Xv=;neQfQ4`#eKwLT zY}gf4H#Ou|X7F)kdFy?6!F^5Tkyr^PK+a+(KuftjUv%BC)p8SeKF6qIoeTw{fkM}~MN2V`kxuojbiWHk}Fo%#-c9Wrs#f6b<4(ln>E_8i7AqEy{ z+5w+(y>cyJ;cVeggVt2+Wrn{z$!6^NOcvf$Vz{tidWF!`@S?77w3eIUXUSd2F)$P` zn@N*yPX*(VK+r&68#{T_s^V9tIhJ^Hy1~BzOKl)ii|;Fd+ePb*4pI_bhee|Nl=|@{ zM0L(R7@~NR5u-ffoSQGovovWmStC^o=b{u~{+(o*0*DUQ!#(_)-gSA1ZLn5IuQ7Gc zG3QkW%QAh|c(~D`E*>A%RKr4Ga!$AT%w|`3$-nCxITSXCf;7GQX ziZ3rJ*SDp|X9-5wS9(o>b^oTSJdsV|cqA;G7V?L_+r7R%1WU#<5M?Ftfwn?Ao`Rv7 zv(nZnfR!hnZk#RmXSH$Sy`%;#^QWas$~RL!niZ}bO>!hos1d!{WrJ#Bl!`6~E7h=} zRW3$da>-I!e#X6o9`eM>gtqLuaZ-55!aWZ=QC=5~rG-3(;yn0eGAdA3bv(Ut7xDr| z)@9ohVAfw<kvQ_2-0c9|q8z(Dj(MpVI|{cJ%bT+;31%c-W-AG0psPK@#;p z|83m>6*f$$X2dnNui8eD#Nn8QDmEuCI2h@9_Jaf>Sb1G0fV!d1ZCt6->Z?|huy!7Q z;LC}sDa%t?Pb*+R(<%MHsd8oDU9SrdfgSTywCCMHb@|2~$a^)WV0cVD>!mQ9)0it+ z>5ulGxpck_oX<6dx@m9H!YCU#K}$$;V3H%$>r;g0Vv=CMFu^0q$E|q+tr+<~*7K%S zY4%nNX#P!S?~J3)$(hRuPL8}~qI}B@_cQhXl8n8a``!-X)~Rjtr&hoTJA-YzQa$~4 zAE^VPQEbI;I%rE~3Y3gH`M`Ervc6v(g~bq;|y9tg!ocL$kjDwq^RJ!MC#?YzD^M!8s5UP&5bd)LeKjh@B9 ze-C?_^M-9JyO*6?U|$G>mmM8%+>8 zlM;wf8E9Bsq+rVLTlalRZKNfcV{sHVD`vt_8UN9#s zr^T8ScKH4oMU$lRNs|P@(UQ?;S2W$dP2XqDiqW1QGNCNOeX$kbg{bQ%J1~;%Ic_~9 z(jNOL%-f7w7sxJ^7ub+A1IGbR6cb+FCZ?~uF6y*q2VXB?)6fV_DPZ{5^j*xY6R*H+H!v5iNU~k(Gmb^OXnOZ4hIkv3}Pi zw}1OR)9pyPmGV7Nqny)om^bAiUfUV)+N)3w2fpYbg>-*?At<>{&S!ZyBi4gZafM~P z(P?PM0X0ADUs)5yrr5;H&Y&3BiHl}`4T=zZXnO+z~mcl3!k`(G1U;O znlPN(vbcK(4h9xx#eGQ*f2*k*E&wuBasqr)jwN?7Y8uIME$Q7FB7c-}1HGlh?3DQ1 zRK?y*@aA4c8@G(~J}EboN3kV0YGVzLn>fNZVVlfO3ss-=mE050{O`wHeFD}v%R~ad zi3}Svo;_S>ha%oudE#C~Qn2dx;6c9k6SdAXCe_Zvo5Z*+$-;x_hk8D>4H8ntY$WZI zvouxaier)xk|>b_n2d73mZglyCqGRp$AnUXY33a3h7pd6@hU9QWeD{3v>wz0#GXoR z1LbWe!)Jd|r;4nzE%2wgJ{dzCN5cA&f@^!2MqE@gC`P4mA@I0@WDtU5#Io{JPS3Th zqzXz+5_*;#oo97dD^cNEXy`wckW<=?WW>q^XSV{cCQxsBI}2r{`LTXrkH{{x_VQ1% zOd@~6m?TX|gbv!pd@VK4n#!81lt(gBL|#XV@fQO2**F{}nesg-t+=Qp=-(pQk(3E^%APdn&%P6q8^5aEP2 zM%Bo%B9|H;yPrP@&Ams=;+!%1FrwgU`KGl>n!7B2c~QQvQ+L@@kDGi|S;&)2slfcY z6xXJ0>E5n61#Z){zFp=tH__|k2If!eKZP{%%htmp@h&Eub?Q)TSDqe)6b!z+3+&pY zkpzicnA%4&;6f1;btH|JrOHi*wzDFFpF0ztI+e8J98B^$1;&>$OQCzI*h(9p?4g~s z#ADB>X8yb8TP$v-{WeP$-zu$aWd%l#7HTkXbFwN~sXv%f} zojddUPFd@RL|t$uQZ^psEg$UlIg5l>KMHIUE4wnNO*V2?BiqFT5j8xfm_UYwr9h!TY7`~^p#edAh%3(0c zp3b2QrjB8~==T_kav4nZoJ!gzf=IwfDV`saOK_{ZUCGHjOLG8B`P>tYe{kKsAVG~xHuYV5mPsmGy7h>|_O0Z@!xS3bJ zH2FvYJ?LQkfbaoJ8ogsGo6%O!S-2~K+62+JL-}h*r)zyK-<@j2>Ng*xex2o9iq4WY z7@d%N-$BAXP5)FVCnuAJHFpWP1?gvzOqgS#l(8H8a>7$>bH&5E%$v-+9vCs?KsKT% zyqyYj@+7&zF^QHye#4r|H7{)aJL9m2Qc;}{>fA+X%GY%3=^(mv2qcgUj5N5` z!V55p%;zVQdQY`{qACSmKjku7rL9&?(SjYDSG6rv%T5%y`X(E#uOEv)vGaFM5Kc3C zGC@zM&Cy8yZ@F2in-_FTM$kwOJ66F#7l;J(gYyV)vd{$rZ9TcYU9{bHvNd9+(JT~9 zy%kwG=E+X{bIKG~rX>0HjbSKdg#?KF5XPZ}mL&IuQ9rV@i z)z5CVm@r7!D5vaf3CTOl5N8t}apieIo@+ZyyxIemkrov&oX8jhL0xoW4kRkuaDFXg zR$`W$JWo#r!nQsf#INZgmj*Zape6XFCv8bsUALAy*O2iVOb**ntlp7QF@La5=uG9im61XS&Ly>xJsv~S zapfq24U+ma)&T=m<{s?liQrYWYjXaA^@X{niOxgJGsydISI^mClHkhKsYFtF6;XC3 zv6?Vw(*hungmrON&QV0@+Jg=%90BHfY0yyg&IiUk^~VX zcfP}cO;plduX$3mh}<)*Lo|R_fkIdZLi6EYE1cwdymaPsE%hS_JCG7oq>__U_!upo zl2Bn;|H8H>Bz;01*r!n+86ho>(a%a%V}rpV$%(-`^smPxCr}kipgk$!YG>0mOe@|5 z5!27*;KfDUfp}|8&f0i@Udtqdt0110_~_vTPlr*X^a(Ub+Iu-yu9vj3Cx9oE!*5v@ znpBJJm@F0lH7(t2~`|3rQPC>MstoHKZZ@{Poj$9Em#HzU;j(SPF-I~_ zBKtWf5G9|Is{IGyHZI0~DV_OvQVLGNDw-w_rw|^KSDT<#HXVy)MN83wEo^*_F#Ev* zCt51Ba|4j**|_Hyq!?wUkmQr}k_G@1KZ3Es8`lclA7~FigO!-p>X0?H^IbQDu#A(4lgONVXt-i7u_mR|QgEw&o zR1{x&-&4k_=L=G4X)GUV-x3A+X_!0prLJk|n99HaCJNgUVT2WONNpM>r{5sul5(N) zyfVr>G>SP&$1`z&`Ltu#0MgbOxCV3{wI9MZ&kO)lc1C#{t?m0gF}jLxnB`m%(8`e; zxZ;={x}*L;3#SdgEv+w3NpC`UXSe$BO@rUn)LzUkg_Lm|EuD|@{N_PON7c%?A^)Wq zWSmq}ZSE`6A)9~Vmd6ENn*)_9Jyqre(C4J60*Ap|^T8LoGMeJHCzGCu35hCT8WJYu zma|$5C)%a-Y)Rj_w+SdR)Eqqs+Aom)N1AgyC-wmu-!xYXmIi0pmA5jJbnB|8PLyN% zj@k^dcO?7qE|9?X2&-~ONM|lP?Hn$n=G^qu294%#&OBl%51cw3SS~T;%3n^0K{?&E zNG$UgYoAMywCgAM5ITcfG}i&(;JIE8UTCN8_L@;Xgda9r^{q2mGD@d}YZRF}FGXX% z`I9q~Qu}$%y?xwH_Wl~&@ipEiu(@r+;au~=Xkn+&NXhbSlOCUAhBD8GXWdENl2TJT zq>$7ICX8^!%+om-j6K^ixUMpbpp2q8x>XzLT$u5Y{h4l+M$LDM43QGKl@jh}Gj|iU zG}EEZN_fm5kZmNc(4we#mNXg+X}MIrXF1aCb4tGz3gyKUwlle3&a%luX>|ri4WTJv zb**^;>3n+vO%jtSS(;HFj-$lI%m6;cSY7%qBuNX1GwCYa4W@KSE#;;{ddy)r)L4Gm zQdZ2$Il%UAdT+T#CysGWZp*9HgRT;r72JE#V7(W^A8HWP5#XMAV(uDw;O2v7Qz~*c zR%(_d3Gm}2H|SDBQ=5*^3tQn#8H-qx=aZz8zb{<(dQO^3E(cNXk7cItzqLUr<-YIy zgj|S3-xD3+o+Zq}RuDJ@aybPe(#Dj2S>LIal*989$ShpjP2-*^W`{!df2JmdH{8!*EaD1&B9IW9n7y^8mD9FZd?v@&4Hy%o8_KXMFG$ zds0XoDVS1%pb3!DY&_yN$fFD0ziBDehZR;gVb+W{Ury{uJ#?qetr!usu{kb0IX0|4 z@+(O#aV6FSz0>Y7DH5svp#%6Tecy!e^SK$~R_a-75_w)0ytHL9mn>$_f&@&1I88~S z%Kp6&trRivk#d4Jb>TL#m@lgrko5G-i6>|OlDMa?4HS&Z`IE8JmNrFpnl{O@xw(- zH*OBJVZL@iABHXFgeGh`XFKS5Vo90Ku|E*r%1b%VV5LlyCkFjNNi4^z*~!;qT8HE> zSiC4z?_s=7Y=~PidzRgzhFA2y;IEzL=(oJSGcWiWLywy!s6uzm--9_p8KHTYtCt!F zvTw?gPS2_LTzUWHxAGNvL3~r0aAH`duVjwQsaWIl>L)zrIH0AVsd<{meUM6@7{(<< zb%%ljVxq0SKc-75$p`?Ykf#uLwnYEr+a<+mO7?>gYe{vn6-v(b)|Z7dBf);stL+rq zE-0rb-J0}JQUyzh33VgQbIOXGh^Iq;f~(b$>rK9eJw$!Bvy)20hQ!lNqY5Nj@ zQ>gX6l8(#6Ps&KSkPJtuAyG)p2BP*Fmr)o#sIjM_TvpmE4=tVTMKL+*^c~odq~582 zG9H|zdxeH=O6Nr^O&66OYsw;>2J$PV|1USPdrO2)pPy5cW4m)7VhE3d zoC;}YQI~v2rDW$P+jm%!G`uM?)5Sc<@cW*|gCILWkKAEaX-1WcedueHkK4*SZx}3! zgu;7zU_*9`6;cZqH}zD!RPoYUfy)ph%FwrV)N{uq$)+k97WF zM_p)uqt?$^2>p#j!`x?lYa8P}wb(9vhMgQWjgW${L&JUFCozbAe%eh4ipiD%KPSYt zZg3_h|CFy%cfv2qr|YL=-;TEITt{r)k^yOC9qE`U!F+%o8#)??2VGvpJqo+}7LDsQ^rs{h=HB)Bw`aEE9$Wg=F$T$SaXX3Wff!2gmI66*3n z-rMwwEl_*LJ>{$jNOAJp6YJU1`!3f(Y8@St0%>9gAMiY+gwYkB2sR@vhRlob zYS^NC6;P{4J=*{v z`$99>865N}(+PLMaU99F+>bu3Em^~naJlkIFEjI?NI{ByQ`CZR!fOvQ}0d7BvxPUwj*3{}5H-?BeSbXFRe0l5h)Qg6OJ;{Ql+NDOz`a~6r^=Fg_R zXiNc2j>x&ag|90+IyBHy4x<>iU)79Xja+(9FZ=l}=*e>PTJURxYK~uOuN26H7t>;_ zh3-s>daAux)@fMK`15hCwbIPDow_-(;ncKw^|hKjtvE^*;3n6F0WE%);{(?_LK%aNG5Rs~7N6MAKl9TT0C(VhdK z7p4{@-{bf=o9Ak$oGR8HJ6X@cJ83@vRm)}Fn-U-=Bb8;o@pu`1<<||{FtQ}imL!%M zE;U82X7YOh^8=;0kblxS<=;Sq=ckQSS&PXymuz}^HjWGBYTnxg%D>GTV5|xf?q7+5 z2QwYC4W3jJbBsTfIR34PPAg%N+{6P@8>2K|u_bV_&X}f=;rcf8-33DMM$GL}S!2PPc#x(xp@aDPW0Ib0O_d6#?U`CmgpKDD z$ze$|enANuzpx!j%u4HQYj|3{>?Z}lOAEQ=lkii?IY)HOFryN8#jVol8*BGQ_o%Stc_*l@X|||s9W0a2p`WS=S4&HZ!1p#% zNIp(&nMMrWBgdKB0cEF~G6C_O6eaj3=m7QgxF2{}l1ft2GF#AkbCiX4XX|!88rTDy zAdQPPj1=WLZoIV;Y6n?b(SKS(86g~CQp7Vb56(i@(prL~WWH9TUX}+#M6Q~^p1LBd z9!~XnmuY+xxwuK-O7^6*X-apU`;w-1Ur{3t%8sK=_FNu7I+rPvkZ|zIEh2hiV(KZh z0XmoLeBTAIUyYUmqCySi_@xWWkNf}@dlE4)9vy|xUMB&%sLRq)b}XPY&&ejH3vVtK zfD|k^4nCRTx!o@a^G|hg@@jUwt&2^lvA)Oxte>ul{&s5APDMbL%LOd+7avqHsgn^y zs=TohLwl-7_4+Y&Tb#g^WfUb|xGyFWNlNdLA2-lSc;TdPNcnxFiy0~Y^E^{wf}1R`LBr=0?=DBQ1i<3OdTf&b)cYUV- zaO!}Y(VpF8Eb9dll_5m{q4zL50k-(v(`IHR%eG8jt1yFjgd!%~Gk z2U?TWeVXgGn(^lU<)OCi+*d53R5(+q4Y8$J7^nQ*H%6o?+ahq3*&Fo4i_-J^(`i%F zdC6lCHYpchk5n~Z%E+{cIA@P@wyXY=a~l87R6pj@I5xMY<NdIvGt6ubG0PtJ@n(4en@*?ZZ%lTody6Z*x2yrI4U?j(PtBNCWh&`!i30Z>)( z8EK>XjFioZ9~{?dBfZJRIgYpJ&3VqqjU!-7%bp;Y!l14x1k!55((s(%%xH?zQZ&Cw zRf`S7I#IIkVb0F~8{$f;n1bEOZ$!Z!yNZXO#)T=9pO~T`#b&zQG+P&=rv=8TSj^_x zvh^t&K-j&2d#9sJR%O3QSMf`}+*In8sQH20*|1fFneE0lul89vABkb(PKmqDMsuWl zo(_&_tbP_L`Bf+CF#>CT!fIu<<}z!@j@}OjSaT)Z(=Y?Ly}y zWe_=z)a3AF1(hwKlmX9K4;sYaTS0qneb*^Hkjwbe5HW&wmP$F-c0 zQpFjwp~Eu3p29BAfszguzp5m@+yk~JN$KuiLcmG^gRtSM9?J>dh#{`I+RRH5KJ)w%Zr*Ed^uKiY zWL|9zi?g-bQCti`UyPtplHYQ>@N)7F_=wQH1K7-20Pv#qR7V2Qe&x|k%U`?``tXc& z6Os52?v!8&UJMhK>s%WX1Bm&Q%6t0uM0vY%KXw9U^Ra1)rgtu8e9vf*#`HNP@=R)+F&hbfa ztg~Qq!sPDWXTQTT2&WhG3P|Km{oRlQU$@}^NveH6XH%#p&qv3p<5hJ`9X&|=yn=Iu zJg6U^i3z;Rt9ui7#+D+wK%b=NfQw8Zw~Fly91t)tY+vA|q`&7*HD=<+x|3w>n%=M= zN2W;5S=DQ&++8QzqM074W^x!3U~*l0GhzpDJ0axZ^EU1eB-@_U>60gsynxLz51h6L z053V!yQD^$4u$0Fw@ilcvl|Q#Hwst&U)^I>wT<1^VX^8ZP8jm4(@_X{3 zF+|BBVoz+=y9f@5wj=rQsD#~~{1{5yMOsOmum`w7UR>qV2Pm*`DX>#f}H^( z_-_cTdt#BOFv5v62HQ!ci9`E075#S>!vIe}u)hR>bLF>|(=ae3xZ9o$Om9!Sf4l{o z=a{MrC*SlZ6^k|6EiUiI#xK1H3YAIr>A0XwESd`4lcbzvI&SxRy=wNb+RSVI0e?eOtbA|&}5ez`#6^^rLM_O zULqgIv!8@Zaxu=S#&?4A?Q62rtBfx83~8At286Zpk|P>p)Klk-fYWR0q8*YyXL7%psqcmO4Z&sG-yKz$Ph81MNzgSZ%8?qC#X(v&p*#f)Eemv~lQRuG>Yn>W0EC(S zsH9bRjj=%l-)2dnX~1Kxw6c>b7s7T}8IADql4ElwvTnG_>y%zk&CBA7mwl4(U{%tX zqvYr1Ri;SJP34}Ma+dzjk|Uc+BpD_FlMt9#bWICJ`>{RurgPLnvD}zK1Z}+LRP`;^mooCc@3Jt0AbCXdBOgb2;+3@KtpGhyJ zF-#|sV9~Do63a|PzBysl6wQQG?x~`_89q5M&_2puu0!?MN~))3N7vvsZ8ON*T*a9p z16?S+6hK5F*O?x_wDk3sxIDe``c4;SECcIusL_* zBV(Qty*g3f2Z5b0ew%)$#!C%uyGE}n8Bt5?Z0sZd!{eppnn;w785HHYJ{czYs2u-z zXA?o!ofJIKLTR9;Kug$Q)x?7&-EHAByKDsB4xo>b3}^_TlHhUvc?pECshPm*r7!@{ zG~G#m@<`iT(&P1=r>R9X^0^_D)3l|6&yl9iqFjI}{YlG?Tv35A?r;{og4;l?AL+b zxHZ&?1d0RqbYBw<2@s~D&J7tbf!yB~_|SH4qH4=aKJLOB6BKO{JcFuJ>fue2iI==;yLw%OgEI`7Sftnj2D}=XPc` z8)ICi1i5>8fcc(lhh2hiNnx32MoRjfW5KgQ2B+OkmWFv#^H6TChVz@vri~SdyJ5sv zw`)$Ulid@Y+<=!m+%iF6DQD(Hg~4|_(-x;;2U+F^|Cy{a7}*Jl0V5?Frg*nSNbO=D zZUYHokxFDiVNYEK@t$HURn)X{CMQ= z^XVjHk$_D1XP+(!xzDLJ==v{2rfxk*{?2DPbmy&>s^c5!C;cn@Pb8)w#IS?>X{DhBgL(e_$8+gYI=xv!yW1uTG3YVC1Pjk7<&w*lSR#Co|EtUk;+fA#kVCj%FTImRCN?6&@d*sc75|fb!1I5V_b%QFw?_x^Hh9N z9w$1ds+Ww)*X{&?x+hn#TtojEJSeDdzOTWlzyMF3Di>FhiN?VkHgD~-53Ka-&OE$) z$i^!;Rq~ngej}-{O;ewjHsHLY-4pQD}{D(RX(eYzPuWcI=d`kcnb z4$9BKGSSCelI0r?)wuCIR;+v|s0S*6+Z4kW{NucDvaiFOu5eYP{gU(2&OE4FXY!@c zZ*+tx5>uYhKrRJ2}2;7A8UE^>MUF*91kK5(l^we=X&N0GWQd62wb8 zkvg$yl)*^y&bDcIkVD>U=*qmQwJ+Udg5SD&(Hxpm zrq{#_e$kdV9AVRNV0H{Lm0S}JH1jo&AT5XDbSwG1?5vUhKW;DYM0RaN8-Y|QbK8$h z1FmGe1fYYBQ=-Hxn3sfNOrvx=nzM;l>L0XT!uESl%IuCM_u91;{Qr@MuoEclN&C6w z55{*M5r9Yj%xT+CjqjTRt+_={l0liqF*oWXB3GTJAx`8gH!^kEc5$!ebJWN zyC;?H$C(TH4x>WaV4Wl2lzAdB`@A=MtM@uycG)LW50Hp{-6ZT&ls58lIrS-QMiNY!lCQ4w zIUvEbXOv|LG$7?%#1V0=@RF`+&AT*1uyaor)E^{~@0*H=$mQj;0j;RZ5BI>ibzX?R zZfN#-DAmMh5G_&nkt$9S&uPyqXLE$D38=N(qe(`bl{J~=$9Op@+UpXxE$--CST$uV$h#>6E4sE}OCuPP(k#`%^k7IKtywO} z2t)%DeN6&Vit|}DTIHm$9zS1$W&*EFTM_(t*D|I5RzeLdBnKhMq`nkb1u3&0JaLaf zRZ3-vUHkDk%`>2WQeRlLeQMt%lCTs$?3M?3qMJM@asfPWD_NB4$0^e_3KTH)dTFDg z(t4|t;mVrx?BGrLKK7;t&Q+a$E^E^E_Kh(ZkO9->d7Zk_bUOKIYYt6kojowV;MsG~ z(gE0PEO^N~gz<-vpCp{9!P2*mV>+*`3l*VNg-;{&d=a0OG|gBA8>gc z$4b4HQZBzJh~YF_{@2UqIhXG1>{|fFzP)3ek6F!Gd~!f6tRV_>&I%FQdEDJ(gs!R8 z_ASKDOx>?K1(TCfQ-|ep*R&H!NwqJjRX}BLVeNiiTgsE-TWYcm6>KA-L-^TBjGb}g z{L|?`=EWxKvyZqn(K6JYpI7oP=sl9VNQTXMx{-R4FTSrZhMWUY(lZFL>0NBvSwH5h zH6p(GjKVGhuRWb`qLi7bLHSPJbbqvd4MY=>?9xDh>lhH9I1{N4>@suUtLiQd0F2I& zE`+{KDyg?lJ-WHLdkmL!)oHJwS-KGjvhd3mG9}i95I>e<5<5~c@wHEhhEbLuI#_e3 zZei=gSA8&%O3lq${!t~g=J~UJ=yd=hQ}%}#O;en2ex#>5l_SG~O`BaeUgyitfn@<= z?7%`-9tLLB@uirWc|mkS_ev-h-O@u|*J2sCtY2sHo)`Cg&zZvZOt4+8!!fx<)!jJe zoHXcjP(e!1@|MQ6s&dH9P54IQY+_HRgp$q-lHg#Cm0D|`B$PzqkA!}XECxm@fSgcl zPw>cO=>^H^n!aBtr_a?2nNoHI31Ugn01opavE}-1q?J04;pa{~C504Ky!4T|?8pkq z_c#_4`3_wld-cIjn9Bl!CS&UrQ=_rUH*v5+)H8m5;m%|;$E!L~fs zlYL`qxTH1s_$ml1RgJxlt3dw{;<>*|cmsJ{@<87-#g?h^Z+hdiq$*{F^bmOx9$Q&* zbRO1L`Ksw_R;@-J{cf$m>9exC3|UJhBE%5rX)KWz z`|LD&DUog-?C)uSk-Uvzd#P|prrfkPEm^L@=Hf`lx7#0E#|;#~0+HiXCw5wnBi}UfB=IZ7MBS(VDk04ku;fa|Sids21I`8>{=kDc z^5s6@)Vdv&%ukAAaub~g`qVZfqx{g)Tc*A227fx_H-ZvJ%J#Mx>)a;&%Q<0z+!PNA z02gTs9?$t8UmipHn6kLZoO8(2<&GD4_LPJ9XUA6T&awO~A3yNyUG%R6Fh5Sbqcx$@w^dMg2p0|~km;$31jufRLQP~Q>mot=mkP_v}C(y!kdQbQg zy6e=M*#K^CNXYedw-$r%n&*z?#D$bQS*PFBDq_!zp>y)8Oo?py|FP-(D9kka{CN3A z+kWmArfpAHo*XayN+SF>?R>NJDLs{+n6}^`TBV9b^Wz83JF-zKO%1!7VnB zL*Ax|KT^3jSxex;Ccjdp~t-^b5{bOmv zDIj&~Nnn;>DmY3)M|%KZ)dz^ec2UVQ1L0Phd>`7Nj}&b(^G*E?wg4*wpVaHClUkD$_q169$#3J=SK9*gnP?#OBWpKqf`uppFaA~nCp)tjVgZU)J!6yg zAeU31eBXSK)ZS+FGCD$ZH|j~or>KQ?l(yn|QuHFkt2R>nq%Y}Yy%s$BNlO$`K=E!} zYR;Zj^1!s>(S?uw-6W1#-9D`Ka!S^((Dei;hm&dkBL%=hq}U9X{j?1QRUPt&pFw6f zZya^193-~nx|iJNREY^($93z!NueL_RL4u&Fx1Og8*&wUt@|Q+b^1Q?+MvTy(g!U2 zB%o0&%*mad_nC}gPB6K56dBTFzz-kftYp4X0I^fmq(sYw+}7d3R5jWM;+HtJED040 zC85+DgWV4;mqa)EUp$8f6#!6oK;Zr{3haQTDf!ZKUxrLcbPqkRBmK~KTzOFEaOU#e zo~b>bCxB96oYxQ1+l5BlXWsg>q6kgtxbjGVA92widjIS`o_ShF-n*IG@%TJ*51Kf$ z5{VlW1@_cidnaCD#~EPfwC94R^jN2OBBGn6$Qwg|KkwTd($E2ZXy6^0R^5ErhK9x@(KrI zlD;qmrvYpw9g^-yem_sBZ|*OH+#p6sF3dgAt;jEXN?W+>iJq8JBF6u@LMP9jScSF-iI&86v>A0rb_VUk673?=o7|jS}gV-X_0R-BI!&3Gg1^Xp=lNsskp|# zcdj|C?o%rD9L{%tQah|0KOyRDBreW8^?L$V3xU9$D=v+=`(syNADlq?@Oa+1;Utk@ zZYBgmYXSvaP!CHV#&Cm%U|N{TE~&W>*V+jkB+3G7CB*fcg;4Hr&eSPzq#j%*K%`Jk z+$*Y;ighlM)7Q*lG7U-4&+i@J%)gW3fJ)xxLlcK<}}g1B65>L{bE@LN_{|aC!5OzjFMRxiUea}H? zBKIm;YG+#x8$Em`zxzXUxx@*>05&2!{>ZVvBu?4`9(_3hoK#S#_7$=afb*H0r33*8 zyBn!GY4TvLm#b9}8|U6Dr!(#RN8*>gXY$THT@=~*=5}uzpqlB_!*cj36j6Y#m@%g( zO6;n6g{c>|$&F8%x%f7viOkE+ad`khFa9@q$7j9RN}e~;Pjb!1S3QTUPUWDXu)!Hl zDr@Ob%;{3broM(L{8HC8kesx2MjPJ-h@3)oOFe#(25VT!dwTK2ih_B}{yFtkO25tp zc~`r0x;yg8tok`Mt&Z-=%V*?d-wUCW(<}SZB41Rsk2zr)JV|Uhrd&m0Zhm1;TSG#h zN$Hk*o=d3iv?G7H4|CeGV_LB7ClL~yAQAb^OU&sjH>Nn$*`5%acv#g-9Zu4+h;4=f zuwdmFwzu5YI=;0rFeQi%$1_KMI|)|=%Q|uqJ|OUg-XUTovHaY%hhFvl7FMljrI*zC z(}*2Yt1uBeMIyzM&B!jVbz4>d@NS~tflC->y=gkOT6PYS9M_MWjKPFrrBwc4%%nYD zKk$RxI}6#DMpku`^S~bJPU~rC%+(wwxR}E?|J^IV7AJ~o(E5AsYLG4L7r!wpSI7`JTH!WsfAY~ zC0h;}hzns-!_txZHnlGu?{Ckgy@?vJL`*%Ay7A3b?v-$FG9EkWnn#rY@zOh* z0$>P=hbi&6666x5C@BxE$)tS-3q(skrX+bl=gqB-fjT?1MB3zx#K?DIJCd1ta_QQp z=me>X)M&k-m8Ql`F3kJXZzc8GNU)ZE*Ot7Qj0b}TO_QLGol_yZ7dE8F_f0_P9M%ET zC1H+yG-3>kvGk+cNhmkRWOS600{WSnj;1ud+hDYoJ}Kc1@+)T#!){t(fk2b{PV_5E z)if9KOitF*fk57=3_8k}u7b3Bu1Kn=Wh3kGiZFTeiL-P7XrpcEz}bV{$Gq<)A!1Fs z*(l}Xk#9IKgG6K39;|38c_90=^H8N6hI&1JtUxR!fYclcUwEb8yjGO*!4v{moEDIJ zlu>>wL%a zs-=be;Kw{-I}n|y_|eD8$xH;{{ByS}J=XaoCfw-f9k}LAEwxQymzNQII*MTzO6hR! z>DUmMHqg-q+R33`tQA_K%~eh+1fA_%UOiIQPOL1A38k8I2DUa4@m3i;A5Vr*1ZNpC zua$+c@kX5-z)k`&s1?4NwR=_>;GmQBi6fg+u)yi2A3C1AF5aJM zsgi1^fX9=+2DhKYoR^x*o|MIKfq?NGYVyY05&^2on{)(@k$YG+P|=1H(mQR!Y5^Z^ch}Dj1C4;4laKh5nj0hb%Tom({Vd9vqiF&gZK8zl zk_i7yl6@WvFV7E&a*BAq+Z0sJBQIx8O%6~lZOW`^p_a(58!Oph?Kk*^-?zx$p_m`);lfiL$F=ldFNX4YTO+7oHDL#zp^CIp>J1CC_JQxe_ z=4*ItdGZN?SB`%Q{=w}wwbVN^&Ox*6M)k@!edh}Q;vbSy#9AdODIYGq*OEwcT?u2U z7L$?gS?cD@rgdD1x~tGqXrvk-t)1%qU6Z_XdAZKMQz$ppUh3lK13UbX1F14F2JA@d zuS`m8^(5sd&b4VhQPY~DYn)VT=@4%_fL;zA|H<)9fA^fxD}imI*w8>tJSrXbB%~$j z>t0=vK}SB{pfoCgCoJ_R!kg!E$|ORO|1FpH=BmZ&VJFcxVeUt>A$t?5Q(_$E9D|Es zzmswrKK`fudvayYXIPOgq6s+IwoU>+Sh9R`vz5fk%fVNKPpt5Nm+X`2gkGXn3;|hPoi~-mkzXfQufV*N@twFzFa?6 z#jfgJ*qhhnc{sVm#@x@H2!3HMmxn;;9Hk&@ns=tk2{=^C}0V(=xzN*=|EyES9`hzxgf}p+um; zX_A1EOX)Y)bw<)B`I;={YxqNz>AFmtO9jp##R-;)Ida!~a{Rb!TWUfcr-JQga#x~l z8rHpbFJk-hqj#$M>3xBr z?plc6Jrv!knC^*3IWjbXxzecg)9~lzH;W+(C`%s2ptqW6_u2W;v|MS~*wj^o5F@&hfv*-lsgr{ zXQxbVmzY0ZxT`elC2hENZAAv-m)UMxt!Y~Ek^o57zEUEa+2qMwmzpLA1ZWVK>xCKP z2UkD^wvijnuv3ZyDGdrA4=iLW(#Lu)`?2Zr4At?sZuH=+`5Wh(@ z9RT{7V7VOKr4bmgSbKqKU4sj!iqLREcSEGfqaYQOvMc%KnQp`{*+l!1+*E3{N&gH( z7LaCbR8I`ZnaFEC znD)V)<*nz|ZG=X#zLw6;HQmaxNfIxrM`f0Dn{pH3J5!Sz>)ofuRKbTN7+wgmeY8D2&JAakm}|0a;#V>v_Jg)3r;%T$aF|#;&25;T z<#LUaBhoXiMfAE)pBPU&NoqnYfUCLtcxb6DY>iPK_k@Z)4;PO8LioyEI}ob*2A=Pm zPi2Iei1ir5To1NmB6vbJjh2s$4XyR$0hJGj#+>R?fkr==sntJfWeZP~Z!jUtaU-OYZaJC%fm#Lp+%7=x7p{*9)&aXh*0-Tc z6RTaAh0sqMI7(a!m>nI~Av!jetmZ9&QgIuM9bg#w^%(L?N**N96J;GqRktUA-U%wmrQQNUt6Ia$HCm5rX z(9x4?xr`SHE5*!v%zkGDw(2WAu|)D=teV6Bjg|hy$G}S-&GAk4ZZQ0ml8B*mhkB5v zIr`Zl-=>Rrr8)CcCXY>!N$H39n$mjxNSy$t+-1!HrmvU)YV+eqP6M@%f>!e3rB~@G zE)vGlfTbvZADwv~RgN0-XHHftm>Strl!9YAkfyB5|Nr%~JX0ee!MJ{eY`%-&eJaV5 zmd{Q+4taoK44;_Cfqrf~2XnBz4-?&Wf``*H_vzO+MY?R3m`YUo4@%v>)01Ih{F*Z= zm~W4Kq-Xx7a`Qs!CXwv!o#ZA=#JlgNSPX=0?DFb2GaY_JxvPbt#&ISRtw?p?xnDsM zNW6OuAlft{(br=h(1>aTnE+H?(fQ1oPx*G)#_ojBtytjoL6Uc#!)IctLS}vUkrnDmg?V3!(7dQdu8`$TvIG^0l|s-CC~M_?B?#wn zr4c%j_l6ToTLKMe2Z&&y`m|{vK#RUJssa%E&q%82io44j*k!f$;T51mYTE_M#%5H#)7(>v6It`g6;^cdE!3kBl@v}0QO9(>VL zB$6y8C1pp5wFCH=ex8HJF?f6BJS3c(UUQ&%(pTlqaU-l}y5N+q6D4*IvRcM;dE8KA zmk3tLh^IA*yN#_P$EDYOPB z0$xpGC=a`2_DZO8&G}80LX+OlJ|NRJ>XHRl5RslISZb602yB#z@V#&b@z+DKgvIuY7yEY&wGBVblM_JS6r6X?^VSe(a?_p_zOazvc<*mZOSxaujx||6 zDK8mw#n%M6G;^R`lQ&A#7qc+UeLmk!@HIazS9c;)+eK9yyF zOzh5IZ)NE>F|qoSG8kO2M{?`|#*wBcU3$8X0sl0-H*IU-oMXV4vp?8_PgkR))kG^` z@})j}1@if|ZYGpsG7!|AHIW&{Q$#)Y?3A4wHNH>Fu`)Y_x)QnZ4#Bn)&VN zBq5bkyQjP8^o{PM=^OTW;K8Jp%ouB5qX~PQA@%{;x4`WcM8L$1l5tyP@i(xPd+GNgT%7kHa8jn+$Js; zgZ){jti`@Re(J{@ICa^E!t_W5L}bbbrc|$=Q2PubxT=D7ATd4T5D2l(sHKe0e0LLK^;ZtV?c6!`pTLn zZ@SAvF;iadMI{|OvBC$TncI@R?1?q_Jr%Vl4Sg~L2{TsJEGia3zcuPg4W=xO z-f44ece0x~z6)?GI0gA|T8DXJi3Y~bbNhw(TR`8AcfvVfKHC>G3JyTX3n232{eDADRaudcf62g;)zXis2sW|b3W;pUr zvimZCpeESk+2=1C z2PBLofTWRQRrx0SA2irD;Ch_;ysC9IzuQw`B)aF?thVHLLKiWUhZ& zSaX2F)ijNWc65iAL&HXgfjXJxLYlbaWVrFBJU;q1$)Sxi-FcBqo_7<~Y&&*Kh+3cB%=~uc_T4cTo^8_?vF{DD3Fd2c~|eX=Y$U{VU&qT^Yxdgq{t|ZH8;$TF|Nv zu*F+DcQ|RjYEKD5O( zr(>HUbbHSDm)>Cqib=VfQ1!!OG5g{ z(|wky0hsH17SZGWKBx}5&8O8z>S#P7DDwLLoXx&GS0yv`3-dmU?L4Dtc`)0y4^x$lCgN}v_6fUk-&iVQclyZrm=3_n()rB;E-_d1>QXgV#znA-MrJ- zTM|}wZi&3arZr$rrHhusl!v83V#OpA(ZWfHeVkil)Xg3?9Sg-3!%0A?Wje#9;Ac%@ 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 z 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

-?2StIO?<7bFVVYdfGKv+%?1L|aS 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

bFJk-hqj#$M>3xBr?plc6 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 z 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%0Aqq?~`2D2>YV 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

S$1}=pGv_#N*fp{~ zyYqFm+35C;8(HO?3Dt_q2`Rf;3a8{2kC~phY1kCYO-EA(wkbazyRDAmfA?HzY)Sbl zvmqx(0R7?a@i3DG#R^~t3;-PsoHl~P&DXE2@&%A~G5y72_{Wu3cVxoX!|k-g40KYs3NE|D8{ zx5>#r%ak2BJ#t!2frVD7O578vw-@)xWkl3$p?0ll8u@`%qb&W`fK>HYfvWXpGp-&p z{QYR`nxeSbr_biEQx!x9zc}s1{XNhLQ9QKk>w4^ZOW+4buqO|@qo=Es^soWLz{xFz zg6*pC?+T!+qD4f5f5IkT|5bOz{^WWY`R_ph{u~$t&?2I_fInh?a&KDq9t?OVQ>5F+ z-OOJ0<``u&__HVDFb?*K@t@T3J)o^Xz$`%Tm!Q}yp%7Fb2RcBiuMhhVs9^|OAi-7C z-p_4tmBE>GIu4mb5IKlXj{s6~-)_Si|LivGR|<32PW6 zLY|Ca=saHdN*?57z=;eYNlK(TJ@g%5v>tRO2OOgns$>}T+eGD; z+@uEsLPtTxJJe?|kP`1{pzRELor9;-d)-OOmY!ayjLqtBt?iDDKO}li6$8x zU7P_tIt+wNyjM@1M2gY(&QH>TWNH)h4!}+iA`%VfKudJV65>TghLWHIXH^U9eNsNa z;S;zKc1#x{JM@XsVMj2SF+GC@d}i~DDFqxfApEjF6tLU*(RUaM?3^W#0?ARtm22%TBly7W^_FQpSF~ixXh#(_w zP#7~9eWWSDk_?#O7mlK5LChv70~kgLH;sM7r?Xuu(v;i7r76oWhM0(?_lE}LVnAgX zS(-D9gQ%94mQ-U?BbK>EkO|e;h{-gfQ%$KxrbfZ0mMoT~A^hKxc6QXK)+Uz9+)<%W z+QEc23`gAERhrNg7iT|W#MzAAVcUiHP5?eYR0NRYO=w5pNA8Cox}25}qY=(U!{kq& zDEID%h=)mhs4gS}-|ykm7UMx8+SEW2Cg|bt{}Hbpaa=O{&4pypeyVPonE>47DyYsF zNp!!e6V}1 zLgZ->3CrMyRS79c^yoM0y`vv%m2E;_!H#;bORr?KwP{7NKrkHpyXz#_!m(U8L+ ziVk}LSQ+;e{9=&3Ph#}%=~6H%NAPIlhmsS$o9wVx`h-)W9RRvJsQ89&lN=vxd-2%e zxICQ_8vn?@MY`{R@k@a^Bz8CvBB%CC{P}&!Ui2aKB<_5|t<6o=;PYpKid~Hfktqiy z=D=qzk79#Cgc%`-{C?t0pa=LGju6HHM+gV|Y}n{1L|Vy_074)@H3&WXCcvcD+06zX zyTFR?51)=mY>r5#Ac|)g%vA&JbqZAWT>CbtvVBf`#Z zgot!LITB)ToFE6Z_Q3@-{eRXvSYHs)SXU(G!eYk=qWA>X!sw`AyPMC<0L?*RfD67j zU#KR59?V_U((&5=zPPFRYV!( zOn?7>H$lv#EERW>4X*}Bx`_JTFwid1^zd+|z>tJ>x+iH`b%QQT@xvbv2$2V$`@_YA z3>j?VZR}Zv5LqlM(+|U#5+MU@@xxr-@ZVt((cTT0n2cnZzwx6w1VLvN_+fRaIw9bG z%q*}OF7d&%nHY!OTuGRSF5%dYO^=74UX2(_$Pf~y)` zpdQ7~{_(}<%bxHH;_2mAM!)mJIjh13UnjDFA9oWW%-j3B@#@;*-B2t#5 zd6Cg~#}b3`&sbeqDF2KWaN1-;h?t~e&{zU+nT1sd#m6B-8ZiPe|0A(D2z5xY0*CnJ z#WM$D_)u-1h$<;+321WhZ6GM9h!zno(@A0`aKa+_*$O(J#OnEAkD-N#${d2wkN{D+ zMbr|I4ipi>%JGcFSmF$F!K*Jil1mC<(V)Z+R!Ij+{GdgM#LxQ`8oG-4iQtbo99F;u z%JZN_h}e1m3QlajA|WaihrvohKyetf2ob7JU#OBw#bCb>Vqu>iLXioy2$4npKgAOJ zyq`!;U?Jg~M(j0s_@)spXOO_)pF(~M7(aR8h=qceb+H$D)p1a>Id~|^Z`pgg4us1D S%6#xk1>Cgg;DOB!%Kre_6SOP< literal 0 HcmV?d00001 diff --git a/neo/bin/prompt.py b/neo/bin/prompt.py index 143f3040b..615aaebe5 100755 --- a/neo/bin/prompt.py +++ b/neo/bin/prompt.py @@ -1055,6 +1055,8 @@ def main(): help="Use a private net instead of the default TestNet, optionally using a custom host (default: 127.0.0.1)") group.add_argument("--coznet", action="store_true", default=False, help="Use the CoZ network instead of the default TestNet") + group.add_argument("-u", "--unittest", nargs="?", metavar="host", const=True, default=False, + help="Use a private net instead of the default TestNet, optionally using a custom host (default: 127.0.0.1)") group.add_argument("-c", "--config", action="store", help="Use a specific config file") # Theme @@ -1097,6 +1099,8 @@ def main(): return elif args.coznet: settings.setup_coznet() + elif args.unittest: + settings.setup_unittest_net() # Logfile settings & setup logfile_fn = os.path.join(settings.DATA_DIR_PATH, 'prompt.log') diff --git a/neo/data/protocol.unittest-net.json b/neo/data/protocol.unittest-net.json index ba897d3e2..302a7fea1 100644 --- a/neo/data/protocol.unittest-net.json +++ b/neo/data/protocol.unittest-net.json @@ -25,8 +25,8 @@ } }, "ApplicationConfiguration": { - "DataDirectoryPath": "Chains/privnet", - "NotificationDataPath": "Chains/privnet_notif", + "DataDirectoryPath": "Chains/unittest", + "NotificationDataPath": "Chains/unittest_notif", "RPCPort": 20332, "NodePort": 20333, "WsPort": 20334, From 8febcf150f14c92d897b3908457f29db5d90cd42 Mon Sep 17 00:00:00 2001 From: jseagrave21 <40873301+jseagrave21@users.noreply.github.com> Date: Thu, 18 Oct 2018 14:05:57 -0700 Subject: [PATCH 04/30] Update CHANGELOG.rst for compatibility --- CHANGELOG.rst | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 6ba652b10..5e030cb3b 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -5,13 +5,7 @@ All notable changes to this project are documented in this file. [0.8.2] In Progress ------------------- -- Add ExtendedJsonRpcApi, Add ``getnodestate`` RPC extended method, Add ``gettxhistory`` RPC extended method -- Fix return types of ``claimGas`` function. -- Update compiler version ``v0.5.4`` -- Add the option -u (unittest-net) to prompt.py -- Add fixtures guidelines and add the smart contract source codes (UnitTest-SM.zip) to the fixtures package -- Adds ``sendmany`` feature to prompt.py, integrates with ``send`` feature, and adds provisions for sending with a negative fee and bad from_address -- Fix ``ExtendedJsonRpcApi`` + [0.8.1] 2018-10-06 ------------------ From c7a790f800dce5c50fbb419fe50c3f22175b4fab Mon Sep 17 00:00:00 2001 From: jseagrave21 <40873301+jseagrave21@users.noreply.github.com> Date: Thu, 18 Oct 2018 14:07:17 -0700 Subject: [PATCH 05/30] Update CHANGELOG.rst --- CHANGELOG.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 5e030cb3b..e6f263686 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -5,6 +5,14 @@ All notable changes to this project are documented in this file. [0.8.2] In Progress ------------------- +- Add raw transaction building examples in ``\examples\`` folder +- Add ExtendedJsonRpcApi, Add ``getnodestate`` RPC extended method, Add ``gettxhistory`` RPC extended method +- Fix return types of ``claimGas`` function. +- Update compiler version ``v0.5.4`` +- Add the option -u (unittest-net) to prompt.py +- Add fixtures guidelines and add the smart contract source codes (UnitTest-SM.zip) to the fixtures package +- Adds ``sendmany`` feature to prompt.py, integrates with ``send`` feature, and adds provisions for sending with a negative fee and bad from_address +- Fix ``ExtendedJsonRpcApi`` [0.8.1] 2018-10-06 From c51390e2b68646c7a141c1dc127d9b37eec5921e Mon Sep 17 00:00:00 2001 From: jseagrave21 <40873301+jseagrave21@users.noreply.github.com> Date: Thu, 18 Oct 2018 14:07:47 -0700 Subject: [PATCH 06/30] Merge CoZ Development into jseagrave21 Development (#49) * Fix ExtendedJsonRpcApi (#662) * Update ExtendedJsonRpcApi.py - add fix provided by @localhuman so original methods are returned as well as extended methods * Mute expected test stacktrace and clearly identify why an exception is thrown. (#663) * Add guideline for adding tests to the neo-privnet-unittest image (#661) * Add the option -u (unittest-net) to prompt.py * Add unittest guildeline and add the smart contract source codes (UnitTest-SM.zip) to the fixtures package * Add raw transaction building examples (#665) * Update neo-boa version to fix core building test --- CHANGELOG.rst | 2 +- examples/build_raw_transactions.py | 192 ++++++++++++++++++ .../Wallets/peewee/UserWallet.py | 5 +- requirements.txt | 2 +- 4 files changed, 197 insertions(+), 4 deletions(-) create mode 100644 examples/build_raw_transactions.py diff --git a/CHANGELOG.rst b/CHANGELOG.rst index e6f263686..c28e0b969 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -23,7 +23,7 @@ All notable changes to this project are documented in this file. - Change notification transfer event format to use string quoted integer - Fix Notification token list to include correct hash for contract and token - Removes all ``hold`` and ``withdraw`` related functionality from wallet and prompt -- Fix 'script_hash' output in ``ToJson`` in AccountState, Adds an 'address' key, Adds a test for ``ToJson`` in AccountState, Replaces the variable ``script_hash`` in ``GetAccountState`` in LevelDBBlockchain with ``address``, Adds a test for ``GetAccountState`` in LevelDBBlockchain +- Various updates to inaccuracies in ``ToJson`` output of ``AccountState`` - Add documentation support for Python 3.7 - Change execution fail event payload to give more meaningful error messages diff --git a/examples/build_raw_transactions.py b/examples/build_raw_transactions.py new file mode 100644 index 000000000..6b11551f2 --- /dev/null +++ b/examples/build_raw_transactions.py @@ -0,0 +1,192 @@ +""" + This file contains 2 examples on how to build raw transactions that can be send via the 'sendrawtransaction' RPC endpoint. + + Note that the perspective taken in these examples is that you want a light wallet like approach. This means that you will + not have a fully synced Blockchain via neo-python and that you get certain pieces of data from external sources like the API at NEOSCAN.io + + The first example will build a Transaction for sending either NEO or GAS + + The second example will interact with a smart contract on the chain (this can be sending NEP5 tokens or simply quering data). +""" + +import binascii +import hashlib +from neo.Implementations.Wallets.peewee.UserWallet import UserWallet +from neo.Core.TX.Transaction import ContractTransaction, TransactionOutput +from neo.Core.TX.InvocationTransaction import InvocationTransaction +from neo.Core.TX.TransactionAttribute import TransactionAttribute, TransactionAttributeUsage +from neo.Core.CoinReference import CoinReference +from neo.SmartContract.ContractParameterContext import ContractParametersContext +from neocore.Fixed8 import Fixed8 +from neocore.UInt256 import UInt256 +from neocore.UInt160 import UInt160 +from neocore.KeyPair import KeyPair +from neo import Blockchain +from base58 import b58decode +from neo.VM.ScriptBuilder import ScriptBuilder + +""" + Example 1 + + Sending NEO or GAS happens via a ContractTransaction + For more information regarding different transaction types read point 3 of: + http://docs.neo.org/en-us/network/network-protocol.html#data-type + + The standard ``Transaction`` looks as follows (taken from the above source) + + +------+------------+-----------+--------------------------------------------------+ + | Size | Field | DataType | Description | + +------+------------+-----------+--------------------------------------------------+ + | 1 | Type | uint8 | Type of transaction | + | 1 | Version | uint8 | Trading version, currently 0 | + | ? | - | - | Data specific to transaction types | + | ?*? | Attributes | tx_attr[] | Additional features that the transaction has | + | 34*? | Inputs | tx_in[] | Input | + | 60*? | Outputs | tx_out[] | Output | + | ?*? | Scripts | script[] | List of scripts used to validate the transaction | + +------+------------+-----------+--------------------------------------------------+ + +""" + + +def example1(): + neo_asset_id = Blockchain.GetSystemShare().Hash + gas_asset_id = Blockchain.GetSystemCoin().Hash + + source_address = "D3u1UuDJkzUCixp9UUtSSza6Rgt4F9KJqv3mPSzWopgb" + source_script_hash = address_to_scripthash(source_address) + + destination_address = "Ad9A1xPbuA5YBFr1XPznDwBwQzdckAjCev" + destination_script_hash = address_to_scripthash(destination_address) + + # Let's start with building a ContractTransaction + # The constructor already sets the correct `Type` and `Version` fields, so we do not have to worry about that + contract_tx = ContractTransaction() + + # the ContractTransaction type has no special data, so we do not have to do anything there + + # Next we can add Attributes if we want. Again the various types are described in point 4. of the main link above + # We will add a simple "description" + contract_tx.Attributes.append(TransactionAttribute(usage=TransactionAttributeUsage.Description, data="My raw contract transaction description")) + + # The next field we will set are the inputs. The inputs neo-python expects are of the type ``CoinReference`` + # To create these inputs we will need the usual `PrevHash` and `PrevIndex` values. + # You can get the required data by using e.g. the neoscan.io API: https://api.neoscan.io/docs/index.html#api-v1-get-3 + # The `PrevHash` field equals to neoscan's `balance.unspent[index].txid` key, and `PrevIndex` comes from `balance.unspent[index].n` + # It is up to the transaction creator to make sure that the sum of all input ``value`` fields is equal to or bigger than the amount that's intended to be send + # The below values are fictuous and taken from the neoscan example + input1 = CoinReference(prev_hash=UInt256(data=binascii.unhexlify('19edc4159d2bcf4c538256b17336555b71a3a6a81ecb07493fc7fa218cbafdbd')), prev_index=787) + contract_tx.inputs = [input1] + + # Next we will create the outputs. + # The above input has a value of 5. We will create 2 outputs. + + # 1 output for sending 3 NEO to a specific destination address + send_to_destination_output = TransactionOutput(AssetId=neo_asset_id, Value=Fixed8.FromDecimal(3), script_hash=destination_script_hash) + + # and a second output for sending the change back to ourselves + return_change_output = TransactionOutput(AssetId=neo_asset_id, Value=Fixed8.FromDecimal(2), script_hash=source_script_hash) + + contract_tx.outputs = [send_to_destination_output, return_change_output] + + # at this point we've build our unsigned transaction and it's time to sign it before we get the raw output that we can send to the network via RPC + # we need to create a Wallet instance for helping us with signing + wallet = UserWallet.Create('path', generate_default_key=False) + + # if you have a WIF use + private_key = KeyPair.PrivateKeyFromWIF("WIF_string") + + # if you have a NEP2 encrypted key use the following instead + private_key = KeyPair.PrivateKeyFromNEP2("NEP2 key string", "password string") + + # we add the key to our wallet + wallet.CreateKey(private_key) + + # and now we're ready to sign + context = ContractParametersContext(contract_tx) + wallet.Sign(context) + + raw = contract_tx.ToArray() + raw_signed_transaction = raw.hex() + + +""" + Example 2 + + Interacting with a Smart contract happens via an InvocationTransaction + For more information regarding different transaction types read point 3 of: + http://docs.neo.org/en-us/network/network-protocol.html#data-type + + The standard ``Transaction`` looks as follows (taken from the above source) + + +------+------------+-----------+--------------------------------------------------+ + | Size | Field | DataType | Description | + +------+------------+-----------+--------------------------------------------------+ + | 1 | Type | uint8 | Type of transaction | + | 1 | Version | uint8 | Trading version, currently 0 | + | ? | - | - | Data specific to transaction types | + | ?*? | Attributes | tx_attr[] | Additional features that the transaction has | + | 34*? | Inputs | tx_in[] | Input | + | 60*? | Outputs | tx_out[] | Output | + | ?*? | Scripts | script[] | List of scripts used to validate the transaction | + +------+------------+-----------+--------------------------------------------------+ + +""" + + +def example2(): + source_address = "D3u1UuDJkzUCixp9UUtSSza6Rgt4F9KJqv3mPSzWopgb" + source_script_hash = address_to_scripthash(source_address) + + # start by creating a base InvocationTransaction + # the inputs, outputs and Type do not have to be set anymore. + invocation_tx = InvocationTransaction() + + # often times smart contract developers use the function ``CheckWitness`` to determine if the transaction is signed by somebody eligible of calling a certain method + # in order to pass that check you want to add the corresponding script_hash as a transaction attribute (this is generally the script_hash of the public key you use for signing) + # Note that for public functions like the NEP-5 'getBalance' and alike this would not be needed, but it doesn't hurt either + invocation_tx.Attributes.append(TransactionAttribute(usage=TransactionAttributeUsage.Script, data=source_script_hash)) + + # next we need to build a 'script' that gets executed against the smart contract. + # this is basically the script that calls the entry point of the contract with the necessary parameters + smartcontract_scripthash = UInt160.ParseString("1578103c13e39df15d0d29826d957e85d770d8c9") + sb = ScriptBuilder() + # call the NEP-5 `name` method on the contract (assumes contract address is a NEP-5 token) + sb.EmitAppCallWithOperation(smartcontract_scripthash, 'name') + invocation_tx.Script = binascii.unhexlify(sb.ToArray()) + + # at this point we've build our unsigned transaction and it's time to sign it before we get the raw output that we can send to the network via RPC + # we need to create a Wallet instance for helping us with signing + wallet = UserWallet.Create('path', generate_default_key=False) + + # if you have a WIF use + private_key = KeyPair.PrivateKeyFromWIF("WIF_string") + + # if you have a NEP2 encrypted key use the following instead + private_key = KeyPair.PrivateKeyFromNEP2("NEP2 key string", "password string") + + # we add the key to our wallet + wallet.CreateKey(private_key) + + # and now we're ready to sign + context = ContractParametersContext(invocation_tx) + wallet.Sign(context) + + raw = invocation_tx.ToArray() + raw_signed_transaction = raw.hex() + + +def address_to_scripthash(address: str) -> UInt160: + """Just a helper method""" + AddressVersion = 23 # fixed at this point + data = b58decode(address) + if len(data) != 25: + raise ValueError('Not correct Address, wrong length.') + if data[0] != AddressVersion: + raise ValueError('Not correct Coin Version') + + checksum_data = data[:21] + checksum = hashlib.sha256(hashlib.sha256(checksum_data).digest()).digest()[:4] + if checksum != data[21:]: + raise Exception('Address format error') + return UInt160(data=data[1:21]) diff --git a/neo/Implementations/Wallets/peewee/UserWallet.py b/neo/Implementations/Wallets/peewee/UserWallet.py index 44a0d0815..f19ba358e 100755 --- a/neo/Implementations/Wallets/peewee/UserWallet.py +++ b/neo/Implementations/Wallets/peewee/UserWallet.py @@ -87,7 +87,7 @@ def Open(path, password): return UserWallet(path=path, passwordKey=password, create=False) @staticmethod - def Create(path, password): + def Create(path, password, generate_default_key=True): """ Create a new user wallet. @@ -99,7 +99,8 @@ def Create(path, password): UserWallet: a UserWallet instance. """ wallet = UserWallet(path=path, passwordKey=password, create=True) - wallet.CreateKey() + if generate_default_key: + wallet.CreateKey() return wallet def CreateKey(self, prikey=None): diff --git a/requirements.txt b/requirements.txt index aaff91521..e0a79f3f4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -34,7 +34,7 @@ memory-profiler==0.54.0 mmh3==2.5.1 mock==2.0.0 mpmath==1.0.0 -neo-boa==0.5.4 +neo-boa==0.5.5 neo-python-rpc==0.2.1 neocore==0.5.3 pbr==4.2.0 From e12e7467a18632dfb697e427e91905891298214a Mon Sep 17 00:00:00 2001 From: jseagrave21 <40873301+jseagrave21@users.noreply.github.com> Date: Wed, 31 Oct 2018 22:09:55 -0700 Subject: [PATCH 07/30] Update test_extended_json_rpc_api.py - add tests for "showallaccounts" and "showallaccountstates" --- neo/api/JSONRPC/test_extended_json_rpc_api.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/neo/api/JSONRPC/test_extended_json_rpc_api.py b/neo/api/JSONRPC/test_extended_json_rpc_api.py index e1474e030..c76dcb15b 100644 --- a/neo/api/JSONRPC/test_extended_json_rpc_api.py +++ b/neo/api/JSONRPC/test_extended_json_rpc_api.py @@ -118,3 +118,21 @@ def test_gettxhistory(self): self.app.wallet.Close() self.app.wallet = None os.remove(WalletFixtureTestCase.wallet_1_dest()) + + def test_showallaccounts(self): + req = self._gen_rpc_req("showallaccounts") + mock_req = mock_request(json.dumps(req).encode("utf-8")) + res = json.loads(self.app.home(mock_req)) + self.assertEqual(len(res['result']), 9) + for entry in res['result']: + # test that each entry is an address + self.assertEqual("A", entry[0]) + self.assertEqual(34, len(entry)) + + def test_showallaccountstates(self): + req = self._gen_rpc_req("showallaccountstates") + mock_req = mock_request(json.dumps(req).encode("utf-8")) + res = json.loads(self.app.home(mock_req)) + self.assertEqual(len(res['result']), 9) + for entry in res['result']: + self.assertTrue('balances' in entry) From 0f5590337d18cb6d484e6f56fcd2676f798cba25 Mon Sep 17 00:00:00 2001 From: jseagrave21 <40873301+jseagrave21@users.noreply.github.com> Date: Wed, 31 Oct 2018 22:11:56 -0700 Subject: [PATCH 08/30] Update test_extended_json_rpc_api.py - revert --- neo/api/JSONRPC/test_extended_json_rpc_api.py | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/neo/api/JSONRPC/test_extended_json_rpc_api.py b/neo/api/JSONRPC/test_extended_json_rpc_api.py index c76dcb15b..e1474e030 100644 --- a/neo/api/JSONRPC/test_extended_json_rpc_api.py +++ b/neo/api/JSONRPC/test_extended_json_rpc_api.py @@ -118,21 +118,3 @@ def test_gettxhistory(self): self.app.wallet.Close() self.app.wallet = None os.remove(WalletFixtureTestCase.wallet_1_dest()) - - def test_showallaccounts(self): - req = self._gen_rpc_req("showallaccounts") - mock_req = mock_request(json.dumps(req).encode("utf-8")) - res = json.loads(self.app.home(mock_req)) - self.assertEqual(len(res['result']), 9) - for entry in res['result']: - # test that each entry is an address - self.assertEqual("A", entry[0]) - self.assertEqual(34, len(entry)) - - def test_showallaccountstates(self): - req = self._gen_rpc_req("showallaccountstates") - mock_req = mock_request(json.dumps(req).encode("utf-8")) - res = json.loads(self.app.home(mock_req)) - self.assertEqual(len(res['result']), 9) - for entry in res['result']: - self.assertTrue('balances' in entry) From ec42908ad3017790a64da6f909e0eb355c64d514 Mon Sep 17 00:00:00 2001 From: jseagrave21 <40873301+jseagrave21@users.noreply.github.com> Date: Thu, 8 Nov 2018 02:26:06 -0800 Subject: [PATCH 09/30] Update requirements.txt - add furl --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 776149dac..b559fd8f7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -23,6 +23,7 @@ cycler==0.10.0 docopt==0.6.2 ecdsa==0.13 Events==0.3 +furl==2.0.0 gevent==1.3.6 greenlet==0.4.15 hyperlink==18.0.0 From bfbc2cd4c11f2b0631cc3e35e9754b386a38b12f Mon Sep 17 00:00:00 2001 From: jseagrave21 <40873301+jseagrave21@users.noreply.github.com> Date: Thu, 8 Nov 2018 02:33:01 -0800 Subject: [PATCH 10/30] Update JsonRpcApi.py - add support for GET Requests --- neo/api/JSONRPC/JsonRpcApi.py | 51 ++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/neo/api/JSONRPC/JsonRpcApi.py b/neo/api/JSONRPC/JsonRpcApi.py index 3836fea50..fe263449a 100644 --- a/neo/api/JSONRPC/JsonRpcApi.py +++ b/neo/api/JSONRPC/JsonRpcApi.py @@ -36,6 +36,8 @@ from neo.Implementations.Wallets.peewee.Models import Account from neo.Prompt.Utils import get_asset_id from neo.Wallets.Wallet import Wallet +from furl import furl +import ast class JsonRpcError(Exception): @@ -120,27 +122,52 @@ def get_data(self, body: dict): @json_response @cors_header def home(self, request): + # POST Examples: # {"jsonrpc": "2.0", "id": 5, "method": "getblockcount", "params": []} # or multiple requests in 1 transaction # [{"jsonrpc": "2.0", "id": 1, "method": "getblock", "params": [10], {"jsonrpc": "2.0", "id": 2, "method": "getblock", "params": [10,1]} + # + # GET Example: + # /?jsonrpc=2.0&method=getblockcount¶ms=[]&id=5 + # NOTE: "params" must not be last + # NOTE: GET requests do not support multiple requests in 1 transaction request_id = None - try: - content = json.loads(request.content.read().decode("utf-8")) + if "POST" == request.method.decode("utf-8"): + + try: + content = json.loads(request.content.read().decode("utf-8")) + + # test if it's a multi-request message + if isinstance(content, list): + result = [] + for body in content: + result.append(self.get_data(body)) + return result + + # otherwise it's a single request + return self.get_data(content) - # test if it's a multi-request message - if isinstance(content, list): - result = [] - for body in content: - result.append(self.get_data(body)) - return result + except JSONDecodeError as e: + error = JsonRpcError.parseError() + return self.get_custom_error_payload(request_id, error.code, error.message) + + elif "GET" == request.method.decode("utf-8"): + + content = furl(request.uri).args + + if len(content.keys()) > 3: + try: + params = content['params'] + l_params = ast.literal_eval(params) + content['params'] = [l_params] + except KeyError: + error = JsonRpcError(-32602, "Invalid params") + return self.get_custom_error_payload(request_id, error.code, error.message) - # otherwise it's a single request return self.get_data(content) - except JSONDecodeError as e: - error = JsonRpcError.parseError() - return self.get_custom_error_payload(request_id, error.code, error.message) + raise JsonRpcError.invalidRequest() def json_rpc_method_handler(self, method, params): From 42f516076f9196afb651b3dc7618c404d9ac0e76 Mon Sep 17 00:00:00 2001 From: jseagrave21 <40873301+jseagrave21@users.noreply.github.com> Date: Thu, 8 Nov 2018 02:57:08 -0800 Subject: [PATCH 11/30] Update test_json_rpc_api.py - update tests to include GET requests --- neo/api/JSONRPC/test_json_rpc_api.py | 522 ++++++++++++++++----------- 1 file changed, 316 insertions(+), 206 deletions(-) diff --git a/neo/api/JSONRPC/test_json_rpc_api.py b/neo/api/JSONRPC/test_json_rpc_api.py index cc418cfd7..407cbcd60 100644 --- a/neo/api/JSONRPC/test_json_rpc_api.py +++ b/neo/api/JSONRPC/test_json_rpc_api.py @@ -9,6 +9,8 @@ import shutil from tempfile import mkdtemp from klein.test.test_resource import requestMock +from twisted.web import server +from twisted.web.test.test_web import DummyChannel from neo import __version__ from neo.api.JSONRPC.JsonRpcApi import JsonRpcApi @@ -26,8 +28,16 @@ from mock import patch -def mock_request(body): - return requestMock(path=b'/', method="POST", body=body) +def mock_post_request(body): + return requestMock(path=b'/', method=b"POST", body=body) + + +def mock_get_request(path, method=b"GET"): + request = server.Request(DummyChannel(), False) + request.uri = path + request.method = method + request.clientproto = b'HTTP/1.1' + return request class JsonRpcApiTestCase(BlockchainFixtureTestCase): @@ -40,16 +50,34 @@ def leveldb_testpath(self): def setUp(self): self.app = JsonRpcApi(20332) + def test_invalid_request_method(self): + with self.assertRaises(Exception) as context: + # test HEAD method + mock_req = mock_get_request(b'/?test', b"HEAD") + json.loads(self.app.home(mock_req)) + + self.assertTrue("Invalid Request" in str(context.exception)) + def test_invalid_json_payload(self): - mock_req = mock_request(b"{ invalid") + # test POST requests + mock_req = mock_post_request(b"{ invalid") res = json.loads(self.app.home(mock_req)) self.assertEqual(res["error"]["code"], -32700) - mock_req = mock_request(json.dumps({"some": "stuff"}).encode("utf-8")) + mock_req = mock_post_request(json.dumps({"some": "stuff"}).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res["error"]["code"], -32600) - def _gen_rpc_req(self, method, params=None, request_id="2"): + # test GET requests + mock_req = mock_get_request(b"/?%20invalid") # equivalent to "/? invalid" + res = json.loads(self.app.home(mock_req)) + self.assertEqual(res["error"]["code"], -32600) + + mock_req = mock_get_request(b"/?some=stuff") + res = json.loads(self.app.home(mock_req)) + self.assertEqual(res["error"]["code"], -32600) + + def _gen_post_rpc_req(self, method, params=None, request_id="2"): ret = { "jsonrpc": "2.0", "id": request_id, @@ -59,45 +87,86 @@ def _gen_rpc_req(self, method, params=None, request_id="2"): ret["params"] = params return ret + def _gen_get_rpc_req(self, method, params=None, request="2"): + ret = "/?jsonrpc=2.0&method=%s¶ms=[]&id=%s" % (method, request) + if params: + ret = "/?jsonrpc=2.0&method=%s¶ms=%s&id=%s" % (method, params, request) + return ret.encode('utf-8') + def test_initial_setup(self): self.assertTrue(GetBlockchain().GetBlock(0).Hash.To0xString(), '0x996e37358dc369912041f966f8c5d8d3a8255ba5dcbd3447f8a82b55db869099') def test_missing_fields(self): - req = self._gen_rpc_req("foo") + # test POST requests + req = self._gen_post_rpc_req("foo") del req["jsonrpc"] - mock_req = mock_request(json.dumps(req).encode("utf-8")) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res["error"]["code"], -32600) + self.assertEqual(res["error"]["message"], "Invalid value for 'jsonrpc'") - req = self._gen_rpc_req("foo") + req = self._gen_post_rpc_req("foo") del req["id"] - mock_req = mock_request(json.dumps(req).encode("utf-8")) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res["error"]["code"], -32600) + self.assertEqual(res["error"]["message"], "Field 'id' is missing") - req = self._gen_rpc_req("foo") + req = self._gen_post_rpc_req("foo") del req["method"] - mock_req = mock_request(json.dumps(req).encode("utf-8")) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) + res = json.loads(self.app.home(mock_req)) + self.assertEqual(res["error"]["code"], -32600) + self.assertEqual(res["error"]["message"], "Field 'method' is missing") + + # test GET requests + mock_req = mock_get_request(b"/?method=foo&id=2") res = json.loads(self.app.home(mock_req)) self.assertEqual(res["error"]["code"], -32600) + self.assertEqual(res["error"]["message"], "Invalid value for 'jsonrpc'") + + mock_req = mock_get_request(b"/?jsonrpc=2.0&method=foo") + res = json.loads(self.app.home(mock_req)) + self.assertEqual(res["error"]["code"], -32600) + self.assertEqual(res["error"]["message"], "Field 'id' is missing") + + mock_req = mock_get_request(b"/?jsonrpc=2.0&id=2") + res = json.loads(self.app.home(mock_req)) + self.assertEqual(res["error"]["code"], -32600) + self.assertEqual(res["error"]["message"], "Field 'method' is missing") def test_invalid_method(self): - req = self._gen_rpc_req("invalid", request_id="42") - mock_req = mock_request(json.dumps(req).encode("utf-8")) + # test POST requests + req = self._gen_post_rpc_req("invalid", request_id="42") + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res["id"], "42") self.assertEqual(res["error"]["code"], -32601) self.assertEqual(res["error"]["message"], "Method not found") + # test GET requests + req = self._gen_get_rpc_req("invalid") + mock_req = mock_get_request(req) + res = json.loads(self.app.home(mock_req)) + self.assertEqual(res["error"]["code"], -32601) + self.assertEqual(res["error"]["message"], "Method not found") + def test_getblockcount(self): - req = self._gen_rpc_req("getblockcount") - mock_req = mock_request(json.dumps(req).encode("utf-8")) + # test POST requests + req = self._gen_post_rpc_req("getblockcount") + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) + res = json.loads(self.app.home(mock_req)) + self.assertEqual(GetBlockchain().Height + 1, res["result"]) + + # test GET requests ...next we will test a complex method; see test_sendmany_complex + req = self._gen_get_rpc_req("getblockcount") + mock_req = mock_get_request(req) res = json.loads(self.app.home(mock_req)) self.assertEqual(GetBlockchain().Height + 1, res["result"]) def test_getblockhash(self): - req = self._gen_rpc_req("getblockhash", params=[2]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getblockhash", params=[2]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) # taken from neoscan @@ -105,32 +174,32 @@ def test_getblockhash(self): self.assertEqual(expected_blockhash, res["result"]) def test_getblockhash_failure(self): - req = self._gen_rpc_req("getblockhash", params=[-1]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getblockhash", params=[-1]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(-100, res["error"]["code"]) self.assertEqual("Invalid Height", res["error"]["message"]) def test_account_state(self): addr_str = 'AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y' - req = self._gen_rpc_req("getaccountstate", params=[addr_str]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getaccountstate", params=[addr_str]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res['result']['balances']['0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b'], '99989900.0') self.assertEqual(res['result']['address'], addr_str) def test_account_state_not_existing_yet(self): addr_str = 'AHozf8x8GmyLnNv8ikQcPKgRHQTbFi46u2' - req = self._gen_rpc_req("getaccountstate", params=[addr_str]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getaccountstate", params=[addr_str]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res['result']['balances'], {}) self.assertEqual(res['result']['address'], addr_str) def test_account_state_failure(self): addr_str = 'AK2nJJpJr6o664CWJKi1QRXjqeic2zRp81' - req = self._gen_rpc_req("getaccountstate", params=[addr_str]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getaccountstate", params=[addr_str]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertTrue('error' in res) self.assertEqual(-2146233033, res['error']['code']) @@ -138,8 +207,8 @@ def test_account_state_failure(self): def test_get_asset_state(self): asset_str = '602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7' - req = self._gen_rpc_req("getassetstate", params=[asset_str]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getassetstate", params=[asset_str]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res['result']['assetId'], '0x%s' % asset_str) self.assertEqual(res['result']['admin'], 'AWKECj9RD8rS8RPcpCgYVjk1DeYyHwxZm3') @@ -147,23 +216,23 @@ def test_get_asset_state(self): def test_get_asset_state_0x(self): asset_str = '0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7' - req = self._gen_rpc_req("getassetstate", params=[asset_str]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getassetstate", params=[asset_str]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res['result']['assetId'], asset_str) def test_bad_asset_state(self): asset_str = '602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282dee' - req = self._gen_rpc_req("getassetstate", params=[asset_str]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getassetstate", params=[asset_str]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertTrue('error' in res) self.assertEqual(res['error']['message'], 'Unknown asset') def test_get_bestblockhash(self): - req = self._gen_rpc_req("getbestblockhash", params=[]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getbestblockhash", params=[]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res['result'], '0x62539bdf30ff2567355efb38b1911cc07258710cfab5b50d3e32751618969bcb') @@ -175,8 +244,8 @@ def test_get_connectioncount(self): leader.Peers = [fake_obj, fake_obj] leader.ADDRS = [fake_obj, fake_obj] - req = self._gen_rpc_req("getconnectioncount", params=[]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getconnectioncount", params=[]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res['result'], 2) @@ -184,8 +253,8 @@ def test_get_connectioncount(self): NodeLeader._LEAD = old_leader def test_get_block_int(self): - req = self._gen_rpc_req("getblock", params=[10, 1]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getblock", params=[10, 1]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res['result']['index'], 10) @@ -194,8 +263,8 @@ def test_get_block_int(self): self.assertEqual(res['result']['nextblockhash'], '0x2b1c78633dae7ab81f64362e0828153079a17b018d779d0406491f84c27b086f') def test_get_block_hash(self): - req = self._gen_rpc_req("getblock", params=['2b1c78633dae7ab81f64362e0828153079a17b018d779d0406491f84c27b086f', 1]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getblock", params=['2b1c78633dae7ab81f64362e0828153079a17b018d779d0406491f84c27b086f', 1]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res['result']['index'], 11) @@ -203,41 +272,41 @@ def test_get_block_hash(self): self.assertEqual(res['result']['previousblockhash'], '0xd69e7a1f62225a35fed91ca578f33447d93fa0fd2b2f662b957e19c38c1dab1e') def test_get_block_hash_0x(self): - req = self._gen_rpc_req("getblock", params=['0x2b1c78633dae7ab81f64362e0828153079a17b018d779d0406491f84c27b086f', 1]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getblock", params=['0x2b1c78633dae7ab81f64362e0828153079a17b018d779d0406491f84c27b086f', 1]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res['result']['index'], 11) def test_get_block_hash_failure(self): - req = self._gen_rpc_req("getblock", params=['aad34f68cb7a04d625ae095fa509479ec7dcb4dc87ecd865ab059d0f8a42decf', 1]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getblock", params=['aad34f68cb7a04d625ae095fa509479ec7dcb4dc87ecd865ab059d0f8a42decf', 1]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertTrue('error' in res) self.assertEqual(res['error']['message'], 'Unknown block') def test_get_block_sysfee(self): - req = self._gen_rpc_req("getblocksysfee", params=[9479]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getblocksysfee", params=[9479]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res['result'], 1560) # test negative block - req = self._gen_rpc_req("getblocksysfee", params=[-1]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getblocksysfee", params=[-1]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertTrue('error' in res) self.assertEqual(res['error']['message'], 'Invalid Height') # test block exceeding max block height - req = self._gen_rpc_req("getblocksysfee", params=[3000000000]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getblocksysfee", params=[3000000000]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertTrue('error' in res) self.assertEqual(res['error']['message'], 'Invalid Height') def test_block_non_verbose(self): - req = self._gen_rpc_req("getblock", params=[2003, 0]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getblock", params=[2003, 0]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertIsNotNone(res['result']) @@ -249,8 +318,8 @@ def test_block_non_verbose(self): def test_get_contract_state(self): contract_hash = "b9fbcff6e50fd381160b822207231233dd3c56c2" - req = self._gen_rpc_req("getcontractstate", params=[contract_hash]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getcontractstate", params=[contract_hash]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res['result']['code_version'], '') self.assertEqual(res['result']['properties']['storage'], True) @@ -260,23 +329,23 @@ def test_get_contract_state(self): def test_get_contract_state_0x(self): contract_hash = "0xb9fbcff6e50fd381160b822207231233dd3c56c2" - req = self._gen_rpc_req("getcontractstate", params=[contract_hash]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getcontractstate", params=[contract_hash]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res['result']['code_version'], '') def test_get_contract_state_not_found(self): contract_hash = '0xb9fbcff6e50fd381160b822207231233dd3c56c1' - req = self._gen_rpc_req("getcontractstate", params=[contract_hash]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getcontractstate", params=[contract_hash]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertTrue('error' in res) self.assertEqual(res['error']['message'], 'Unknown contract') def test_get_raw_mempool(self): # TODO: currently returns empty list. test with list would be great - req = self._gen_rpc_req("getrawmempool", params=[]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getrawmempool", params=[]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) mempool = res['result'] @@ -289,43 +358,43 @@ def test_get_raw_mempool(self): def test_get_version(self): # TODO: what's the nonce? on testnet live server response it's always 771199013 - req = self._gen_rpc_req("getversion", params=[]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getversion", params=[]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res["result"]["port"], 20332) self.assertEqual(res["result"]["useragent"], "/NEO-PYTHON:%s/" % __version__) def test_validate_address(self): # example from docs.neo.org - req = self._gen_rpc_req("validateaddress", params=["AQVh2pG732YvtNaxEGkQUei3YA4cvo7d2i"]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("validateaddress", params=["AQVh2pG732YvtNaxEGkQUei3YA4cvo7d2i"]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertTrue(res["result"]["isvalid"]) # example from docs.neo.org - req = self._gen_rpc_req("validateaddress", params=["152f1muMCNa7goXYhYAQC61hxEgGacmncB"]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("validateaddress", params=["152f1muMCNa7goXYhYAQC61hxEgGacmncB"]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertFalse(res["result"]["isvalid"]) # catch completely invalid argument - req = self._gen_rpc_req("validateaddress", params=[]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("validateaddress", params=[]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertTrue('error' in res) self.assertEqual('Missing argument', res['error']['message']) # catch completely invalid argument - req = self._gen_rpc_req("validateaddress", params=[""]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("validateaddress", params=[""]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertTrue('error' in res) self.assertEqual('Missing argument', res['error']['message']) def test_getrawtx_1(self): txid = 'f999c36145a41306c846ea80290416143e8e856559818065be3f4e143c60e43a' - req = self._gen_rpc_req("getrawtransaction", params=[txid, 1]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getrawtransaction", params=[txid, 1]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req))['result'] self.assertEqual(res['blockhash'], '0x6088bf9d3b55c67184f60b00d2e380228f713b4028b24c1719796dcd2006e417') self.assertEqual(res['txid'], "0x%s" % txid) @@ -334,16 +403,16 @@ def test_getrawtx_1(self): def test_getrawtx_2(self): txid = 'f999c36145a41306c846ea80290416143e8e856559818065be3f4e143c60e43a' - req = self._gen_rpc_req("getrawtransaction", params=[txid, 0]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getrawtransaction", params=[txid, 0]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req))['result'] expected = '8000012023ba2703c53263e8d6e522dc32203339dcd8eee901ff6a846c115ef1fb88664b00aa67f2c95e9405286db1b56c9120c27c698490530000029b7cffdaa674beae0f930ebe6085af9093e5fe56b34a5c220ccdcf6efc336fc50010a5d4e8000000affb37f5fdb9c6fec48d9f0eee85af82950f9b4a9b7cffdaa674beae0f930ebe6085af9093e5fe56b34a5c220ccdcf6efc336fc500f01b9b0986230023ba2703c53263e8d6e522dc32203339dcd8eee9014140a88bd1fcfba334b06da0ce1a679f80711895dade50352074e79e438e142dc95528d04a00c579398cb96c7301428669a09286ae790459e05e907c61ab8a1191c62321031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4aac' self.assertEqual(res, expected) def test_getrawtx_3(self): txid = 'f999c36145a41306c846ea80290416143e8e856559818065be3f4e143c60e43b' - req = self._gen_rpc_req("getrawtransaction", params=[txid, 0]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getrawtransaction", params=[txid, 0]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertTrue('error' in res) self.assertEqual(res['error']['message'], 'Unknown Transaction') @@ -351,8 +420,8 @@ def test_getrawtx_3(self): def test_get_storage_item(self): contract_hash = 'b9fbcff6e50fd381160b822207231233dd3c56c2' storage_key = binascii.hexlify(b'in_circulation').decode('utf-8') - req = self._gen_rpc_req("getstorage", params=[contract_hash, storage_key]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getstorage", params=[contract_hash, storage_key]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res['result'], '00a031a95fe300') actual_val = int.from_bytes(binascii.unhexlify(res['result'].encode('utf-8')), 'little') @@ -361,32 +430,32 @@ def test_get_storage_item(self): def test_get_storage_item2(self): contract_hash = '90ea0b9b8716cf0ceca5b24f6256adf204f444d9' storage_key = binascii.hexlify(b'in_circulation').decode('utf-8') - req = self._gen_rpc_req("getstorage", params=[contract_hash, storage_key]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getstorage", params=[contract_hash, storage_key]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res['result'], '00c06e31d91001') def test_get_storage_item_key_not_found(self): contract_hash = 'b9fbcff6e50fd381160b822207231233dd3c56c1' storage_key = binascii.hexlify(b'blah').decode('utf-8') - req = self._gen_rpc_req("getstorage", params=[contract_hash, storage_key]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getstorage", params=[contract_hash, storage_key]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res['result'], None) def test_get_storage_item_contract_not_found(self): contract_hash = 'b9fbcff6e50fd381160b822207231233dd3c56c1' storage_key = binascii.hexlify(b'blah').decode('utf-8') - req = self._gen_rpc_req("getstorage", params=[contract_hash, storage_key]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getstorage", params=[contract_hash, storage_key]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res['result'], None) def test_get_storage_item_bad_contract_hash(self): contract_hash = 'b9fbcff6e50f01160b822207231233dd3c56c1' storage_key = binascii.hexlify(b'blah').decode('utf-8') - req = self._gen_rpc_req("getstorage", params=[contract_hash, storage_key]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getstorage", params=[contract_hash, storage_key]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertTrue('error' in res) self.assertIn('Invalid UInt', res['error']['message']) @@ -399,8 +468,8 @@ def test_get_unspents(self): def test_gettxout(self): txid = 'a2a37fd2ab7048d70d51eaa8af2815e0e542400329b05a34274771174180a7e8' output_index = 0 - req = self._gen_rpc_req("gettxout", params=[txid, output_index]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("gettxout", params=[txid, output_index]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) # will return `null` if not found self.assertEqual(None, res["result"]) @@ -409,8 +478,8 @@ def test_gettxout(self): # The txid need to be updated whenever we spend NEO from the address: AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y (coz wallet) txid = '42978cd563e9e95550fb51281d9071e27ec94bd42116836f0d0141d57a346b3e' output_index = 1 - req = self._gen_rpc_req("gettxout", params=[txid, output_index]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("gettxout", params=[txid, output_index]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) expected_asset = '0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b' @@ -425,8 +494,8 @@ def test_gettxout(self): # now test a different index txid = 'f999c36145a41306c846ea80290416143e8e856559818065be3f4e143c60e43a' output_index = 0 - req = self._gen_rpc_req("gettxout", params=[txid, output_index]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("gettxout", params=[txid, output_index]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) expected_value = "10000" @@ -435,32 +504,32 @@ def test_gettxout(self): def test_send_raw_tx(self): raw_tx = '8000000001e72d286979ee6cb1b7e65dfddfb2e384100b8d148e7758de42e4168b71792c6000ca9a3b0000000048033b58ef547cbf54c8ee2f72a42d5b603c00af' - req = self._gen_rpc_req("sendrawtransaction", params=[raw_tx]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendrawtransaction", params=[raw_tx]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res['result'], True) def test_send_raw_tx_bad(self): raw_tx = '80000001b10ad9ec660bf343c0eb411f9e05b4fa4ad8abed31d4e4dc5bb6ae416af0c4de000002e72d286979ee6cb1b7e65dfddfb2e384100b8d148e7758de42e4168b71792c60c8db571300000000af12a8687b14948bc4a008128a550a63695bc1a5e72d286979ee6cb1b7e65dfddfb2e384100b8d148e7758de42e4168b71792c603808b44002000000eca8fcf94e7a2a7fc3fd54ae0ed3d34d52ec25900141404749ce868ed9588f604eeeb5c523db39fd57cd7f61d04393a1754c2d32f131d67e6b1ec561ac05012b7298eb5ff254487c76de0b2a0c4d097d17cec708c0a9802321025b5c8cdcb32f8e278e111a0bf58ebb463988024bb4e250aa4310b40252030b60ac' - req = self._gen_rpc_req("sendrawtransaction", params=[raw_tx]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendrawtransaction", params=[raw_tx]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res['result'], False) def test_send_raw_tx_bad_2(self): raw_tx = '80000001b10ad9ec660bf343c0eb411f9e05b4fa4ad8abed31d4e4dc5bb6ae416af0c4de000002e72d286979ee6cbb7e65dfddfb2e384100b8d148e7758de42e4168b71792c60c8db571300000000af12a8687b14948bc4a008128a550a63695bc1a5e72d286979ee6cb1b7e65dfddfb2e384100b8d148e7758de42e4168b71792c603808b44002000000eca8fcf94e7a2a7fc3fd54ae0ed3d34d52ec25900141404749ce868ed9588f604eeeb5c523db39fd57cd7f61d04393a1754c2d32f131d67e6b1ec561ac05012b7298eb5ff254487c76de0b2a0c4d097d17cec708c0a9802321025b5c8cdcb32f8e278e111a0bf58ebb463988024bb4e250aa4310b40252030b60ac' - req = self._gen_rpc_req("sendrawtransaction", params=[raw_tx]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendrawtransaction", params=[raw_tx]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertTrue('error' in res) self.assertEqual(res['error']['code'], -32603) def test_gzip_compression(self): - req = self._gen_rpc_req("getblock", params=['307ed2cf8b8935dd38c534b10dceac55fcd0f60c68bf409627f6c155f8143b31', 1]) + req = self._gen_post_rpc_req("getblock", params=['307ed2cf8b8935dd38c534b10dceac55fcd0f60c68bf409627f6c155f8143b31', 1]) body = json.dumps(req).encode("utf-8") # first validate that we get a gzip response if we accept gzip encoding - mock_req = requestMock(path=b'/', method="POST", body=body, headers={'Accept-Encoding': ['deflate', 'gzip;q=1.0', '*;q=0.5']}) + mock_req = requestMock(path=b'/', method=b"POST", body=body, headers={'Accept-Encoding': ['deflate', 'gzip;q=1.0', '*;q=0.5']}) res = self.app.home(mock_req) GZIP_MAGIC = b'\x1f\x8b' @@ -468,7 +537,7 @@ def test_gzip_compression(self): self.assertTrue(res.startswith(GZIP_MAGIC)) # then validate that we don't get a gzip response if we don't accept gzip encoding - mock_req = requestMock(path=b'/', method="POST", body=body, headers={}) + mock_req = requestMock(path=b'/', method=b"POST", body=body, headers={}) res = self.app.home(mock_req) self.assertIsInstance(res, str) @@ -490,8 +559,8 @@ def test_getpeers(self): test_node.port = 20333 node.Peers = [test_node] - req = self._gen_rpc_req("getpeers", params=[]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getpeers", params=[]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(len(node.Peers), len(res['result']['connected'])) @@ -504,8 +573,8 @@ def test_getpeers(self): node.ADDRS = [] def test_getwalletheight_no_wallet(self): - req = self._gen_rpc_req("getwalletheight", params=["some id here"]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getwalletheight", params=["some id here"]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) @@ -516,15 +585,15 @@ def test_getwalletheight_no_wallet(self): def test_getwalletheight(self): self.app.wallet = UserWallet.Open(os.path.join(ROOT_INSTALL_PATH, "neo/data/neo-privnet.sample.wallet"), to_aes_key("coz")) - req = self._gen_rpc_req("getwalletheight", params=[]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getwalletheight", params=[]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(1, res.get('result')) def test_getbalance_no_wallet(self): - req = self._gen_rpc_req("getbalance", params=["some id here"]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getbalance", params=["some id here"]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) @@ -540,8 +609,8 @@ def test_getbalance_neo_with_wallet(self): ) neo_id = "c56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b" - req = self._gen_rpc_req("getbalance", params=[neo_id]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getbalance", params=[neo_id]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertIn('Balance', res.get('result').keys()) @@ -559,8 +628,8 @@ def test_getbalance_token_with_wallet(self): ) fake_token_id = "fd941304d9cf36f31cd141c7c7029d81b1efa4f3" - req = self._gen_rpc_req("getbalance", params=[fake_token_id]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getbalance", params=[fake_token_id]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertIn('Balance', res.get('result').keys()) @@ -571,8 +640,8 @@ def test_getbalance_token_with_wallet(self): os.remove(test_wallet_path) def test_listaddress_no_wallet(self): - req = self._gen_rpc_req("listaddress", params=[]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("listaddress", params=[]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) @@ -587,8 +656,8 @@ def test_listaddress_with_wallet(self): to_aes_key('awesomepassword') ) - req = self._gen_rpc_req("listaddress", params=[]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("listaddress", params=[]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) results = res.get('result', []) self.assertGreater(len(results), 0) @@ -599,8 +668,8 @@ def test_listaddress_with_wallet(self): os.remove(test_wallet_path) def test_getnewaddress_no_wallet(self): - req = self._gen_rpc_req("getnewaddress", params=[]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getnewaddress", params=[]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) @@ -617,8 +686,8 @@ def test_getnewaddress_with_wallet(self): old_addrs = self.app.wallet.Addresses - req = self._gen_rpc_req("getnewaddress", params=[]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getnewaddress", params=[]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) result = res.get('result') @@ -630,11 +699,12 @@ def test_getnewaddress_with_wallet(self): os.remove(test_wallet_path) def test_valid_multirequest(self): + # test POST requests ...should pass raw_block_request = {"jsonrpc": "2.0", "method": "getblock", "params": [1], "id": 1} verbose_block_request = {"jsonrpc": "2.0", "method": "getblock", "params": [1, 1], "id": 2} multi_request = json.dumps([raw_block_request, verbose_block_request]) - mock_req = mock_request(multi_request.encode()) + mock_req = mock_post_request(multi_request.encode()) res = json.loads(self.app.home(mock_req)) self.assertEqual(type(res), list) @@ -644,6 +714,16 @@ def test_valid_multirequest(self): expected_verbose_hash = '0x55f745c9098d5d5bdaff9f8f32aad29c904c83d9832b48c16e677d30c7da4273' self.assertEqual(res[1]['result']['hash'], expected_verbose_hash) + # test GET requests ...should fail + raw_request = b"/?[jsonrpc=2.0&method=getblock¶ms=[1]&id=1,jsonrpc=2.0&method=getblock¶ms=[1,1]&id=2]" + + mock_req = mock_get_request(raw_request) + res = json.loads(self.app.home(mock_req)) + + error = res.get('error', {}) + self.assertEqual(error.get('code', None), -32600) + self.assertEqual(error.get('message', None), "Invalid value for 'jsonrpc'") + def test_multirequest_with_1_invalid_request(self): """ We provide 2 requests, first one invalid and should return and error, second one valid and should still come up with correct results @@ -653,7 +733,7 @@ def test_multirequest_with_1_invalid_request(self): verbose_block_request = {"jsonrpc": "2.0", "method": "getblock", "params": [1, 1], "id": 2} multi_request = json.dumps([raw_block_request, verbose_block_request]) - mock_req = mock_request(multi_request.encode()) + mock_req = mock_post_request(multi_request.encode()) res = json.loads(self.app.home(mock_req)) self.assertEqual(type(res), list) @@ -669,8 +749,8 @@ def test_multirequest_with_1_invalid_request(self): self.assertEqual(res[1]['result']['hash'], expected_verbose_hash) def test_send_to_address_no_wallet(self): - req = self._gen_rpc_req("sendtoaddress", params=[]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendtoaddress", params=[]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) @@ -685,8 +765,8 @@ def test_send_to_address_wrong_arguments(self): to_aes_key('awesomepassword') ) - req = self._gen_rpc_req("sendtoaddress", params=["arg"]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendtoaddress", params=["arg"]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) @@ -709,8 +789,8 @@ def test_send_to_address_simple(self): ) address = 'AXjaFSP23Jkbe6Pk9pPGT6NBDs1HVdqaXK' - req = self._gen_rpc_req("sendtoaddress", params=['gas', address, 1]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendtoaddress", params=['gas', address, 1]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res.get('jsonrpc', None), '2.0') @@ -732,8 +812,8 @@ def test_send_to_address_with_fee(self): ) address = 'AXjaFSP23Jkbe6Pk9pPGT6NBDs1HVdqaXK' - req = self._gen_rpc_req("sendtoaddress", params=['neo', address, 1, 0.005]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendtoaddress", params=['neo', address, 1, 0.005]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res.get('jsonrpc', None), '2.0') @@ -755,8 +835,8 @@ def test_send_to_address_bad_assetid(self): ) address = 'AXjaFSP23Jkbe6Pk9pPGT6NBDs1HVdqaXK' - req = self._gen_rpc_req("sendtoaddress", params=['ga', address, 1]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendtoaddress", params=['ga', address, 1]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) @@ -778,8 +858,8 @@ def test_send_to_address_bad_address(self): ) address = 'AXjaFSP23Jkbe6Pk9pPGT6NBDs1HVdqaX' # "AXjaFSP23Jkbe6Pk9pPGT6NBDs1HVdqaX" is too short causing ToScriptHash to fail - req = self._gen_rpc_req("sendtoaddress", params=['gas', address, 1]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendtoaddress", params=['gas', address, 1]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) @@ -801,8 +881,8 @@ def test_send_to_address_negative_amount(self): ) address = 'AXjaFSP23Jkbe6Pk9pPGT6NBDs1HVdqaXK' - req = self._gen_rpc_req("sendtoaddress", params=['gas', address, -1]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendtoaddress", params=['gas', address, -1]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) @@ -824,8 +904,8 @@ def test_send_to_address_zero_amount(self): ) address = 'AXjaFSP23Jkbe6Pk9pPGT6NBDs1HVdqaXK' - req = self._gen_rpc_req("sendtoaddress", params=['gas', address, 0]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendtoaddress", params=['gas', address, 0]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) @@ -847,8 +927,8 @@ def test_send_to_address_negative_fee(self): ) address = 'AXjaFSP23Jkbe6Pk9pPGT6NBDs1HVdqaXK' - req = self._gen_rpc_req("sendtoaddress", params=['gas', address, 1, -0.005]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendtoaddress", params=['gas', address, 1, -0.005]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) @@ -870,8 +950,8 @@ def test_send_to_address_insufficient_funds(self): ) address = 'AXjaFSP23Jkbe6Pk9pPGT6NBDs1HVdqaXK' - req = self._gen_rpc_req("sendtoaddress", params=['gas', address, 51]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendtoaddress", params=['gas', address, 51]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) @@ -894,8 +974,8 @@ def test_send_to_address_fails_to_sign_tx(self): ) address = 'AXjaFSP23Jkbe6Pk9pPGT6NBDs1HVdqaXK' - req = self._gen_rpc_req("sendtoaddress", params=['gas', address, 1]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendtoaddress", params=['gas', address, 1]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res.get('jsonrpc', None), '2.0') @@ -907,8 +987,8 @@ def test_send_to_address_fails_to_sign_tx(self): os.remove(WalletFixtureTestCase.wallet_1_dest()) def test_send_from_no_wallet(self): - req = self._gen_rpc_req("sendfrom", params=[]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendfrom", params=[]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) self.assertEqual(error.get('code', None), -400) @@ -920,8 +1000,8 @@ def test_send_from_wrong_arguments(self): test_wallet_path, to_aes_key('awesomepassword') ) - req = self._gen_rpc_req("sendfrom", params=["arg"]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendfrom", params=["arg"]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) self.assertEqual(error.get('code', None), -32602) @@ -941,8 +1021,8 @@ def test_send_from_simple(self): ) address_to = 'AXjaFSP23Jkbe6Pk9pPGT6NBDs1HVdqaXK' address_from = 'AJQ6FoaSXDFzA6wLnyZ1nFN7SGSN2oNTc3' - req = self._gen_rpc_req("sendfrom", params=['neo', address_from, address_to, 1]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendfrom", params=['neo', address_from, address_to, 1]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res.get('jsonrpc', None), '2.0') self.assertIn('txid', res.get('result', {}).keys()) @@ -970,8 +1050,8 @@ def test_send_from_complex(self): address_from_account_state = GetBlockchain().GetAccountState(address_from).ToJson() address_from_gas_bal = address_from_account_state['balances']['0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7'] - req = self._gen_rpc_req("sendfrom", params=['gas', address_from, address_to, amount, net_fee, change_addr]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendfrom", params=['gas', address_from, address_to, amount, net_fee, change_addr]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res.get('jsonrpc', None), '2.0') @@ -996,8 +1076,8 @@ def test_send_from_bad_assetid(self): ) address_to = 'AXjaFSP23Jkbe6Pk9pPGT6NBDs1HVdqaXK' address_from = 'AJQ6FoaSXDFzA6wLnyZ1nFN7SGSN2oNTc3' - req = self._gen_rpc_req("sendfrom", params=['nep', address_from, address_to, 1]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendfrom", params=['nep', address_from, address_to, 1]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) self.assertEqual(error.get('code', None), -32602) @@ -1017,8 +1097,8 @@ def test_send_from_negative_amount(self): ) address_to = 'AXjaFSP23Jkbe6Pk9pPGT6NBDs1HVdqaXK' address_from = 'AJQ6FoaSXDFzA6wLnyZ1nFN7SGSN2oNTc3' - req = self._gen_rpc_req("sendfrom", params=['neo', address_from, address_to, -1]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendfrom", params=['neo', address_from, address_to, -1]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) self.assertEqual(error.get('code', None), -32602) @@ -1038,8 +1118,8 @@ def test_send_from_zero_amount(self): ) address_to = 'AXjaFSP23Jkbe6Pk9pPGT6NBDs1HVdqaXK' address_from = 'AJQ6FoaSXDFzA6wLnyZ1nFN7SGSN2oNTc3' - req = self._gen_rpc_req("sendfrom", params=['neo', address_from, address_to, 0]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendfrom", params=['neo', address_from, address_to, 0]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) self.assertEqual(error.get('code', None), -32602) @@ -1059,8 +1139,8 @@ def test_send_from_bad_from_addr(self): ) address_to = 'AXjaFSP23Jkbe6Pk9pPGT6NBDs1HVdqaXK' address_from = 'AJQ6FoaSXDFzA6wLnyZ1nFN7SGSN2oNTc' # "AJQ6FoaSXDFzA6wLnyZ1nFN7SGSN2oNTc" is too short causing ToScriptHash to fail - req = self._gen_rpc_req("sendfrom", params=['neo', address_from, address_to, 1]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendfrom", params=['neo', address_from, address_to, 1]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) self.assertEqual(error.get('code', None), -32602) @@ -1080,8 +1160,8 @@ def test_send_from_bad_to_addr(self): ) address_to = 'AXjaFSP23Jkbe6Pk9pPGT6NBDs1HVdqaX' # "AXjaFSP23Jkbe6Pk9pPGT6NBDs1HVdqaX" is too short causing ToScriptHash to fail address_from = 'AJQ6FoaSXDFzA6wLnyZ1nFN7SGSN2oNTc3' - req = self._gen_rpc_req("sendfrom", params=['neo', address_from, address_to, 1]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendfrom", params=['neo', address_from, address_to, 1]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) self.assertEqual(error.get('code', None), -32602) @@ -1101,8 +1181,8 @@ def test_send_from_negative_fee(self): ) address_to = 'AXjaFSP23Jkbe6Pk9pPGT6NBDs1HVdqaXK' address_from = 'AJQ6FoaSXDFzA6wLnyZ1nFN7SGSN2oNTc3' - req = self._gen_rpc_req("sendfrom", params=['neo', address_from, address_to, 1, -0.005]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendfrom", params=['neo', address_from, address_to, 1, -0.005]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) self.assertEqual(error.get('code', None), -32602) @@ -1122,8 +1202,8 @@ def test_send_from_bad_change_addr(self): ) address_to = 'AXjaFSP23Jkbe6Pk9pPGT6NBDs1HVdqaXK' address_from = 'AJQ6FoaSXDFzA6wLnyZ1nFN7SGSN2oNTc3' - req = self._gen_rpc_req("sendfrom", params=['neo', address_from, address_to, 1, .005, 'AGYaEi3W6ndHPUmW7T12FFfsbQ6DWymkE']) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendfrom", params=['neo', address_from, address_to, 1, .005, 'AGYaEi3W6ndHPUmW7T12FFfsbQ6DWymkE']) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) self.assertEqual(error.get('code', None), -32602) @@ -1143,8 +1223,8 @@ def test_send_from_insufficient_funds(self): ) address_to = 'AXjaFSP23Jkbe6Pk9pPGT6NBDs1HVdqaXK' address_from = 'AJQ6FoaSXDFzA6wLnyZ1nFN7SGSN2oNTc3' - req = self._gen_rpc_req("sendfrom", params=['neo', address_from, address_to, 51]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendfrom", params=['neo', address_from, address_to, 51]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) self.assertEqual(error.get('code', None), -300) @@ -1165,8 +1245,8 @@ def test_send_from_fails_to_sign_tx(self): ) address_to = 'AXjaFSP23Jkbe6Pk9pPGT6NBDs1HVdqaXK' address_from = 'AJQ6FoaSXDFzA6wLnyZ1nFN7SGSN2oNTc3' - req = self._gen_rpc_req("sendfrom", params=['neo', address_from, address_to, 1]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendfrom", params=['neo', address_from, address_to, 1]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res.get('jsonrpc', None), '2.0') @@ -1178,14 +1258,15 @@ def test_send_from_fails_to_sign_tx(self): os.remove(WalletFixtureTestCase.wallet_1_dest()) def test_sendmany_no_wallet(self): - req = self._gen_rpc_req("sendmany", params=[]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendmany", params=[]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) self.assertEqual(error.get('code', None), -400) self.assertEqual(error.get('message', None), "Access denied.") def test_sendmany_complex(self): + # test POST requests test_wallet_path = shutil.copyfile( WalletFixtureTestCase.wallet_1_path(), WalletFixtureTestCase.wallet_1_dest() @@ -1201,8 +1282,8 @@ def test_sendmany_complex(self): {"asset": 'neo', "value": 1, "address": address_to}] - req = self._gen_rpc_req("sendmany", params=[output, 1, "APRgMZHZubii29UXF9uFa6sohrsYupNAvx"]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendmany", params=[output, 1, "APRgMZHZubii29UXF9uFa6sohrsYupNAvx"]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res.get('jsonrpc', None), '2.0') @@ -1221,6 +1302,35 @@ def test_sendmany_complex(self): self.app.wallet = None os.remove(WalletFixtureTestCase.wallet_1_dest()) + # test GET requests + test_wallet_path = shutil.copyfile( + WalletFixtureTestCase.wallet_1_path(), + WalletFixtureTestCase.wallet_1_dest() + ) + self.app.wallet = UserWallet.Open( + test_wallet_path, + to_aes_key(WalletFixtureTestCase.wallet_1_pass()) + ) + req = self._gen_get_rpc_req("sendmany", params=[output, 0.005, "APRgMZHZubii29UXF9uFa6sohrsYupNAvx"]) + mock_req = mock_get_request(req) + res = json.loads(self.app.home(mock_req)) + + self.assertEqual(res.get('jsonrpc', None), '2.0') + self.assertIn('txid', res.get('result', {}).keys()) + self.assertIn('vin', res.get('result', {}).keys()) + self.assertEqual('0.005', res['result']['net_fee']) + + # check for 2 transfers + transfers = 0 + for info in res['result']['vout']: + if info['address'] == "AXjaFSP23Jkbe6Pk9pPGT6NBDs1HVdqaXK": + transfers += 1 + self.assertEqual(2, transfers) + + self.app.wallet.Close() + self.app.wallet = None + os.remove(WalletFixtureTestCase.wallet_1_dest()) + def test_sendmany_min_params(self): test_wallet_path = shutil.copyfile( WalletFixtureTestCase.wallet_1_path(), @@ -1237,8 +1347,8 @@ def test_sendmany_min_params(self): {"asset": 'neo', "value": 1, "address": address_to}] - req = self._gen_rpc_req("sendmany", params=[output]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendmany", params=[output]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res.get('jsonrpc', None), '2.0') self.assertIn('txid', res.get('result', {}).keys()) @@ -1254,8 +1364,8 @@ def test_sendmany_not_list(self): test_wallet_path, to_aes_key('awesomepassword') ) - req = self._gen_rpc_req("sendmany", params=["arg"]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendmany", params=["arg"]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) self.assertEqual(error.get('code', None), -32602) @@ -1280,8 +1390,8 @@ def test_sendmany_too_many_args(self): {"asset": 'neo', "value": 1, "address": address_to}] - req = self._gen_rpc_req("sendmany", params=[output, 1, "APRgMZHZubii29UXF9uFa6sohrsYupNAvx", "arg"]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendmany", params=[output, 1, "APRgMZHZubii29UXF9uFa6sohrsYupNAvx", "arg"]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) self.assertEqual(error.get('code', None), -32602) @@ -1306,8 +1416,8 @@ def test_sendmany_bad_assetid(self): {"asset": 'ne', "value": 1, "address": address_to}] - req = self._gen_rpc_req("sendmany", params=[output]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendmany", params=[output]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) self.assertEqual(error.get('code', None), -32602) @@ -1332,8 +1442,8 @@ def test_sendmany_bad_address(self): {"asset": 'neo', "value": 1, "address": address_to}] - req = self._gen_rpc_req("sendmany", params=[output]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendmany", params=[output]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) self.assertEqual(error.get('code', None), -32602) @@ -1358,8 +1468,8 @@ def test_sendmany_negative_amount(self): {"asset": 'neo', "value": -1, "address": address_to}] - req = self._gen_rpc_req("sendmany", params=[output]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendmany", params=[output]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) self.assertEqual(error.get('code', None), -32602) @@ -1384,8 +1494,8 @@ def test_sendmany_zero_amount(self): {"asset": 'neo', "value": 0, "address": address_to}] - req = self._gen_rpc_req("sendmany", params=[output]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendmany", params=[output]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) self.assertEqual(error.get('code', None), -32602) @@ -1410,8 +1520,8 @@ def test_sendmany_negative_fee(self): {"asset": 'neo', "value": 1, "address": address_to}] - req = self._gen_rpc_req("sendmany", params=[output, -0.005, "APRgMZHZubii29UXF9uFa6sohrsYupNAvx"]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendmany", params=[output, -0.005, "APRgMZHZubii29UXF9uFa6sohrsYupNAvx"]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) self.assertEqual(error.get('code', None), -32602) @@ -1437,8 +1547,8 @@ def test_sendmany_bad_change_address(self): {"asset": 'neo', "value": 1, "address": address_to}] - req = self._gen_rpc_req("sendmany", params=[output, 0.005, change_addr]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendmany", params=[output, 0.005, change_addr]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) self.assertEqual(error.get('code', None), -32602) @@ -1463,8 +1573,8 @@ def test_sendmany_insufficient_funds(self): {"asset": 'neo', "value": 1, "address": address_to}] - req = self._gen_rpc_req("sendmany", params=[output]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendmany", params=[output]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) self.assertEqual(error.get('code', None), -300) @@ -1490,8 +1600,8 @@ def test_sendmany_fails_to_sign_tx(self): {"asset": 'neo', "value": 1, "address": address_to}] - req = self._gen_rpc_req("sendmany", params=[output]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("sendmany", params=[output]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res.get('jsonrpc', None), '2.0') self.assertIn('type', res.get('result', {}).keys()) @@ -1501,8 +1611,8 @@ def test_sendmany_fails_to_sign_tx(self): os.remove(WalletFixtureTestCase.wallet_1_dest()) def test_getblockheader_int(self): - req = self._gen_rpc_req("getblockheader", params=[10, 1]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getblockheader", params=[10, 1]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res['result']['index'], 10) self.assertEqual(res['result']['hash'], '0xd69e7a1f62225a35fed91ca578f33447d93fa0fd2b2f662b957e19c38c1dab1e') @@ -1510,8 +1620,8 @@ def test_getblockheader_int(self): self.assertEqual(res['result']['nextblockhash'], '0x2b1c78633dae7ab81f64362e0828153079a17b018d779d0406491f84c27b086f') def test_getblockheader_hash(self): - req = self._gen_rpc_req("getblockheader", params=['2b1c78633dae7ab81f64362e0828153079a17b018d779d0406491f84c27b086f', 1]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getblockheader", params=['2b1c78633dae7ab81f64362e0828153079a17b018d779d0406491f84c27b086f', 1]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res['result']['index'], 11) @@ -1519,21 +1629,21 @@ def test_getblockheader_hash(self): self.assertEqual(res['result']['previousblockhash'], '0xd69e7a1f62225a35fed91ca578f33447d93fa0fd2b2f662b957e19c38c1dab1e') def test_getblockheader_hash_0x(self): - req = self._gen_rpc_req("getblockheader", params=['0x2b1c78633dae7ab81f64362e0828153079a17b018d779d0406491f84c27b086f', 1]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getblockheader", params=['0x2b1c78633dae7ab81f64362e0828153079a17b018d779d0406491f84c27b086f', 1]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res['result']['index'], 11) def test_getblockheader_hash_failure(self): - req = self._gen_rpc_req("getblockheader", params=[GetBlockchain().Height + 1, 1]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getblockheader", params=[GetBlockchain().Height + 1, 1]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertTrue('error' in res) self.assertEqual(res['error']['message'], 'Unknown block') def test_getblockheader_non_verbose(self): - req = self._gen_rpc_req("getblockheader", params=[11, 0]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("getblockheader", params=[11, 0]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertIsNotNone(res['result']) From 02aa2b83f3900e180ba0b04a6f8580beed3fc822 Mon Sep 17 00:00:00 2001 From: jseagrave21 <40873301+jseagrave21@users.noreply.github.com> Date: Thu, 8 Nov 2018 03:00:38 -0800 Subject: [PATCH 12/30] Update test_extended_json_rpc_api.py - update tests for GET requests --- neo/api/JSONRPC/test_extended_json_rpc_api.py | 109 +++++++++++++++--- 1 file changed, 90 insertions(+), 19 deletions(-) diff --git a/neo/api/JSONRPC/test_extended_json_rpc_api.py b/neo/api/JSONRPC/test_extended_json_rpc_api.py index e1474e030..c68285d87 100644 --- a/neo/api/JSONRPC/test_extended_json_rpc_api.py +++ b/neo/api/JSONRPC/test_extended_json_rpc_api.py @@ -7,6 +7,8 @@ import os import shutil from klein.test.test_resource import requestMock +from twisted.web import server +from twisted.web.test.test_web import DummyChannel from neo.api.JSONRPC.ExtendedJsonRpcApi import ExtendedJsonRpcApi from neo.Utils.BlockchainFixtureTestCase import BlockchainFixtureTestCase from neo.Implementations.Wallets.peewee.UserWallet import UserWallet @@ -16,8 +18,16 @@ from neo.Utils.WalletFixtureTestCase import WalletFixtureTestCase -def mock_request(body): - return requestMock(path=b'/', method="POST", body=body) +def mock_post_request(body): + return requestMock(path=b'/', method=b"POST", body=body) + + +def mock_get_request(path, method=b"GET"): + request = server.Request(DummyChannel(), False) + request.uri = path + request.method = method + request.clientproto = b'HTTP/1.1' + return request class ExtendedJsonRpcApiTestCase(BlockchainFixtureTestCase): @@ -30,16 +40,34 @@ def leveldb_testpath(self): def setUp(self): self.app = ExtendedJsonRpcApi(20332) + def test_invalid_request_method(self): + with self.assertRaises(Exception) as context: + # test HEAD method + mock_req = mock_get_request(b'/?test', b"HEAD") + json.loads(self.app.home(mock_req)) + + self.assertTrue("Invalid Request" in str(context.exception)) + def test_invalid_json_payload(self): - mock_req = mock_request(b"{ invalid") + # test POST requests + mock_req = mock_post_request(b"{ invalid") res = json.loads(self.app.home(mock_req)) self.assertEqual(res["error"]["code"], -32700) - mock_req = mock_request(json.dumps({"some": "stuff"}).encode("utf-8")) + mock_req = mock_post_request(json.dumps({"some": "stuff"}).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res["error"]["code"], -32600) - def _gen_rpc_req(self, method, params=None, request_id="2"): + # test GET requests + mock_req = mock_get_request(b"/?%20invalid") # equivalent to "/? invalid" + res = json.loads(self.app.home(mock_req)) + self.assertEqual(res["error"]["code"], -32600) + + mock_req = mock_get_request(b"/?some=stuff") + res = json.loads(self.app.home(mock_req)) + self.assertEqual(res["error"]["code"], -32600) + + def _gen_post_rpc_req(self, method, params=None, request_id="2"): ret = { "jsonrpc": "2.0", "id": request_id, @@ -49,47 +77,90 @@ def _gen_rpc_req(self, method, params=None, request_id="2"): ret["params"] = params return ret + def _gen_get_rpc_req(self, method, params=None, request="2"): + ret = "/?jsonrpc=2.0&method=%s¶ms=[]&id=%s" % (method, request) + if params: + ret = "/?jsonrpc=2.0&method=%s¶ms=%s&id=%s" % (method, params, request) + return ret.encode('utf-8') + def test_initial_setup(self): self.assertTrue(GetBlockchain().GetBlock(0).Hash.To0xString(), '0x996e37358dc369912041f966f8c5d8d3a8255ba5dcbd3447f8a82b55db869099') def test_missing_fields(self): - req = self._gen_rpc_req("foo") + # test POST requests + req = self._gen_post_rpc_req("foo") del req["jsonrpc"] - mock_req = mock_request(json.dumps(req).encode("utf-8")) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res["error"]["code"], -32600) + self.assertEqual(res["error"]["message"], "Invalid value for 'jsonrpc'") - req = self._gen_rpc_req("foo") + req = self._gen_post_rpc_req("foo") del req["id"] - mock_req = mock_request(json.dumps(req).encode("utf-8")) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res["error"]["code"], -32600) + self.assertEqual(res["error"]["message"], "Field 'id' is missing") - req = self._gen_rpc_req("foo") + req = self._gen_post_rpc_req("foo") del req["method"] - mock_req = mock_request(json.dumps(req).encode("utf-8")) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) + res = json.loads(self.app.home(mock_req)) + self.assertEqual(res["error"]["code"], -32600) + self.assertEqual(res["error"]["message"], "Field 'method' is missing") + + # test GET requests + mock_req = mock_get_request(b"/?method=foo&id=2") res = json.loads(self.app.home(mock_req)) self.assertEqual(res["error"]["code"], -32600) + self.assertEqual(res["error"]["message"], "Invalid value for 'jsonrpc'") + + mock_req = mock_get_request(b"/?jsonrpc=2.0&method=foo") + res = json.loads(self.app.home(mock_req)) + self.assertEqual(res["error"]["code"], -32600) + self.assertEqual(res["error"]["message"], "Field 'id' is missing") + + mock_req = mock_get_request(b"/?jsonrpc=2.0&id=2") + res = json.loads(self.app.home(mock_req)) + self.assertEqual(res["error"]["code"], -32600) + self.assertEqual(res["error"]["message"], "Field 'method' is missing") def test_invalid_method(self): - req = self._gen_rpc_req("invalid", request_id="42") - mock_req = mock_request(json.dumps(req).encode("utf-8")) + # test POST requests + req = self._gen_post_rpc_req("invalid", request_id="42") + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res["id"], "42") self.assertEqual(res["error"]["code"], -32601) self.assertEqual(res["error"]["message"], "Method not found") + # test GET requests + req = self._gen_get_rpc_req("invalid") + mock_req = mock_get_request(req) + res = json.loads(self.app.home(mock_req)) + self.assertEqual(res["error"]["code"], -32601) + self.assertEqual(res["error"]["message"], "Method not found") + def test_get_node_state(self): - req = self._gen_rpc_req("getnodestate") - mock_req = mock_request(json.dumps(req).encode("utf-8")) + # test POST requests + req = self._gen_post_rpc_req("getnodestate") + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) + res = json.loads(self.app.home(mock_req)) + self.assertGreater(res['result']['Progress'][0], 0) + self.assertGreater(res['result']['Progress'][2], 0) + self.assertGreater(res['result']['Time elapsed (minutes)'], 0) + + # test GET requests + req = self._gen_get_rpc_req("getnodestate") + mock_req = mock_get_request(req) res = json.loads(self.app.home(mock_req)) self.assertGreater(res['result']['Progress'][0], 0) self.assertGreater(res['result']['Progress'][2], 0) self.assertGreater(res['result']['Time elapsed (minutes)'], 0) def test_gettxhistory_no_wallet(self): - req = self._gen_rpc_req("gettxhistory") - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("gettxhistory") + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) error = res.get('error', {}) self.assertEqual(error.get('code', None), -400) @@ -104,8 +175,8 @@ def test_gettxhistory(self): test_wallet_path, to_aes_key(WalletFixtureTestCase.wallet_1_pass()) ) - req = self._gen_rpc_req("gettxhistory") - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("gettxhistory") + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) for tx in res['result']: self.assertIn('txid', tx.keys()) From ef8db466fd1a0e1a524ccc79c866288d458b70cc Mon Sep 17 00:00:00 2001 From: jseagrave21 <40873301+jseagrave21@users.noreply.github.com> Date: Thu, 8 Nov 2018 03:03:48 -0800 Subject: [PATCH 13/30] Update test_json_invoke_rpc_api.py - update tests for GET requests --- neo/api/JSONRPC/test_json_invoke_rpc_api.py | 86 ++++++++++++++++----- 1 file changed, 67 insertions(+), 19 deletions(-) diff --git a/neo/api/JSONRPC/test_json_invoke_rpc_api.py b/neo/api/JSONRPC/test_json_invoke_rpc_api.py index 9fd1541fa..02e9d0534 100644 --- a/neo/api/JSONRPC/test_json_invoke_rpc_api.py +++ b/neo/api/JSONRPC/test_json_invoke_rpc_api.py @@ -8,6 +8,8 @@ import binascii import os from klein.test.test_resource import requestMock +from twisted.web import server +from twisted.web.test.test_web import DummyChannel from neo import __version__ from neo.api.JSONRPC.JsonRpcApi import JsonRpcApi @@ -21,8 +23,16 @@ from neo.Settings import settings -def mock_request(body): - return requestMock(path=b'/', method="POST", body=body) +def mock_post_request(body): + return requestMock(path=b'/', method=b"POST", body=body) + + +def mock_get_request(path, method=b"GET"): + request = server.Request(DummyChannel(), False) + request.uri = path + request.method = method + request.clientproto = b'HTTP/1.1' + return request class JsonRpcInvokeApiTestCase(BlockchainFixtureTestCase): @@ -35,16 +45,34 @@ def leveldb_testpath(self): def setUp(self): self.app = JsonRpcApi(9479) + def test_invalid_request_method(self): + with self.assertRaises(Exception) as context: + # test HEAD method + mock_req = mock_get_request(b'/?test', b"HEAD") + json.loads(self.app.home(mock_req)) + + self.assertTrue("Invalid Request" in str(context.exception)) + def test_invalid_json_payload(self): - mock_req = mock_request(b"{ invalid") + # test POST requests + mock_req = mock_post_request(b"{ invalid") res = json.loads(self.app.home(mock_req)) self.assertEqual(res["error"]["code"], -32700) - mock_req = mock_request(json.dumps({"some": "stuff"}).encode("utf-8")) + mock_req = mock_post_request(json.dumps({"some": "stuff"}).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res["error"]["code"], -32600) - def _gen_rpc_req(self, method, params=None, request_id="2"): + # test GET requests + mock_req = mock_get_request(b"/?%20invalid") # equivalent to "/? invalid" + res = json.loads(self.app.home(mock_req)) + self.assertEqual(res["error"]["code"], -32600) + + mock_req = mock_get_request(b"/?some=stuff") + res = json.loads(self.app.home(mock_req)) + self.assertEqual(res["error"]["code"], -32600) + + def _gen_post_rpc_req(self, method, params=None, request_id="2"): ret = { "jsonrpc": "2.0", "id": request_id, @@ -54,7 +82,14 @@ def _gen_rpc_req(self, method, params=None, request_id="2"): ret["params"] = params return ret + def _gen_get_rpc_req(self, method, params=None, request="2"): + ret = "/?jsonrpc=2.0&method=%s¶ms=[]&id=%s" % (method, request) + if params: + ret = "/?jsonrpc=2.0&method=%s¶ms=%s&id=%s" % (method, params, request) + return ret.encode('utf-8') + def test_invoke_1(self): + # test POST requests contract_hash = 'b9fbcff6e50fd381160b822207231233dd3c56c2' jsn = [ { @@ -66,8 +101,21 @@ def test_invoke_1(self): 'value': [] } ] - req = self._gen_rpc_req("invoke", params=[contract_hash, jsn]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("invoke", params=[contract_hash, jsn]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) + res = json.loads(self.app.home(mock_req)) + self.assertEqual(res['result']['state'], VMStateStr(VMState.HALT + VMState.BREAK)) + self.assertEqual(res['result']['gas_consumed'], '0.128') + results = [] + for p in res['result']['stack']: + results.append(ContractParameter.FromJson(p)) + self.assertEqual(len(results), 1) + self.assertEqual(results[0].Type, ContractParameterType.ByteArray) + self.assertEqual(results[0].Value, bytearray(b'NEX Template V2')) + + # test GET requests + req = self._gen_get_rpc_req("invoke", params=[contract_hash, jsn]) + mock_req = mock_get_request(req) res = json.loads(self.app.home(mock_req)) self.assertEqual(res['result']['state'], VMStateStr(VMState.HALT + VMState.BREAK)) self.assertEqual(res['result']['gas_consumed'], '0.128') @@ -95,8 +143,8 @@ def test_invoke_2(self): ] } ] - req = self._gen_rpc_req("invoke", params=[contract_hash, jsn]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("invoke", params=[contract_hash, jsn]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res['result']['state'], VMStateStr(VMState.HALT + VMState.BREAK)) results = [] @@ -108,8 +156,8 @@ def test_invoke_2(self): def test_invoke_3(self): contract_hash = 'b9fbcff6e50fd381160b822207231233dd3c56c2' - req = self._gen_rpc_req("invokefunction", params=[contract_hash, 'symbol']) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("invokefunction", params=[contract_hash, 'symbol']) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res['result']['state'], VMStateStr(VMState.HALT + VMState.BREAK)) results = [] @@ -124,8 +172,8 @@ def test_invoke_4(self): params = [{'type': str(ContractParameterType.ByteArray), 'value': bytearray(b'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9').hex()}] - req = self._gen_rpc_req("invokefunction", params=[contract_hash, 'balanceOf', params]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("invokefunction", params=[contract_hash, 'balanceOf', params]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res['result']['state'], VMStateStr(VMState.HALT + VMState.BREAK)) results = [] @@ -138,8 +186,8 @@ def test_invoke_4(self): def test_invoke_5(self): test_script = "00046e616d6567c2563cdd3312230722820b1681d30fe5f6cffbb9000673796d626f6c67c2563cdd3312230722820b1681d30fe5f6cffbb90008646563696d616c7367c2563cdd3312230722820b1681d30fe5f6cffbb9" - req = self._gen_rpc_req("invokescript", params=[test_script]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("invokescript", params=[test_script]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertEqual(res['result']['state'], VMStateStr(VMState.HALT + VMState.BREAK)) @@ -154,16 +202,16 @@ def test_invoke_5(self): def test_bad_invoke_script(self): test_script = '0zzzzzzef3e30b007cd98d67d7' - req = self._gen_rpc_req("invokescript", params=[test_script]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("invokescript", params=[test_script]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertTrue('error' in res) self.assertIn('Non-hexadecimal digit found', res['error']['message']) def test_bad_invoke_script_2(self): test_script = '00046e616d656754a64cac1b103e662933ef3e30b007cd98d67d7000673796d626f6c6754a64cac1b1073e662933ef3e30b007cd98d67d70008646563696d616c736754a64cac1b1073e662933ef3e30b007cd98d67d7' - req = self._gen_rpc_req("invokescript", params=[test_script]) - mock_req = mock_request(json.dumps(req).encode("utf-8")) + req = self._gen_post_rpc_req("invokescript", params=[test_script]) + mock_req = mock_post_request(json.dumps(req).encode("utf-8")) res = json.loads(self.app.home(mock_req)) self.assertTrue('error' in res) self.assertIn('Odd-length string', res['error']['message']) From 2cda293feec047d46363ede0f597ed53e6ae3fa7 Mon Sep 17 00:00:00 2001 From: jseagrave21 <40873301+jseagrave21@users.noreply.github.com> Date: Thu, 8 Nov 2018 03:04:56 -0800 Subject: [PATCH 14/30] Update CHANGELOG.rst --- CHANGELOG.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index a08b346f5..a658c4098 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -11,6 +11,7 @@ All notable changes to this project are documented in this file. - Make bootstrap lookup dynamic such that users don't have to update their configs from here on forward - Move some warnings and 'expected' errors to `DEBUG` level to avoid logging to console by default - Empty VerificationScripts for deployed contracts now work as intended +- Add GET Request functionality for JSON-RPC servers [0.8.2] 2018-10-31 From 1386c891b5f2bbf8d3a02a341829943d8821addf Mon Sep 17 00:00:00 2001 From: jseagrave21 <40873301+jseagrave21@users.noreply.github.com> Date: Thu, 8 Nov 2018 03:29:29 -0800 Subject: [PATCH 15/30] Update test_json_rpc_api.py - add a test for a GET request with bad "params" field --- neo/api/JSONRPC/test_json_rpc_api.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/neo/api/JSONRPC/test_json_rpc_api.py b/neo/api/JSONRPC/test_json_rpc_api.py index 407cbcd60..d39be604d 100644 --- a/neo/api/JSONRPC/test_json_rpc_api.py +++ b/neo/api/JSONRPC/test_json_rpc_api.py @@ -96,6 +96,15 @@ def _gen_get_rpc_req(self, method, params=None, request="2"): def test_initial_setup(self): self.assertTrue(GetBlockchain().GetBlock(0).Hash.To0xString(), '0x996e37358dc369912041f966f8c5d8d3a8255ba5dcbd3447f8a82b55db869099') + def test_GET_request_bad_params(self): + req = "/?jsonrpc=2.0&method=getblockcount¶m=[]&id=2" # "params" is misspelled + mock_req = mock_get_request(req) + res = json.loads(self.app.home(mock_req)) + + error = res.get('error', {}) + self.assertEqual(error.get('code', None), -32602) + self.assertEqual(error.get('message', None), "Invalid params") + def test_missing_fields(self): # test POST requests req = self._gen_post_rpc_req("foo") From 1264b25c84be407383645bf42958d8b84761ace2 Mon Sep 17 00:00:00 2001 From: jseagrave21 <40873301+jseagrave21@users.noreply.github.com> Date: Fri, 9 Nov 2018 15:19:26 -0800 Subject: [PATCH 16/30] Update JsonRpcApi.py - add functionality for having params field as last field - add a response for an HTTP OPTIONS request to identify the supported HTTP methods --- neo/api/JSONRPC/JsonRpcApi.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/neo/api/JSONRPC/JsonRpcApi.py b/neo/api/JSONRPC/JsonRpcApi.py index fe263449a..6926c2d0f 100644 --- a/neo/api/JSONRPC/JsonRpcApi.py +++ b/neo/api/JSONRPC/JsonRpcApi.py @@ -128,13 +128,11 @@ def home(self, request): # [{"jsonrpc": "2.0", "id": 1, "method": "getblock", "params": [10], {"jsonrpc": "2.0", "id": 2, "method": "getblock", "params": [10,1]} # # GET Example: - # /?jsonrpc=2.0&method=getblockcount¶ms=[]&id=5 - # NOTE: "params" must not be last + # /?jsonrpc=2.0&id=5&method=getblockcount¶ms=[] # NOTE: GET requests do not support multiple requests in 1 transaction request_id = None if "POST" == request.method.decode("utf-8"): - try: content = json.loads(request.content.read().decode("utf-8")) @@ -153,9 +151,15 @@ def home(self, request): return self.get_custom_error_payload(request_id, error.code, error.message) elif "GET" == request.method.decode("utf-8"): - content = furl(request.uri).args + # remove hanging ' or " from last value if value is not None to avoid SyntaxError + l_value = list(content.values())[-1] + if l_value is not None: + n_value = l_value[:-1] + l_key = list(content.keys())[-1] + content[l_key] = n_value + if len(content.keys()) > 3: try: params = content['params'] @@ -167,6 +171,9 @@ def home(self, request): return self.get_data(content) + elif "OPTIONS" == request.method.decode("utf-8"): + return {'supported HTTP methods': ("GET", "POST")} + raise JsonRpcError.invalidRequest() def json_rpc_method_handler(self, method, params): From d487d1a8d79afd255730ea84ce84c29dc7533b7d Mon Sep 17 00:00:00 2001 From: jseagrave21 <40873301+jseagrave21@users.noreply.github.com> Date: Fri, 9 Nov 2018 15:21:40 -0800 Subject: [PATCH 17/30] Update test_json_rpc_api.py - add test for HTTP OPTIONS request - show support for having params as last field --- neo/api/JSONRPC/test_json_rpc_api.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/neo/api/JSONRPC/test_json_rpc_api.py b/neo/api/JSONRPC/test_json_rpc_api.py index d39be604d..0fb929ffa 100644 --- a/neo/api/JSONRPC/test_json_rpc_api.py +++ b/neo/api/JSONRPC/test_json_rpc_api.py @@ -50,6 +50,13 @@ def leveldb_testpath(self): def setUp(self): self.app = JsonRpcApi(20332) + def test_HTTP_OPTIONS_request(self): + mock_req = mock_get_request(b'/?test', b"OPTIONS") + res = json.loads(self.app.home(mock_req)) + + self.assertTrue("GET" in res['supported HTTP methods']) + self.assertTrue("POST" in res['supported HTTP methods']) + def test_invalid_request_method(self): with self.assertRaises(Exception) as context: # test HEAD method @@ -88,9 +95,9 @@ def _gen_post_rpc_req(self, method, params=None, request_id="2"): return ret def _gen_get_rpc_req(self, method, params=None, request="2"): - ret = "/?jsonrpc=2.0&method=%s¶ms=[]&id=%s" % (method, request) + ret = "/?jsonrpc=2.0&id=%s&method=%s¶ms=[]" % (request, method) if params: - ret = "/?jsonrpc=2.0&method=%s¶ms=%s&id=%s" % (method, params, request) + ret = "/?jsonrpc=2.0&id=%s&method=%s¶ms=%s" % (request, method, params) return ret.encode('utf-8') def test_initial_setup(self): From 29df360015cadf4fbffe1f63d2edb24947ffa4d3 Mon Sep 17 00:00:00 2001 From: jseagrave21 <40873301+jseagrave21@users.noreply.github.com> Date: Fri, 9 Nov 2018 15:24:53 -0800 Subject: [PATCH 18/30] Update CHANGELOG.rst for compatibility --- CHANGELOG.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index a658c4098..a08b346f5 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -11,7 +11,6 @@ All notable changes to this project are documented in this file. - Make bootstrap lookup dynamic such that users don't have to update their configs from here on forward - Move some warnings and 'expected' errors to `DEBUG` level to avoid logging to console by default - Empty VerificationScripts for deployed contracts now work as intended -- Add GET Request functionality for JSON-RPC servers [0.8.2] 2018-10-31 From 122347fd89ee4dd24ac2ae9c5ef1f3c718fc46b0 Mon Sep 17 00:00:00 2001 From: jseagrave21 <40873301+jseagrave21@users.noreply.github.com> Date: Fri, 9 Nov 2018 15:27:59 -0800 Subject: [PATCH 19/30] Update CHANGELOG.rst --- CHANGELOG.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 0eb984cae..6642c71fb 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -12,7 +12,8 @@ All notable changes to this project are documented in this file. - Fix various issues related to signing multi-signature transactions - Move some warnings and 'expected' errors to `DEBUG` level to avoid logging to console by default - Empty VerificationScripts for deployed contracts now work as intended -- Fix RPC's ``getaccountstate`` response schema to match ``neo-cli`` `#714 ` +- Fix RPC's ``getaccountstate`` response schema to match ``neo-cli`` `#714 `_ +- Add GET and OPTIONS request functionality for JSON-RPC servers [0.8.2] 2018-10-31 From 1aac551d33e6623a62a605e3046c8ffcef57f067 Mon Sep 17 00:00:00 2001 From: jseagrave21 <40873301+jseagrave21@users.noreply.github.com> Date: Sat, 10 Nov 2018 13:29:51 -0800 Subject: [PATCH 20/30] Update JsonRpcApi.py - add server-type identifier for OPTIONS request --- neo/api/JSONRPC/JsonRpcApi.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/neo/api/JSONRPC/JsonRpcApi.py b/neo/api/JSONRPC/JsonRpcApi.py index 6926c2d0f..171aee4d5 100644 --- a/neo/api/JSONRPC/JsonRpcApi.py +++ b/neo/api/JSONRPC/JsonRpcApi.py @@ -172,7 +172,8 @@ def home(self, request): return self.get_data(content) elif "OPTIONS" == request.method.decode("utf-8"): - return {'supported HTTP methods': ("GET", "POST")} + return {'supported HTTP methods': ("GET", "POST"), + 'JSON-RPC server type': "default"} raise JsonRpcError.invalidRequest() From c4f68bafcc6d3269e82d618ee59295886fcb31dd Mon Sep 17 00:00:00 2001 From: jseagrave21 <40873301+jseagrave21@users.noreply.github.com> Date: Sat, 10 Nov 2018 13:30:50 -0800 Subject: [PATCH 21/30] Update test_json_rpc_api.py - update OPTIONS test for server-type --- neo/api/JSONRPC/test_json_rpc_api.py | 1 + 1 file changed, 1 insertion(+) diff --git a/neo/api/JSONRPC/test_json_rpc_api.py b/neo/api/JSONRPC/test_json_rpc_api.py index a7541e3e4..344a593b1 100644 --- a/neo/api/JSONRPC/test_json_rpc_api.py +++ b/neo/api/JSONRPC/test_json_rpc_api.py @@ -56,6 +56,7 @@ def test_HTTP_OPTIONS_request(self): self.assertTrue("GET" in res['supported HTTP methods']) self.assertTrue("POST" in res['supported HTTP methods']) + self.assertTrue("default" in res['JSON-RPC server type']) def test_invalid_request_method(self): with self.assertRaises(Exception) as context: From 034957bdfdfdfbfd9bd0c97580d9befb0922ffcf Mon Sep 17 00:00:00 2001 From: jseagrave21 <40873301+jseagrave21@users.noreply.github.com> Date: Sat, 10 Nov 2018 13:33:29 -0800 Subject: [PATCH 22/30] Update ExtendedJsonRpcApi.py - add server-type for OPTIONS request --- neo/api/JSONRPC/ExtendedJsonRpcApi.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/neo/api/JSONRPC/ExtendedJsonRpcApi.py b/neo/api/JSONRPC/ExtendedJsonRpcApi.py index 123a15161..595be0236 100644 --- a/neo/api/JSONRPC/ExtendedJsonRpcApi.py +++ b/neo/api/JSONRPC/ExtendedJsonRpcApi.py @@ -1,4 +1,6 @@ +from klein import Klein from neo.Core.Blockchain import Blockchain +from neo.api.utils import json_response, cors_header from neo.api.JSONRPC.JsonRpcApi import JsonRpcApi, JsonRpcError from neo.Implementations.Wallets.peewee.UserWallet import UserWallet from neocore.UInt256 import UInt256 @@ -9,12 +11,28 @@ class ExtendedJsonRpcApi(JsonRpcApi): """ Extended JSON-RPC API Methods """ + app = Klein() + port = None def __init__(self, port, wallet=None): self.start_height = Blockchain.Default().Height self.start_dt = datetime.datetime.utcnow() super(ExtendedJsonRpcApi, self).__init__(port, wallet) + # + # JSON-RPC Extended API Route + # + @app.route('/') + @json_response + @cors_header + def home(self, request): + + if "OPTIONS" == request.method.decode("utf-8"): + return {'supported HTTP methods': ("GET", "POST"), + 'JSON-RPC server type': "extended-rpc"} + + return super(ExtendedJsonRpcApi, self).home(request) + def json_rpc_method_handler(self, method, params): if method == "getnodestate": From f6c2d222ea50452b3aa5dd73b2c4b9fef4b94c98 Mon Sep 17 00:00:00 2001 From: jseagrave21 <40873301+jseagrave21@users.noreply.github.com> Date: Sat, 10 Nov 2018 13:34:39 -0800 Subject: [PATCH 23/30] Update test_extended_json_rpc_api.py - add specific test for OPTIONS request --- neo/api/JSONRPC/test_extended_json_rpc_api.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/neo/api/JSONRPC/test_extended_json_rpc_api.py b/neo/api/JSONRPC/test_extended_json_rpc_api.py index c68285d87..13687c84c 100644 --- a/neo/api/JSONRPC/test_extended_json_rpc_api.py +++ b/neo/api/JSONRPC/test_extended_json_rpc_api.py @@ -40,6 +40,14 @@ def leveldb_testpath(self): def setUp(self): self.app = ExtendedJsonRpcApi(20332) + def test_HTTP_OPTIONS_request(self): + mock_req = mock_get_request(b'/?test', b"OPTIONS") + res = json.loads(self.app.home(mock_req)) + + self.assertTrue("GET" in res['supported HTTP methods']) + self.assertTrue("POST" in res['supported HTTP methods']) + self.assertTrue("extended-rpc" in res['JSON-RPC server type']) + def test_invalid_request_method(self): with self.assertRaises(Exception) as context: # test HEAD method From cbbdd0921518538290e83a737e689c8f13e014de Mon Sep 17 00:00:00 2001 From: jseagrave21 <40873301+jseagrave21@users.noreply.github.com> Date: Sat, 10 Nov 2018 14:27:49 -0800 Subject: [PATCH 24/30] Update JsonRpcApi.py - add a functional return for an unsupported HTTP method --- neo/api/JSONRPC/JsonRpcApi.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/neo/api/JSONRPC/JsonRpcApi.py b/neo/api/JSONRPC/JsonRpcApi.py index 171aee4d5..7d9548e9b 100644 --- a/neo/api/JSONRPC/JsonRpcApi.py +++ b/neo/api/JSONRPC/JsonRpcApi.py @@ -175,7 +175,8 @@ def home(self, request): return {'supported HTTP methods': ("GET", "POST"), 'JSON-RPC server type': "default"} - raise JsonRpcError.invalidRequest() + error = JsonRpcError.invalidRequest("%s is not a supported HTTP method" % request.method.decode("utf-8")) + return self.get_custom_error_payload(request_id, error.code, error.message) def json_rpc_method_handler(self, method, params): From 0385de6d09674c362a8310a0c40c8b9cea6b541c Mon Sep 17 00:00:00 2001 From: jseagrave21 <40873301+jseagrave21@users.noreply.github.com> Date: Sat, 10 Nov 2018 14:29:06 -0800 Subject: [PATCH 25/30] Update test_json_rpc_api.py - update test_invalid_request_method for functional return --- neo/api/JSONRPC/test_json_rpc_api.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/neo/api/JSONRPC/test_json_rpc_api.py b/neo/api/JSONRPC/test_json_rpc_api.py index 344a593b1..cab93617e 100644 --- a/neo/api/JSONRPC/test_json_rpc_api.py +++ b/neo/api/JSONRPC/test_json_rpc_api.py @@ -59,12 +59,11 @@ def test_HTTP_OPTIONS_request(self): self.assertTrue("default" in res['JSON-RPC server type']) def test_invalid_request_method(self): - with self.assertRaises(Exception) as context: - # test HEAD method - mock_req = mock_get_request(b'/?test', b"HEAD") - json.loads(self.app.home(mock_req)) - - self.assertTrue("Invalid Request" in str(context.exception)) + # test HEAD method + mock_req = mock_get_request(b'/?test', b"HEAD") + res = json.loads(self.app.home(mock_req)) + self.assertEqual(res["error"]["code"], -32600) + self.assertEqual(res["error"]["message"], 'HEAD is not a supported HTTP method') def test_invalid_json_payload(self): # test POST requests From d526b6c4e37c198bc7f1d85d081b90c48bd5e336 Mon Sep 17 00:00:00 2001 From: jseagrave21 <40873301+jseagrave21@users.noreply.github.com> Date: Sat, 10 Nov 2018 14:48:42 -0800 Subject: [PATCH 26/30] Update test_extended_json_rpc_api.py - update test for unsupported HTTP method for an extended-rpc server --- neo/api/JSONRPC/test_extended_json_rpc_api.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/neo/api/JSONRPC/test_extended_json_rpc_api.py b/neo/api/JSONRPC/test_extended_json_rpc_api.py index 13687c84c..edf99cf81 100644 --- a/neo/api/JSONRPC/test_extended_json_rpc_api.py +++ b/neo/api/JSONRPC/test_extended_json_rpc_api.py @@ -49,12 +49,11 @@ def test_HTTP_OPTIONS_request(self): self.assertTrue("extended-rpc" in res['JSON-RPC server type']) def test_invalid_request_method(self): - with self.assertRaises(Exception) as context: - # test HEAD method - mock_req = mock_get_request(b'/?test', b"HEAD") - json.loads(self.app.home(mock_req)) - - self.assertTrue("Invalid Request" in str(context.exception)) + # test HEAD method + mock_req = mock_get_request(b'/?test', b"HEAD") + res = json.loads(self.app.home(mock_req)) + self.assertEqual(res["error"]["code"], -32600) + self.assertEqual(res["error"]["message"], 'HEAD is not a supported HTTP method') def test_invalid_json_payload(self): # test POST requests From 0222e80b015ba8e09dc8714d06e5498da7fb7128 Mon Sep 17 00:00:00 2001 From: jseagrave21 <40873301+jseagrave21@users.noreply.github.com> Date: Sat, 10 Nov 2018 14:55:03 -0800 Subject: [PATCH 27/30] Update test_json_invoke_rpc_api.py - update test for invalid HTTP request --- neo/api/JSONRPC/test_json_invoke_rpc_api.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/neo/api/JSONRPC/test_json_invoke_rpc_api.py b/neo/api/JSONRPC/test_json_invoke_rpc_api.py index 02e9d0534..05953a9e0 100644 --- a/neo/api/JSONRPC/test_json_invoke_rpc_api.py +++ b/neo/api/JSONRPC/test_json_invoke_rpc_api.py @@ -46,12 +46,11 @@ def setUp(self): self.app = JsonRpcApi(9479) def test_invalid_request_method(self): - with self.assertRaises(Exception) as context: - # test HEAD method - mock_req = mock_get_request(b'/?test', b"HEAD") - json.loads(self.app.home(mock_req)) - - self.assertTrue("Invalid Request" in str(context.exception)) + # test HEAD method + mock_req = mock_get_request(b'/?test', b"HEAD") + res = json.loads(self.app.home(mock_req)) + self.assertEqual(res["error"]["code"], -32600) + self.assertEqual(res["error"]["message"], 'HEAD is not a supported HTTP method') def test_invalid_json_payload(self): # test POST requests From 1079f5b3927b0ce399cf0e8903f186a6f2a522a4 Mon Sep 17 00:00:00 2001 From: jseagrave21 <40873301+jseagrave21@users.noreply.github.com> Date: Mon, 19 Nov 2018 13:00:37 -0800 Subject: [PATCH 28/30] Update CHANGELOG.rst for compatibility --- CHANGELOG.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 6642c71fb..7b956df65 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -13,7 +13,6 @@ All notable changes to this project are documented in this file. - Move some warnings and 'expected' errors to `DEBUG` level to avoid logging to console by default - Empty VerificationScripts for deployed contracts now work as intended - Fix RPC's ``getaccountstate`` response schema to match ``neo-cli`` `#714 `_ -- Add GET and OPTIONS request functionality for JSON-RPC servers [0.8.2] 2018-10-31 From 0b3f45042aa30730e3062a9a9b0f25ab16fdb24a Mon Sep 17 00:00:00 2001 From: jseagrave21 <40873301+jseagrave21@users.noreply.github.com> Date: Mon, 19 Nov 2018 13:01:10 -0800 Subject: [PATCH 29/30] Update CHANGELOG.rst for compatibility --- CHANGELOG.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 7b956df65..0eb984cae 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -12,7 +12,7 @@ All notable changes to this project are documented in this file. - Fix various issues related to signing multi-signature transactions - Move some warnings and 'expected' errors to `DEBUG` level to avoid logging to console by default - Empty VerificationScripts for deployed contracts now work as intended -- Fix RPC's ``getaccountstate`` response schema to match ``neo-cli`` `#714 `_ +- Fix RPC's ``getaccountstate`` response schema to match ``neo-cli`` `#714 ` [0.8.2] 2018-10-31 From a3fe3aa7d8d774d8ab5e2a16252b91007945bbad Mon Sep 17 00:00:00 2001 From: jseagrave21 <40873301+jseagrave21@users.noreply.github.com> Date: Mon, 19 Nov 2018 13:03:50 -0800 Subject: [PATCH 30/30] Update CHANGELOG.rst --- CHANGELOG.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 3e51fc7a7..503655398 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -12,12 +12,13 @@ All notable changes to this project are documented in this file. - Fix various issues related to signing multi-signature transactions - Move some warnings and 'expected' errors to `DEBUG` level to avoid logging to console by default - Empty VerificationScripts for deployed contracts now work as intended -- Fix RPC's ``getaccountstate`` response schema to match ``neo-cli`` `#714 ` +- Fix RPC's ``getaccountstate`` response schema to match ``neo-cli`` `#714 `_ - Add fix to ensure tx is saved to wallet when sent using RPC -- Add bad peers to the ``getpeers`` RPC method `#715 ` +- Add bad peers to the ``getpeers`` RPC method `#715 `_ - Introduce Django inspired component loading for REST and RPC server - Allow a raw tx to be build without an active blockchain db in the environment - Fix unnecessary default bootstrap warning for mainnet showing. +- Add GET and OPTIONS request functionality for JSON-RPC servers [0.8.2] 2018-10-31