From 4802d70b7b13fb1fdd7ddbefb2c8a06b365a041d Mon Sep 17 00:00:00 2001 From: Kyle Altendorf Date: Mon, 11 Mar 2024 15:28:03 -0400 Subject: [PATCH 01/12] Revert "Delete unconfirmed Clawback TX" (#17681) Revert "Delete unconfirmed Clawback TX (#16454)" This reverts commit 59e7cd8e261ab08190186b741903b49b651d45b8. --- chia/wallet/wallet_state_manager.py | 13 ------------- tests/wallet/test_wallet.py | 4 ---- 2 files changed, 17 deletions(-) diff --git a/chia/wallet/wallet_state_manager.py b/chia/wallet/wallet_state_manager.py index 500ab050ab3c..04cb7c59f789 100644 --- a/chia/wallet/wallet_state_manager.py +++ b/chia/wallet/wallet_state_manager.py @@ -1891,19 +1891,6 @@ async def _add_coin_states( else: for rem_coin in tx_record.removals: if rem_coin == coin_state.coin: - if tx_record.type == TransactionType.OUTGOING_CLAWBACK.value: - # Check if the coin is spent by the current wallet - coin_spend = await fetch_coin_spend_for_coin_state(coin_state, peer) - new_coins = set(compute_spend_hints_and_additions(coin_spend).keys()) - # Check if the new coin belongs to the current wallet. - # Otherwise, we should remove the TX. - need_remove: bool = True - for added_coin in tx_record.additions: - if added_coin.name() in new_coins: - need_remove = False - break - if need_remove: - await self.tx_store.delete_transaction_record(tx_record.name) confirmed_tx_records.append(tx_record) for tx_record in confirmed_tx_records: diff --git a/tests/wallet/test_wallet.py b/tests/wallet/test_wallet.py index 84bc324cf8e0..f3edc665b54a 100644 --- a/tests/wallet/test_wallet.py +++ b/tests/wallet/test_wallet.py @@ -777,7 +777,6 @@ async def test_clawback_resync( wallet_1 = wallet_node_1.wallet_state_manager.main_wallet wallet_2 = wallet_node_2.wallet_state_manager.main_wallet api_1 = WalletRpcApi(wallet_node_1) - api_2 = WalletRpcApi(wallet_node_2) if trusted: wallet_node_1.config["trusted_peers"] = {full_node_server.node_id.hex(): full_node_server.node_id.hex()} wallet_node_2.config["trusted_peers"] = {full_node_server.node_id.hex(): full_node_server.node_id.hex()} @@ -842,9 +841,6 @@ async def test_clawback_resync( resp = await api_1.spend_clawback_coins(dict({"coin_ids": [clawback_coin_id_2.hex()], "fee": 0})) assert resp["success"] assert len(resp["transaction_ids"]) == 1 - resp = await api_2.spend_clawback_coins(dict({"coin_ids": [clawback_coin_id_1.hex()], "fee": 0})) - assert resp["success"] - assert len(resp["transaction_ids"]) == 1 expected_confirmed_balance += await full_node_api.farm_blocks_to_wallet(count=num_blocks, wallet=wallet_1) await time_out_assert( 20, wallet_node_1.wallet_state_manager.coin_store.count_small_unspent, 0, 1000, CoinType.CLAWBACK From 73174465a779f00ddc1b7e78b58ce8073203fb80 Mon Sep 17 00:00:00 2001 From: Kyle Altendorf Date: Mon, 11 Mar 2024 16:52:45 -0400 Subject: [PATCH 02/12] exclude 3.12 from main matrix (#17682) --- .github/workflows/test-single.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-single.yml b/.github/workflows/test-single.yml index 7724f200adb6..bd6e821933d4 100644 --- a/.github/workflows/test-single.yml +++ b/.github/workflows/test-single.yml @@ -100,7 +100,7 @@ jobs: matrix: '3.12' exclude_from: limited: True -# main: True + main: True exclude: - os: matrix: macos From 58cf78de04eedd866a8d735318c89d93fc34a58b Mon Sep 17 00:00:00 2001 From: Matt Hauff Date: Tue, 12 Mar 2024 13:50:21 -0700 Subject: [PATCH 03/12] Wallet Block Tools (#17580) * Remove consensus logic in part from wallet tests * Fix simulation test * Test coverage * test coverage * Improve handling of block_list_input in WalletBlockTools's get_consecutive_blocks. * Update tests/wallet/conftest.py Co-authored-by: Arvid Norberg * Address comments by @arvidn --------- Co-authored-by: Amine Khaldi Co-authored-by: Arvid Norberg --- chia/simulator/full_node_simulator.py | 3 +- pytest.ini | 1 + tests/simulation/test_simulation.py | 5 +- tests/wallet/conftest.py | 66 +++- tests/wallet/rpc/test_wallet_rpc.py | 6 +- .../simple_sync/test_simple_sync_protocol.py | 2 + tests/wallet/sync/test_wallet_sync.py | 3 + tests/wallet/test_wallet_blockchain.py | 1 + tests/wallet/test_wallet_key_val_store.py | 1 + tests/wallet/test_wallet_node.py | 2 + tests/wallet/wallet_block_tools.py | 323 ++++++++++++++++++ 11 files changed, 406 insertions(+), 7 deletions(-) create mode 100644 tests/wallet/wallet_block_tools.py diff --git a/chia/simulator/full_node_simulator.py b/chia/simulator/full_node_simulator.py index 5e1e140e3f65..d6a6c3787507 100644 --- a/chia/simulator/full_node_simulator.py +++ b/chia/simulator/full_node_simulator.py @@ -363,8 +363,9 @@ async def farm_blocks_to_wallet( original_peak_height = self.full_node.blockchain.get_peak_height() expected_peak_height = 0 if original_peak_height is None else original_peak_height + extra_blocks = [[False, False]] if original_peak_height is None else [] # Farm genesis block first - for to_wallet, tx_block in [*([[True, False]] * (count - 1)), [True, True], [False, True]]: + for to_wallet, tx_block in [*extra_blocks, *([[True, False]] * (count - 1)), [True, True], [False, True]]: # This complicated application of the last two blocks being transaction # blocks is due to the transaction blocks only including rewards from # blocks up until, and including, the previous transaction block. diff --git a/pytest.ini b/pytest.ini index 1ba22675f7f0..da4c129c45c7 100644 --- a/pytest.ini +++ b/pytest.ini @@ -7,6 +7,7 @@ console_output_style = count log_format = %(asctime)s %(name)s: %(levelname)s %(message)s markers = limit_consensus_modes + standard_block_tools data_layer: Mark as a data layer related test. test_mark_a1: used in testing test utilities test_mark_a2: used in testing test utilities diff --git a/tests/simulation/test_simulation.py b/tests/simulation/test_simulation.py index fe33a0af473b..6090b2502a2b 100644 --- a/tests/simulation/test_simulation.py +++ b/tests/simulation/test_simulation.py @@ -290,10 +290,11 @@ async def test_simulation_farm_blocks( rewards = await full_node_api.farm_blocks_to_wallet(count=count, wallet=wallet) # The requested number of blocks had been processed plus 1 to handle the final reward - # transactions in the case of a non-zero count. + # transactions in the case of a non-zero count. An additional +1 is added for the genesis block which does not + # farm rewards to the wallet. expected_height = count if count > 0: - expected_height += 1 + expected_height += 2 peak_height = full_node_api.full_node.blockchain.get_peak_height() if peak_height is None: diff --git a/tests/wallet/conftest.py b/tests/wallet/conftest.py index c258397165e1..7a378f4b948d 100644 --- a/tests/wallet/conftest.py +++ b/tests/wallet/conftest.py @@ -2,13 +2,15 @@ from contextlib import AsyncExitStack from dataclasses import replace -from typing import Any, AsyncIterator, Awaitable, Callable, Dict, List, Optional +from typing import Any, AsyncIterator, Awaitable, Callable, Dict, List, Literal, Optional, Tuple import pytest from chia.consensus.constants import ConsensusConstants +from chia.consensus.cost_calculator import NPCResult from chia.full_node.full_node import FullNode from chia.rpc.wallet_rpc_client import WalletRpcClient +from chia.types.blockchain_format.sized_bytes import bytes32 from chia.types.peer_info import PeerInfo from chia.util.ints import uint32, uint64, uint128 from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG, TXConfig @@ -16,6 +18,7 @@ from chia.wallet.wallet_state_manager import WalletStateManager from tests.environments.wallet import WalletEnvironment, WalletState, WalletTestFramework from tests.util.setup_nodes import setup_simulators_and_wallets_service +from tests.wallet.wallet_block_tools import WalletBlockTools @pytest.fixture(scope="function", autouse=True) @@ -30,6 +33,67 @@ async def mocked_synced(self: Any, block_is_current_at: Optional[uint64] = uint6 monkeypatch.setattr(FullNode, "synced", make_new_synced(FullNode.synced)) +@pytest.fixture(scope="function", autouse=True) +async def ignore_block_validation(request: pytest.FixtureRequest, monkeypatch: pytest.MonkeyPatch) -> None: + """ + This fixture exists to patch the existing BlockTools with WalletBlockTools and to patch existing code to work with + simplified blocks. This is done as a step towards the separation of the wallet into its own self contained project. + + Many consensus concepts are irrelevant when testing wallet code which generally only cares about the mempool's + acceptance of its spends and notifications of new representations of the coin set. One day, it would be good to + patch away the full node entirely in favor of the bare minimum logic to emulate the two features above. + + In addition, making truly consensus valid blocks is often slow so shortcutting the logic makes wallet tests as of + today (3/4/24) about ~30% faster. + """ + if "standard_block_tools" in request.keywords: + return None + + async def validate_block_body(*args: Any, **kwargs: Any) -> Tuple[Literal[None], NPCResult]: + return None, args[7] + + def create_wrapper(original_create: Any) -> Any: + async def new_create(*args: Any, **kwargs: Any) -> Any: + # Modify the config argument directly since it's a mutable dictionary + if "config" in kwargs: + kwargs["config"]["single_threaded"] = True + else: # pragma: no cover + # Nowhere covers this line right now but its entirely possible + args[0]["single_threaded"] = True + + # Call the original function with modified arguments + full_node = await original_create(*args, **kwargs) + return full_node + + return new_create + + monkeypatch.setattr("chia.simulator.block_tools.BlockTools", WalletBlockTools) + monkeypatch.setattr(FullNode, "create", create_wrapper(FullNode.create)) + monkeypatch.setattr("chia.consensus.blockchain.validate_block_body", validate_block_body) + monkeypatch.setattr( + "chia.consensus.block_header_validation.validate_unfinished_header_block", lambda *_, **__: (uint64(1), None) + ) + monkeypatch.setattr( + "chia.wallet.wallet_blockchain.validate_finished_header_block", lambda *_, **__: (uint64(1), None) + ) + monkeypatch.setattr( + "chia.consensus.multiprocess_validation.validate_finished_header_block", lambda *_, **__: (uint64(1), None) + ) + monkeypatch.setattr( + "chia.consensus.multiprocess_validation.verify_and_get_quality_string", lambda *_, **__: bytes32([0] * 32) + ) + monkeypatch.setattr("chia.consensus.block_record.BlockRecord.sp_total_iters", lambda *_: uint128(0)) + monkeypatch.setattr("chia.consensus.block_record.BlockRecord.ip_sub_slot_total_iters", lambda *_: uint128(0)) + monkeypatch.setattr("chia.consensus.make_sub_epoch_summary.calculate_sp_iters", lambda *_: uint64(0)) + monkeypatch.setattr("chia.consensus.make_sub_epoch_summary.calculate_ip_iters", lambda *_: uint64(0)) + monkeypatch.setattr("chia.consensus.difficulty_adjustment._get_next_sub_slot_iters", lambda *_: uint64(1)) + monkeypatch.setattr("chia.consensus.difficulty_adjustment._get_next_difficulty", lambda *_: uint64(1)) + monkeypatch.setattr("chia.full_node.full_node_store.calculate_sp_interval_iters", lambda *_: uint64(1)) + monkeypatch.setattr("chia.consensus.pot_iterations.calculate_sp_interval_iters", lambda *_: uint64(1)) + monkeypatch.setattr("chia.consensus.pot_iterations.calculate_ip_iters", lambda *_: uint64(1)) + monkeypatch.setattr("chia.consensus.block_record.BlockRecord.sp_sub_slot_total_iters", lambda *_: uint64(1)) + + @pytest.fixture(scope="function", params=[True, False]) def trusted_full_node(request: Any) -> bool: trusted: bool = request.param diff --git a/tests/wallet/rpc/test_wallet_rpc.py b/tests/wallet/rpc/test_wallet_rpc.py index 4c402c5a256f..9c1ad92d8821 100644 --- a/tests/wallet/rpc/test_wallet_rpc.py +++ b/tests/wallet/rpc/test_wallet_rpc.py @@ -114,7 +114,7 @@ class WalletRpcTestEnvironment: async def farm_transaction_block(full_node_api: FullNodeSimulator, wallet_node: WalletNode): - await full_node_api.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True) + await full_node_api.farm_blocks_to_puzzlehash(count=1) await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20) @@ -397,14 +397,14 @@ async def test_get_farmed_amount(wallet_rpc_environment: WalletRpcTestEnvironmen await full_node_api.farm_blocks_to_wallet(2, wallet) get_farmed_amount_result = await wallet_rpc_client.get_farmed_amount() - get_timestamp_for_height_result = await wallet_rpc_client.get_timestamp_for_height(uint32(2)) + get_timestamp_for_height_result = await wallet_rpc_client.get_timestamp_for_height(uint32(3)) # genesis + 2 expected_result = { "blocks_won": 2, "farmed_amount": 4_000_000_000_000, "farmer_reward_amount": 500_000_000_000, "fee_amount": 0, - "last_height_farmed": 2, + "last_height_farmed": 3, "last_time_farmed": get_timestamp_for_height_result, "pool_reward_amount": 3_500_000_000_000, "success": True, diff --git a/tests/wallet/simple_sync/test_simple_sync_protocol.py b/tests/wallet/simple_sync/test_simple_sync_protocol.py index 333606f74a7a..f1b77b2f0871 100644 --- a/tests/wallet/simple_sync/test_simple_sync_protocol.py +++ b/tests/wallet/simple_sync/test_simple_sync_protocol.py @@ -317,6 +317,7 @@ async def test_subscribe_for_coin_id(simulator_and_wallet: OldSimulatorsAndWalle @pytest.mark.anyio +@pytest.mark.standard_block_tools async def test_subscribe_for_ph_reorg(simulator_and_wallet: OldSimulatorsAndWallets, self_hostname: str) -> None: num_blocks = 4 long_blocks = 20 @@ -559,6 +560,7 @@ async def test_subscribe_for_puzzle_hash_coin_hint_duplicates( @pytest.mark.anyio +@pytest.mark.standard_block_tools async def test_subscribe_for_hint_long_sync( wallet_two_node_simulator: OldSimulatorsAndWallets, self_hostname: str ) -> None: diff --git a/tests/wallet/sync/test_wallet_sync.py b/tests/wallet/sync/test_wallet_sync.py index eb891edd4ccb..aa33fd1c5b83 100644 --- a/tests/wallet/sync/test_wallet_sync.py +++ b/tests/wallet/sync/test_wallet_sync.py @@ -63,6 +63,9 @@ async def get_nft_count(wallet: NFTWallet) -> int: log = getLogger(__name__) +pytestmark = pytest.mark.standard_block_tools + + @pytest.mark.limit_consensus_modes(reason="save time") @pytest.mark.anyio async def test_request_block_headers( diff --git a/tests/wallet/test_wallet_blockchain.py b/tests/wallet/test_wallet_blockchain.py index 8594402572f4..6775fcda3997 100644 --- a/tests/wallet/test_wallet_blockchain.py +++ b/tests/wallet/test_wallet_blockchain.py @@ -23,6 +23,7 @@ @pytest.mark.limit_consensus_modes(allowed=[ConsensusMode.PLAIN, ConsensusMode.HARD_FORK_2_0], reason="save time") @pytest.mark.anyio +@pytest.mark.standard_block_tools async def test_wallet_blockchain( simulator_and_wallet: OldSimulatorsAndWallets, default_1000_blocks: List[FullBlock] ) -> None: diff --git a/tests/wallet/test_wallet_key_val_store.py b/tests/wallet/test_wallet_key_val_store.py index c1c06380489f..60ad78e9709b 100644 --- a/tests/wallet/test_wallet_key_val_store.py +++ b/tests/wallet/test_wallet_key_val_store.py @@ -10,6 +10,7 @@ class TestWalletKeyValStore: @pytest.mark.anyio + @pytest.mark.standard_block_tools async def test_store(self, bt): async with DBConnection(1) as db_wrapper: store = await KeyValStore.create(db_wrapper) diff --git a/tests/wallet/test_wallet_node.py b/tests/wallet/test_wallet_node.py index 5b780d7c1991..92c0c234ce79 100644 --- a/tests/wallet/test_wallet_node.py +++ b/tests/wallet/test_wallet_node.py @@ -329,6 +329,7 @@ def test_timestamp_in_sync(root_path_populated_with_config: Path, testing: bool, @pytest.mark.anyio +@pytest.mark.standard_block_tools async def test_get_timestamp_for_height_from_peer( simulator_and_wallet: OldSimulatorsAndWallets, self_hostname: str, caplog: pytest.LogCaptureFixture ) -> None: @@ -393,6 +394,7 @@ async def test_unique_puzzle_hash_subscriptions(simulator_and_wallet: OldSimulat @pytest.mark.limit_consensus_modes(allowed=[ConsensusMode.PLAIN, ConsensusMode.HARD_FORK_2_0], reason="save time") @pytest.mark.anyio +@pytest.mark.standard_block_tools async def test_get_balance( simulator_and_wallet: OldSimulatorsAndWallets, self_hostname: str, default_400_blocks: List[FullBlock] ) -> None: diff --git a/tests/wallet/wallet_block_tools.py b/tests/wallet/wallet_block_tools.py new file mode 100644 index 000000000000..c080e0546140 --- /dev/null +++ b/tests/wallet/wallet_block_tools.py @@ -0,0 +1,323 @@ +from __future__ import annotations + +import time +from typing import Any, Dict, List, Optional, Tuple + +from chia_rs import G1Element, G2Element, compute_merkle_set_root +from chiabip158 import PyBIP158 + +from chia.consensus.block_record import BlockRecord +from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward +from chia.consensus.coinbase import create_farmer_coin, create_pool_coin +from chia.consensus.constants import ConsensusConstants +from chia.consensus.full_block_to_block_record import block_to_block_record +from chia.full_node.bundle_tools import simple_solution_generator +from chia.simulator.block_tools import BlockTools, compute_additions_unchecked +from chia.types.blockchain_format.classgroup import ClassgroupElement +from chia.types.blockchain_format.coin import Coin, hash_coin_ids +from chia.types.blockchain_format.foliage import Foliage, FoliageBlockData, FoliageTransactionBlock, TransactionsInfo +from chia.types.blockchain_format.pool_target import PoolTarget +from chia.types.blockchain_format.proof_of_space import ProofOfSpace +from chia.types.blockchain_format.reward_chain_block import RewardChainBlock, RewardChainBlockUnfinished +from chia.types.blockchain_format.sized_bytes import bytes32 +from chia.types.blockchain_format.vdf import VDFInfo, VDFProof +from chia.types.full_block import FullBlock +from chia.types.generator_types import BlockGenerator +from chia.types.spend_bundle import SpendBundle +from chia.types.unfinished_block import UnfinishedBlock +from chia.util.block_cache import BlockCache +from chia.util.hash import std_hash +from chia.util.ints import uint8, uint32, uint64, uint128 + +DEFAULT_PROOF_OF_SPACE = ProofOfSpace( + bytes32([0] * 32), + G1Element(), + None, + G1Element(), + uint8(20), + bytes(32 * 5), +) +DEFAULT_VDF_INFO = VDFInfo(bytes32([0] * 32), uint64(1), ClassgroupElement(bytes(100))) +DEFAULT_VDF_PROOF = VDFProof(uint8(0), bytes(100), False) + + +class WalletBlockTools(BlockTools): + """ + Tools to generate blocks for wallet testing. + (Differs from standard block tools by patching away as much consensus logic as possible) + """ + + def get_consecutive_blocks( + self, + num_blocks: int, + block_list_input: Optional[List[FullBlock]] = None, + *, + farmer_reward_puzzle_hash: Optional[bytes32] = None, + pool_reward_puzzle_hash: Optional[bytes32] = None, + transaction_data: Optional[SpendBundle] = None, + genesis_timestamp: Optional[uint64] = None, + **kwargs: Any, # We're overriding so there's many arguments no longer used. + ) -> List[FullBlock]: + assert num_blocks > 0 + constants = self.constants + + if farmer_reward_puzzle_hash is None: + farmer_reward_puzzle_hash = self.farmer_ph + + if block_list_input is None: + block_list_input = [] + + blocks: Dict[bytes32, BlockRecord] + if len(block_list_input) == 0: + height_to_hash = {} + blocks = {} + elif block_list_input[-1].header_hash == self._block_cache_header: + height_to_hash = self._block_cache_height_to_hash + blocks = self._block_cache + else: + height_to_hash, _, blocks = load_block_list(block_list_input, constants) + + if len(block_list_input) > 0: + latest_block: Optional[BlockRecord] = blocks[block_list_input[-1].header_hash] + assert latest_block is not None + assert latest_block.timestamp is not None + last_timestamp = latest_block.timestamp + else: + latest_block = None + last_timestamp = uint64((int(time.time()) if genesis_timestamp is None else genesis_timestamp) - 20) + + for _ in range(0, num_blocks): + additions = [] + removals = [] + block_generator: Optional[BlockGenerator] = None + if transaction_data is not None and len(block_list_input) > 0: + additions = compute_additions_unchecked(transaction_data) + removals = transaction_data.removals() + block_generator = simple_solution_generator(transaction_data) + pool_target = PoolTarget( + pool_reward_puzzle_hash if pool_reward_puzzle_hash is not None else self.pool_ph, uint32(0) + ) + + ( + full_block, + block_record, + new_timestamp, + ) = get_full_block_and_block_record( + constants, + blocks, + last_timestamp, + farmer_reward_puzzle_hash, + pool_target, + latest_block, + block_generator, + additions, + removals, + ) + + transaction_data = None + + last_timestamp = uint64(new_timestamp) + block_list_input.append(full_block) + blocks[full_block.header_hash] = block_record + height_to_hash[uint32(full_block.height)] = full_block.header_hash + latest_block = block_record + + self._block_cache_header = block_list_input[-1].header_hash + self._block_cache_height_to_hash = height_to_hash + self._block_cache_difficulty = uint64(1) + self._block_cache = blocks + return block_list_input + + +def load_block_list( + block_list: List[FullBlock], constants: ConsensusConstants +) -> Tuple[Dict[uint32, bytes32], uint64, Dict[bytes32, BlockRecord]]: + height_to_hash: Dict[uint32, bytes32] = {} + blocks: Dict[bytes32, BlockRecord] = {} + for full_block in block_list: + blocks[full_block.header_hash] = block_to_block_record( + constants, + BlockCache(blocks), + uint64(1), + full_block, + None, + ) + height_to_hash[uint32(full_block.height)] = full_block.header_hash + return height_to_hash, uint64(1), blocks + + +def finish_block( + constants: ConsensusConstants, + unfinished_block: UnfinishedBlock, + prev_block: Optional[BlockRecord], + blocks: Dict[bytes32, BlockRecord], +) -> Tuple[FullBlock, BlockRecord]: + if prev_block is None: + new_weight = uint128(1) + new_height = uint32(0) + else: + new_weight = uint128(prev_block.weight + 1) + new_height = uint32(prev_block.height + 1) + + full_block = FullBlock( + [], + RewardChainBlock( + new_weight, + new_height, + uint128(1), + uint8(1), + bytes32([0] * 32), + unfinished_block.reward_chain_block.proof_of_space, + DEFAULT_VDF_INFO, + G2Element(), + DEFAULT_VDF_INFO, + DEFAULT_VDF_INFO, + G2Element(), + DEFAULT_VDF_INFO, + DEFAULT_VDF_INFO, + prev_block is not None, + ), + DEFAULT_VDF_PROOF, + DEFAULT_VDF_PROOF, + DEFAULT_VDF_PROOF, + DEFAULT_VDF_PROOF, + DEFAULT_VDF_PROOF, + unfinished_block.foliage, + unfinished_block.foliage_transaction_block, + unfinished_block.transactions_info, + unfinished_block.transactions_generator, + [], + ) + + block_record = block_to_block_record(constants, BlockCache(blocks), uint64(1), full_block, None, uint64(1)) + return full_block, block_record + + +def get_full_block_and_block_record( + constants: ConsensusConstants, + blocks: Dict[bytes32, BlockRecord], + last_timestamp: uint64, + farmer_reward_puzzlehash: bytes32, + pool_target: PoolTarget, + prev_block: Optional[BlockRecord], + block_generator: Optional[BlockGenerator], + additions: List[Coin], + removals: List[Coin], +) -> Tuple[FullBlock, BlockRecord, float]: + timestamp = last_timestamp + 20 + if prev_block is None: + height: uint32 = uint32(0) + prev_block_hash: bytes32 = constants.GENESIS_CHALLENGE + else: + height = uint32(prev_block.height + 1) + prev_block_hash = prev_block.header_hash + + fees: uint64 = uint64(sum(c.amount for c in removals) - sum(c.amount for c in additions)) + + if height > 0: + assert prev_block is not None + additions.append( + create_pool_coin( + prev_block.height, + prev_block.pool_puzzle_hash, + calculate_pool_reward(prev_block.height), + constants.GENESIS_CHALLENGE, + ) + ) + additions.append( + create_farmer_coin( + prev_block.height, + prev_block.farmer_puzzle_hash, + uint64( + calculate_base_farmer_reward(prev_block.height) + prev_block.fees + if prev_block.fees is not None + else 0 + ), + constants.GENESIS_CHALLENGE, + ) + ) + + byte_array_tx: List[bytearray] = [] + removal_ids: List[bytes32] = [] + puzzlehash_coin_map: Dict[bytes32, List[bytes32]] = {} + for coin in additions: + puzzlehash_coin_map.setdefault(coin.puzzle_hash, []) + puzzlehash_coin_map[coin.puzzle_hash].append(coin.name()) + byte_array_tx.append(bytearray(coin.puzzle_hash)) + for coin in removals: + cname = coin.name() + removal_ids.append(cname) + byte_array_tx.append(bytearray(cname)) + bip158: PyBIP158 = PyBIP158(byte_array_tx) + filter_hash = std_hash(bytes(bip158.GetEncoded())) + + additions_merkle_items: List[bytes32] = [] + for puzzle, coin_ids in puzzlehash_coin_map.items(): + additions_merkle_items.append(puzzle) + additions_merkle_items.append(hash_coin_ids(coin_ids)) + + additions_root = bytes32(compute_merkle_set_root(additions_merkle_items)) + removals_root = bytes32(compute_merkle_set_root(removal_ids)) + + generator_hash = bytes32([0] * 32) + if block_generator is not None: + generator_hash = std_hash(block_generator.program) + + foliage_data = FoliageBlockData( + bytes32([0] * 32), + pool_target, + G2Element(), + farmer_reward_puzzlehash, + bytes32([0] * 32), + ) + + transactions_info = TransactionsInfo( + generator_hash, + bytes32([0] * 32), + G2Element(), + fees, + uint64(constants.MAX_BLOCK_COST_CLVM), + additions[-2:], + ) + + foliage_transaction_block = FoliageTransactionBlock( + prev_block_hash, + uint64(timestamp), + filter_hash, + additions_root, + removals_root, + transactions_info.get_hash(), + ) + + foliage = Foliage( + prev_block_hash, + bytes32([0] * 32), + foliage_data, + G2Element(), + foliage_transaction_block.get_hash(), + G2Element(), + ) + unfinished_block = UnfinishedBlock( + [], + RewardChainBlockUnfinished( + uint128(1), + uint8(1), + bytes32([0] * 32), + DEFAULT_PROOF_OF_SPACE, + None, + G2Element(), + None, + G2Element(), + ), + None, + None, + foliage, + foliage_transaction_block, + transactions_info, + block_generator.program if block_generator else None, + [], + ) + + full_block, block_record = finish_block(constants, unfinished_block, prev_block, blocks) + + return full_block, block_record, timestamp From 1d37bb1b96a41b5adfab0702fa413236ef5eba01 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 12 Mar 2024 13:50:57 -0700 Subject: [PATCH 04/12] CA Cert updates (#17691) adding ca updates Co-authored-by: ChiaAutomation --- mozilla-ca | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mozilla-ca b/mozilla-ca index 32e2cb05b174..0d3a67c2d346 160000 --- a/mozilla-ca +++ b/mozilla-ca @@ -1 +1 @@ -Subproject commit 32e2cb05b1745eca7df43b9324c2a9184b37a014 +Subproject commit 0d3a67c2d3461b74903a951292c95733166a5bad From a7724e0387f0df86ea0b60b2e2a06bbe5abfce61 Mon Sep 17 00:00:00 2001 From: Arvid Norberg Date: Wed, 13 Mar 2024 17:07:36 +0100 Subject: [PATCH 05/12] tighten up the check for duplicate UnfinishedBlocks before requesting (#17606) * tighten up the check for duplicate UnfinishedBlocks before requesting them * improve comment. rename private member with an underscore prefix * improve variable names --- chia/full_node/full_node.py | 24 ++-- chia/full_node/full_node_api.py | 26 ++-- chia/full_node/full_node_store.py | 129 +++++++++++------- .../full_node/stores/test_full_node_store.py | 129 +++++++++++------- tests/core/full_node/test_full_node.py | 20 +-- 5 files changed, 201 insertions(+), 127 deletions(-) diff --git a/chia/full_node/full_node.py b/chia/full_node/full_node.py index 52c6c4115a2a..3423d713d52a 100644 --- a/chia/full_node/full_node.py +++ b/chia/full_node/full_node.py @@ -47,7 +47,7 @@ from chia.full_node.bundle_tools import detect_potential_template_generator from chia.full_node.coin_store import CoinStore from chia.full_node.full_node_api import FullNodeAPI -from chia.full_node.full_node_store import FullNodeStore, FullNodeStorePeakResult +from chia.full_node.full_node_store import FullNodeStore, FullNodeStorePeakResult, UnfinishedBlockEntry from chia.full_node.hint_management import get_hints_and_subscription_coin_ids from chia.full_node.hint_store import HintStore from chia.full_node.mempool_manager import MempoolManager @@ -1667,19 +1667,27 @@ async def add_block( # This is the case where we already had the unfinished block, and asked for this block without # the transactions (since we already had them). Therefore, here we add the transactions. unfinished_rh: bytes32 = block.reward_chain_block.get_unfinished().get_hash() - unf_block: Optional[UnfinishedBlock] = self.full_node_store.get_unfinished_block(unfinished_rh) + foliage_hash: Optional[bytes32] = block.foliage.foliage_transaction_block_hash + assert foliage_hash is not None + unf_entry: Optional[UnfinishedBlockEntry] = self.full_node_store.get_unfinished_block_result( + unfinished_rh, foliage_hash + ) if ( - unf_block is not None - and unf_block.transactions_generator is not None - and unf_block.foliage_transaction_block == block.foliage_transaction_block + unf_entry is not None + and unf_entry.unfinished_block is not None + and unf_entry.unfinished_block.transactions_generator is not None + and unf_entry.unfinished_block.foliage_transaction_block == block.foliage_transaction_block ): # We checked that the transaction block is the same, therefore all transactions and the signature # must be identical in the unfinished and finished blocks. We can therefore use the cache. - pre_validation_result = self.full_node_store.get_unfinished_block_result(unfinished_rh) + + # this is a transaction block, the foliage hash should be set + assert foliage_hash is not None + pre_validation_result = unf_entry.result assert pre_validation_result is not None block = block.replace( - transactions_generator=unf_block.transactions_generator, - transactions_generator_ref_list=unf_block.transactions_generator_ref_list, + transactions_generator=unf_entry.unfinished_block.transactions_generator, + transactions_generator_ref_list=unf_entry.unfinished_block.transactions_generator_ref_list, ) else: # We still do not have the correct information for this block, perhaps there is a duplicate block diff --git a/chia/full_node/full_node_api.py b/chia/full_node/full_node_api.py index fd74f5eee5ae..eab9ae644024 100644 --- a/chia/full_node/full_node_api.py +++ b/chia/full_node/full_node_api.py @@ -428,27 +428,25 @@ async def new_unfinished_block( return None # This prevents us from downloading the same block from many peers - if block_hash in self.full_node.full_node_store.requesting_unfinished_blocks: - return None - - # if we've already learned about an unfinished block with this reward - # hash via the v2 protocol, and we've requested it. Assume it's the same - # block - if block_hash in self.full_node.full_node_store.requesting_unfinished_blocks2: + requesting, count = self.full_node.full_node_store.is_requesting_unfinished_block(block_hash, None) + if requesting: + self.log.debug( + f"Already have or requesting {count} Unfinished Blocks with partial " + f"hash {block_hash}. Ignoring this one" + ) return None msg = make_msg( ProtocolMessageTypes.request_unfinished_block, full_node_protocol.RequestUnfinishedBlock(block_hash), ) - self.full_node.full_node_store.requesting_unfinished_blocks.add(block_hash) + self.full_node.full_node_store.mark_requesting_unfinished_block(block_hash, None) # However, we want to eventually download from other peers, if this peer does not respond # Todo: keep track of who it was async def eventually_clear() -> None: await asyncio.sleep(5) - if block_hash in self.full_node.full_node_store.requesting_unfinished_blocks: - self.full_node.full_node_store.requesting_unfinished_blocks.remove(block_hash) + self.full_node.full_node_store.remove_requesting_unfinished_block(block_hash, None) asyncio.create_task(eventually_clear()) @@ -497,7 +495,13 @@ async def new_unfinished_block2( return None # This prevents us from downloading the same block from many peers - if self.full_node.full_node_store.is_requesting_unfinished_block(block_hash, foliage_hash): + requesting, count = self.full_node.full_node_store.is_requesting_unfinished_block(block_hash, foliage_hash) + if requesting: + return None + if count >= max_duplicate_unfinished_blocks: + self.log.info( + f"Already requesting {count} Unfinished Blocks with partial hash {block_hash} ignoring another one" + ) return None msg = make_msg( diff --git a/chia/full_node/full_node_store.py b/chia/full_node/full_node_store.py index 10c280cb8e48..e36dcd637950 100644 --- a/chia/full_node/full_node_store.py +++ b/chia/full_node/full_node_store.py @@ -40,8 +40,12 @@ class FullNodeStorePeakResult(Streamable): @dataclasses.dataclass class UnfinishedBlockEntry: - unfinished_block: UnfinishedBlock - result: PreValidationResult + # if this is None, it means we've requested this block but not yet received + # it + unfinished_block: Optional[UnfinishedBlock] + # If this is None, it means we've initiated validation of this block, but it + # hasn't completed yet + result: Optional[PreValidationResult] height: uint32 @@ -57,13 +61,27 @@ def find_best_block( all_blocks = list(result.items()) if len(all_blocks) == 1: - return all_blocks[0][0], all_blocks[0][1].unfinished_block + foliage_hash, entry = all_blocks[0] + # this means we don't have the block yet + if entry.unfinished_block is None: + return None, None + else: + return foliage_hash, entry.unfinished_block + + def include_block(item: Tuple[Optional[bytes32], UnfinishedBlockEntry]) -> bool: + foliage_hash, entry = item + return foliage_hash is not None and entry.unfinished_block is not None # if there are unfinished blocks with foliage (i.e. not None) we prefer # those, so drop the first element - all_blocks = [e for e in all_blocks if e[0] is not None] + all_blocks = [e for e in all_blocks if include_block(e)] all_blocks = sorted(all_blocks) + # we may have filtered out some blocks that we have only requested, but not + # yet received. + if len(all_blocks) == 0: + return None, None + return all_blocks[0][0], all_blocks[0][1].unfinished_block @@ -84,7 +102,13 @@ class FullNodeStore: # There may be multiple different unfinished blocks with the same partial # hash (reward chain block hash). They are stored under their partial hash # though. The inner dictionary uses the foliage hash as the key - unfinished_blocks: Dict[bytes32, Dict[Optional[bytes32], UnfinishedBlockEntry]] + # The UnfinishedBlockEntry is a placeholder for UnfinishedBlocks we have + # requested (but don't have yet) or that we have but haven't completed + # validation of (yet). + # The inner key (the foliage hash) is Optional, where None either means + # it's not a transaction block, or it's a block we learned about via the old + # protocol, where all we get is the reward block hash. + _unfinished_blocks: Dict[bytes32, Dict[Optional[bytes32], UnfinishedBlockEntry]] # Finished slots and sps from the peak's slot onwards # We store all 32 SPs for each slot, starting as 32 Nones and filling them as we go @@ -111,13 +135,6 @@ class FullNodeStore: recent_signage_points: LRUCache[bytes32, Tuple[SignagePoint, float]] recent_eos: LRUCache[bytes32, Tuple[EndOfSubSlotBundle, float]] - # Partial hashes of unfinished blocks we are requesting - requesting_unfinished_blocks: Set[bytes32] - - # with the updated protocol for UnfinishedBlocks, when we request a block - # with a specific foliage hash, we add the outstanding request to this dict - requesting_unfinished_blocks2: Dict[bytes32, Set[Optional[bytes32]]] - previous_generator: Optional[CompressorArg] pending_tx_request: Dict[bytes32, bytes32] # tx_id: peer_id peers_with_tx: Dict[bytes32, Set[bytes32]] # tx_id: Set[peer_ids} @@ -131,15 +148,13 @@ def __init__(self, constants: ConsensusConstants): self.candidate_blocks = {} self.candidate_backup_blocks = {} self.seen_unfinished_blocks = {} - self.unfinished_blocks = {} + self._unfinished_blocks = {} self.finished_sub_slots = [] self.future_eos_cache = {} self.future_sp_cache = {} self.future_ip_cache = {} self.recent_signage_points = LRUCache(500) self.recent_eos = LRUCache(50) - self.requesting_unfinished_blocks = set() - self.requesting_unfinished_blocks2 = {} self.previous_generator = None self.future_cache_key_times = {} self.constants = constants @@ -152,21 +167,43 @@ def __init__(self, constants: ConsensusConstants): self.serialized_wp_message_tip = None self.max_seen_unfinished_blocks = 1000 - def is_requesting_unfinished_block(self, reward_block_hash: bytes32, foliage_hash: Optional[bytes32]) -> bool: - ents = self.requesting_unfinished_blocks2.get(reward_block_hash) - return ents is not None and foliage_hash in ents + def is_requesting_unfinished_block( + self, reward_block_hash: bytes32, foliage_hash: Optional[bytes32] + ) -> Tuple[bool, int]: + """ + Asks if we are already requesting this specific unfinished block (given + the reward block hash and foliage hash). The returned bool is true if we + are and false otherwise. The function also returns the number of + variants of an unfinished block with this reward block hash we are + currently requesting. This is useful to ensure we limit the number of + variants we request. + """ + ents = self._unfinished_blocks.get(reward_block_hash) + if ents is None: + return (False, 0) + elif foliage_hash is None: + return (len(ents) > 0, len(ents)) + else: + return (foliage_hash in ents, len(ents)) def mark_requesting_unfinished_block(self, reward_block_hash: bytes32, foliage_hash: Optional[bytes32]) -> None: - ents = self.requesting_unfinished_blocks2.setdefault(reward_block_hash, set()) - ents.add(foliage_hash) + ents = self._unfinished_blocks.setdefault(reward_block_hash, {}) + ents.setdefault(foliage_hash, UnfinishedBlockEntry(None, None, uint32(0))) def remove_requesting_unfinished_block(self, reward_block_hash: bytes32, foliage_hash: Optional[bytes32]) -> None: - ents = self.requesting_unfinished_blocks2.get(reward_block_hash) - if ents is None: + reward_ents = self._unfinished_blocks.get(reward_block_hash) + if reward_ents is None: + return + foliage_ent = reward_ents.get(foliage_hash) + if foliage_ent is None: return - ents.discard(foliage_hash) - if len(ents) == 0: - del self.requesting_unfinished_blocks2[reward_block_hash] + if foliage_ent.unfinished_block is not None: + # in this case we've successfully received the unfinished block, + # it's already considered "not requesting", but actually downloaded + return + del reward_ents[foliage_hash] + if len(reward_ents) == 0: + del self._unfinished_blocks[reward_block_hash] def add_candidate_block( self, quality_string: bytes32, height: uint32, unfinished_block: UnfinishedBlock, backup: bool = False @@ -218,13 +255,13 @@ def add_unfinished_block( self, height: uint32, unfinished_block: UnfinishedBlock, result: PreValidationResult ) -> None: partial_hash = unfinished_block.partial_hash - entry = self.unfinished_blocks.setdefault(partial_hash, {}) + entry = self._unfinished_blocks.setdefault(partial_hash, {}) entry[unfinished_block.foliage.foliage_transaction_block_hash] = UnfinishedBlockEntry( unfinished_block, result, height ) def get_unfinished_block(self, unfinished_reward_hash: bytes32) -> Optional[UnfinishedBlock]: - result = self.unfinished_blocks.get(unfinished_reward_hash, None) + result = self._unfinished_blocks.get(unfinished_reward_hash, None) if result is None: return None # The old API doesn't distinguish between duplicate UnfinishedBlocks, @@ -252,11 +289,12 @@ def get_unfinished_block2( 3. whether we already have a "better" UnfinishedBlock candidate than this """ - result = self.unfinished_blocks.get(unfinished_reward_hash, None) + result = self._unfinished_blocks.get(unfinished_reward_hash, None) if result is None: return None, 0, False if unfinished_foliage_hash is None: - return self.get_unfinished_block(unfinished_reward_hash), len(result), False + foliage_hash, block = find_best_block(result) + return block, len(result), False foliage_hash, block = find_best_block(result) has_better: bool = foliage_hash is not None and foliage_hash < unfinished_foliage_hash @@ -268,36 +306,29 @@ def get_unfinished_block2( else: return entry.unfinished_block, len(result), has_better - def get_unfinished_block_result(self, unfinished_reward_hash: bytes32) -> Optional[PreValidationResult]: - result = self.unfinished_blocks.get(unfinished_reward_hash, None) + # we only have PreValidationResults for transaction blocks, and they all + # have a foliage hash. That's why unfinished_foliage_hash is not Optional. + def get_unfinished_block_result( + self, unfinished_reward_hash: bytes32, unfinished_foliage_hash: bytes32 + ) -> Optional[UnfinishedBlockEntry]: + result = self._unfinished_blocks.get(unfinished_reward_hash, None) if result is None: return None - return next(iter(result.values())).result - - def get_unfinished_block_result2( - self, unfinished_reward_hash: bytes32, unfinished_foliage_hash: Optional[bytes32] - ) -> Optional[PreValidationResult]: - result = self.unfinished_blocks.get(unfinished_reward_hash, None) - if result is None: - return None - if unfinished_foliage_hash is None: - return next(iter(result.values())).result else: - entry = result.get(unfinished_foliage_hash) - return None if entry is None else entry.result + return result.get(unfinished_foliage_hash) # returns all unfinished blocks for the specified height def get_unfinished_blocks(self, height: uint32) -> List[UnfinishedBlock]: ret: List[UnfinishedBlock] = [] - for entry in self.unfinished_blocks.values(): + for entry in self._unfinished_blocks.values(): for ube in entry.values(): - if ube.height == height: + if ube.height == height and ube.unfinished_block is not None: ret.append(ube.unfinished_block) return ret def clear_unfinished_blocks_below(self, height: uint32) -> None: del_partial: List[bytes32] = [] - for partial_hash, entry in self.unfinished_blocks.items(): + for partial_hash, entry in self._unfinished_blocks.items(): del_foliage: List[Optional[bytes32]] = [] for foliage_hash, ube in entry.items(): if ube.height < height: @@ -307,12 +338,12 @@ def clear_unfinished_blocks_below(self, height: uint32) -> None: if len(entry) == 0: del_partial.append(partial_hash) for ph in del_partial: - del self.unfinished_blocks[ph] + del self._unfinished_blocks[ph] # TODO: this should be removed. It's only used by a test def remove_unfinished_block(self, partial_reward_hash: bytes32) -> None: - if partial_reward_hash in self.unfinished_blocks: - del self.unfinished_blocks[partial_reward_hash] + if partial_reward_hash in self._unfinished_blocks: + del self._unfinished_blocks[partial_reward_hash] def add_to_future_ip(self, infusion_point: timelord_protocol.NewInfusionPointVDF) -> None: ch: bytes32 = infusion_point.reward_chain_ip_vdf.challenge diff --git a/tests/core/full_node/stores/test_full_node_store.py b/tests/core/full_node/stores/test_full_node_store.py index 1df966f6a5e3..aa0256c8d3d3 100644 --- a/tests/core/full_node/stores/test_full_node_store.py +++ b/tests/core/full_node/stores/test_full_node_store.py @@ -3,7 +3,7 @@ import dataclasses import logging import random -from typing import AsyncIterator, Dict, List, Optional +from typing import AsyncIterator, Dict, List, Optional, Tuple import pytest @@ -117,27 +117,40 @@ async def test_unfinished_block_rank( @pytest.mark.anyio +@pytest.mark.limit_consensus_modes(reason="save time") @pytest.mark.parametrize( "blocks,expected", [ - ([None, 1, 2, 3], 1), - ([None], None), + ([(None, True), (1, True), (2, True), (3, True)], 1), + ([(None, True), (1, False), (2, True), (3, True)], 2), + ([(None, True), (1, False), (2, False), (3, True)], 3), + ([(None, True)], None), ([], None), - ([4, 5, 3], 3), - ([4], 4), + ([(4, True), (5, True), (3, True)], 3), + ([(4, True)], 4), + ([(4, False)], None), ], ) async def test_find_best_block( seeded_random: random.Random, - blocks: List[Optional[int]], + blocks: List[Tuple[Optional[int], bool]], expected: Optional[int], + default_400_blocks: List[FullBlock], + bt: BlockTools, ) -> None: result: Dict[Optional[bytes32], UnfinishedBlockEntry] = {} - for b in blocks: + i = 0 + for b, with_unf in blocks: + unf: Optional[UnfinishedBlock] + if with_unf: + unf = make_unfinished_block(default_400_blocks[i], bt.constants) + i += 1 + else: + unf = None if b is None: - result[b] = UnfinishedBlockEntry(None, None, 123) # type: ignore + result[b] = UnfinishedBlockEntry(unf, None, uint32(123)) else: - result[bytes32(b.to_bytes(1, "big") * 32)] = UnfinishedBlockEntry(None, None, 123) # type: ignore + result[bytes32(b.to_bytes(1, "big") * 32)] = UnfinishedBlockEntry(unf, None, uint32(123)) foliage_hash, block = find_best_block(result) if expected is None: @@ -224,13 +237,22 @@ async def test_basic_store( foliage_hash is not None and dummy_hash > foliage_hash, ) - ublock = store.get_unfinished_block_result(unf_block.partial_hash) - assert ublock is not None and ublock.required_iters == uint64(123532) - ublock = store.get_unfinished_block_result2( - unf_block.partial_hash, unf_block.foliage.foliage_transaction_block_hash - ) + # only transaction blocks have PreValidationResults + # so get_unfinished_block_result requires the foliage hash + if unf_block.foliage.foliage_transaction_block_hash is not None: + entry = store.get_unfinished_block_result( + unf_block.partial_hash, unf_block.foliage.foliage_transaction_block_hash + ) + assert entry is not None + ublock = entry.result + assert ublock is not None and ublock.required_iters == uint64(123532) + entry = store.get_unfinished_block_result( + unf_block.partial_hash, unf_block.foliage.foliage_transaction_block_hash + ) + assert entry is not None + ublock = entry.result - assert ublock is not None and ublock.required_iters == uint64(123532) + assert ublock is not None and ublock.required_iters == uint64(123532) store.remove_unfinished_block(unf_block.partial_hash) assert store.get_unfinished_block(unf_block.partial_hash) is None @@ -289,17 +311,22 @@ async def test_basic_store( ) assert store.get_unfinished_block2(unf4.partial_hash, None) == (unf1, 2, False) - ublock = store.get_unfinished_block_result(unf1.partial_hash) + entry = store.get_unfinished_block_result(unf1.partial_hash, unf1.foliage.foliage_transaction_block_hash) + assert entry is not None + ublock = entry.result assert ublock is not None and ublock.required_iters == uint64(0) - ublock = store.get_unfinished_block_result2(unf1.partial_hash, unf1.foliage.foliage_transaction_block_hash) + entry = store.get_unfinished_block_result(unf1.partial_hash, unf1.foliage.foliage_transaction_block_hash) + assert entry is not None + ublock = entry.result assert ublock is not None and ublock.required_iters == uint64(0) # still, when not specifying a foliage hash, you just get the first ublock - ublock = store.get_unfinished_block_result2(unf1.partial_hash, None) + entry = store.get_unfinished_block_result(unf1.partial_hash, unf1.foliage.foliage_transaction_block_hash) + assert entry is not None + ublock = entry.result assert ublock is not None and ublock.required_iters == uint64(0) # negative test cases - assert store.get_unfinished_block_result(bytes32([1] * 32)) is None - assert store.get_unfinished_block_result2(bytes32([1] * 32), None) is None + assert store.get_unfinished_block_result(bytes32([1] * 32), bytes32([2] * 32)) is None blocks = custom_block_tools.get_consecutive_blocks( 1, @@ -1141,50 +1168,50 @@ async def test_mark_requesting( b = bytes32.random(seeded_random) c = bytes32.random(seeded_random) - assert not store.is_requesting_unfinished_block(a, a) - assert not store.is_requesting_unfinished_block(a, b) - assert not store.is_requesting_unfinished_block(a, c) - assert not store.is_requesting_unfinished_block(b, b) - assert not store.is_requesting_unfinished_block(c, c) + assert store.is_requesting_unfinished_block(a, a) == (False, 0) + assert store.is_requesting_unfinished_block(a, b) == (False, 0) + assert store.is_requesting_unfinished_block(a, c) == (False, 0) + assert store.is_requesting_unfinished_block(b, b) == (False, 0) + assert store.is_requesting_unfinished_block(c, c) == (False, 0) store.mark_requesting_unfinished_block(a, b) - assert store.is_requesting_unfinished_block(a, b) - assert not store.is_requesting_unfinished_block(a, c) - assert not store.is_requesting_unfinished_block(a, a) - assert not store.is_requesting_unfinished_block(b, c) - assert not store.is_requesting_unfinished_block(b, b) + assert store.is_requesting_unfinished_block(a, b) == (True, 1) + assert store.is_requesting_unfinished_block(a, c) == (False, 1) + assert store.is_requesting_unfinished_block(a, a) == (False, 1) + assert store.is_requesting_unfinished_block(b, c) == (False, 0) + assert store.is_requesting_unfinished_block(b, b) == (False, 0) store.mark_requesting_unfinished_block(a, c) - assert store.is_requesting_unfinished_block(a, b) - assert store.is_requesting_unfinished_block(a, c) - assert not store.is_requesting_unfinished_block(a, a) - assert not store.is_requesting_unfinished_block(b, c) - assert not store.is_requesting_unfinished_block(b, b) + assert store.is_requesting_unfinished_block(a, b) == (True, 2) + assert store.is_requesting_unfinished_block(a, c) == (True, 2) + assert store.is_requesting_unfinished_block(a, a) == (False, 2) + assert store.is_requesting_unfinished_block(b, c) == (False, 0) + assert store.is_requesting_unfinished_block(b, b) == (False, 0) # this is a no-op store.remove_requesting_unfinished_block(a, a) store.remove_requesting_unfinished_block(c, a) - assert store.is_requesting_unfinished_block(a, b) - assert store.is_requesting_unfinished_block(a, c) - assert not store.is_requesting_unfinished_block(a, a) - assert not store.is_requesting_unfinished_block(b, c) - assert not store.is_requesting_unfinished_block(b, b) + assert store.is_requesting_unfinished_block(a, b) == (True, 2) + assert store.is_requesting_unfinished_block(a, c) == (True, 2) + assert store.is_requesting_unfinished_block(a, a) == (False, 2) + assert store.is_requesting_unfinished_block(b, c) == (False, 0) + assert store.is_requesting_unfinished_block(b, b) == (False, 0) store.remove_requesting_unfinished_block(a, b) - assert not store.is_requesting_unfinished_block(a, b) - assert store.is_requesting_unfinished_block(a, c) - assert not store.is_requesting_unfinished_block(a, a) - assert not store.is_requesting_unfinished_block(b, c) - assert not store.is_requesting_unfinished_block(b, b) + assert store.is_requesting_unfinished_block(a, b) == (False, 1) + assert store.is_requesting_unfinished_block(a, c) == (True, 1) + assert store.is_requesting_unfinished_block(a, a) == (False, 1) + assert store.is_requesting_unfinished_block(b, c) == (False, 0) + assert store.is_requesting_unfinished_block(b, b) == (False, 0) store.remove_requesting_unfinished_block(a, c) - assert not store.is_requesting_unfinished_block(a, b) - assert not store.is_requesting_unfinished_block(a, c) - assert not store.is_requesting_unfinished_block(a, a) - assert not store.is_requesting_unfinished_block(b, c) - assert not store.is_requesting_unfinished_block(b, b) + assert store.is_requesting_unfinished_block(a, b) == (False, 0) + assert store.is_requesting_unfinished_block(a, c) == (False, 0) + assert store.is_requesting_unfinished_block(a, a) == (False, 0) + assert store.is_requesting_unfinished_block(b, c) == (False, 0) + assert store.is_requesting_unfinished_block(b, b) == (False, 0) - assert len(store.requesting_unfinished_blocks) == 0 + assert len(store._unfinished_blocks) == 0 diff --git a/tests/core/full_node/test_full_node.py b/tests/core/full_node/test_full_node.py index f04a32beab9a..9cc651e5bd4b 100644 --- a/tests/core/full_node/test_full_node.py +++ b/tests/core/full_node/test_full_node.py @@ -749,7 +749,11 @@ async def test_respond_unfinished(self, wallet_nodes, self_hostname): assert full_node_1.full_node.full_node_store.get_unfinished_block(unf.partial_hash) is None await full_node_1.full_node.add_unfinished_block(unf, None) assert full_node_1.full_node.full_node_store.get_unfinished_block(unf.partial_hash) is not None - result = full_node_1.full_node.full_node_store.get_unfinished_block_result(unf.partial_hash) + entry = full_node_1.full_node.full_node_store.get_unfinished_block_result( + unf.partial_hash, unf.foliage.foliage_transaction_block_hash + ) + assert entry is not None + result = entry.result assert result is not None assert result.npc_result is not None assert result.npc_result.conds is not None @@ -1219,12 +1223,12 @@ async def test_new_unfinished_block(self, wallet_nodes, peer_version: str, reque # Don't have if requesting == 1: - full_node_1.full_node.full_node_store.requesting_unfinished_blocks.add(unf.partial_hash) + full_node_1.full_node.full_node_store.mark_requesting_unfinished_block(unf.partial_hash, None) res = await full_node_1.new_unfinished_block(fnp.NewUnfinishedBlock(unf.partial_hash)) assert res is None elif requesting == 2: - full_node_1.full_node.full_node_store.requesting_unfinished_blocks2.setdefault(unf.partial_hash, set()).add( - unf.foliage.foliage_transaction_block_hash + full_node_1.full_node.full_node_store.mark_requesting_unfinished_block( + unf.partial_hash, unf.foliage.foliage_transaction_block_hash ) res = await full_node_1.new_unfinished_block(fnp.NewUnfinishedBlock(unf.partial_hash)) assert res is None @@ -1274,11 +1278,11 @@ async def test_new_unfinished_block2(self, wallet_nodes, requesting: int, self_h # Don't have if requesting == 1: - full_node_1.full_node.full_node_store.requesting_unfinished_blocks.add(unf.partial_hash) + full_node_1.full_node.full_node_store.mark_requesting_unfinished_block(unf.partial_hash, None) if requesting == 2: - full_node_1.full_node.full_node_store.requesting_unfinished_blocks2.setdefault(unf.partial_hash, set()).add( - unf.foliage.foliage_transaction_block_hash + full_node_1.full_node.full_node_store.mark_requesting_unfinished_block( + unf.partial_hash, unf.foliage.foliage_transaction_block_hash ) res = await full_node_1.new_unfinished_block2( fnp.NewUnfinishedBlock2(unf.partial_hash, unf.foliage.foliage_transaction_block_hash) @@ -1350,7 +1354,7 @@ def sort_key(b: UnfinishedBlock) -> bytes32: fnp.NewUnfinishedBlock2(unf.partial_hash, unf.foliage.foliage_transaction_block_hash) ) # 3 is the default number of different unfinished blocks we forward - if idx <= 3: + if idx < 3: # Don't have assert res is not None and res.data == bytes( fnp.RequestUnfinishedBlock2(unf.partial_hash, unf.foliage.foliage_transaction_block_hash) From 48e4039e58e945d6e047c09a95b64a77880b4de7 Mon Sep 17 00:00:00 2001 From: Earle Lowe <30607889+emlowe@users.noreply.github.com> Date: Wed, 13 Mar 2024 11:08:19 -0700 Subject: [PATCH 06/12] Update black to 24.1.1 and update source as needed (#17499) * Update source to black 24 spec * update black to 24.1.1 * update pylint to ignore multiple-statements * update test file * black updates * format updates * Update test_network_protocol_files.py * Update test_network_protocol_files.py --- .flake8 | 1 + chia/cmds/cmds_util.py | 8 +- chia/cmds/wallet_funcs.py | 20 +- chia/consensus/block_record.py | 15 +- chia/daemon/server.py | 3 +- chia/data_layer/data_layer_wallet.py | 34 +-- chia/farmer/farmer_api.py | 12 +- chia/full_node/full_node_api.py | 8 +- chia/full_node/weight_proof.py | 16 +- chia/plot_sync/sender.py | 3 +- chia/plotters/chiapos.py | 1 + chia/pools/pool_wallet.py | 6 +- chia/rpc/data_layer_rpc_util.py | 6 +- chia/rpc/rpc_server.py | 6 +- chia/rpc/wallet_rpc_api.py | 90 ++++--- chia/rpc/wallet_rpc_client.py | 6 +- chia/server/api_protocol.py | 3 +- chia/server/chia_policy.py | 27 +-- chia/server/ws_connection.py | 7 +- chia/simulator/block_tools.py | 12 +- chia/simulator/full_node_simulator.py | 16 +- chia/simulator/simulator_test_tools.py | 12 +- chia/util/async_pool.py | 12 +- chia/util/hash.py | 9 +- chia/util/keyring_wrapper.py | 9 +- chia/util/misc.py | 6 +- chia/util/struct_stream.py | 3 +- chia/util/timing.py | 6 +- chia/wallet/cat_wallet/cat_wallet.py | 18 +- chia/wallet/conditions.py | 14 +- chia/wallet/driver_protocol.py | 20 +- chia/wallet/nft_wallet/nft_wallet.py | 14 +- .../wallet/puzzles/p2_delegated_conditions.py | 1 - .../p2_delegated_puzzle_or_hidden_puzzle.py | 1 + chia/wallet/trade_manager.py | 48 ++-- chia/wallet/util/puzzle_decorator.py | 15 +- chia/wallet/vc_wallet/cr_cat_wallet.py | 22 +- chia/wallet/wallet.py | 18 +- chia/wallet/wallet_nft_store.py | 8 +- chia/wallet/wallet_protocol.py | 39 +-- chia/wallet/wallet_state_manager.py | 34 +-- pylintrc | 1 + setup.py | 2 +- tests/conftest.py | 10 +- tests/core/data_layer/util.py | 6 +- .../core/full_node/stores/test_coin_store.py | 8 +- tests/core/server/serve.py | 6 +- tests/core/services/test_services.py | 3 +- tests/core/util/test_keyring_wrapper.py | 5 +- tests/environments/common.py | 15 +- tests/environments/wallet.py | 14 +- tests/farmer_harvester/test_farmer.py | 16 +- tests/util/misc.py | 12 +- tests/util/test_network_protocol_files.py | 1 + tests/wallet/cat_wallet/test_trades.py | 224 ++++++++++-------- tests/wallet/conftest.py | 8 +- tests/wallet/rpc/test_wallet_rpc.py | 4 +- tests/wallet/test_wallet.py | 116 ++++----- tests/wallet/vc_wallet/test_vc_lifecycle.py | 32 ++- tools/manage_clvm.py | 8 +- 60 files changed, 553 insertions(+), 547 deletions(-) diff --git a/.flake8 b/.flake8 index 9c5194b95620..f3f45bca91b2 100644 --- a/.flake8 +++ b/.flake8 @@ -2,6 +2,7 @@ max-line-length = 120 exclude = ./typings/**/* ignore = E203,W503 +extend-ignore = E704,E701 per-file-ignores = tests/util/build_network_protocol_files.py:F405 tests/util/test_network_protocol_files.py:F405 diff --git a/chia/cmds/cmds_util.py b/chia/cmds/cmds_util.py index cedcc0f6c5d6..2badd8d8d1ef 100644 --- a/chia/cmds/cmds_util.py +++ b/chia/cmds/cmds_util.py @@ -339,9 +339,11 @@ def to_coin_selection_config(self, mojo_per_unit: int) -> CoinSelectionConfig: return CoinSelectionConfigLoader( uint64(int(Decimal(self.min_coin_amount) * mojo_per_unit)) if self.min_coin_amount is not None else None, uint64(int(Decimal(self.max_coin_amount) * mojo_per_unit)) if self.max_coin_amount is not None else None, - [uint64(int(Decimal(a) * mojo_per_unit)) for a in self.excluded_coin_amounts] - if self.excluded_coin_amounts is not None - else None, + ( + [uint64(int(Decimal(a) * mojo_per_unit)) for a in self.excluded_coin_amounts] + if self.excluded_coin_amounts is not None + else None + ), [bytes32.from_hexstr(id) for id in self.excluded_coin_ids] if self.excluded_coin_ids is not None else None, ).autofill(constants=DEFAULT_CONSTANTS) diff --git a/chia/cmds/wallet_funcs.py b/chia/cmds/wallet_funcs.py index db04fa8b30ef..543a675314bd 100644 --- a/chia/cmds/wallet_funcs.py +++ b/chia/cmds/wallet_funcs.py @@ -314,11 +314,11 @@ async def send( ).to_tx_config(mojo_per_unit, config, fingerprint), final_fee, memos, - puzzle_decorator_override=[ - {"decorator": PuzzleDecoratorType.CLAWBACK.name, "clawback_timelock": clawback_time_lock} - ] - if clawback_time_lock > 0 - else None, + puzzle_decorator_override=( + [{"decorator": PuzzleDecoratorType.CLAWBACK.name, "clawback_timelock": clawback_time_lock}] + if clawback_time_lock > 0 + else None + ), ) elif typ in {WalletType.CAT, WalletType.CRCAT}: print("Submitting transaction...") @@ -1470,10 +1470,12 @@ async def mint_vc( vc_record, txs = await wallet_client.vc_mint( decode_puzzle_hash(ensure_valid_address(did, allowed_types={AddressType.DID}, config=config)), CMDTXConfigLoader().to_tx_config(units["chia"], config, fingerprint), - None - if target_address is None - else decode_puzzle_hash( - ensure_valid_address(target_address, allowed_types={AddressType.XCH}, config=config) + ( + None + if target_address is None + else decode_puzzle_hash( + ensure_valid_address(target_address, allowed_types={AddressType.XCH}, config=config) + ) ), uint64(int(d_fee * units["chia"])), ) diff --git a/chia/consensus/block_record.py b/chia/consensus/block_record.py index c50e116641dc..e2fd3a2cc003 100644 --- a/chia/consensus/block_record.py +++ b/chia/consensus/block_record.py @@ -13,24 +13,19 @@ class BlockRecordProtocol(Protocol): @property - def header_hash(self) -> bytes32: - ... + def header_hash(self) -> bytes32: ... @property - def height(self) -> uint32: - ... + def height(self) -> uint32: ... @property - def timestamp(self) -> Optional[uint64]: - ... + def timestamp(self) -> Optional[uint64]: ... @property - def prev_transaction_block_height(self) -> uint32: - ... + def prev_transaction_block_height(self) -> uint32: ... @property - def prev_transaction_block_hash(self) -> Optional[bytes32]: - ... + def prev_transaction_block_hash(self) -> Optional[bytes32]: ... @property def is_transaction_block(self) -> bool: diff --git a/chia/daemon/server.py b/chia/daemon/server.py index b956cd1dcdfb..84a32edeeb1b 100644 --- a/chia/daemon/server.py +++ b/chia/daemon/server.py @@ -120,8 +120,7 @@ async def ping() -> Dict[str, Any]: class Command(Protocol): - async def __call__(self, websocket: WebSocketResponse, request: Dict[str, Any]) -> Dict[str, Any]: - ... + async def __call__(self, websocket: WebSocketResponse, request: Dict[str, Any]) -> Dict[str, Any]: ... def _get_keys_by_fingerprints(fingerprints: Optional[List[uint32]]) -> Tuple[List[KeyData], Set[uint32]]: diff --git a/chia/data_layer/data_layer_wallet.py b/chia/data_layer/data_layer_wallet.py index 70f24a150959..8322bc046752 100644 --- a/chia/data_layer/data_layer_wallet.py +++ b/chia/data_layer/data_layer_wallet.py @@ -275,9 +275,9 @@ async def track_new_launcher_id( await self.wallet_state_manager.add_interested_puzzle_hashes([launcher_id], [self.id()]) await self.wallet_state_manager.add_interested_coin_ids([new_singleton.name()]) - new_singleton_coin_record: Optional[ - WalletCoinRecord - ] = await self.wallet_state_manager.coin_store.get_coin_record(new_singleton.name()) + new_singleton_coin_record: Optional[WalletCoinRecord] = ( + await self.wallet_state_manager.coin_store.get_coin_record(new_singleton.name()) + ) while new_singleton_coin_record is not None and new_singleton_coin_record.spent_block_height > 0: # We've already synced this before, so we need to sort of force a resync parent_spend = await fetch_coin_spend(new_singleton_coin_record.spent_block_height, new_singleton, peer) @@ -418,10 +418,10 @@ async def create_update_state_spend( if root_hash is None: root_hash = singleton_record.root - inner_puzzle_derivation: Optional[ - DerivationRecord - ] = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash( - singleton_record.inner_puzzle_hash + inner_puzzle_derivation: Optional[DerivationRecord] = ( + await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash( + singleton_record.inner_puzzle_hash + ) ) if inner_puzzle_derivation is None: raise ValueError(f"DL Wallet does not have permission to update Singleton with launcher ID {launcher_id}") @@ -719,10 +719,10 @@ async def get_owned_singletons(self) -> List[SingletonRecord]: # this is likely due to a race between getting the list and acquiring the extra data continue - inner_puzzle_derivation: Optional[ - DerivationRecord - ] = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash( - singleton_record.inner_puzzle_hash + inner_puzzle_derivation: Optional[DerivationRecord] = ( + await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash( + singleton_record.inner_puzzle_hash + ) ) if inner_puzzle_derivation is not None: collected.append(singleton_record) @@ -765,9 +765,9 @@ async def delete_mirror( parent_coin: Coin = ( await self.wallet_state_manager.wallet_node.get_coin_state([mirror_coin.parent_coin_info], peer=peer) )[0].coin - inner_puzzle_derivation: Optional[ - DerivationRecord - ] = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(parent_coin.puzzle_hash) + inner_puzzle_derivation: Optional[DerivationRecord] = ( + await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(parent_coin.puzzle_hash) + ) if inner_puzzle_derivation is None: raise ValueError(f"DL Wallet does not have permission to delete mirror with ID {mirror_id}") @@ -976,9 +976,9 @@ async def potentially_handle_resubmit(self, launcher_id: bytes32) -> None: # pr # Let's check our standard wallet for fee transactions related to these dl txs all_spends: List[SpendBundle] = [tx.spend_bundle for tx in relevant_dl_txs if tx.spend_bundle is not None] all_removal_ids: Set[bytes32] = {removal.name() for sb in all_spends for removal in sb.removals()} - unconfirmed_std_txs: List[ - TransactionRecord - ] = await self.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(self.standard_wallet.id()) + unconfirmed_std_txs: List[TransactionRecord] = ( + await self.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(self.standard_wallet.id()) + ) relevant_std_txs: List[TransactionRecord] = [ tx for tx in unconfirmed_std_txs if any(c.name() in all_removal_ids for c in tx.removals) ] diff --git a/chia/farmer/farmer_api.py b/chia/farmer/farmer_api.py index 9316c6839180..5388239bf34c 100644 --- a/chia/farmer/farmer_api.py +++ b/chia/farmer/farmer_api.py @@ -574,11 +574,13 @@ async def request_signed_values(self, full_node_request: farmer_protocol.Request SignatureRequestSourceData( uint8(SigningDataKind.FOLIAGE_BLOCK_DATA), bytes(full_node_request.foliage_block_data) ), - None - if full_node_request.foliage_transaction_block_data is None - else SignatureRequestSourceData( - uint8(SigningDataKind.FOLIAGE_TRANSACTION_BLOCK), - bytes(full_node_request.foliage_transaction_block_data), + ( + None + if full_node_request.foliage_transaction_block_data is None + else SignatureRequestSourceData( + uint8(SigningDataKind.FOLIAGE_TRANSACTION_BLOCK), + bytes(full_node_request.foliage_transaction_block_data), + ) ), ] diff --git a/chia/full_node/full_node_api.py b/chia/full_node/full_node_api.py index eab9ae644024..26de429f428c 100644 --- a/chia/full_node/full_node_api.py +++ b/chia/full_node/full_node_api.py @@ -915,10 +915,10 @@ def get_pool_sig(_1: PoolTarget, _2: Optional[G1Element]) -> Optional[G2Element] return None try: - finished_sub_slots: Optional[ - List[EndOfSubSlotBundle] - ] = self.full_node.full_node_store.get_finished_sub_slots( - self.full_node.blockchain, prev_b, cc_challenge_hash + finished_sub_slots: Optional[List[EndOfSubSlotBundle]] = ( + self.full_node.full_node_store.get_finished_sub_slots( + self.full_node.blockchain, prev_b, cc_challenge_hash + ) ) if finished_sub_slots is None: return None diff --git a/chia/full_node/weight_proof.py b/chia/full_node/weight_proof.py index 5d71913894a7..aacd6576eead 100644 --- a/chia/full_node/weight_proof.py +++ b/chia/full_node/weight_proof.py @@ -765,12 +765,16 @@ def handle_finished_slots(end_of_slot: EndOfSubSlotBundle, icc_end_of_slot_info: None, None, None, - None - if end_of_slot.proofs.challenge_chain_slot_proof is None - else end_of_slot.proofs.challenge_chain_slot_proof, - None - if end_of_slot.proofs.infused_challenge_chain_slot_proof is None - else end_of_slot.proofs.infused_challenge_chain_slot_proof, + ( + None + if end_of_slot.proofs.challenge_chain_slot_proof is None + else end_of_slot.proofs.challenge_chain_slot_proof + ), + ( + None + if end_of_slot.proofs.infused_challenge_chain_slot_proof is None + else end_of_slot.proofs.infused_challenge_chain_slot_proof + ), end_of_slot.challenge_chain.challenge_chain_end_of_slot_vdf, icc_end_of_slot_info, None, diff --git a/chia/plot_sync/sender.py b/chia/plot_sync/sender.py index 6e3c14d0487e..78f902902355 100644 --- a/chia/plot_sync/sender.py +++ b/chia/plot_sync/sender.py @@ -52,8 +52,7 @@ def _convert_plot_info_list(plot_infos: List[PlotInfo]) -> List[Plot]: class PayloadType(Protocol): - def __init__(self, identifier: PlotSyncIdentifier, *args: object) -> None: - ... + def __init__(self, identifier: PlotSyncIdentifier, *args: object) -> None: ... def __bytes__(self) -> bytes: pass diff --git a/chia/plotters/chiapos.py b/chia/plotters/chiapos.py index 132878719ba4..a390984d82db 100644 --- a/chia/plotters/chiapos.py +++ b/chia/plotters/chiapos.py @@ -2,6 +2,7 @@ NOTE: This contains duplicate code from `chia.cmds.plots`. After `chia plots create` becomes obsolete, consider removing it from there. """ + from __future__ import annotations import asyncio diff --git a/chia/pools/pool_wallet.py b/chia/pools/pool_wallet.py index c254cf274106..9d803e77fbf4 100644 --- a/chia/pools/pool_wallet.py +++ b/chia/pools/pool_wallet.py @@ -936,9 +936,9 @@ async def new_peak(self, peak_height: uint32) -> None: # Add some buffer (+2) to reduce chances of a reorg if peak_height > leave_height + 2: - unconfirmed: List[ - TransactionRecord - ] = await self.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(self.wallet_id) + unconfirmed: List[TransactionRecord] = ( + await self.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(self.wallet_id) + ) next_tip: Optional[Coin] = get_most_recent_singleton_coin_from_coin_spend(tip_spend) assert next_tip is not None diff --git a/chia/rpc/data_layer_rpc_util.py b/chia/rpc/data_layer_rpc_util.py index d904fa08e36d..4991524b0496 100644 --- a/chia/rpc/data_layer_rpc_util.py +++ b/chia/rpc/data_layer_rpc_util.py @@ -13,11 +13,9 @@ class MarshallableProtocol(Protocol): @classmethod - def unmarshal(cls: Type[_T], marshalled: Dict[str, Any]) -> _T: - ... + def unmarshal(cls: Type[_T], marshalled: Dict[str, Any]) -> _T: ... - def marshal(self) -> Dict[str, Any]: - ... + def marshal(self) -> Dict[str, Any]: ... class UnboundRoute(Protocol): diff --git a/chia/rpc/rpc_server.py b/chia/rpc/rpc_server.py index 264084a6fe9f..31dbf7324a62 100644 --- a/chia/rpc/rpc_server.py +++ b/chia/rpc/rpc_server.py @@ -35,8 +35,7 @@ class StateChangedProtocol(Protocol): - def __call__(self, change: str, change_data: Optional[Dict[str, Any]]) -> None: - ... + def __call__(self, change: str, change_data: Optional[Dict[str, Any]]) -> None: ... class RpcServiceProtocol(Protocol): @@ -82,8 +81,7 @@ class RpcApiProtocol(Protocol): All lower case with underscores as needed. """ - def __init__(self, node: RpcServiceProtocol) -> None: - ... + def __init__(self, node: RpcServiceProtocol) -> None: ... @property def service(self) -> RpcServiceProtocol: diff --git a/chia/rpc/wallet_rpc_api.py b/chia/rpc/wallet_rpc_api.py index 23a2cd5c3e07..de6d62165cb8 100644 --- a/chia/rpc/wallet_rpc_api.py +++ b/chia/rpc/wallet_rpc_api.py @@ -667,15 +667,17 @@ async def get_wallets(self, request: Dict[str, Any]) -> EndpointResult: if include_data: response = { "wallets": [ - wallet - if wallet.type != WalletType.CRCAT - else { - **wallet.to_json_dict(), - "authorized_providers": [ - p.hex() for p in CRCATInfo.from_bytes(bytes.fromhex(wallet.data)).authorized_providers - ], - "flags_needed": CRCATInfo.from_bytes(bytes.fromhex(wallet.data)).proofs_checker.flags, - } + ( + wallet + if wallet.type != WalletType.CRCAT + else { + **wallet.to_json_dict(), + "authorized_providers": [ + p.hex() for p in CRCATInfo.from_bytes(bytes.fromhex(wallet.data)).authorized_providers + ], + "flags_needed": CRCATInfo.from_bytes(bytes.fromhex(wallet.data)).proofs_checker.flags, + } + ) for wallet in response["wallets"] ] } @@ -850,9 +852,9 @@ async def create_new_wallet( "treasury_id": dao_wallet.dao_info.treasury_id, "cat_wallet_id": dao_wallet.dao_info.cat_wallet_id, "dao_cat_wallet_id": dao_wallet.dao_info.dao_cat_wallet_id, - "transactions": [tx.to_json_dict_convenience(self.service.config) for tx in txs] - if mode == "new" - else [], + "transactions": ( + [tx.to_json_dict_convenience(self.service.config) for tx in txs] if mode == "new" else [] + ), } elif request["wallet_type"] == "nft_wallet": for wallet in self.service.wallet_state_manager.wallets.values(): @@ -1463,10 +1465,10 @@ async def extend_derivation_index(self, request: Dict[str, Any]) -> Dict[str, An @marshal async def get_notifications(self, request: GetNotifications) -> GetNotificationsResponse: if request.ids is None: - notifications: List[ - Notification - ] = await self.service.wallet_state_manager.notification_manager.notification_store.get_all_notifications( - pagination=(request.start, request.end) + notifications: List[Notification] = ( + await self.service.wallet_state_manager.notification_manager.notification_store.get_all_notifications( + pagination=(request.start, request.end) + ) ) else: notifications = ( @@ -1914,17 +1916,19 @@ async def get_offer_summary(self, request: Dict[str, Any]) -> EndpointResult: "summary": { **response["summary"], # type: ignore[dict-item] "infos": { - key: { - **info, - "also": { - **info["also"], - "flags": ProofsChecker.from_program( - uncurry_puzzle(Program(assemble(info["also"]["proofs_checker"]))) - ).flags, - }, - } - if "also" in info and "proofs_checker" in info["also"] - else info + key: ( + { + **info, + "also": { + **info["also"], + "flags": ProofsChecker.from_program( + uncurry_puzzle(Program(assemble(info["also"]["proofs_checker"]))) + ).flags, + }, + } + if "also" in info and "proofs_checker" in info["also"] + else info + ) for key, info in response["summary"]["infos"].items() # type: ignore[index] }, }, @@ -3853,18 +3857,22 @@ async def _generate_signed_transaction() -> EndpointResult: *( AssertCoinAnnouncement( asserted_id=bytes32.from_hexstr(ca["coin_id"]), - asserted_msg=hexstr_to_bytes(ca["message"]) - if request.get("morph_bytes") is None - else std_hash(hexstr_to_bytes(ca["morph_bytes"]) + hexstr_to_bytes(ca["message"])), + asserted_msg=( + hexstr_to_bytes(ca["message"]) + if request.get("morph_bytes") is None + else std_hash(hexstr_to_bytes(ca["morph_bytes"]) + hexstr_to_bytes(ca["message"])) + ), ) for ca in request.get("coin_announcements", []) ), *( AssertPuzzleAnnouncement( asserted_ph=bytes32.from_hexstr(pa["puzzle_hash"]), - asserted_msg=hexstr_to_bytes(pa["message"]) - if request.get("morph_bytes") is None - else std_hash(hexstr_to_bytes(pa["morph_bytes"]) + hexstr_to_bytes(pa["message"])), + asserted_msg=( + hexstr_to_bytes(pa["message"]) + if request.get("morph_bytes") is None + else std_hash(hexstr_to_bytes(pa["morph_bytes"]) + hexstr_to_bytes(pa["message"])) + ), ) for pa in request.get("puzzle_announcements", []) ), @@ -3888,18 +3896,22 @@ async def _generate_signed_transaction() -> EndpointResult: *( AssertCoinAnnouncement( asserted_id=bytes32.from_hexstr(ca["coin_id"]), - asserted_msg=hexstr_to_bytes(ca["message"]) - if request.get("morph_bytes") is None - else std_hash(hexstr_to_bytes(ca["morph_bytes"]) + hexstr_to_bytes(ca["message"])), + asserted_msg=( + hexstr_to_bytes(ca["message"]) + if request.get("morph_bytes") is None + else std_hash(hexstr_to_bytes(ca["morph_bytes"]) + hexstr_to_bytes(ca["message"])) + ), ) for ca in request.get("coin_announcements", []) ), *( AssertPuzzleAnnouncement( asserted_ph=bytes32.from_hexstr(pa["puzzle_hash"]), - asserted_msg=hexstr_to_bytes(pa["message"]) - if request.get("morph_bytes") is None - else std_hash(hexstr_to_bytes(pa["morph_bytes"]) + hexstr_to_bytes(pa["message"])), + asserted_msg=( + hexstr_to_bytes(pa["message"]) + if request.get("morph_bytes") is None + else std_hash(hexstr_to_bytes(pa["morph_bytes"]) + hexstr_to_bytes(pa["message"])) + ), ) for pa in request.get("puzzle_announcements", []) ), diff --git a/chia/rpc/wallet_rpc_client.py b/chia/rpc/wallet_rpc_client.py index 313515b07438..71e8a62d9e96 100644 --- a/chia/rpc/wallet_rpc_client.py +++ b/chia/rpc/wallet_rpc_client.py @@ -1547,9 +1547,9 @@ async def vc_spend( "vc_id": vc_id.hex(), "new_puzhash": new_puzhash.hex() if new_puzhash is not None else new_puzhash, "new_proof_hash": new_proof_hash.hex() if new_proof_hash is not None else new_proof_hash, - "provider_inner_puzhash": provider_inner_puzhash.hex() - if provider_inner_puzhash is not None - else provider_inner_puzhash, + "provider_inner_puzhash": ( + provider_inner_puzhash.hex() if provider_inner_puzhash is not None else provider_inner_puzhash + ), "fee": fee, "extra_conditions": conditions_to_json_dicts(extra_conditions), "push": push, diff --git a/chia/server/api_protocol.py b/chia/server/api_protocol.py index 575f245554c4..62d05c5a5429 100644 --- a/chia/server/api_protocol.py +++ b/chia/server/api_protocol.py @@ -8,5 +8,4 @@ class ApiProtocol(Protocol): log: Logger - def ready(self) -> bool: - ... + def ready(self) -> bool: ... diff --git a/chia/server/chia_policy.py b/chia/server/chia_policy.py index 0a38aa98251e..eab2f7982416 100644 --- a/chia/server/chia_policy.py +++ b/chia/server/chia_policy.py @@ -28,8 +28,7 @@ class _ProtocolFactory(Protocol): # https://github.com/python/mypy/issues/6910#issuecomment-1081107831 # https://github.com/python/typeshed/pull/5718/files - def __call__(self) -> asyncio.protocols.BaseProtocol: - ... + def __call__(self) -> asyncio.protocols.BaseProtocol: ... _SSLContext: TypeAlias = Union[bool, None, ssl.SSLContext] @@ -47,8 +46,7 @@ def _start_serving( backlog: int = ..., # https://github.com/python/cpython/blob/v3.10.8/Lib/asyncio/constants.py#L16 ssl_handshake_timeout: Optional[float] = ..., - ) -> None: - ... + ) -> None: ... # https://github.com/python/cpython/blob/v3.10.8/Lib/asyncio/base_events.py#L278 # https://github.com/python/typeshed/blob/d084079fc3d89a7b51b89095ad67762944e0ace3/stdlib/asyncio/base_events.pyi#L27 @@ -64,38 +62,31 @@ class BaseEventsServer(asyncio.base_events.Server): _ssl_context: _SSLContext _ssl_handshake_timeout: Optional[float] - def _attach(self) -> None: - ... + def _attach(self) -> None: ... - def _detach(self) -> None: - ... + def _detach(self) -> None: ... - def _start_serving(self) -> None: - ... + def _start_serving(self) -> None: ... if sys.platform == "win32": # https://github.com/python/cpython/blob/v3.10.8/Lib/asyncio/windows_events.py#L48 - class _OverlappedFuture(asyncio.Future[Any]): - ... + class _OverlappedFuture(asyncio.Future[Any]): ... # https://github.com/python/cpython/blob/v3.10.8/Lib/asyncio/windows_events.py#L410 # https://github.com/python/typeshed/blob/d084079fc3d89a7b51b89095ad67762944e0ace3/stdlib/asyncio/windows_events.pyi#L44 class IocpProactor(asyncio.windows_events.IocpProactor): _loop: Optional[asyncio.events.AbstractEventLoop] - def _register_with_iocp(self, obj: object) -> None: - ... + def _register_with_iocp(self, obj: object) -> None: ... def _register( self, ov: _overlapped.Overlapped, obj: socket.socket, callback: Callable[[object, socket.socket, _overlapped.Overlapped], Tuple[socket.socket, object]], - ) -> _OverlappedFuture: - ... + ) -> _OverlappedFuture: ... - def _get_accept_socket(self, family: socket.AddressFamily) -> socket.socket: - ... + def _get_accept_socket(self, family: socket.AddressFamily) -> socket.socket: ... # https://github.com/python/cpython/blob/v3.10.8/Lib/asyncio/windows_events.py#L309 # https://github.com/python/typeshed/blob/d084079fc3d89a7b51b89095ad67762944e0ace3/stdlib/asyncio/windows_events.pyi#L35 diff --git a/chia/server/ws_connection.py b/chia/server/ws_connection.py index a09723bd4b36..2e60cd741f4d 100644 --- a/chia/server/ws_connection.py +++ b/chia/server/ws_connection.py @@ -57,8 +57,7 @@ async def __call__( connection: WSChiaConnection, ban_time: int, closed_connection: bool = ..., - ) -> None: - ... + ) -> None: ... @final @@ -551,9 +550,7 @@ async def send_request(self, message_no_id: Message, timeout: int) -> Optional[M if self.is_outbound: self.request_nonce = uint16(self.request_nonce + 1) if self.request_nonce != (2**15 - 1) else uint16(0) else: - self.request_nonce = ( - uint16(self.request_nonce + 1) if self.request_nonce != (2**16 - 1) else uint16(2**15) - ) + self.request_nonce = uint16(self.request_nonce + 1) if self.request_nonce != (2**16 - 1) else uint16(2**15) message = Message(message_no_id.type, request_id, message_no_id.data) assert message.id is not None diff --git a/chia/simulator/block_tools.py b/chia/simulator/block_tools.py index 053e1a65afc5..27da48c32862 100644 --- a/chia/simulator/block_tools.py +++ b/chia/simulator/block_tools.py @@ -232,12 +232,12 @@ def __init__( if automated_testing: # Hold onto the wrappers so that they can keep track of whether the certs/keys # are in use by another BlockTools instance. - self.ssl_ca_cert_and_key_wrapper: SSLTestCollateralWrapper[ - SSLTestCACertAndPrivateKey - ] = get_next_private_ca_cert_and_key() - self.ssl_nodes_certs_and_keys_wrapper: SSLTestCollateralWrapper[ - SSLTestNodeCertsAndKeys - ] = get_next_nodes_certs_and_keys() + self.ssl_ca_cert_and_key_wrapper: SSLTestCollateralWrapper[SSLTestCACertAndPrivateKey] = ( + get_next_private_ca_cert_and_key() + ) + self.ssl_nodes_certs_and_keys_wrapper: SSLTestCollateralWrapper[SSLTestNodeCertsAndKeys] = ( + get_next_nodes_certs_and_keys() + ) create_default_chia_config(root_path) create_all_ssl( root_path, diff --git a/chia/simulator/full_node_simulator.py b/chia/simulator/full_node_simulator.py index d6a6c3787507..060339af2e7c 100644 --- a/chia/simulator/full_node_simulator.py +++ b/chia/simulator/full_node_simulator.py @@ -168,10 +168,10 @@ async def farm_new_transaction_block( current_blocks = await self.get_all_full_blocks() if len(current_blocks) == 0: genesis = self.bt.get_consecutive_blocks(uint8(1))[0] - pre_validation_results: List[ - PreValidationResult - ] = await self.full_node.blockchain.pre_validate_blocks_multiprocessing( - [genesis], {}, validate_signatures=True + pre_validation_results: List[PreValidationResult] = ( + await self.full_node.blockchain.pre_validate_blocks_multiprocessing( + [genesis], {}, validate_signatures=True + ) ) assert pre_validation_results is not None await self.full_node.blockchain.add_block(genesis, pre_validation_results[0]) @@ -219,10 +219,10 @@ async def farm_new_block(self, request: FarmNewBlockProtocol, force_wait_for_tim current_blocks = await self.get_all_full_blocks() if len(current_blocks) == 0: genesis = self.bt.get_consecutive_blocks(uint8(1))[0] - pre_validation_results: List[ - PreValidationResult - ] = await self.full_node.blockchain.pre_validate_blocks_multiprocessing( - [genesis], {}, validate_signatures=True + pre_validation_results: List[PreValidationResult] = ( + await self.full_node.blockchain.pre_validate_blocks_multiprocessing( + [genesis], {}, validate_signatures=True + ) ) assert pre_validation_results is not None await self.full_node.blockchain.add_block(genesis, pre_validation_results[0]) diff --git a/chia/simulator/simulator_test_tools.py b/chia/simulator/simulator_test_tools.py index adbe8537099b..b837e20e938c 100644 --- a/chia/simulator/simulator_test_tools.py +++ b/chia/simulator/simulator_test_tools.py @@ -136,12 +136,12 @@ async def get_full_chia_simulator( with Lockfile.create(daemon_launch_lock_path(chia_root)): mnemonic, fingerprint = mnemonic_fingerprint(keychain) - ssl_ca_cert_and_key_wrapper: SSLTestCollateralWrapper[ - SSLTestCACertAndPrivateKey - ] = get_next_private_ca_cert_and_key() - ssl_nodes_certs_and_keys_wrapper: SSLTestCollateralWrapper[ - SSLTestNodeCertsAndKeys - ] = get_next_nodes_certs_and_keys() + ssl_ca_cert_and_key_wrapper: SSLTestCollateralWrapper[SSLTestCACertAndPrivateKey] = ( + get_next_private_ca_cert_and_key() + ) + ssl_nodes_certs_and_keys_wrapper: SSLTestCollateralWrapper[SSLTestNodeCertsAndKeys] = ( + get_next_nodes_certs_and_keys() + ) if config is None: config = create_config( chia_root, diff --git a/chia/util/async_pool.py b/chia/util/async_pool.py index d1fd789079af..905982029a21 100644 --- a/chia/util/async_pool.py +++ b/chia/util/async_pool.py @@ -19,8 +19,7 @@ def __init__(self, o: object) -> None: class WorkerCallable(Protocol): - async def __call__(self, worker_id: int) -> object: - ... + async def __call__(self, worker_id: int) -> object: ... J = TypeVar("J") @@ -31,18 +30,15 @@ async def __call__(self, worker_id: int) -> object: class QueuedWorkerCallable(Protocol[T, T_co]): - async def __call__(self, worker_id: int, job: Job[T]) -> T_co: - ... + async def __call__(self, worker_id: int, job: Job[T]) -> T_co: ... class JobQueueProtocol(Protocol[T_co]): - async def get(self) -> T_co: - ... + async def get(self) -> T_co: ... class ResultQueueProtocol(Protocol[T_contra]): - async def put(self, item: T_contra) -> None: - ... + async def put(self, item: T_contra) -> None: ... # TODO: how does this compare to just using a future diff --git a/chia/util/hash.py b/chia/util/hash.py index 53e00198ba84..ccd4abae3b8a 100644 --- a/chia/util/hash.py +++ b/chia/util/hash.py @@ -7,18 +7,15 @@ @overload -def std_hash(b: Union[bytes, SupportsBytes]) -> bytes32: - ... +def std_hash(b: Union[bytes, SupportsBytes]) -> bytes32: ... @overload -def std_hash(b: Union[bytes, SupportsBytes], skip_bytes_conversion: Literal[False]) -> bytes32: - ... +def std_hash(b: Union[bytes, SupportsBytes], skip_bytes_conversion: Literal[False]) -> bytes32: ... @overload -def std_hash(b: bytes, skip_bytes_conversion: Literal[True]) -> bytes32: - ... +def std_hash(b: bytes, skip_bytes_conversion: Literal[True]) -> bytes32: ... def std_hash(b: Union[bytes, SupportsBytes], skip_bytes_conversion: bool = False) -> bytes32: diff --git a/chia/util/keyring_wrapper.py b/chia/util/keyring_wrapper.py index 0901d5a9e2b3..230c00ad1157 100644 --- a/chia/util/keyring_wrapper.py +++ b/chia/util/keyring_wrapper.py @@ -112,18 +112,15 @@ def set_keys_root_path(keys_root_path: Path) -> None: @overload @staticmethod - def get_shared_instance() -> KeyringWrapper: - ... + def get_shared_instance() -> KeyringWrapper: ... @overload @staticmethod - def get_shared_instance(create_if_necessary: Literal[True]) -> KeyringWrapper: - ... + def get_shared_instance(create_if_necessary: Literal[True]) -> KeyringWrapper: ... @overload @staticmethod - def get_shared_instance(create_if_necessary: bool) -> Optional[KeyringWrapper]: - ... + def get_shared_instance(create_if_necessary: bool) -> Optional[KeyringWrapper]: ... @staticmethod def get_shared_instance(create_if_necessary: bool = True) -> Optional[KeyringWrapper]: diff --git a/chia/util/misc.py b/chia/util/misc.py index a26d5c749475..b556d7def58f 100644 --- a/chia/util/misc.py +++ b/chia/util/misc.py @@ -203,8 +203,7 @@ def __call__( signal_: signal.Signals, stack_frame: Optional[FrameType], loop: asyncio.AbstractEventLoop, - ) -> None: - ... + ) -> None: ... class AsyncHandler(Protocol): @@ -213,8 +212,7 @@ async def __call__( signal_: signal.Signals, stack_frame: Optional[FrameType], loop: asyncio.AbstractEventLoop, - ) -> None: - ... + ) -> None: ... @final diff --git a/chia/util/struct_stream.py b/chia/util/struct_stream.py index 085a978f29dc..a055e189a7f7 100644 --- a/chia/util/struct_stream.py +++ b/chia/util/struct_stream.py @@ -9,8 +9,7 @@ # https://github.com/python/typeshed/blob/c2182fdd3e572a1220c70ad9c28fd908b70fb19b/stdlib/_typeshed/__init__.pyi#L68-L69 class SupportsTrunc(Protocol): - def __trunc__(self) -> int: - ... + def __trunc__(self) -> int: ... def parse_metadata_from_name(cls: Type[_T_StructStream]) -> Type[_T_StructStream]: diff --git a/chia/util/timing.py b/chia/util/timing.py index bcf2f0045561..e2551d007d01 100644 --- a/chia/util/timing.py +++ b/chia/util/timing.py @@ -29,13 +29,11 @@ @overload -def adjusted_timeout(timeout: float) -> float: - ... +def adjusted_timeout(timeout: float) -> float: ... @overload -def adjusted_timeout(timeout: None) -> None: - ... +def adjusted_timeout(timeout: None) -> None: ... def adjusted_timeout(timeout: Optional[float]) -> Optional[float]: diff --git a/chia/wallet/cat_wallet/cat_wallet.py b/chia/wallet/cat_wallet/cat_wallet.py index f9d889454ccc..f46aca465b6b 100644 --- a/chia/wallet/cat_wallet/cat_wallet.py +++ b/chia/wallet/cat_wallet/cat_wallet.py @@ -442,9 +442,9 @@ async def get_puzzle_hash(self, new: bool) -> bytes32: if new: return await self.get_new_puzzlehash() else: - record: Optional[ - DerivationRecord - ] = await self.wallet_state_manager.get_current_derivation_record_for_wallet(self.standard_wallet.id()) + record: Optional[DerivationRecord] = ( + await self.wallet_state_manager.get_current_derivation_record_for_wallet(self.standard_wallet.id()) + ) if record is None: return await self.get_new_puzzlehash() return record.puzzle_hash @@ -562,18 +562,18 @@ async def sign(self, spend_bundle: SpendBundle) -> SpendBundle: return SpendBundle.aggregate([spend_bundle, SpendBundle([], agg_sig)]) async def inner_puzzle_for_cat_puzhash(self, cat_hash: bytes32) -> Program: - record: Optional[ - DerivationRecord - ] = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(cat_hash) + record: Optional[DerivationRecord] = ( + await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(cat_hash) + ) if record is None: raise RuntimeError(f"Missing Derivation Record for CAT puzzle_hash {cat_hash}") inner_puzzle: Program = self.standard_wallet.puzzle_for_pk(record.pubkey) return inner_puzzle async def convert_puzzle_hash(self, puzzle_hash: bytes32) -> bytes32: - record: Optional[ - DerivationRecord - ] = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(puzzle_hash) + record: Optional[DerivationRecord] = ( + await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(puzzle_hash) + ) if record is None: return puzzle_hash # TODO: check if we have a test for this case! else: diff --git a/chia/wallet/conditions.py b/chia/wallet/conditions.py index c52949a15c9a..228b42085a32 100644 --- a/chia/wallet/conditions.py +++ b/chia/wallet/conditions.py @@ -19,13 +19,11 @@ class Condition(Streamable, ABC): @abstractmethod - def to_program(self) -> Program: - ... + def to_program(self) -> Program: ... @classmethod @abstractmethod - def from_program(cls: Type[_T_Condition], program: Program) -> _T_Condition: - ... + def from_program(cls: Type[_T_Condition], program: Program) -> _T_Condition: ... @final @@ -243,9 +241,11 @@ def from_program(cls, program: Program) -> CreateCoin: return cls( bytes32(program.at("rf").as_atom()), uint64(program.at("rrf").as_int()), - None - if potential_memos == Program.to(None) - else [memo.as_atom() for memo in potential_memos.at("f").as_iter()], + ( + None + if potential_memos == Program.to(None) + else [memo.as_atom() for memo in potential_memos.at("f").as_iter()] + ), ) diff --git a/chia/wallet/driver_protocol.py b/chia/wallet/driver_protocol.py index 624400a8e9a0..18e2ab3f4910 100644 --- a/chia/wallet/driver_protocol.py +++ b/chia/wallet/driver_protocol.py @@ -11,20 +11,16 @@ class DriverProtocol(Protocol): - def match(self, puzzle: UncurriedPuzzle) -> Optional[PuzzleInfo]: - ... + def match(self, puzzle: UncurriedPuzzle) -> Optional[PuzzleInfo]: ... - def get_inner_puzzle(self, constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle) -> Optional[Program]: - ... + def get_inner_puzzle(self, constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle) -> Optional[Program]: ... - def get_inner_solution(self, constructor: PuzzleInfo, solution: Program) -> Optional[Program]: - ... + def get_inner_solution(self, constructor: PuzzleInfo, solution: Program) -> Optional[Program]: ... - def asset_id(self, constructor: PuzzleInfo) -> Optional[bytes32]: - ... + def asset_id(self, constructor: PuzzleInfo) -> Optional[bytes32]: ... - def construct(self, constructor: PuzzleInfo, inner_puzzle: Program) -> Program: - ... + def construct(self, constructor: PuzzleInfo, inner_puzzle: Program) -> Program: ... - def solve(self, constructor: PuzzleInfo, solver: Solver, inner_puzzle: Program, inner_solution: Program) -> Program: - ... + def solve( + self, constructor: PuzzleInfo, solver: Solver, inner_puzzle: Program, inner_solution: Program + ) -> Program: ... diff --git a/chia/wallet/nft_wallet/nft_wallet.py b/chia/wallet/nft_wallet/nft_wallet.py index 6779e23c555e..9ef9a3751a19 100644 --- a/chia/wallet/nft_wallet/nft_wallet.py +++ b/chia/wallet/nft_wallet/nft_wallet.py @@ -192,9 +192,9 @@ async def puzzle_solution_received(self, coin: Coin, data: NFTCoinData, peer: WS metadata, p2_puzzle_hash = get_metadata_and_phs(uncurried_nft, data.parent_coin_spend.solution) self.log.debug("Got back puzhash from solution: %s", p2_puzzle_hash) self.log.debug("Got back updated metadata: %s", metadata) - derivation_record: Optional[ - DerivationRecord - ] = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(p2_puzzle_hash) + derivation_record: Optional[DerivationRecord] = ( + await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(p2_puzzle_hash) + ) self.log.debug("Record for %s is: %s", p2_puzzle_hash, derivation_record) if derivation_record is None: self.log.debug("Not our NFT, pointing to %s, skipping", p2_puzzle_hash) @@ -723,10 +723,10 @@ async def generate_unsigned_spendbundle( if unft.supports_did: if new_owner is None: # If no new owner was specified and we're sending this to ourselves, let's not reset the DID - derivation_record: Optional[ - DerivationRecord - ] = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash( - payments[0].puzzle_hash + derivation_record: Optional[DerivationRecord] = ( + await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash( + payments[0].puzzle_hash + ) ) if derivation_record is not None: new_owner = unft.owner_did diff --git a/chia/wallet/puzzles/p2_delegated_conditions.py b/chia/wallet/puzzles/p2_delegated_conditions.py index 0d1e3698cf46..7f81903975db 100644 --- a/chia/wallet/puzzles/p2_delegated_conditions.py +++ b/chia/wallet/puzzles/p2_delegated_conditions.py @@ -5,7 +5,6 @@ is returned literally. """ - from __future__ import annotations from typing import cast diff --git a/chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py b/chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py index 8413c3145522..41994471417e 100644 --- a/chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +++ b/chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py @@ -55,6 +55,7 @@ key whose derivation is within. Any wallets which intend to use standard coins in this way must try to resolve a public key to a secret key via this derivation. """ + from __future__ import annotations import hashlib diff --git a/chia/wallet/trade_manager.py b/chia/wallet/trade_manager.py index bd1b179eb48e..3eb18df9512f 100644 --- a/chia/wallet/trade_manager.py +++ b/chia/wallet/trade_manager.py @@ -516,15 +516,15 @@ async def _create_offer_for_ids( requested_payments, driver_dict, taking ) - potential_special_offer: Optional[ - Tuple[Offer, List[TransactionRecord]] - ] = await self.check_for_special_offer_making( - offer_dict_no_ints, - driver_dict, - tx_config, - solver, - fee, - extra_conditions, + potential_special_offer: Optional[Tuple[Offer, List[TransactionRecord]]] = ( + await self.check_for_special_offer_making( + offer_dict_no_ints, + driver_dict, + tx_config, + solver, + fee, + extra_conditions, + ) ) if potential_special_offer is not None: @@ -988,23 +988,25 @@ async def check_for_requested_payment_modifications( raise ValueError("Cannot request CR-CATs that you cannot approve with a VC") # pragma: no cover return { - asset_id: [ - dataclasses.replace( - payment, - puzzle_hash=construct_pending_approval_state( - payment.puzzle_hash, payment.amount - ).get_tree_hash(), - ) - for payment in payments - ] - if asset_id is not None - and driver_dict[asset_id].check_type( + asset_id: ( [ - AssetType.CAT.value, - AssetType.CR.value, + dataclasses.replace( + payment, + puzzle_hash=construct_pending_approval_state( + payment.puzzle_hash, payment.amount + ).get_tree_hash(), + ) + for payment in payments ] + if asset_id is not None + and driver_dict[asset_id].check_type( + [ + AssetType.CAT.value, + AssetType.CR.value, + ] + ) + else payments ) - else payments for asset_id, payments in requested_payments.items() } else: diff --git a/chia/wallet/util/puzzle_decorator.py b/chia/wallet/util/puzzle_decorator.py index b69e8e4ae180..dff15c72ed69 100644 --- a/chia/wallet/util/puzzle_decorator.py +++ b/chia/wallet/util/puzzle_decorator.py @@ -14,24 +14,19 @@ class PuzzleDecoratorProtocol(Protocol): @staticmethod - def create(config: Dict[str, Any]) -> PuzzleDecoratorProtocol: - ... + def create(config: Dict[str, Any]) -> PuzzleDecoratorProtocol: ... - def decorate(self, inner_puzzle: Program) -> Program: - ... + def decorate(self, inner_puzzle: Program) -> Program: ... def decorate_target_puzzle_hash( self, inner_puzzle: Program, target_puzzle_hash: bytes32 - ) -> Tuple[Program, bytes32]: - ... + ) -> Tuple[Program, bytes32]: ... def decorate_memos( self, inner_puzzle: Program, target_puzzle_hash: bytes32, memos: List[bytes] - ) -> Tuple[Program, List[bytes]]: - ... + ) -> Tuple[Program, List[bytes]]: ... - def solve(self, puzzle: Program, primaries: List[Payment], inner_solution: Program) -> Tuple[Program, Program]: - ... + def solve(self, puzzle: Program, primaries: List[Payment], inner_solution: Program) -> Tuple[Program, Program]: ... class PuzzleDecoratorManager: diff --git a/chia/wallet/vc_wallet/cr_cat_wallet.py b/chia/wallet/vc_wallet/cr_cat_wallet.py index 4feea953f150..35286ae87de5 100644 --- a/chia/wallet/vc_wallet/cr_cat_wallet.py +++ b/chia/wallet/vc_wallet/cr_cat_wallet.py @@ -383,11 +383,13 @@ def coin_record_to_crcat(self, coin_record: WalletCoinRecord) -> CRCAT: metadata.lineage_proof, self.info.authorized_providers, self.info.proofs_checker.as_program(), - construct_pending_approval_state( - metadata.inner_puzzle_hash, uint64(coin_record.coin.amount) - ).get_tree_hash() - if coin_record.coin_type == CoinType.CRCAT_PENDING - else metadata.inner_puzzle_hash, + ( + construct_pending_approval_state( + metadata.inner_puzzle_hash, uint64(coin_record.coin.amount) + ).get_tree_hash() + if coin_record.coin_type == CoinType.CRCAT_PENDING + else metadata.inner_puzzle_hash + ), ) return crcat except Exception as e: # pragma: no cover @@ -639,10 +641,12 @@ async def generate_signed_transaction( # Force wrap the outgoing coins in the pending state if not going to us payments.append( Payment( - construct_pending_approval_state(puzhash, amount).get_tree_hash() - if puzhash != Offer.ph() - and not await self.wallet_state_manager.puzzle_store.puzzle_hash_exists(puzhash) - else puzhash, + ( + construct_pending_approval_state(puzhash, amount).get_tree_hash() + if puzhash != Offer.ph() + and not await self.wallet_state_manager.puzzle_store.puzzle_hash_exists(puzhash) + else puzhash + ), amount, memos_with_hint, ) diff --git a/chia/wallet/wallet.py b/chia/wallet/wallet.py index a03fdf693966..4711a4add52c 100644 --- a/chia/wallet/wallet.py +++ b/chia/wallet/wallet.py @@ -159,9 +159,9 @@ async def get_puzzle(self, new: bool) -> Program: if new: return await self.get_new_puzzle() else: - record: Optional[ - DerivationRecord - ] = await self.wallet_state_manager.get_current_derivation_record_for_wallet(self.id()) + record: Optional[DerivationRecord] = ( + await self.wallet_state_manager.get_current_derivation_record_for_wallet(self.id()) + ) if record is None: return await self.get_new_puzzle() # pragma: no cover puzzle = puzzle_for_pk(record.pubkey) @@ -171,9 +171,9 @@ async def get_puzzle_hash(self, new: bool) -> bytes32: if new: return await self.get_new_puzzlehash() else: - record: Optional[ - DerivationRecord - ] = await self.wallet_state_manager.get_current_derivation_record_for_wallet(self.id()) + record: Optional[DerivationRecord] = ( + await self.wallet_state_manager.get_current_derivation_record_for_wallet(self.id()) + ) if record is None: return await self.get_new_puzzlehash() return record.puzzle_hash @@ -485,9 +485,9 @@ def get_name(self) -> str: async def match_hinted_coin(self, coin: Coin, hint: bytes32) -> bool: if hint == coin.puzzle_hash: - wallet_identifier: Optional[ - WalletIdentifier - ] = await self.wallet_state_manager.puzzle_store.get_wallet_identifier_for_puzzle_hash(coin.puzzle_hash) + wallet_identifier: Optional[WalletIdentifier] = ( + await self.wallet_state_manager.puzzle_store.get_wallet_identifier_for_puzzle_hash(coin.puzzle_hash) + ) if wallet_identifier is not None and wallet_identifier.id == self.id(): return True return False diff --git a/chia/wallet/wallet_nft_store.py b/chia/wallet/wallet_nft_store.py index b3238586ae1e..eeb99384bb21 100644 --- a/chia/wallet/wallet_nft_store.py +++ b/chia/wallet/wallet_nft_store.py @@ -123,9 +123,11 @@ async def save_nft(self, wallet_id: uint32, did_id: Optional[bytes32], nft_coin_ int(wallet_id), did_id.hex() if did_id else None, json.dumps(nft_coin_info.coin.to_json_dict()), - json.dumps(nft_coin_info.lineage_proof.to_json_dict()) - if nft_coin_info.lineage_proof is not None - else None, + ( + json.dumps(nft_coin_info.lineage_proof.to_json_dict()) + if nft_coin_info.lineage_proof is not None + else None + ), int(nft_coin_info.mint_height), IN_TRANSACTION_STATUS if nft_coin_info.pending_transaction else DEFAULT_STATUS, bytes(nft_coin_info.full_puzzle), diff --git a/chia/wallet/wallet_protocol.py b/chia/wallet/wallet_protocol.py index 179206053f9c..cc5bee5a8e73 100644 --- a/chia/wallet/wallet_protocol.py +++ b/chia/wallet/wallet_protocol.py @@ -25,50 +25,37 @@ class WalletProtocol(Protocol[T]): @classmethod - def type(cls) -> WalletType: - ... + def type(cls) -> WalletType: ... - def id(self) -> uint32: - ... + def id(self) -> uint32: ... - async def coin_added(self, coin: Coin, height: uint32, peer: WSChiaConnection, coin_data: Optional[T]) -> None: - ... + async def coin_added(self, coin: Coin, height: uint32, peer: WSChiaConnection, coin_data: Optional[T]) -> None: ... async def select_coins( self, amount: uint64, coin_selection_config: CoinSelectionConfig, - ) -> Set[Coin]: - ... + ) -> Set[Coin]: ... - async def get_confirmed_balance(self, record_list: Optional[Set[WalletCoinRecord]] = None) -> uint128: - ... + async def get_confirmed_balance(self, record_list: Optional[Set[WalletCoinRecord]] = None) -> uint128: ... - async def get_unconfirmed_balance(self, unspent_records: Optional[Set[WalletCoinRecord]] = None) -> uint128: - ... + async def get_unconfirmed_balance(self, unspent_records: Optional[Set[WalletCoinRecord]] = None) -> uint128: ... - async def get_spendable_balance(self, unspent_records: Optional[Set[WalletCoinRecord]] = None) -> uint128: - ... + async def get_spendable_balance(self, unspent_records: Optional[Set[WalletCoinRecord]] = None) -> uint128: ... - async def get_pending_change_balance(self) -> uint64: - ... + async def get_pending_change_balance(self) -> uint64: ... - async def get_max_send_amount(self, records: Optional[Set[WalletCoinRecord]] = None) -> uint128: - ... + async def get_max_send_amount(self, records: Optional[Set[WalletCoinRecord]] = None) -> uint128: ... # not all wallet supports this. To signal support, make # require_derivation_paths() return true - def puzzle_hash_for_pk(self, pubkey: G1Element) -> bytes32: - ... + def puzzle_hash_for_pk(self, pubkey: G1Element) -> bytes32: ... - def require_derivation_paths(self) -> bool: - ... + def require_derivation_paths(self) -> bool: ... - def get_name(self) -> str: - ... + def get_name(self) -> str: ... - async def match_hinted_coin(self, coin: Coin, hint: bytes32) -> bool: - ... + async def match_hinted_coin(self, coin: Coin, hint: bytes32) -> bool: ... wallet_info: WalletInfo # WalletStateManager is only imported for type hinting thus leaving pylint diff --git a/chia/wallet/wallet_state_manager.py b/chia/wallet/wallet_state_manager.py index 04cb7c59f789..c853c936e56f 100644 --- a/chia/wallet/wallet_state_manager.py +++ b/chia/wallet/wallet_state_manager.py @@ -959,9 +959,11 @@ async def spend_clawback_coins( memos, # Forward memo of the first coin ) ], - conditions=extra_conditions - if len(coin_spends) > 0 or fee == 0 - else (*extra_conditions, CreateCoinAnnouncement(message)), + conditions=( + extra_conditions + if len(coin_spends) > 0 or fee == 0 + else (*extra_conditions, CreateCoinAnnouncement(message)) + ), ) coin_spend: CoinSpend = generate_clawback_spend_bundle(coin, metadata, inner_puzzle, inner_solution) coin_spends.append(coin_spend) @@ -1440,12 +1442,12 @@ async def handle_nft( old_p2_puzhash, new_p2_puzhash, ) - new_derivation_record: Optional[ - DerivationRecord - ] = await self.puzzle_store.get_derivation_record_for_puzzle_hash(new_p2_puzhash) - old_derivation_record: Optional[ - DerivationRecord - ] = await self.puzzle_store.get_derivation_record_for_puzzle_hash(old_p2_puzhash) + new_derivation_record: Optional[DerivationRecord] = ( + await self.puzzle_store.get_derivation_record_for_puzzle_hash(new_p2_puzhash) + ) + old_derivation_record: Optional[DerivationRecord] = ( + await self.puzzle_store.get_derivation_record_for_puzzle_hash(old_p2_puzhash) + ) if new_derivation_record is None and old_derivation_record is None: self.log.debug( "Cannot find a P2 puzzle hash for NFT:%s, this NFT belongs to others.", @@ -1518,9 +1520,9 @@ async def handle_clawback( assert coin_state.created_height is not None is_recipient: Optional[bool] = None # Check if the wallet is the sender - sender_derivation_record: Optional[ - DerivationRecord - ] = await self.puzzle_store.get_derivation_record_for_puzzle_hash(metadata.sender_puzzle_hash) + sender_derivation_record: Optional[DerivationRecord] = ( + await self.puzzle_store.get_derivation_record_for_puzzle_hash(metadata.sender_puzzle_hash) + ) # Check if the wallet is the recipient recipient_derivation_record = await self.puzzle_store.get_derivation_record_for_puzzle_hash( metadata.recipient_puzzle_hash @@ -1549,9 +1551,11 @@ async def handle_clawback( tx_record = TransactionRecord( confirmed_at_height=uint32(coin_state.spent_height), created_at_time=created_timestamp, - to_puzzle_hash=metadata.sender_puzzle_hash - if clawback_spend_bundle.additions()[0].puzzle_hash == metadata.sender_puzzle_hash - else metadata.recipient_puzzle_hash, + to_puzzle_hash=( + metadata.sender_puzzle_hash + if clawback_spend_bundle.additions()[0].puzzle_hash == metadata.sender_puzzle_hash + else metadata.recipient_puzzle_hash + ), amount=uint64(coin_state.coin.amount), fee_amount=uint64(0), confirmed=True, diff --git a/pylintrc b/pylintrc index 22df2c470812..acda73a98a34 100644 --- a/pylintrc +++ b/pylintrc @@ -164,6 +164,7 @@ disable=raw-checker-failed, wildcard-import, wrong-import-order, wrong-import-position, + multiple-statements, # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option diff --git a/setup.py b/setup.py index 2543a66b1965..33c40070ab31 100644 --- a/setup.py +++ b/setup.py @@ -59,7 +59,7 @@ "isort==5.13.2", "flake8==7.0.0", "mypy==1.8.0", - "black==23.12.1", + "black==24.1.1", "lxml==5.1.0", "aiohttp_cors==0.7.0", # For blackd "pyinstaller==6.3.0", diff --git a/tests/conftest.py b/tests/conftest.py index 1971dd5f69ea..ae24e8bf1a09 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -798,7 +798,15 @@ async def two_nodes_one_block(blockchain_constants: ConsensusConstants): async def farmer_one_harvester_simulator_wallet( tmp_path: Path, blockchain_constants: ConsensusConstants, -) -> AsyncIterator[Tuple[HarvesterService, FarmerService, SimulatorFullNodeService, WalletService, BlockTools,]]: +) -> AsyncIterator[ + Tuple[ + HarvesterService, + FarmerService, + SimulatorFullNodeService, + WalletService, + BlockTools, + ] +]: async with setup_simulators_and_wallets_service(1, 1, blockchain_constants) as (nodes, wallets, bt): async with setup_farmer_multi_harvester(bt, 1, tmp_path, bt.constants, start_services=True) as ( harvester_services, diff --git a/tests/core/data_layer/util.py b/tests/core/data_layer/util.py index 89da59a0130c..14c999c0fc9e 100644 --- a/tests/core/data_layer/util.py +++ b/tests/core/data_layer/util.py @@ -188,15 +188,13 @@ def create_valid_node_values( node_type: Literal[NodeType.INTERNAL], left_hash: bytes32, right_hash: bytes32, -) -> Dict[str, Any]: - ... +) -> Dict[str, Any]: ... @overload def create_valid_node_values( node_type: Literal[NodeType.TERMINAL], -) -> Dict[str, Any]: - ... +) -> Dict[str, Any]: ... def create_valid_node_values( diff --git a/tests/core/full_node/stores/test_coin_store.py b/tests/core/full_node/stores/test_coin_store.py index 10c80a7850a7..0dd3f936ed70 100644 --- a/tests/core/full_node/stores/test_coin_store.py +++ b/tests/core/full_node/stores/test_coin_store.py @@ -829,9 +829,11 @@ def make_test_data(test_items: List[UnspentLineageInfoTestItem]) -> List[CoinRec assert result == UnspentLineageInfo( coin_id=bytes32(TEST_COIN_ID), coin_amount=TEST_AMOUNT, - parent_id=bytes32(TEST_PARENT_ID_DIFFERENT_AMOUNT) - if case.parent_with_diff_amount - else bytes32(TEST_PARENT_ID), + parent_id=( + bytes32(TEST_PARENT_ID_DIFFERENT_AMOUNT) + if case.parent_with_diff_amount + else bytes32(TEST_PARENT_ID) + ), parent_amount=TEST_PARENT_DIFFERENT_AMOUNT if case.parent_with_diff_amount else TEST_AMOUNT, parent_parent_id=bytes32(TEST_PARENT_PARENT_ID), ) diff --git a/tests/core/server/serve.py b/tests/core/server/serve.py index a5586c125145..8b96894d3ef3 100644 --- a/tests/core/server/serve.py +++ b/tests/core/server/serve.py @@ -49,8 +49,7 @@ async def async_main( ip: str = "127.0.0.1", port: int = 8444, port_holder: Optional[List[int]] = None, -) -> None: - ... +) -> None: ... @overload @@ -61,8 +60,7 @@ async def async_main( ip: str = "127.0.0.1", port: int = 8444, port_holder: Optional[List[int]] = None, -) -> None: - ... +) -> None: ... async def async_main( diff --git a/tests/core/services/test_services.py b/tests/core/services/test_services.py index 12531bfe4f49..061a8e931fee 100644 --- a/tests/core/services/test_services.py +++ b/tests/core/services/test_services.py @@ -34,8 +34,7 @@ async def __call__( port: uint16, root_path: Path, net_config: Dict[str, Any], - ) -> RpcClient: - ... + ) -> RpcClient: ... async def wait_for_daemon_connection(root_path: Path, config: Dict[str, Any], timeout: float = 15) -> DaemonProxy: diff --git a/tests/core/util/test_keyring_wrapper.py b/tests/core/util/test_keyring_wrapper.py index c34d8566aa6c..3a8a4d007bf7 100644 --- a/tests/core/util/test_keyring_wrapper.py +++ b/tests/core/util/test_keyring_wrapper.py @@ -292,7 +292,10 @@ def test_japanese_master_passphrase(self, empty_temp_file_keyring: TempKeyring): assert KeyringWrapper.get_shared_instance().master_passphrase_is_valid("私は幸せな農夫です") is True # Expect: an invalid passphrase containing an non-ascii characters should fail validation - assert KeyringWrapper.get_shared_instance().get_cached_master_passphrase() != ("私は幸せな農夫ではありません", True) + assert KeyringWrapper.get_shared_instance().get_cached_master_passphrase() != ( + "私は幸せな農夫ではありません", + True, + ) assert KeyringWrapper.get_shared_instance().master_passphrase_is_valid("私は幸せな農夫ではありません") is False # When: using a new empty keyring diff --git a/tests/environments/common.py b/tests/environments/common.py index b73f60db0d4c..a74b8a7c812c 100644 --- a/tests/environments/common.py +++ b/tests/environments/common.py @@ -20,21 +20,16 @@ class ServiceEnvironment(Protocol[T_Node, T_RpcApi, T_PeerApi]): __match_args__: ClassVar[Tuple[str, ...]] = () @property - def node(self) -> T_Node: - ... + def node(self) -> T_Node: ... @property - def rpc_api(self) -> T_RpcApi: - ... + def rpc_api(self) -> T_RpcApi: ... @property - def rpc_server(self) -> RpcServer[T_RpcApi]: - ... + def rpc_server(self) -> RpcServer[T_RpcApi]: ... @property - def peer_api(self) -> T_PeerApi: - ... + def peer_api(self) -> T_PeerApi: ... @property - def peer_server(self) -> ChiaServer: - ... + def peer_server(self) -> ChiaServer: ... diff --git a/tests/environments/wallet.py b/tests/environments/wallet.py index c34109f0c186..8c1b9918c551 100644 --- a/tests/environments/wallet.py +++ b/tests/environments/wallet.py @@ -230,9 +230,11 @@ async def change_balances(self, update_dictionary: Dict[Union[int, str], Dict[st **( asdict(existing_values) if "set_remainder" in kwargs and kwargs["set_remainder"] - else {} - if "init" in kwargs and kwargs["init"] - else asdict(self.wallet_states[wallet_id].balance) + else ( + {} + if "init" in kwargs and kwargs["init"] + else asdict(self.wallet_states[wallet_id].balance) + ) ), **new_values, } @@ -267,9 +269,9 @@ async def process_pending_states(self, state_transitions: List[WalletStateTransi for env in self.environments: ph_indexes: Dict[uint32, Optional[DerivationRecord]] = {} for wallet_id in env.wallet_state_manager.wallets: - ph_indexes[ - wallet_id - ] = await env.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(wallet_id) + ph_indexes[wallet_id] = ( + await env.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(wallet_id) + ) puzzle_hash_indexes.append(ph_indexes) # Gather all pending transactions and ensure they enter mempool diff --git a/tests/farmer_harvester/test_farmer.py b/tests/farmer_harvester/test_farmer.py index 07c85c2b4bbb..c44483fd39fc 100644 --- a/tests/farmer_harvester/test_farmer.py +++ b/tests/farmer_harvester/test_farmer.py @@ -211,13 +211,15 @@ def create_verified_quality_case( farmer_private_keys=[ PrivateKey.from_bytes(bytes.fromhex("3cb188d8b2469bb8414a3ec68857959e231a8bec836df199a896ff523b9d2f7d")) ], - authentication_keys={ - p2_singleton_puzzle_hash: PrivateKey.from_bytes( - bytes.fromhex("11ed596eb95b31364a9185e948f6b66be30415f816819449d5d40751dc70e786") - ), - } - if has_valid_authentication_keys - else {}, + authentication_keys=( + { + p2_singleton_puzzle_hash: PrivateKey.from_bytes( + bytes.fromhex("11ed596eb95b31364a9185e948f6b66be30415f816819449d5d40751dc70e786") + ), + } + if has_valid_authentication_keys + else {} + ), use_invalid_peer_response=use_invalid_peer_response, expected_pool_state=expected_pool_state, ) diff --git a/tests/util/misc.py b/tests/util/misc.py index 0156ad29409d..f6876360a2b6 100644 --- a/tests/util/misc.py +++ b/tests/util/misc.py @@ -420,8 +420,7 @@ class DataCase(Protocol): marks: Marks @property - def id(self) -> str: - ... + def id(self) -> str: ... def datacases(*cases: DataCase, _name: str = "case") -> pytest.MarkDecorator: @@ -432,8 +431,7 @@ def datacases(*cases: DataCase, _name: str = "case") -> pytest.MarkDecorator: class DataCasesDecorator(Protocol): - def __call__(self, *cases: DataCase, _name: str = "case") -> pytest.MarkDecorator: - ... + def __call__(self, *cases: DataCase, _name: str = "case") -> pytest.MarkDecorator: ... def named_datacases(name: str) -> DataCasesDecorator: @@ -627,8 +625,6 @@ class DataTypeProtocol(Protocol): __match_args__: ClassVar[Tuple[str, ...]] = () @classmethod - def unmarshal(cls: Type[T], marshalled: Dict[str, Any]) -> T: - ... + def unmarshal(cls: Type[T], marshalled: Dict[str, Any]) -> T: ... - def marshal(self) -> Dict[str, Any]: - ... + def marshal(self) -> Dict[str, Any]: ... diff --git a/tests/util/test_network_protocol_files.py b/tests/util/test_network_protocol_files.py index bea36cb7dd5c..8eb30656a1c1 100644 --- a/tests/util/test_network_protocol_files.py +++ b/tests/util/test_network_protocol_files.py @@ -20,6 +20,7 @@ def parse_blob(input_bytes: bytes) -> Tuple[bytes, bytes]: def test_protocol_bytes() -> None: + filename: Path = get_network_protocol_filename() assert filename.exists() with open(filename, "rb") as f: diff --git a/tests/wallet/cat_wallet/test_trades.py b/tests/wallet/cat_wallet/test_trades.py index d578259bcb21..aacafd900571 100644 --- a/tests/wallet/cat_wallet/test_trades.py +++ b/tests/wallet/cat_wallet/test_trades.py @@ -431,9 +431,11 @@ async def test_cat_trades( driver_item["also"] = { "type": AssetType.CR.value, "authorized_providers": ["0x" + provider.hex() for provider in authorized_providers], - "proofs_checker": proofs_checker_maker.as_program() - if wallet == cat_wallet_maker - else proofs_checker_taker.as_program(), + "proofs_checker": ( + proofs_checker_maker.as_program() + if wallet == cat_wallet_maker + else proofs_checker_taker.as_program() + ), } driver_dict[bytes32.from_hexstr(asset_id)] = PuzzleInfo(driver_item) @@ -492,30 +494,34 @@ async def test_cat_trades( ">#spendable_balance": 0, ">#max_send_amount": 0, }, - "new cat": { - # No change if credential_restricted because pending approval balance needs to be claimed - "confirmed_wallet_balance": 0, - "unconfirmed_wallet_balance": 0, - "spendable_balance": 0, - "max_send_amount": 0, - "unspent_coin_count": 0, - } - if credential_restricted - else { - "confirmed_wallet_balance": 2, - "unconfirmed_wallet_balance": 2, - "spendable_balance": 2, - "max_send_amount": 2, - "unspent_coin_count": 1, - }, + "new cat": ( + { + # No change if credential_restricted because pending approval balance needs to be claimed + "confirmed_wallet_balance": 0, + "unconfirmed_wallet_balance": 0, + "spendable_balance": 0, + "max_send_amount": 0, + "unspent_coin_count": 0, + } + if credential_restricted + else { + "confirmed_wallet_balance": 2, + "unconfirmed_wallet_balance": 2, + "spendable_balance": 2, + "max_send_amount": 2, + "unspent_coin_count": 1, + } + ), }, - post_block_additional_balance_info={ - "new cat": { - "pending_approval_balance": 2, + post_block_additional_balance_info=( + { + "new cat": { + "pending_approval_balance": 2, + } } - } - if credential_restricted - else {}, + if credential_restricted + else {} + ), ), WalletStateTransition( pre_block_balance_updates={ @@ -815,22 +821,24 @@ async def assert_trade_tx_number(wallet_node, trade_id, number): }, }, post_block_balance_updates={ - "new cat": { - # No change if credential_restricted because pending approval balance needs to be claimed - "confirmed_wallet_balance": 0, - "unconfirmed_wallet_balance": 0, - "spendable_balance": 0, - "max_send_amount": 0, - "unspent_coin_count": 0, - } - if credential_restricted - else { - "confirmed_wallet_balance": 6, - "unconfirmed_wallet_balance": 6, - "spendable_balance": 6, - "max_send_amount": 6, - "unspent_coin_count": 1, - }, + "new cat": ( + { + # No change if credential_restricted because pending approval balance needs to be claimed + "confirmed_wallet_balance": 0, + "unconfirmed_wallet_balance": 0, + "spendable_balance": 0, + "max_send_amount": 0, + "unspent_coin_count": 0, + } + if credential_restricted + else { + "confirmed_wallet_balance": 6, + "unconfirmed_wallet_balance": 6, + "spendable_balance": 6, + "max_send_amount": 6, + "unspent_coin_count": 1, + } + ), "cat": { "confirmed_wallet_balance": -5, "unconfirmed_wallet_balance": -5, @@ -839,13 +847,15 @@ async def assert_trade_tx_number(wallet_node, trade_id, number): "pending_coin_removal_count": -1, }, }, - post_block_additional_balance_info={ - "new cat": { - "pending_approval_balance": 6, + post_block_additional_balance_info=( + { + "new cat": { + "pending_approval_balance": 6, + } } - } - if credential_restricted - else {}, + if credential_restricted + else {} + ), ), WalletStateTransition( pre_block_balance_updates={ @@ -1011,49 +1021,55 @@ async def assert_trade_tx_number(wallet_node, trade_id, number): "unconfirmed_wallet_balance": -7, "confirmed_wallet_balance": -7, }, - "cat": { - # No change if credential_restricted because pending approval balance needs to be claimed - "confirmed_wallet_balance": 0, - "unconfirmed_wallet_balance": 0, - "spendable_balance": 0, - "max_send_amount": 0, - "unspent_coin_count": 0, - } - if credential_restricted - else { - "confirmed_wallet_balance": 8, - "unconfirmed_wallet_balance": 8, - "spendable_balance": 8, - "max_send_amount": 8, - "unspent_coin_count": 1, - }, - "new cat": { - # No change if credential_restricted because pending approval balance needs to be claimed - "confirmed_wallet_balance": 0, - "unconfirmed_wallet_balance": 0, - "spendable_balance": 0, - "max_send_amount": 0, - "unspent_coin_count": 0, + "cat": ( + { + # No change if credential_restricted because pending approval balance needs to be claimed + "confirmed_wallet_balance": 0, + "unconfirmed_wallet_balance": 0, + "spendable_balance": 0, + "max_send_amount": 0, + "unspent_coin_count": 0, + } + if credential_restricted + else { + "confirmed_wallet_balance": 8, + "unconfirmed_wallet_balance": 8, + "spendable_balance": 8, + "max_send_amount": 8, + "unspent_coin_count": 1, + } + ), + "new cat": ( + { + # No change if credential_restricted because pending approval balance needs to be claimed + "confirmed_wallet_balance": 0, + "unconfirmed_wallet_balance": 0, + "spendable_balance": 0, + "max_send_amount": 0, + "unspent_coin_count": 0, + } + if credential_restricted + else { + "confirmed_wallet_balance": 9, + "unconfirmed_wallet_balance": 9, + "spendable_balance": 9, + "max_send_amount": 9, + "unspent_coin_count": 1, + } + ), + }, + post_block_additional_balance_info=( + { + "cat": { + "pending_approval_balance": 8, + }, + "new cat": { + "pending_approval_balance": 9, + }, } if credential_restricted - else { - "confirmed_wallet_balance": 9, - "unconfirmed_wallet_balance": 9, - "spendable_balance": 9, - "max_send_amount": 9, - "unspent_coin_count": 1, - }, - }, - post_block_additional_balance_info={ - "cat": { - "pending_approval_balance": 8, - }, - "new cat": { - "pending_approval_balance": 9, - }, - } - if credential_restricted - else {}, + else {} + ), ), WalletStateTransition( pre_block_balance_updates={ @@ -1394,21 +1410,23 @@ async def assert_trade_tx_number(wallet_node, trade_id, number): "unconfirmed_wallet_balance": -14, "confirmed_wallet_balance": -14, }, - "new cat": { - "spendable_balance": 0, - "max_send_amount": 0, - "unconfirmed_wallet_balance": 0, - "confirmed_wallet_balance": 0, - "unspent_coin_count": 0, - } - if credential_restricted - else { - "spendable_balance": 15, - "max_send_amount": 15, - "unconfirmed_wallet_balance": 15, - "confirmed_wallet_balance": 15, - "unspent_coin_count": 1, - }, + "new cat": ( + { + "spendable_balance": 0, + "max_send_amount": 0, + "unconfirmed_wallet_balance": 0, + "confirmed_wallet_balance": 0, + "unspent_coin_count": 0, + } + if credential_restricted + else { + "spendable_balance": 15, + "max_send_amount": 15, + "unconfirmed_wallet_balance": 15, + "confirmed_wallet_balance": 15, + "unspent_coin_count": 1, + } + ), }, ), WalletStateTransition( diff --git a/tests/wallet/conftest.py b/tests/wallet/conftest.py index 7a378f4b948d..8d756bdee5ea 100644 --- a/tests/wallet/conftest.py +++ b/tests/wallet/conftest.py @@ -137,9 +137,11 @@ async def wallet_environments( for service in wallet_services: service._node.config = { **service._node.config, - "trusted_peers": {full_node[0]._api.server.node_id.hex(): full_node[0]._api.server.node_id.hex()} - if trusted_full_node - else {}, + "trusted_peers": ( + {full_node[0]._api.server.node_id.hex(): full_node[0]._api.server.node_id.hex()} + if trusted_full_node + else {} + ), **config_overrides, } service._node.wallet_state_manager.config = service._node.config diff --git a/tests/wallet/rpc/test_wallet_rpc.py b/tests/wallet/rpc/test_wallet_rpc.py index 9c1ad92d8821..1b8db0a9ad5d 100644 --- a/tests/wallet/rpc/test_wallet_rpc.py +++ b/tests/wallet/rpc/test_wallet_rpc.py @@ -1936,9 +1936,7 @@ async def test_get_coin_records_rpc_limits( max_coins = api.max_get_coin_records_limit * 10 coin_records = [ WalletCoinRecord( - Coin( - bytes32.random(seeded_random), bytes32.random(seeded_random), uint64(seeded_random.randrange(2**64)) - ), + Coin(bytes32.random(seeded_random), bytes32.random(seeded_random), uint64(seeded_random.randrange(2**64))), uint32(seeded_random.randrange(2**32)), uint32(0), False, diff --git a/tests/wallet/test_wallet.py b/tests/wallet/test_wallet.py index f3edc665b54a..852234fa4e07 100644 --- a/tests/wallet/test_wallet.py +++ b/tests/wallet/test_wallet.py @@ -852,35 +852,35 @@ async def test_clawback_resync( assert len(await wallet_node_1.wallet_state_manager.coin_store.get_all_unspent_coins()) == 6 assert len(await wallet_node_2.wallet_state_manager.coin_store.get_all_unspent_coins()) == 0 before_txs: Dict[str, Dict[TransactionType, int]] = {"sender": {}, "recipient": {}} - before_txs["sender"][ - TransactionType.INCOMING_CLAWBACK_SEND - ] = await wallet_node_1.wallet_state_manager.tx_store.get_transaction_count_for_wallet( - 1, type_filter=TransactionTypeFilter.include([TransactionType.INCOMING_CLAWBACK_SEND]) - ) - before_txs["sender"][ - TransactionType.OUTGOING_CLAWBACK - ] = await wallet_node_1.wallet_state_manager.tx_store.get_transaction_count_for_wallet( - 1, type_filter=TransactionTypeFilter.include([TransactionType.OUTGOING_CLAWBACK]) - ) - before_txs["sender"][ - TransactionType.OUTGOING_TX - ] = await wallet_node_1.wallet_state_manager.tx_store.get_transaction_count_for_wallet( - 1, type_filter=TransactionTypeFilter.include([TransactionType.OUTGOING_TX]) - ) - before_txs["sender"][ - TransactionType.INCOMING_TX - ] = await wallet_node_1.wallet_state_manager.tx_store.get_transaction_count_for_wallet( - 1, type_filter=TransactionTypeFilter.include([TransactionType.INCOMING_TX]) - ) - before_txs["sender"][ - TransactionType.COINBASE_REWARD - ] = await wallet_node_1.wallet_state_manager.tx_store.get_transaction_count_for_wallet( - 1, type_filter=TransactionTypeFilter.include([TransactionType.COINBASE_REWARD]) - ) - before_txs["recipient"][ - TransactionType.INCOMING_CLAWBACK_RECEIVE - ] = await wallet_node_2.wallet_state_manager.tx_store.get_transaction_count_for_wallet( - 1, type_filter=TransactionTypeFilter.include([TransactionType.INCOMING_CLAWBACK_RECEIVE]) + before_txs["sender"][TransactionType.INCOMING_CLAWBACK_SEND] = ( + await wallet_node_1.wallet_state_manager.tx_store.get_transaction_count_for_wallet( + 1, type_filter=TransactionTypeFilter.include([TransactionType.INCOMING_CLAWBACK_SEND]) + ) + ) + before_txs["sender"][TransactionType.OUTGOING_CLAWBACK] = ( + await wallet_node_1.wallet_state_manager.tx_store.get_transaction_count_for_wallet( + 1, type_filter=TransactionTypeFilter.include([TransactionType.OUTGOING_CLAWBACK]) + ) + ) + before_txs["sender"][TransactionType.OUTGOING_TX] = ( + await wallet_node_1.wallet_state_manager.tx_store.get_transaction_count_for_wallet( + 1, type_filter=TransactionTypeFilter.include([TransactionType.OUTGOING_TX]) + ) + ) + before_txs["sender"][TransactionType.INCOMING_TX] = ( + await wallet_node_1.wallet_state_manager.tx_store.get_transaction_count_for_wallet( + 1, type_filter=TransactionTypeFilter.include([TransactionType.INCOMING_TX]) + ) + ) + before_txs["sender"][TransactionType.COINBASE_REWARD] = ( + await wallet_node_1.wallet_state_manager.tx_store.get_transaction_count_for_wallet( + 1, type_filter=TransactionTypeFilter.include([TransactionType.COINBASE_REWARD]) + ) + ) + before_txs["recipient"][TransactionType.INCOMING_CLAWBACK_RECEIVE] = ( + await wallet_node_2.wallet_state_manager.tx_store.get_transaction_count_for_wallet( + 1, type_filter=TransactionTypeFilter.include([TransactionType.INCOMING_CLAWBACK_RECEIVE]) + ) ) # Resync start wallet_node_1._close() @@ -899,35 +899,35 @@ async def test_clawback_resync( await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node_1, timeout=20) await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node_2, timeout=20) after_txs: Dict[str, Dict[TransactionType, int]] = {"sender": {}, "recipient": {}} - after_txs["sender"][ - TransactionType.INCOMING_CLAWBACK_SEND - ] = await wallet_node_1.wallet_state_manager.tx_store.get_transaction_count_for_wallet( - 1, type_filter=TransactionTypeFilter.include([TransactionType.INCOMING_CLAWBACK_SEND]) - ) - after_txs["sender"][ - TransactionType.OUTGOING_CLAWBACK - ] = await wallet_node_1.wallet_state_manager.tx_store.get_transaction_count_for_wallet( - 1, type_filter=TransactionTypeFilter.include([TransactionType.OUTGOING_CLAWBACK]) - ) - after_txs["sender"][ - TransactionType.OUTGOING_TX - ] = await wallet_node_1.wallet_state_manager.tx_store.get_transaction_count_for_wallet( - 1, type_filter=TransactionTypeFilter.include([TransactionType.OUTGOING_TX]) - ) - after_txs["sender"][ - TransactionType.INCOMING_TX - ] = await wallet_node_1.wallet_state_manager.tx_store.get_transaction_count_for_wallet( - 1, type_filter=TransactionTypeFilter.include([TransactionType.INCOMING_TX]) - ) - after_txs["sender"][ - TransactionType.COINBASE_REWARD - ] = await wallet_node_1.wallet_state_manager.tx_store.get_transaction_count_for_wallet( - 1, type_filter=TransactionTypeFilter.include([TransactionType.COINBASE_REWARD]) - ) - after_txs["recipient"][ - TransactionType.INCOMING_CLAWBACK_RECEIVE - ] = await wallet_node_2.wallet_state_manager.tx_store.get_transaction_count_for_wallet( - 1, type_filter=TransactionTypeFilter.include([TransactionType.INCOMING_CLAWBACK_RECEIVE]) + after_txs["sender"][TransactionType.INCOMING_CLAWBACK_SEND] = ( + await wallet_node_1.wallet_state_manager.tx_store.get_transaction_count_for_wallet( + 1, type_filter=TransactionTypeFilter.include([TransactionType.INCOMING_CLAWBACK_SEND]) + ) + ) + after_txs["sender"][TransactionType.OUTGOING_CLAWBACK] = ( + await wallet_node_1.wallet_state_manager.tx_store.get_transaction_count_for_wallet( + 1, type_filter=TransactionTypeFilter.include([TransactionType.OUTGOING_CLAWBACK]) + ) + ) + after_txs["sender"][TransactionType.OUTGOING_TX] = ( + await wallet_node_1.wallet_state_manager.tx_store.get_transaction_count_for_wallet( + 1, type_filter=TransactionTypeFilter.include([TransactionType.OUTGOING_TX]) + ) + ) + after_txs["sender"][TransactionType.INCOMING_TX] = ( + await wallet_node_1.wallet_state_manager.tx_store.get_transaction_count_for_wallet( + 1, type_filter=TransactionTypeFilter.include([TransactionType.INCOMING_TX]) + ) + ) + after_txs["sender"][TransactionType.COINBASE_REWARD] = ( + await wallet_node_1.wallet_state_manager.tx_store.get_transaction_count_for_wallet( + 1, type_filter=TransactionTypeFilter.include([TransactionType.COINBASE_REWARD]) + ) + ) + after_txs["recipient"][TransactionType.INCOMING_CLAWBACK_RECEIVE] = ( + await wallet_node_2.wallet_state_manager.tx_store.get_transaction_count_for_wallet( + 1, type_filter=TransactionTypeFilter.include([TransactionType.INCOMING_CLAWBACK_RECEIVE]) + ) ) # Check clawback clawback_tx_1 = await wallet_node_1.wallet_state_manager.tx_store.get_transaction_record(clawback_coin_id_1) diff --git a/tests/wallet/vc_wallet/test_vc_lifecycle.py b/tests/wallet/vc_wallet/test_vc_lifecycle.py index d7b7484535a2..9b57a46dd84c 100644 --- a/tests/wallet/vc_wallet/test_vc_lifecycle.py +++ b/tests/wallet/vc_wallet/test_vc_lifecycle.py @@ -714,15 +714,19 @@ async def test_vc_lifecycle(test_syncing: bool, cost_logger: CostLogger) -> None [51, ACS_PH, vc.coin.amount], [ 62, - cr_1.expected_announcement() - if error not in ["use_malicious_cats", "attempt_honest_cat_piggyback"] - else malicious_cr_1.expected_announcement(), + ( + cr_1.expected_announcement() + if error not in ["use_malicious_cats", "attempt_honest_cat_piggyback"] + else malicious_cr_1.expected_announcement() + ), ], [ 62, - cr_2.expected_announcement() - if error not in ["use_malicious_cats", "attempt_honest_cat_piggyback"] - else malicious_cr_2.expected_announcement(), + ( + cr_2.expected_announcement() + if error not in ["use_malicious_cats", "attempt_honest_cat_piggyback"] + else malicious_cr_2.expected_announcement() + ), ], *(a.to_program() for a in expected_announcements), vc.standard_magic_condition(), @@ -779,13 +783,15 @@ async def test_vc_lifecycle(test_syncing: bool, cost_logger: CostLogger) -> None ACS, ), solution_for_singleton( - LineageProof( - parent_name=did.parent_coin_info, - inner_puzzle_hash=ACS_PH, - amount=uint64(did.amount), - ) - if correct_did - else other_lineage_proof, + ( + LineageProof( + parent_name=did.parent_coin_info, + inner_puzzle_hash=ACS_PH, + amount=uint64(did.amount), + ) + if correct_did + else other_lineage_proof + ), uint64(new_did.amount), Program.to([[51, ACS_PH, new_did.amount], expected_announcement.to_program()]), ), diff --git a/tools/manage_clvm.py b/tools/manage_clvm.py index 3a6a8f7bddfa..911ec8217df9 100644 --- a/tools/manage_clvm.py +++ b/tools/manage_clvm.py @@ -143,9 +143,11 @@ def from_clvm_paths(cls, paths: ClvmPaths, hash_dict: typing.Dict[str, str] = {} hex_bytes = paths.hex.read_bytes() return cls( hex=hex_bytes, - hash=bytes32(bytes.fromhex(hash_dict[paths.hash])) - if paths.hash in hash_dict - else generate_hash_bytes(hex_bytes=hex_bytes), + hash=( + bytes32(bytes.fromhex(hash_dict[paths.hash])) + if paths.hash in hash_dict + else generate_hash_bytes(hex_bytes=hex_bytes) + ), ) @classmethod From 368f69cf1126684890910f2ce9515a7dadc661b5 Mon Sep 17 00:00:00 2001 From: Kyle Altendorf Date: Wed, 13 Mar 2024 16:41:04 -0400 Subject: [PATCH 07/12] prettier (#17396) * add prettier to pre-commit * apply prettier.io --- .github/ISSUE_TEMPLATE/bug_report.yaml | 2 +- .github/ISSUE_TEMPLATE/config.yml | 2 +- .github/workflows/benchmarks.yml | 36 +- .../workflows/build-linux-installer-deb.yml | 704 ++++++++--------- .../workflows/build-linux-installer-rpm.yml | 748 +++++++++--------- .github/workflows/build-macos-installers.yml | 82 +- .github/workflows/build-windows-installer.yml | 742 ++++++++--------- .github/workflows/check-commit-signing.yml | 18 +- .../workflows/check_wheel_availability.yaml | 28 +- .github/workflows/codeql-analysis.yml | 60 +- .github/workflows/dependency-review.yml | 6 +- .github/workflows/pre-commit.yml | 44 +- .github/workflows/stale-issue.yml | 4 +- .github/workflows/super-linter.yml | 10 +- .github/workflows/test-install-scripts.yml | 292 +++---- .github/workflows/test-single.yml | 64 +- .github/workflows/test.yml | 28 +- .github/workflows/trigger-docker-dev.yml | 8 +- .github/workflows/trigger-docker-main.yml | 2 +- .github/workflows/upload-pypi-source.yml | 168 ++-- .markdown-lint.yml | 18 +- .pre-commit-config.yaml | 61 +- .prettierrc.yaml | 4 + build_scripts/electron-builder.json | 16 +- .../puzzles/deployed_puzzle_hashes.json | 126 +-- .../test_third_party_harvesters_data.json | 34 +- tests/tools/1315537.json | 318 ++++---- tests/tools/1315544.json | 298 +++---- tests/tools/1315630.json | 282 +++---- tests/tools/300000.json | 202 ++--- tests/tools/466212.json | 4 +- tests/util/bip39_test_vectors.json | 290 +++---- 32 files changed, 2355 insertions(+), 2346 deletions(-) create mode 100644 .prettierrc.yaml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 72d803bc0878..c80618be3d02 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -12,7 +12,7 @@ body: id: what-happened attributes: label: What happened? - description: A clear and concise description of what happened, how to reproduce it, and what you expected to happen. + description: A clear and concise description of what happened, how to reproduce it, and what you expected to happen. validations: required: true - type: input diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 1559f1bc6ad4..6959b47a39a8 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -9,4 +9,4 @@ contact_links: https://github.com/Chia-Network/chia-blockchain/discussions/new?category=ideas - about: Get support in the Chia Discord chat channels. name: Join the Discord support chat - url: 'https://discord.gg/chia' + url: "https://discord.gg/chia" diff --git a/.github/workflows/benchmarks.yml b/.github/workflows/benchmarks.yml index b94aa610b227..c37cb697a3b7 100644 --- a/.github/workflows/benchmarks.yml +++ b/.github/workflows/benchmarks.yml @@ -1,26 +1,26 @@ name: ⚡️ Benchmarks on: - workflow_dispatch: + workflow_dispatch: inputs: repeats: description: "The number of times to execute each benchmark" type: int default: 1 - push: - paths-ignore: - - '**.md' - branches: - - 'long_lived/**' - - main - - 'release/**' - release: - types: [published] - pull_request: - paths-ignore: - - '**.md' - branches: - - '**' + push: + paths-ignore: + - "**.md" + branches: + - "long_lived/**" + - main + - "release/**" + release: + types: [published] + pull_request: + paths-ignore: + - "**.md" + branches: + - "**" concurrency: # SHA is added to the end if on `main` to let all main workflows run @@ -57,7 +57,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: [ "3.10" ] + python-version: ["3.10"] env: CHIA_ROOT: ${{ github.workspace }}/.chia/mainnet BLOCKS_AND_PLOTS_VERSION: 0.38.0 @@ -91,8 +91,8 @@ jobs: - name: Checkout test blocks and plots uses: actions/checkout@v4 with: - repository: 'Chia-Network/test-cache' - path: '.chia' + repository: "Chia-Network/test-cache" + path: ".chia" ref: ${{ env.BLOCKS_AND_PLOTS_VERSION }} fetch-depth: 1 diff --git a/.github/workflows/build-linux-installer-deb.yml b/.github/workflows/build-linux-installer-deb.yml index 978f9acc41da..d2b1ea0efced 100644 --- a/.github/workflows/build-linux-installer-deb.yml +++ b/.github/workflows/build-linux-installer-deb.yml @@ -4,29 +4,29 @@ on: workflow_dispatch: inputs: release_type: - description: 'Tagged release testing scenario' + description: "Tagged release testing scenario" required: false type: choice - default: '' + default: "" options: - - '' - - 9.9.9-b1 - - 9.9.9-rc1 - - 9.9.9 + - "" + - 9.9.9-b1 + - 9.9.9-rc1 + - 9.9.9 push: paths-ignore: - - '**.md' + - "**.md" branches: - - 'long_lived/**' + - "long_lived/**" - main - - 'release/**' + - "release/**" release: types: [published] pull_request: paths-ignore: - - '**.md' + - "**.md" branches: - - '**' + - "**" concurrency: # SHA is added to the end if on `main` to let all main workflows run @@ -60,151 +60,151 @@ jobs: bladebit-suffix: "ubuntu-arm64.tar.gz" steps: - - uses: Chia-Network/actions/clean-workspace@main - - - name: Add safe git directory - uses: Chia-Network/actions/git-mark-workspace-safe@main - - - name: Checkout Code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - submodules: recursive - - - uses: Chia-Network/actions/git-ssh-to-https@main - - - name: Cleanup any leftovers that exist from previous runs - run: bash build_scripts/clean-runner.sh || true - - - name: Set Env - uses: Chia-Network/actions/setjobenv@main - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Check tag type - shell: bash - run: | - REG_B="^[0-9]+\.[0-9]+\.[0-9]+-b[0-9]+$" - REG_RC="^[0-9]+\.[0-9]+\.[0-9]+-rc[0-9]+$" - if [[ "${{ github.event.release.tag_name }}" =~ $REG_B ]] || [[ "${{ inputs.release_type }}" =~ $REG_B ]]; then - echo "TAG_TYPE=beta" - echo "TAG_TYPE=beta" >> "$GITHUB_ENV" - elif [[ "${{ github.event.release.tag_name }}" =~ $REG_RC ]] || [[ "${{ inputs.release_type }}" =~ $REG_RC ]]; then - echo "TAG_TYPE=rc" - echo "TAG_TYPE=rc" >> "$GITHUB_ENV" - fi - - # Create our own venv outside of the git directory JUST for getting the ACTUAL version so that install can't break it - - name: Get version number - id: version_number - run: | - python3 -m venv ../venv - . ../venv/bin/activate - pip3 install setuptools_scm - echo "CHIA_INSTALLER_VERSION=$(python3 ./build_scripts/installer-version.py)" >> "$GITHUB_OUTPUT" - deactivate - - - name: Get latest madmax plotter - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - LATEST_MADMAX=$(gh api repos/Chia-Network/chia-plotter-madmax/releases/latest --jq 'select(.prerelease == false) | .tag_name') - mkdir "$GITHUB_WORKSPACE"/madmax - gh release download -R Chia-Network/chia-plotter-madmax "$LATEST_MADMAX" -p 'chia_plot-*-${{ matrix.os.madmax-suffix }}' -O "$GITHUB_WORKSPACE"/madmax/chia_plot - gh release download -R Chia-Network/chia-plotter-madmax "$LATEST_MADMAX" -p 'chia_plot_k34-*-${{ matrix.os.madmax-suffix }}' -O "$GITHUB_WORKSPACE"/madmax/chia_plot_k34 - chmod +x "$GITHUB_WORKSPACE"/madmax/chia_plot - chmod +x "$GITHUB_WORKSPACE"/madmax/chia_plot_k34 - - - name: Fetch bladebit versions - shell: bash - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - # Fetch the latest version of each type - LATEST_RELEASE=$(gh api repos/Chia-Network/bladebit/releases/latest --jq 'select(.prerelease == false) | .tag_name') - LATEST_BETA=$(gh api repos/Chia-Network/bladebit/releases --jq 'map(select(.prerelease) | select(.tag_name | test("^v[0-9]+\\.[0-9]+\\.[0-9]+-beta[0-9]+$"))) | first | .tag_name') - LATEST_RC=$(gh api repos/Chia-Network/bladebit/releases --jq 'map(select(.prerelease) | select(.tag_name | test("^v[0-9]+\\.[0-9]+\\.[0-9]+-rc[0-9]+$"))) | first | .tag_name') - - # Compare the versions and choose the newest that matches the requirements - if [[ "$TAG_TYPE" == "beta" || -z "$TAG_TYPE" ]]; then - # For beta or dev builds (indicated by the absence of a tag), use the latest version available - LATEST_VERSION=$(printf "%s\n%s\n%s\n" "$LATEST_RELEASE" "$LATEST_BETA" "$LATEST_RC" | sed '/-/!s/$/_/' | sort -V | sed 's/_$//' | tail -n 1) - elif [[ "$TAG_TYPE" == "rc" ]]; then - # For RC builds, use the latest RC or full release if it's newer - LATEST_VERSION=$(printf "%s\n%s\n" "$LATEST_RELEASE" "$LATEST_RC" | sed '/-/!s/$/_/' | sort -V | sed 's/_$//' | tail -n 1) - else - # For full releases, use the latest full release - LATEST_VERSION="$LATEST_RELEASE" - fi - echo "LATEST_VERSION=$LATEST_VERSION" >> "$GITHUB_ENV" - - - name: Get latest bladebit plotter - shell: bash - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - # Download and extract the chosen version - mkdir "$GITHUB_WORKSPACE"/bladebit - cd "$GITHUB_WORKSPACE"/bladebit - gh release download -R Chia-Network/bladebit "$LATEST_VERSION" -p 'bladebit*-${{ matrix.os.bladebit-suffix }}' - ls *.tar.gz | xargs -I{} bash -c 'tar -xzf {} && rm {}' - ls bladebit* | xargs -I{} chmod +x {} - cd "$OLDPWD" - - - uses: ./.github/actions/install - with: - python-version: ${{ matrix.python-version }} - development: true - constraints-file-artifact-name: constraints-file-${{ matrix.os.arch }} - - - uses: chia-network/actions/activate-venv@main - - - name: Prepare GUI cache - id: gui-ref - run: | - gui_ref=$(git submodule status chia-blockchain-gui | sed -e 's/^ //g' -e 's/ chia-blockchain-gui.*$//g') - echo "${gui_ref}" - echo "GUI_REF=${gui_ref}" >> "$GITHUB_OUTPUT" - echo "rm -rf ./chia-blockchain-gui" - rm -rf ./chia-blockchain-gui - - - name: Cache GUI - uses: actions/cache@v4 - id: cache-gui - with: - path: ./chia-blockchain-gui - key: ${{ runner.os }}-${{ matrix.os.arch }}-chia-blockchain-gui-${{ steps.gui-ref.outputs.GUI_REF }} - - - if: steps.cache-gui.outputs.cache-hit != 'true' - name: Build GUI - continue-on-error: false - run: | - cd ./build_scripts - bash build_linux_deb-1-gui.sh - - - name: Build .deb package - env: - CHIA_INSTALLER_VERSION: ${{ steps.version_number.outputs.CHIA_INSTALLER_VERSION }} - run: | - ldd --version - cd ./build_scripts - sh build_linux_deb-2-installer.sh ${{ matrix.os.arch }} - - - name: Upload Linux artifacts - uses: actions/upload-artifact@v4 - with: - name: chia-installers-linux-deb-${{ matrix.os.arch }} - path: ${{ github.workspace }}/build_scripts/final_installer/ - - - name: Remove working files to exclude from cache - run: | - rm -rf ./chia-blockchain-gui/packages/gui/daemon + - uses: Chia-Network/actions/clean-workspace@main + + - name: Add safe git directory + uses: Chia-Network/actions/git-mark-workspace-safe@main + + - name: Checkout Code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + submodules: recursive + + - uses: Chia-Network/actions/git-ssh-to-https@main + + - name: Cleanup any leftovers that exist from previous runs + run: bash build_scripts/clean-runner.sh || true + + - name: Set Env + uses: Chia-Network/actions/setjobenv@main + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Check tag type + shell: bash + run: | + REG_B="^[0-9]+\.[0-9]+\.[0-9]+-b[0-9]+$" + REG_RC="^[0-9]+\.[0-9]+\.[0-9]+-rc[0-9]+$" + if [[ "${{ github.event.release.tag_name }}" =~ $REG_B ]] || [[ "${{ inputs.release_type }}" =~ $REG_B ]]; then + echo "TAG_TYPE=beta" + echo "TAG_TYPE=beta" >> "$GITHUB_ENV" + elif [[ "${{ github.event.release.tag_name }}" =~ $REG_RC ]] || [[ "${{ inputs.release_type }}" =~ $REG_RC ]]; then + echo "TAG_TYPE=rc" + echo "TAG_TYPE=rc" >> "$GITHUB_ENV" + fi + + # Create our own venv outside of the git directory JUST for getting the ACTUAL version so that install can't break it + - name: Get version number + id: version_number + run: | + python3 -m venv ../venv + . ../venv/bin/activate + pip3 install setuptools_scm + echo "CHIA_INSTALLER_VERSION=$(python3 ./build_scripts/installer-version.py)" >> "$GITHUB_OUTPUT" + deactivate + + - name: Get latest madmax plotter + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + LATEST_MADMAX=$(gh api repos/Chia-Network/chia-plotter-madmax/releases/latest --jq 'select(.prerelease == false) | .tag_name') + mkdir "$GITHUB_WORKSPACE"/madmax + gh release download -R Chia-Network/chia-plotter-madmax "$LATEST_MADMAX" -p 'chia_plot-*-${{ matrix.os.madmax-suffix }}' -O "$GITHUB_WORKSPACE"/madmax/chia_plot + gh release download -R Chia-Network/chia-plotter-madmax "$LATEST_MADMAX" -p 'chia_plot_k34-*-${{ matrix.os.madmax-suffix }}' -O "$GITHUB_WORKSPACE"/madmax/chia_plot_k34 + chmod +x "$GITHUB_WORKSPACE"/madmax/chia_plot + chmod +x "$GITHUB_WORKSPACE"/madmax/chia_plot_k34 + + - name: Fetch bladebit versions + shell: bash + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + # Fetch the latest version of each type + LATEST_RELEASE=$(gh api repos/Chia-Network/bladebit/releases/latest --jq 'select(.prerelease == false) | .tag_name') + LATEST_BETA=$(gh api repos/Chia-Network/bladebit/releases --jq 'map(select(.prerelease) | select(.tag_name | test("^v[0-9]+\\.[0-9]+\\.[0-9]+-beta[0-9]+$"))) | first | .tag_name') + LATEST_RC=$(gh api repos/Chia-Network/bladebit/releases --jq 'map(select(.prerelease) | select(.tag_name | test("^v[0-9]+\\.[0-9]+\\.[0-9]+-rc[0-9]+$"))) | first | .tag_name') + + # Compare the versions and choose the newest that matches the requirements + if [[ "$TAG_TYPE" == "beta" || -z "$TAG_TYPE" ]]; then + # For beta or dev builds (indicated by the absence of a tag), use the latest version available + LATEST_VERSION=$(printf "%s\n%s\n%s\n" "$LATEST_RELEASE" "$LATEST_BETA" "$LATEST_RC" | sed '/-/!s/$/_/' | sort -V | sed 's/_$//' | tail -n 1) + elif [[ "$TAG_TYPE" == "rc" ]]; then + # For RC builds, use the latest RC or full release if it's newer + LATEST_VERSION=$(printf "%s\n%s\n" "$LATEST_RELEASE" "$LATEST_RC" | sed '/-/!s/$/_/' | sort -V | sed 's/_$//' | tail -n 1) + else + # For full releases, use the latest full release + LATEST_VERSION="$LATEST_RELEASE" + fi + echo "LATEST_VERSION=$LATEST_VERSION" >> "$GITHUB_ENV" + + - name: Get latest bladebit plotter + shell: bash + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + # Download and extract the chosen version + mkdir "$GITHUB_WORKSPACE"/bladebit + cd "$GITHUB_WORKSPACE"/bladebit + gh release download -R Chia-Network/bladebit "$LATEST_VERSION" -p 'bladebit*-${{ matrix.os.bladebit-suffix }}' + ls *.tar.gz | xargs -I{} bash -c 'tar -xzf {} && rm {}' + ls bladebit* | xargs -I{} chmod +x {} + cd "$OLDPWD" + + - uses: ./.github/actions/install + with: + python-version: ${{ matrix.python-version }} + development: true + constraints-file-artifact-name: constraints-file-${{ matrix.os.arch }} + + - uses: chia-network/actions/activate-venv@main + + - name: Prepare GUI cache + id: gui-ref + run: | + gui_ref=$(git submodule status chia-blockchain-gui | sed -e 's/^ //g' -e 's/ chia-blockchain-gui.*$//g') + echo "${gui_ref}" + echo "GUI_REF=${gui_ref}" >> "$GITHUB_OUTPUT" + echo "rm -rf ./chia-blockchain-gui" + rm -rf ./chia-blockchain-gui + + - name: Cache GUI + uses: actions/cache@v4 + id: cache-gui + with: + path: ./chia-blockchain-gui + key: ${{ runner.os }}-${{ matrix.os.arch }}-chia-blockchain-gui-${{ steps.gui-ref.outputs.GUI_REF }} + + - if: steps.cache-gui.outputs.cache-hit != 'true' + name: Build GUI + continue-on-error: false + run: | + cd ./build_scripts + bash build_linux_deb-1-gui.sh + + - name: Build .deb package + env: + CHIA_INSTALLER_VERSION: ${{ steps.version_number.outputs.CHIA_INSTALLER_VERSION }} + run: | + ldd --version + cd ./build_scripts + sh build_linux_deb-2-installer.sh ${{ matrix.os.arch }} + + - name: Upload Linux artifacts + uses: actions/upload-artifact@v4 + with: + name: chia-installers-linux-deb-${{ matrix.os.arch }} + path: ${{ github.workspace }}/build_scripts/final_installer/ + + - name: Remove working files to exclude from cache + run: | + rm -rf ./chia-blockchain-gui/packages/gui/daemon publish: name: Publish ${{ matrix.os.arch }} runs-on: ${{ matrix.os.runs-on }} needs: - - build + - build container: chianetwork/ubuntu-20.04-builder:latest timeout-minutes: ${{ matrix.os.timeout }} strategy: @@ -226,222 +226,222 @@ jobs: CHIA_INSTALLER_VERSION: ${{ needs.build.outputs.chia-installer-version }} steps: - - uses: Chia-Network/actions/clean-workspace@main - - - uses: chia-network/actions/create-venv@main - id: create-venv - - - uses: chia-network/actions/activate-venv@main - with: - directories: ${{ steps.create-venv.outputs.activate-venv-directories }} - - - name: Download constraints file - uses: actions/download-artifact@v4 - with: - name: constraints-file-${{ matrix.os.arch }} - path: venv - - - name: Install utilities - run: | - pip install --constraint venv/constraints.txt py3createtorrent - - - name: Download packages - uses: actions/download-artifact@v4 - with: - name: chia-installers-linux-deb-${{ matrix.os.arch }} - path: build_scripts/final_installer/ - - - name: Set Env - uses: Chia-Network/actions/setjobenv@main - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Test for secrets access - id: check_secrets - shell: bash - run: | - unset HAS_AWS_SECRET - unset HAS_GLUE_SECRET - - if [ -n "$AWS_SECRET" ]; then HAS_AWS_SECRET='true' ; fi - echo HAS_AWS_SECRET=${HAS_AWS_SECRET} >> "$GITHUB_OUTPUT" - - if [ -n "$GLUE_API_URL" ]; then HAS_GLUE_SECRET='true' ; fi - echo HAS_GLUE_SECRET=${HAS_GLUE_SECRET} >> "$GITHUB_OUTPUT" - env: - AWS_SECRET: "${{ secrets.CHIA_AWS_ACCOUNT_ID }}" - GLUE_API_URL: "${{ secrets.GLUE_API_URL }}" - - - name: Configure AWS credentials - if: steps.check_secrets.outputs.HAS_AWS_SECRET - uses: aws-actions/configure-aws-credentials@v4 - with: - role-to-assume: arn:aws:iam::${{ secrets.CHIA_AWS_ACCOUNT_ID }}:role/installer-upload - aws-region: us-west-2 - - - name: Upload to s3 - if: steps.check_secrets.outputs.HAS_AWS_SECRET - run: | - GIT_SHORT_HASH=$(echo "${GITHUB_SHA}" | cut -c1-8) - CHIA_DEV_BUILD=${CHIA_INSTALLER_VERSION}-$GIT_SHORT_HASH - echo "CHIA_DEV_BUILD=$CHIA_DEV_BUILD" >> "$GITHUB_ENV" - aws s3 cp "$GITHUB_WORKSPACE/build_scripts/final_installer/chia-blockchain_${CHIA_INSTALLER_VERSION}_${{ matrix.os.arch }}.deb" "s3://download.chia.net/dev/chia-blockchain_${CHIA_DEV_BUILD}_${{ matrix.os.arch }}.deb" - aws s3 cp "$GITHUB_WORKSPACE/build_scripts/final_installer/chia-blockchain-cli_${CHIA_INSTALLER_VERSION}-1_${{ matrix.os.arch }}.deb" "s3://download.chia.net/dev/chia-blockchain-cli_${CHIA_DEV_BUILD}-1_${{ matrix.os.arch }}.deb" - - - name: Create Checksums - if: env.FULL_RELEASE == 'true' || github.ref == 'refs/heads/main' - run: | - ls "$GITHUB_WORKSPACE"/build_scripts/final_installer/ - sha256sum "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain_${CHIA_INSTALLER_VERSION}_${{ matrix.os.arch }}.deb > "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain_${CHIA_INSTALLER_VERSION}_${{ matrix.os.arch }}.deb.sha256 - sha256sum "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli_${CHIA_INSTALLER_VERSION}-1_${{ matrix.os.arch }}.deb > "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli_${CHIA_INSTALLER_VERSION}-1_${{ matrix.os.arch }}.deb.sha256 - ls "$GITHUB_WORKSPACE"/build_scripts/final_installer/ - - - name: Create .deb torrent - if: env.FULL_RELEASE == 'true' - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - py3createtorrent -f -t udp://tracker.opentrackr.org:1337/announce "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain_${CHIA_INSTALLER_VERSION}_${{ matrix.os.arch }}.deb -o "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain_${CHIA_INSTALLER_VERSION}_${{ matrix.os.arch }}.deb.torrent --webseed https://download.chia.net/install/chia-blockchain_${CHIA_INSTALLER_VERSION}_${{ matrix.os.arch }}.deb - py3createtorrent -f -t udp://tracker.opentrackr.org:1337/announce "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli_${CHIA_INSTALLER_VERSION}-1_${{ matrix.os.arch }}.deb -o "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli_${CHIA_INSTALLER_VERSION}-1_${{ matrix.os.arch }}.deb.torrent --webseed https://download.chia.net/install/chia-blockchain-cli_${CHIA_INSTALLER_VERSION}-1_${{ matrix.os.arch }}.deb - gh release upload --repo ${{ github.repository }} $RELEASE_TAG "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain_${CHIA_INSTALLER_VERSION}_${{ matrix.os.arch }}.deb.torrent - - - name: Upload Dev Installer - if: steps.check_secrets.outputs.HAS_AWS_SECRET && github.ref == 'refs/heads/main' - run: | - aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain_${CHIA_INSTALLER_VERSION}_${{ matrix.os.arch }}.deb s3://download.chia.net/latest-dev/chia-blockchain_${{ matrix.os.arch }}_latest_dev.deb - aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain_${CHIA_INSTALLER_VERSION}_${{ matrix.os.arch }}.deb.sha256 s3://download.chia.net/latest-dev/chia-blockchain_${{ matrix.os.arch }}_latest_dev.deb.sha256 - aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli_${CHIA_INSTALLER_VERSION}-1_${{ matrix.os.arch }}.deb s3://download.chia.net/latest-dev/chia-blockchain-cli_${{ matrix.os.arch }}_latest_dev.deb - aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli_${CHIA_INSTALLER_VERSION}-1_${{ matrix.os.arch }}.deb.sha256 s3://download.chia.net/latest-dev/chia-blockchain-cli_${{ matrix.os.arch }}_latest_dev.deb.sha256 - - - name: Upload Release Files - if: steps.check_secrets.outputs.HAS_AWS_SECRET && env.FULL_RELEASE == 'true' - run: | - aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain_${CHIA_INSTALLER_VERSION}_${{ matrix.os.arch }}.deb s3://download.chia.net/install/ - aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain_${CHIA_INSTALLER_VERSION}_${{ matrix.os.arch }}.deb.sha256 s3://download.chia.net/install/ - aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain_${CHIA_INSTALLER_VERSION}_${{ matrix.os.arch }}.deb.torrent s3://download.chia.net/torrents/ - aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli_${CHIA_INSTALLER_VERSION}-1_${{ matrix.os.arch }}.deb s3://download.chia.net/install/ - aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli_${CHIA_INSTALLER_VERSION}-1_${{ matrix.os.arch }}.deb.sha256 s3://download.chia.net/install/ - aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli_${CHIA_INSTALLER_VERSION}-1_${{ matrix.os.arch }}.deb.torrent s3://download.chia.net/torrents/ - - - name: Upload release artifacts - if: env.RELEASE == 'true' - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - gh release upload \ - --repo ${{ github.repository }} \ - $RELEASE_TAG \ - build_scripts/final_installer/chia-blockchain_${CHIA_INSTALLER_VERSION}_${{ matrix.os.arch }}.deb \ - build_scripts/final_installer/chia-blockchain-cli_${CHIA_INSTALLER_VERSION}-1_${{ matrix.os.arch }}.deb - - - uses: Chia-Network/actions/github/jwt@main - if: steps.check_secrets.outputs.HAS_GLUE_SECRET - - - name: Mark pre-release installer complete - if: steps.check_secrets.outputs.HAS_GLUE_SECRET && env.PRE_RELEASE == 'true' - run: | - curl -s -XPOST -H "Authorization: Bearer ${{ env.JWT_TOKEN }}" --data '{"chia_ref": "${{ env.RELEASE_TAG }}"}' ${{ secrets.GLUE_API_URL }}/api/v1/${{ env.RFC_REPO }}-prerelease/${{ env.RELEASE_TAG }}/success/${{ matrix.os.glue-name }} - - - name: Mark release installer complete - if: steps.check_secrets.outputs.HAS_GLUE_SECRET && env.FULL_RELEASE == 'true' - run: | - curl -s -XPOST -H "Authorization: Bearer ${{ env.JWT_TOKEN }}" --data '{"chia_ref": "${{ env.RELEASE_TAG }}"}' ${{ secrets.GLUE_API_URL }}/api/v1/${{ env.RFC_REPO }}/${{ env.RELEASE_TAG }}/success/${{ matrix.os.glue-name }} + - uses: Chia-Network/actions/clean-workspace@main + + - uses: chia-network/actions/create-venv@main + id: create-venv + + - uses: chia-network/actions/activate-venv@main + with: + directories: ${{ steps.create-venv.outputs.activate-venv-directories }} + + - name: Download constraints file + uses: actions/download-artifact@v4 + with: + name: constraints-file-${{ matrix.os.arch }} + path: venv + + - name: Install utilities + run: | + pip install --constraint venv/constraints.txt py3createtorrent + + - name: Download packages + uses: actions/download-artifact@v4 + with: + name: chia-installers-linux-deb-${{ matrix.os.arch }} + path: build_scripts/final_installer/ + + - name: Set Env + uses: Chia-Network/actions/setjobenv@main + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Test for secrets access + id: check_secrets + shell: bash + run: | + unset HAS_AWS_SECRET + unset HAS_GLUE_SECRET + + if [ -n "$AWS_SECRET" ]; then HAS_AWS_SECRET='true' ; fi + echo HAS_AWS_SECRET=${HAS_AWS_SECRET} >> "$GITHUB_OUTPUT" + + if [ -n "$GLUE_API_URL" ]; then HAS_GLUE_SECRET='true' ; fi + echo HAS_GLUE_SECRET=${HAS_GLUE_SECRET} >> "$GITHUB_OUTPUT" + env: + AWS_SECRET: "${{ secrets.CHIA_AWS_ACCOUNT_ID }}" + GLUE_API_URL: "${{ secrets.GLUE_API_URL }}" + + - name: Configure AWS credentials + if: steps.check_secrets.outputs.HAS_AWS_SECRET + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: arn:aws:iam::${{ secrets.CHIA_AWS_ACCOUNT_ID }}:role/installer-upload + aws-region: us-west-2 + + - name: Upload to s3 + if: steps.check_secrets.outputs.HAS_AWS_SECRET + run: | + GIT_SHORT_HASH=$(echo "${GITHUB_SHA}" | cut -c1-8) + CHIA_DEV_BUILD=${CHIA_INSTALLER_VERSION}-$GIT_SHORT_HASH + echo "CHIA_DEV_BUILD=$CHIA_DEV_BUILD" >> "$GITHUB_ENV" + aws s3 cp "$GITHUB_WORKSPACE/build_scripts/final_installer/chia-blockchain_${CHIA_INSTALLER_VERSION}_${{ matrix.os.arch }}.deb" "s3://download.chia.net/dev/chia-blockchain_${CHIA_DEV_BUILD}_${{ matrix.os.arch }}.deb" + aws s3 cp "$GITHUB_WORKSPACE/build_scripts/final_installer/chia-blockchain-cli_${CHIA_INSTALLER_VERSION}-1_${{ matrix.os.arch }}.deb" "s3://download.chia.net/dev/chia-blockchain-cli_${CHIA_DEV_BUILD}-1_${{ matrix.os.arch }}.deb" + + - name: Create Checksums + if: env.FULL_RELEASE == 'true' || github.ref == 'refs/heads/main' + run: | + ls "$GITHUB_WORKSPACE"/build_scripts/final_installer/ + sha256sum "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain_${CHIA_INSTALLER_VERSION}_${{ matrix.os.arch }}.deb > "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain_${CHIA_INSTALLER_VERSION}_${{ matrix.os.arch }}.deb.sha256 + sha256sum "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli_${CHIA_INSTALLER_VERSION}-1_${{ matrix.os.arch }}.deb > "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli_${CHIA_INSTALLER_VERSION}-1_${{ matrix.os.arch }}.deb.sha256 + ls "$GITHUB_WORKSPACE"/build_scripts/final_installer/ + + - name: Create .deb torrent + if: env.FULL_RELEASE == 'true' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + py3createtorrent -f -t udp://tracker.opentrackr.org:1337/announce "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain_${CHIA_INSTALLER_VERSION}_${{ matrix.os.arch }}.deb -o "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain_${CHIA_INSTALLER_VERSION}_${{ matrix.os.arch }}.deb.torrent --webseed https://download.chia.net/install/chia-blockchain_${CHIA_INSTALLER_VERSION}_${{ matrix.os.arch }}.deb + py3createtorrent -f -t udp://tracker.opentrackr.org:1337/announce "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli_${CHIA_INSTALLER_VERSION}-1_${{ matrix.os.arch }}.deb -o "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli_${CHIA_INSTALLER_VERSION}-1_${{ matrix.os.arch }}.deb.torrent --webseed https://download.chia.net/install/chia-blockchain-cli_${CHIA_INSTALLER_VERSION}-1_${{ matrix.os.arch }}.deb + gh release upload --repo ${{ github.repository }} $RELEASE_TAG "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain_${CHIA_INSTALLER_VERSION}_${{ matrix.os.arch }}.deb.torrent + + - name: Upload Dev Installer + if: steps.check_secrets.outputs.HAS_AWS_SECRET && github.ref == 'refs/heads/main' + run: | + aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain_${CHIA_INSTALLER_VERSION}_${{ matrix.os.arch }}.deb s3://download.chia.net/latest-dev/chia-blockchain_${{ matrix.os.arch }}_latest_dev.deb + aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain_${CHIA_INSTALLER_VERSION}_${{ matrix.os.arch }}.deb.sha256 s3://download.chia.net/latest-dev/chia-blockchain_${{ matrix.os.arch }}_latest_dev.deb.sha256 + aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli_${CHIA_INSTALLER_VERSION}-1_${{ matrix.os.arch }}.deb s3://download.chia.net/latest-dev/chia-blockchain-cli_${{ matrix.os.arch }}_latest_dev.deb + aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli_${CHIA_INSTALLER_VERSION}-1_${{ matrix.os.arch }}.deb.sha256 s3://download.chia.net/latest-dev/chia-blockchain-cli_${{ matrix.os.arch }}_latest_dev.deb.sha256 + + - name: Upload Release Files + if: steps.check_secrets.outputs.HAS_AWS_SECRET && env.FULL_RELEASE == 'true' + run: | + aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain_${CHIA_INSTALLER_VERSION}_${{ matrix.os.arch }}.deb s3://download.chia.net/install/ + aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain_${CHIA_INSTALLER_VERSION}_${{ matrix.os.arch }}.deb.sha256 s3://download.chia.net/install/ + aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain_${CHIA_INSTALLER_VERSION}_${{ matrix.os.arch }}.deb.torrent s3://download.chia.net/torrents/ + aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli_${CHIA_INSTALLER_VERSION}-1_${{ matrix.os.arch }}.deb s3://download.chia.net/install/ + aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli_${CHIA_INSTALLER_VERSION}-1_${{ matrix.os.arch }}.deb.sha256 s3://download.chia.net/install/ + aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli_${CHIA_INSTALLER_VERSION}-1_${{ matrix.os.arch }}.deb.torrent s3://download.chia.net/torrents/ + + - name: Upload release artifacts + if: env.RELEASE == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh release upload \ + --repo ${{ github.repository }} \ + $RELEASE_TAG \ + build_scripts/final_installer/chia-blockchain_${CHIA_INSTALLER_VERSION}_${{ matrix.os.arch }}.deb \ + build_scripts/final_installer/chia-blockchain-cli_${CHIA_INSTALLER_VERSION}-1_${{ matrix.os.arch }}.deb + + - uses: Chia-Network/actions/github/jwt@main + if: steps.check_secrets.outputs.HAS_GLUE_SECRET + + - name: Mark pre-release installer complete + if: steps.check_secrets.outputs.HAS_GLUE_SECRET && env.PRE_RELEASE == 'true' + run: | + curl -s -XPOST -H "Authorization: Bearer ${{ env.JWT_TOKEN }}" --data '{"chia_ref": "${{ env.RELEASE_TAG }}"}' ${{ secrets.GLUE_API_URL }}/api/v1/${{ env.RFC_REPO }}-prerelease/${{ env.RELEASE_TAG }}/success/${{ matrix.os.glue-name }} + + - name: Mark release installer complete + if: steps.check_secrets.outputs.HAS_GLUE_SECRET && env.FULL_RELEASE == 'true' + run: | + curl -s -XPOST -H "Authorization: Bearer ${{ env.JWT_TOKEN }}" --data '{"chia_ref": "${{ env.RELEASE_TAG }}"}' ${{ secrets.GLUE_API_URL }}/api/v1/${{ env.RFC_REPO }}/${{ env.RELEASE_TAG }}/success/${{ matrix.os.glue-name }} test: name: Test ${{ matrix.distribution.name }} ${{ matrix.mode.name }} ${{ matrix.arch.name }} runs-on: ${{ matrix.os.runs-on[matrix.arch.matrix] }} needs: - - build + - build container: ${{ matrix.distribution.url }} strategy: fail-fast: false matrix: os: - - runs-on: - arm: [linux, arm64] - intel: [ubuntu-latest] + - runs-on: + arm: [linux, arm64] + intel: [ubuntu-latest] distribution: - - name: debian:bullseye - type: debian - # https://packages.debian.org/bullseye/python/python3 (3.9) - url: "docker://debian:bullseye" - - name: debian:bookworm - type: debian - # https://packages.debian.org/bookworm/python/python3 (3.11) - url: "docker://debian:bookworm" - - name: ubuntu:focal (20.04) - type: ubuntu - # https://packages.ubuntu.com/focal/python3 (20.04, 3.8) - url: "docker://ubuntu:focal" - - name: ubuntu:jammy (22.04) - type: ubuntu - # https://packages.ubuntu.com/jammy/python3 (22.04, 3.10) - url: "docker://ubuntu:jammy" + - name: debian:bullseye + type: debian + # https://packages.debian.org/bullseye/python/python3 (3.9) + url: "docker://debian:bullseye" + - name: debian:bookworm + type: debian + # https://packages.debian.org/bookworm/python/python3 (3.11) + url: "docker://debian:bookworm" + - name: ubuntu:focal (20.04) + type: ubuntu + # https://packages.ubuntu.com/focal/python3 (20.04, 3.8) + url: "docker://ubuntu:focal" + - name: ubuntu:jammy (22.04) + type: ubuntu + # https://packages.ubuntu.com/jammy/python3 (22.04, 3.10) + url: "docker://ubuntu:jammy" mode: - - name: GUI - file: chia-blockchain_*.deb - package: chia-blockchain - - name: CLI - file: chia-blockchain-cli_*.deb - package: chia-blockchain-cli + - name: GUI + file: chia-blockchain_*.deb + package: chia-blockchain + - name: CLI + file: chia-blockchain-cli_*.deb + package: chia-blockchain-cli arch: - - name: ARM64 - matrix: arm - artifact-name: arm64 - - name: Intel - matrix: intel - artifact-name: amd64 + - name: ARM64 + matrix: arm + artifact-name: arm64 + - name: Intel + matrix: intel + artifact-name: amd64 env: DEBIAN_FRONTEND: noninteractive steps: - - uses: Chia-Network/actions/clean-workspace@main - - - name: Download packages - uses: actions/download-artifact@v4 - id: download - with: - name: chia-installers-linux-deb-${{ matrix.arch.artifact-name }} - path: packages - - - name: Update apt repos - run: | - apt-get update --yes - - - name: Install package - run: | - ls -l "${{ steps.download.outputs.download-path }}" - apt-get install --yes "${{ steps.download.outputs.download-path }}"/${{ matrix.mode.file }} - - - name: Run chia version - run: | - ACTUAL=$(chia version) - echo " actual version: ${ACTUAL}" - if [ "${ACTUAL}" = "None" ] - then - echo " !!! should not be None" - false - else - echo " :] at least it isn't None" - fi - - - name: Verify /opt/chia present - run: | - if [ ! -e /opt/chia ] - then - ls -l /opt - false - fi - - - name: Remove package - run: | - apt-get remove --yes ${{ matrix.mode.package }} - - - name: Verify /opt/chia not present - run: | - if [ -e /opt/chia ] - then - ls -lR /opt/chia - false - fi + - uses: Chia-Network/actions/clean-workspace@main + + - name: Download packages + uses: actions/download-artifact@v4 + id: download + with: + name: chia-installers-linux-deb-${{ matrix.arch.artifact-name }} + path: packages + + - name: Update apt repos + run: | + apt-get update --yes + + - name: Install package + run: | + ls -l "${{ steps.download.outputs.download-path }}" + apt-get install --yes "${{ steps.download.outputs.download-path }}"/${{ matrix.mode.file }} + + - name: Run chia version + run: | + ACTUAL=$(chia version) + echo " actual version: ${ACTUAL}" + if [ "${ACTUAL}" = "None" ] + then + echo " !!! should not be None" + false + else + echo " :] at least it isn't None" + fi + + - name: Verify /opt/chia present + run: | + if [ ! -e /opt/chia ] + then + ls -l /opt + false + fi + + - name: Remove package + run: | + apt-get remove --yes ${{ matrix.mode.package }} + + - name: Verify /opt/chia not present + run: | + if [ -e /opt/chia ] + then + ls -lR /opt/chia + false + fi diff --git a/.github/workflows/build-linux-installer-rpm.yml b/.github/workflows/build-linux-installer-rpm.yml index 5277180c7b28..2bd9b7d0cadc 100644 --- a/.github/workflows/build-linux-installer-rpm.yml +++ b/.github/workflows/build-linux-installer-rpm.yml @@ -4,29 +4,29 @@ on: workflow_dispatch: inputs: release_type: - description: 'Tagged release testing scenario' + description: "Tagged release testing scenario" required: false type: choice - default: '' + default: "" options: - - '' - - 9.9.9-b1 - - 9.9.9-rc1 - - 9.9.9 + - "" + - 9.9.9-b1 + - 9.9.9-rc1 + - 9.9.9 push: paths-ignore: - - '**.md' + - "**.md" branches: - - 'long_lived/**' + - "long_lived/**" - main - - 'release/**' + - "release/**" release: types: [published] pull_request: paths-ignore: - - '**.md' + - "**.md" branches: - - '**' + - "**" concurrency: # SHA is added to the end if on `main` to let all main workflows run @@ -52,161 +52,161 @@ jobs: python-version: ["3.10"] steps: - - name: Add safe git directory - uses: Chia-Network/actions/git-mark-workspace-safe@main - - - name: Checkout Code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - submodules: recursive - - - uses: Chia-Network/actions/git-ssh-to-https@main - - - name: Cleanup any leftovers that exist from previous runs - run: bash build_scripts/clean-runner.sh || true - - - name: Set Env - uses: Chia-Network/actions/setjobenv@main - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Check tag type - shell: bash - run: | - REG_B="^[0-9]+\.[0-9]+\.[0-9]+-b[0-9]+$" - REG_RC="^[0-9]+\.[0-9]+\.[0-9]+-rc[0-9]+$" - if [[ "${{ github.event.release.tag_name }}" =~ $REG_B ]] || [[ "${{ inputs.release_type }}" =~ $REG_B ]]; then - echo "TAG_TYPE=beta" - echo "TAG_TYPE=beta" >> "$GITHUB_ENV" - elif [[ "${{ github.event.release.tag_name }}" =~ $REG_RC ]] || [[ "${{ inputs.release_type }}" =~ $REG_RC ]]; then - echo "TAG_TYPE=rc" - echo "TAG_TYPE=rc" >> "$GITHUB_ENV" - fi - - - uses: Chia-Network/actions/enforce-semver@main - if: env.FULL_RELEASE == 'true' - - # Create our own venv outside of the git directory JUST for getting the ACTUAL version so that install can't break it - - name: Get version number - id: version_number - run: | - python3 -m venv ../venv - . ../venv/bin/activate - pip3 install setuptools_scm - echo "CHIA_INSTALLER_VERSION=$(python3 ./build_scripts/installer-version.py)" >> "$GITHUB_OUTPUT" - deactivate - - - name: Get latest madmax plotter - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - LATEST_MADMAX=$(gh api repos/Chia-Network/chia-plotter-madmax/releases/latest --jq 'select(.prerelease == false) | .tag_name') - mkdir "$GITHUB_WORKSPACE"/madmax - gh release download -R Chia-Network/chia-plotter-madmax "$LATEST_MADMAX" -p 'chia_plot-*-x86-64' -O "$GITHUB_WORKSPACE"/madmax/chia_plot - gh release download -R Chia-Network/chia-plotter-madmax "$LATEST_MADMAX" -p 'chia_plot_k34-*-x86-64' -O "$GITHUB_WORKSPACE"/madmax/chia_plot_k34 - chmod +x "$GITHUB_WORKSPACE"/madmax/chia_plot - chmod +x "$GITHUB_WORKSPACE"/madmax/chia_plot_k34 - - - name: Fetch bladebit versions - shell: bash - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - # Fetch the latest version of each type - LATEST_RELEASE=$(gh api repos/Chia-Network/bladebit/releases/latest --jq 'select(.prerelease == false) | .tag_name') - LATEST_BETA=$(gh api repos/Chia-Network/bladebit/releases --jq 'map(select(.prerelease) | select(.tag_name | test("^v[0-9]+\\.[0-9]+\\.[0-9]+-beta[0-9]+$"))) | first | .tag_name') - LATEST_RC=$(gh api repos/Chia-Network/bladebit/releases --jq 'map(select(.prerelease) | select(.tag_name | test("^v[0-9]+\\.[0-9]+\\.[0-9]+-rc[0-9]+$"))) | first | .tag_name') - - # Compare the versions and choose the newest that matches the requirements - if [[ "$TAG_TYPE" == "beta" || -z "$TAG_TYPE" ]]; then - # For beta or dev builds (indicated by the absence of a tag), use the latest version available - LATEST_VERSION=$(printf "%s\n%s\n%s\n" "$LATEST_RELEASE" "$LATEST_BETA" "$LATEST_RC" | sed '/-/!s/$/_/' | sort -V | sed 's/_$//' | tail -n 1) - elif [[ "$TAG_TYPE" == "rc" ]]; then - # For RC builds, use the latest RC or full release if it's newer - LATEST_VERSION=$(printf "%s\n%s\n" "$LATEST_RELEASE" "$LATEST_RC" | sed '/-/!s/$/_/' | sort -V | sed 's/_$//' | tail -n 1) - else - # For full releases, use the latest full release - LATEST_VERSION="$LATEST_RELEASE" - fi - echo "LATEST_VERSION=$LATEST_VERSION" >> "$GITHUB_ENV" - - - name: Get latest bladebit plotter - shell: bash - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - # Download and extract the chosen version - mkdir "$GITHUB_WORKSPACE"/bladebit - cd "$GITHUB_WORKSPACE"/bladebit - gh release download -R Chia-Network/bladebit "$LATEST_VERSION" -p 'bladebit*-centos-x86-64.tar.gz' - ls *.tar.gz | xargs -I{} bash -c 'tar -xzf {} && rm {}' - ls bladebit* | xargs -I{} chmod +x {} - cd "$OLDPWD" - - - uses: ./.github/actions/install - with: - python-version: ${{ matrix.python-version }} - development: true - constraints-file-artifact-name: constraints-file-intel - - - uses: chia-network/actions/activate-venv@main - - - name: Prepare GUI cache - id: gui-ref - run: | - gui_ref=$(git submodule status chia-blockchain-gui | sed -e 's/^ //g' -e 's/ chia-blockchain-gui.*$//g') - echo "${gui_ref}" - echo "GUI_REF=${gui_ref}" >> "$GITHUB_OUTPUT" - echo "rm -rf ./chia-blockchain-gui" - rm -rf ./chia-blockchain-gui - - - name: Cache GUI - uses: actions/cache@v4 - id: cache-gui - with: - path: ./chia-blockchain-gui - key: ${{ runner.os }}-rpm-chia-blockchain-gui-${{ steps.gui-ref.outputs.GUI_REF }} - - - if: steps.cache-gui.outputs.cache-hit != 'true' - name: Build GUI - continue-on-error: false - run: | - cd ./build_scripts - bash build_linux_rpm-1-gui.sh - - - name: Build .rpm package - env: - CHIA_INSTALLER_VERSION: ${{ steps.version_number.outputs.CHIA_INSTALLER_VERSION }} - run: | - ldd --version - cd ./build_scripts - bash build_linux_rpm-2-installer.sh amd64 - - - name: Upload fpm-generated rpm spec files - uses: actions/upload-artifact@v4 - with: - if-no-files-found: error - name: spec - path: | - build_scripts/dist/cli.spec - build_scripts/dist/gui.spec - - - name: Upload Linux artifacts - uses: actions/upload-artifact@v4 - with: - name: chia-installers-linux-rpm-intel - path: ${{ github.workspace }}/build_scripts/final_installer/ - - - name: Remove working files to exclude from cache - run: | - rm -rf ./chia-blockchain-gui/packages/gui/daemon + - name: Add safe git directory + uses: Chia-Network/actions/git-mark-workspace-safe@main + + - name: Checkout Code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + submodules: recursive + + - uses: Chia-Network/actions/git-ssh-to-https@main + + - name: Cleanup any leftovers that exist from previous runs + run: bash build_scripts/clean-runner.sh || true + + - name: Set Env + uses: Chia-Network/actions/setjobenv@main + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Check tag type + shell: bash + run: | + REG_B="^[0-9]+\.[0-9]+\.[0-9]+-b[0-9]+$" + REG_RC="^[0-9]+\.[0-9]+\.[0-9]+-rc[0-9]+$" + if [[ "${{ github.event.release.tag_name }}" =~ $REG_B ]] || [[ "${{ inputs.release_type }}" =~ $REG_B ]]; then + echo "TAG_TYPE=beta" + echo "TAG_TYPE=beta" >> "$GITHUB_ENV" + elif [[ "${{ github.event.release.tag_name }}" =~ $REG_RC ]] || [[ "${{ inputs.release_type }}" =~ $REG_RC ]]; then + echo "TAG_TYPE=rc" + echo "TAG_TYPE=rc" >> "$GITHUB_ENV" + fi + + - uses: Chia-Network/actions/enforce-semver@main + if: env.FULL_RELEASE == 'true' + + # Create our own venv outside of the git directory JUST for getting the ACTUAL version so that install can't break it + - name: Get version number + id: version_number + run: | + python3 -m venv ../venv + . ../venv/bin/activate + pip3 install setuptools_scm + echo "CHIA_INSTALLER_VERSION=$(python3 ./build_scripts/installer-version.py)" >> "$GITHUB_OUTPUT" + deactivate + + - name: Get latest madmax plotter + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + LATEST_MADMAX=$(gh api repos/Chia-Network/chia-plotter-madmax/releases/latest --jq 'select(.prerelease == false) | .tag_name') + mkdir "$GITHUB_WORKSPACE"/madmax + gh release download -R Chia-Network/chia-plotter-madmax "$LATEST_MADMAX" -p 'chia_plot-*-x86-64' -O "$GITHUB_WORKSPACE"/madmax/chia_plot + gh release download -R Chia-Network/chia-plotter-madmax "$LATEST_MADMAX" -p 'chia_plot_k34-*-x86-64' -O "$GITHUB_WORKSPACE"/madmax/chia_plot_k34 + chmod +x "$GITHUB_WORKSPACE"/madmax/chia_plot + chmod +x "$GITHUB_WORKSPACE"/madmax/chia_plot_k34 + + - name: Fetch bladebit versions + shell: bash + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + # Fetch the latest version of each type + LATEST_RELEASE=$(gh api repos/Chia-Network/bladebit/releases/latest --jq 'select(.prerelease == false) | .tag_name') + LATEST_BETA=$(gh api repos/Chia-Network/bladebit/releases --jq 'map(select(.prerelease) | select(.tag_name | test("^v[0-9]+\\.[0-9]+\\.[0-9]+-beta[0-9]+$"))) | first | .tag_name') + LATEST_RC=$(gh api repos/Chia-Network/bladebit/releases --jq 'map(select(.prerelease) | select(.tag_name | test("^v[0-9]+\\.[0-9]+\\.[0-9]+-rc[0-9]+$"))) | first | .tag_name') + + # Compare the versions and choose the newest that matches the requirements + if [[ "$TAG_TYPE" == "beta" || -z "$TAG_TYPE" ]]; then + # For beta or dev builds (indicated by the absence of a tag), use the latest version available + LATEST_VERSION=$(printf "%s\n%s\n%s\n" "$LATEST_RELEASE" "$LATEST_BETA" "$LATEST_RC" | sed '/-/!s/$/_/' | sort -V | sed 's/_$//' | tail -n 1) + elif [[ "$TAG_TYPE" == "rc" ]]; then + # For RC builds, use the latest RC or full release if it's newer + LATEST_VERSION=$(printf "%s\n%s\n" "$LATEST_RELEASE" "$LATEST_RC" | sed '/-/!s/$/_/' | sort -V | sed 's/_$//' | tail -n 1) + else + # For full releases, use the latest full release + LATEST_VERSION="$LATEST_RELEASE" + fi + echo "LATEST_VERSION=$LATEST_VERSION" >> "$GITHUB_ENV" + + - name: Get latest bladebit plotter + shell: bash + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + # Download and extract the chosen version + mkdir "$GITHUB_WORKSPACE"/bladebit + cd "$GITHUB_WORKSPACE"/bladebit + gh release download -R Chia-Network/bladebit "$LATEST_VERSION" -p 'bladebit*-centos-x86-64.tar.gz' + ls *.tar.gz | xargs -I{} bash -c 'tar -xzf {} && rm {}' + ls bladebit* | xargs -I{} chmod +x {} + cd "$OLDPWD" + + - uses: ./.github/actions/install + with: + python-version: ${{ matrix.python-version }} + development: true + constraints-file-artifact-name: constraints-file-intel + + - uses: chia-network/actions/activate-venv@main + + - name: Prepare GUI cache + id: gui-ref + run: | + gui_ref=$(git submodule status chia-blockchain-gui | sed -e 's/^ //g' -e 's/ chia-blockchain-gui.*$//g') + echo "${gui_ref}" + echo "GUI_REF=${gui_ref}" >> "$GITHUB_OUTPUT" + echo "rm -rf ./chia-blockchain-gui" + rm -rf ./chia-blockchain-gui + + - name: Cache GUI + uses: actions/cache@v4 + id: cache-gui + with: + path: ./chia-blockchain-gui + key: ${{ runner.os }}-rpm-chia-blockchain-gui-${{ steps.gui-ref.outputs.GUI_REF }} + + - if: steps.cache-gui.outputs.cache-hit != 'true' + name: Build GUI + continue-on-error: false + run: | + cd ./build_scripts + bash build_linux_rpm-1-gui.sh + + - name: Build .rpm package + env: + CHIA_INSTALLER_VERSION: ${{ steps.version_number.outputs.CHIA_INSTALLER_VERSION }} + run: | + ldd --version + cd ./build_scripts + bash build_linux_rpm-2-installer.sh amd64 + + - name: Upload fpm-generated rpm spec files + uses: actions/upload-artifact@v4 + with: + if-no-files-found: error + name: spec + path: | + build_scripts/dist/cli.spec + build_scripts/dist/gui.spec + + - name: Upload Linux artifacts + uses: actions/upload-artifact@v4 + with: + name: chia-installers-linux-rpm-intel + path: ${{ github.workspace }}/build_scripts/final_installer/ + + - name: Remove working files to exclude from cache + run: | + rm -rf ./chia-blockchain-gui/packages/gui/daemon publish: name: Publish amd64 RPM runs-on: ubuntu-latest needs: - - build + - build container: image: chianetwork/rocky8-builder:latest timeout-minutes: 5 @@ -219,62 +219,62 @@ jobs: CHIA_INSTALLER_VERSION: ${{ needs.build.outputs.chia-installer-version }} steps: - - uses: Chia-Network/actions/clean-workspace@main - - - uses: chia-network/actions/create-venv@main - id: create-venv - - - uses: chia-network/actions/activate-venv@main - with: - directories: ${{ steps.create-venv.outputs.activate-venv-directories }} - - - name: Download constraints file - uses: actions/download-artifact@v4 - with: - name: constraints-file-intel - path: venv - - - name: Install utilities - run: | - pip install --constraint venv/constraints.txt py3createtorrent - - - name: Download packages - uses: actions/download-artifact@v4 - with: - name: chia-installers-linux-rpm-intel - path: build_scripts/final_installer/ - - - name: Set Env - uses: Chia-Network/actions/setjobenv@main - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Test for secrets access - id: check_secrets - shell: bash - run: | - unset HAS_AWS_SECRET - unset HAS_GLUE_SECRET - - if [ -n "$AWS_SECRET" ]; then HAS_AWS_SECRET='true' ; fi - echo HAS_AWS_SECRET=${HAS_AWS_SECRET} >> "$GITHUB_OUTPUT" - - if [ -n "$GLUE_API_URL" ]; then HAS_GLUE_SECRET='true' ; fi - echo HAS_GLUE_SECRET=${HAS_GLUE_SECRET} >> "$GITHUB_OUTPUT" - env: - AWS_SECRET: "${{ secrets.CHIA_AWS_ACCOUNT_ID }}" - GLUE_API_URL: "${{ secrets.GLUE_API_URL }}" - - - name: Configure AWS credentials - if: steps.check_secrets.outputs.HAS_AWS_SECRET - uses: aws-actions/configure-aws-credentials@v4 - with: - role-to-assume: arn:aws:iam::${{ secrets.CHIA_AWS_ACCOUNT_ID }}:role/installer-upload - aws-region: us-west-2 - - - name: Upload to s3 - if: steps.check_secrets.outputs.HAS_AWS_SECRET - run: | + - uses: Chia-Network/actions/clean-workspace@main + + - uses: chia-network/actions/create-venv@main + id: create-venv + + - uses: chia-network/actions/activate-venv@main + with: + directories: ${{ steps.create-venv.outputs.activate-venv-directories }} + + - name: Download constraints file + uses: actions/download-artifact@v4 + with: + name: constraints-file-intel + path: venv + + - name: Install utilities + run: | + pip install --constraint venv/constraints.txt py3createtorrent + + - name: Download packages + uses: actions/download-artifact@v4 + with: + name: chia-installers-linux-rpm-intel + path: build_scripts/final_installer/ + + - name: Set Env + uses: Chia-Network/actions/setjobenv@main + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Test for secrets access + id: check_secrets + shell: bash + run: | + unset HAS_AWS_SECRET + unset HAS_GLUE_SECRET + + if [ -n "$AWS_SECRET" ]; then HAS_AWS_SECRET='true' ; fi + echo HAS_AWS_SECRET=${HAS_AWS_SECRET} >> "$GITHUB_OUTPUT" + + if [ -n "$GLUE_API_URL" ]; then HAS_GLUE_SECRET='true' ; fi + echo HAS_GLUE_SECRET=${HAS_GLUE_SECRET} >> "$GITHUB_OUTPUT" + env: + AWS_SECRET: "${{ secrets.CHIA_AWS_ACCOUNT_ID }}" + GLUE_API_URL: "${{ secrets.GLUE_API_URL }}" + + - name: Configure AWS credentials + if: steps.check_secrets.outputs.HAS_AWS_SECRET + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: arn:aws:iam::${{ secrets.CHIA_AWS_ACCOUNT_ID }}:role/installer-upload + aws-region: us-west-2 + + - name: Upload to s3 + if: steps.check_secrets.outputs.HAS_AWS_SECRET + run: | GIT_SHORT_HASH=$(echo "${GITHUB_SHA}" | cut -c1-8) CHIA_DEV_BUILD=${CHIA_INSTALLER_VERSION}-$GIT_SHORT_HASH echo "CHIA_DEV_BUILD=$CHIA_DEV_BUILD" >> "$GITHUB_ENV" @@ -282,108 +282,108 @@ jobs: aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm s3://download.chia.net/dev/chia-blockchain-${CHIA_DEV_BUILD}-1.x86_64.rpm aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm s3://download.chia.net/dev/chia-blockchain-cli-${CHIA_DEV_BUILD}-1.x86_64.rpm - - name: Create Checksums - if: env.FULL_RELEASE == 'true' || github.ref == 'refs/heads/main' - run: | - ls "$GITHUB_WORKSPACE"/build_scripts/final_installer/ - sha256sum "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm > "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm.sha256 - sha256sum "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm > "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm.sha256 - ls "$GITHUB_WORKSPACE"/build_scripts/final_installer/ - - - name: Create .rpm torrent - if: env.FULL_RELEASE == 'true' - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - py3createtorrent -f -t udp://tracker.opentrackr.org:1337/announce "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm -o "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm.torrent --webseed https://download.chia.net/install/chia-blockchain-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm - py3createtorrent -f -t udp://tracker.opentrackr.org:1337/announce "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm -o "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm.torrent --webseed https://download.chia.net/install/chia-blockchain-cli-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm - gh release upload --repo ${{ github.repository }} $RELEASE_TAG "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm.torrent - - - name: Upload Dev Installer - if: steps.check_secrets.outputs.HAS_AWS_SECRET && github.ref == 'refs/heads/main' - run: | - aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm s3://download.chia.net/latest-dev/chia-blockchain-1.x86_64_latest_dev.rpm - aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm.sha256 s3://download.chia.net/latest-dev/chia-blockchain-1.x86_64_latest_dev.rpm.sha256 - aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm s3://download.chia.net/latest-dev/chia-blockchain-cli-1.x86_64_latest_dev.rpm - aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm.sha256 s3://download.chia.net/latest-dev/chia-blockchain-cli-1.x86_64_latest_dev.rpm.sha256 - - - name: Upload Release Files - if: steps.check_secrets.outputs.HAS_AWS_SECRET && env.FULL_RELEASE == 'true' - run: | - aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm s3://download.chia.net/install/ - aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm.sha256 s3://download.chia.net/install/ - aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm.torrent s3://download.chia.net/torrents/ - aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm s3://download.chia.net/install/ - aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm.sha256 s3://download.chia.net/install/ - aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm.torrent s3://download.chia.net/torrents/ - - - name: Upload release artifacts - if: env.RELEASE == 'true' - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - gh release upload \ - --repo ${{ github.repository }} \ - $RELEASE_TAG \ - build_scripts/final_installer/chia-blockchain-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm \ - build_scripts/final_installer/chia-blockchain-cli-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm - - - uses: Chia-Network/actions/github/jwt@main - if: steps.check_secrets.outputs.HAS_GLUE_SECRET - - - name: Mark pre-release installer complete - if: steps.check_secrets.outputs.HAS_GLUE_SECRET && env.PRE_RELEASE == 'true' - run: | + - name: Create Checksums + if: env.FULL_RELEASE == 'true' || github.ref == 'refs/heads/main' + run: | + ls "$GITHUB_WORKSPACE"/build_scripts/final_installer/ + sha256sum "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm > "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm.sha256 + sha256sum "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm > "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm.sha256 + ls "$GITHUB_WORKSPACE"/build_scripts/final_installer/ + + - name: Create .rpm torrent + if: env.FULL_RELEASE == 'true' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + py3createtorrent -f -t udp://tracker.opentrackr.org:1337/announce "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm -o "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm.torrent --webseed https://download.chia.net/install/chia-blockchain-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm + py3createtorrent -f -t udp://tracker.opentrackr.org:1337/announce "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm -o "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm.torrent --webseed https://download.chia.net/install/chia-blockchain-cli-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm + gh release upload --repo ${{ github.repository }} $RELEASE_TAG "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm.torrent + + - name: Upload Dev Installer + if: steps.check_secrets.outputs.HAS_AWS_SECRET && github.ref == 'refs/heads/main' + run: | + aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm s3://download.chia.net/latest-dev/chia-blockchain-1.x86_64_latest_dev.rpm + aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm.sha256 s3://download.chia.net/latest-dev/chia-blockchain-1.x86_64_latest_dev.rpm.sha256 + aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm s3://download.chia.net/latest-dev/chia-blockchain-cli-1.x86_64_latest_dev.rpm + aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm.sha256 s3://download.chia.net/latest-dev/chia-blockchain-cli-1.x86_64_latest_dev.rpm.sha256 + + - name: Upload Release Files + if: steps.check_secrets.outputs.HAS_AWS_SECRET && env.FULL_RELEASE == 'true' + run: | + aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm s3://download.chia.net/install/ + aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm.sha256 s3://download.chia.net/install/ + aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm.torrent s3://download.chia.net/torrents/ + aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm s3://download.chia.net/install/ + aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm.sha256 s3://download.chia.net/install/ + aws s3 cp "$GITHUB_WORKSPACE"/build_scripts/final_installer/chia-blockchain-cli-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm.torrent s3://download.chia.net/torrents/ + + - name: Upload release artifacts + if: env.RELEASE == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh release upload \ + --repo ${{ github.repository }} \ + $RELEASE_TAG \ + build_scripts/final_installer/chia-blockchain-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm \ + build_scripts/final_installer/chia-blockchain-cli-${CHIA_INSTALLER_VERSION}-1.x86_64.rpm + + - uses: Chia-Network/actions/github/jwt@main + if: steps.check_secrets.outputs.HAS_GLUE_SECRET + + - name: Mark pre-release installer complete + if: steps.check_secrets.outputs.HAS_GLUE_SECRET && env.PRE_RELEASE == 'true' + run: | curl -s -XPOST -H "Authorization: Bearer ${{ env.JWT_TOKEN }}" --data '{"chia_ref": "${{ env.RELEASE_TAG }}"}' ${{ secrets.GLUE_API_URL }}/api/v1/${{ env.RFC_REPO }}-prerelease/${{ env.RELEASE_TAG }}/success/build-linux-rpm - - name: Mark release installer complete - if: steps.check_secrets.outputs.HAS_GLUE_SECRET && env.FULL_RELEASE == 'true' - run: | + - name: Mark release installer complete + if: steps.check_secrets.outputs.HAS_GLUE_SECRET && env.FULL_RELEASE == 'true' + run: | curl -s -XPOST -H "Authorization: Bearer ${{ env.JWT_TOKEN }}" --data '{"chia_ref": "${{ env.RELEASE_TAG }}"}' ${{ secrets.GLUE_API_URL }}/api/v1/${{ env.RFC_REPO }}/${{ env.RELEASE_TAG }}/success/build-linux-rpm test: name: Test ${{ matrix.distribution.name }} ${{ matrix.mode.name }} ${{ matrix.state.name }} runs-on: ${{ matrix.os }} needs: - - build + - build container: ${{ matrix.distribution.url }} strategy: fail-fast: false matrix: os: [ubuntu-latest] distribution: - - name: amazonlinux:2023 - type: amazon - url: "docker://amazonlinux:2023" - - name: fedora:37 - type: fedora - # (37, 3.11) https://packages.fedoraproject.org/search?query=python3&releases=Fedora+37&start=0 - url: "docker://fedora:37" - - name: fedora:38 - type: fedora - # (38, 3.11) https://packages.fedoraproject.org/search?query=python3&releases=Fedora+38&start=0 - url: "docker://fedora:38" - - name: rockylinux:8 - type: rocky - url: "docker://rockylinux:8" - - name: rockylinux:9 - type: rocky - url: "docker://rockylinux:9" - # bypass this error for now: Problem: The operation would result in removing the following protected packages: systemd-udev - noautoremove: - gui: --noautoremove - - name: build image - type: rocky - url: "docker://chianetwork/rocky8-builder:latest" + - name: amazonlinux:2023 + type: amazon + url: "docker://amazonlinux:2023" + - name: fedora:37 + type: fedora + # (37, 3.11) https://packages.fedoraproject.org/search?query=python3&releases=Fedora+37&start=0 + url: "docker://fedora:37" + - name: fedora:38 + type: fedora + # (38, 3.11) https://packages.fedoraproject.org/search?query=python3&releases=Fedora+38&start=0 + url: "docker://fedora:38" + - name: rockylinux:8 + type: rocky + url: "docker://rockylinux:8" + - name: rockylinux:9 + type: rocky + url: "docker://rockylinux:9" + # bypass this error for now: Problem: The operation would result in removing the following protected packages: systemd-udev + noautoremove: + gui: --noautoremove + - name: build image + type: rocky + url: "docker://chianetwork/rocky8-builder:latest" mode: - - name: GUI - matrix: gui - file: chia-blockchain-[0,1,2,3,4,5,6,7,8,9]*.rpm - package: chia-blockchain - - name: CLI - matrix: cli - file: chia-blockchain-cli-[0,1,2,3,4,5,6,7,8,9]*.rpm - package: chia-blockchain-cli + - name: GUI + matrix: gui + file: chia-blockchain-[0,1,2,3,4,5,6,7,8,9]*.rpm + package: chia-blockchain + - name: CLI + matrix: cli + file: chia-blockchain-cli-[0,1,2,3,4,5,6,7,8,9]*.rpm + package: chia-blockchain-cli state: - name: Dirty matrix: dirty @@ -391,73 +391,73 @@ jobs: matrix: clean steps: - - uses: Chia-Network/actions/clean-workspace@main - - - name: Download packages - uses: actions/download-artifact@v4 - id: download - with: - name: chia-installers-linux-rpm-intel - path: packages - - - name: Dirty the environment for the sake of testing - if: matrix.state.matrix == 'dirty' - run: | - # this has been known to mess up the version detection, the empty directory should be removed - mkdir --parents /opt/chia/chia_blockchain-0.1.dist-info - # making sure that files are not removed - touch /opt/chia/touched - - - name: Install package - run: | - ls -l "${{ steps.download.outputs.download-path }}" - yum install -y "${{ steps.download.outputs.download-path }}"/${{ matrix.mode.file }} - - - name: Run chia version - run: | - ACTUAL=$(chia version) - echo " actual version: ${ACTUAL}" - if [ "${ACTUAL}" = "None" ] - then - echo " !!! should not be None" - false - else - echo " :] at least it isn't None" - fi - - - name: Verify /opt/chia present - run: | - if [ ! -e /opt/chia ] - then - ls -l /opt - false - fi - - - name: Remove package - run: | - yum remove -y ${{ matrix.distribution.noautoremove[matrix.mode.matrix] }} ${{ matrix.mode.package }} - - - name: Verify /opt/chia not present - if: matrix.state.matrix == 'clean' - run: | - if [ -e /opt/chia ] - then - ls -lR /opt/chia - false - fi - - - name: Verify /opt/chia contains only touched file - if: matrix.state.matrix == 'dirty' - run: | - ACTUAL=$(ls -a /opt/chia) - EXPECTED=$(echo -e '.\n..\ntouched') - echo " actual: ${ACTUAL}" - echo "expected: ${EXPECTED}" - if [ "${ACTUAL}" != "${EXPECTED}" ] - then - echo " !!! they do not match" - ls -lR /opt/chia - false - else - echo " :] they match" - fi + - uses: Chia-Network/actions/clean-workspace@main + + - name: Download packages + uses: actions/download-artifact@v4 + id: download + with: + name: chia-installers-linux-rpm-intel + path: packages + + - name: Dirty the environment for the sake of testing + if: matrix.state.matrix == 'dirty' + run: | + # this has been known to mess up the version detection, the empty directory should be removed + mkdir --parents /opt/chia/chia_blockchain-0.1.dist-info + # making sure that files are not removed + touch /opt/chia/touched + + - name: Install package + run: | + ls -l "${{ steps.download.outputs.download-path }}" + yum install -y "${{ steps.download.outputs.download-path }}"/${{ matrix.mode.file }} + + - name: Run chia version + run: | + ACTUAL=$(chia version) + echo " actual version: ${ACTUAL}" + if [ "${ACTUAL}" = "None" ] + then + echo " !!! should not be None" + false + else + echo " :] at least it isn't None" + fi + + - name: Verify /opt/chia present + run: | + if [ ! -e /opt/chia ] + then + ls -l /opt + false + fi + + - name: Remove package + run: | + yum remove -y ${{ matrix.distribution.noautoremove[matrix.mode.matrix] }} ${{ matrix.mode.package }} + + - name: Verify /opt/chia not present + if: matrix.state.matrix == 'clean' + run: | + if [ -e /opt/chia ] + then + ls -lR /opt/chia + false + fi + + - name: Verify /opt/chia contains only touched file + if: matrix.state.matrix == 'dirty' + run: | + ACTUAL=$(ls -a /opt/chia) + EXPECTED=$(echo -e '.\n..\ntouched') + echo " actual: ${ACTUAL}" + echo "expected: ${EXPECTED}" + if [ "${ACTUAL}" != "${EXPECTED}" ] + then + echo " !!! they do not match" + ls -lR /opt/chia + false + else + echo " :] they match" + fi diff --git a/.github/workflows/build-macos-installers.yml b/.github/workflows/build-macos-installers.yml index 9381c8bbdd98..8df17d630a6f 100644 --- a/.github/workflows/build-macos-installers.yml +++ b/.github/workflows/build-macos-installers.yml @@ -4,29 +4,29 @@ on: workflow_dispatch: inputs: release_type: - description: 'Tagged release testing scenario' + description: "Tagged release testing scenario" required: false type: choice - default: '' + default: "" options: - - '' - - 9.9.9-b1 - - 9.9.9-rc1 - - 9.9.9 + - "" + - 9.9.9-b1 + - 9.9.9-rc1 + - 9.9.9 push: paths-ignore: - - '**.md' + - "**.md" branches: - - 'long_lived/**' + - "long_lived/**" - main - - 'release/**' + - "release/**" release: types: [published] pull_request: paths-ignore: - - '**.md' + - "**.md" branches: - - '**' + - "**" concurrency: # SHA is added to the end if on `main` to let all main workflows run @@ -117,8 +117,7 @@ jobs: # This will be recreated in the next step # Done now and at the end of the workflow in case the last workflow fails, and this is still around - name: Delete keychain if it already exists - run: - security delete-keychain signing_temp.keychain || true + run: security delete-keychain signing_temp.keychain || true - name: Import Apple app signing certificate if: steps.check_secrets.outputs.HAS_APPLE_SECRET @@ -191,7 +190,7 @@ jobs: - name: Setup Node 18.x uses: actions/setup-node@v4 with: - node-version: '18.x' + node-version: "18.x" - name: Prepare GUI cache id: gui-ref @@ -242,14 +241,13 @@ jobs: # We want to delete this no matter what happened in the previous steps (failures, success, etc) - name: Delete signing keychain if: always() - run: - security delete-keychain signing_temp.keychain || true + run: security delete-keychain signing_temp.keychain || true publish: name: Publish ${{ matrix.os.name }} DMG runs-on: ${{ matrix.os.runs-on }} needs: - - build + - build timeout-minutes: 5 strategy: fail-fast: false @@ -398,7 +396,7 @@ jobs: name: Test ${{ matrix.os.name }} ${{ matrix.arch.name }} runs-on: ${{ matrix.os.runs-on[matrix.arch.matrix] }} needs: - - build + - build strategy: fail-fast: false matrix: @@ -434,27 +432,27 @@ jobs: matrix: arm steps: - - uses: Chia-Network/actions/clean-workspace@main - - - name: Download packages - uses: actions/download-artifact@v4 - id: download - with: - name: chia-installers-macos-dmg-${{ matrix.arch.artifact-name }} - path: packages - - - name: Mount .dmg - env: - PACKAGE_PATH: ${{ github.workspace }}/build_scripts/final_installer/ - run: | - ls -l "${{ steps.download.outputs.download-path }}" - hdiutil attach "${{ steps.download.outputs.download-path }}"/chia-*.dmg - - - name: Run chia version - run: | - "/Volumes/Chia "*"/Chia.app/Contents/Resources/app.asar.unpacked/daemon/chia" version - - - name: Detach .dmg - if: always() - run: | - hdiutil detach -force "/Volumes/Chia "* + - uses: Chia-Network/actions/clean-workspace@main + + - name: Download packages + uses: actions/download-artifact@v4 + id: download + with: + name: chia-installers-macos-dmg-${{ matrix.arch.artifact-name }} + path: packages + + - name: Mount .dmg + env: + PACKAGE_PATH: ${{ github.workspace }}/build_scripts/final_installer/ + run: | + ls -l "${{ steps.download.outputs.download-path }}" + hdiutil attach "${{ steps.download.outputs.download-path }}"/chia-*.dmg + + - name: Run chia version + run: | + "/Volumes/Chia "*"/Chia.app/Contents/Resources/app.asar.unpacked/daemon/chia" version + + - name: Detach .dmg + if: always() + run: | + hdiutil detach -force "/Volumes/Chia "* diff --git a/.github/workflows/build-windows-installer.yml b/.github/workflows/build-windows-installer.yml index e1a8a5d39157..c75f40ac4982 100644 --- a/.github/workflows/build-windows-installer.yml +++ b/.github/workflows/build-windows-installer.yml @@ -4,29 +4,29 @@ on: workflow_dispatch: inputs: release_type: - description: 'Tagged release testing scenario' + description: "Tagged release testing scenario" required: false type: choice - default: '' + default: "" options: - - '' - - 9.9.9-b1 - - 9.9.9-rc1 - - 9.9.9 + - "" + - 9.9.9-b1 + - 9.9.9-rc1 + - 9.9.9 push: paths-ignore: - - '**.md' + - "**.md" branches: - - 'long_lived/**' + - "long_lived/**" - main - - 'release/**' + - "release/**" release: types: [published] pull_request: paths-ignore: - - '**.md' + - "**.md" branches: - - '**' + - "**" concurrency: # SHA is added to the end if on `main` to let all main workflows run @@ -50,225 +50,225 @@ jobs: python-version: ["3.10"] steps: - - name: Checkout Code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - submodules: recursive - - - name: Set Env - uses: Chia-Network/actions/setjobenv@main - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Check tag type - shell: bash - run: | - REG_B="^[0-9]+\.[0-9]+\.[0-9]+-b[0-9]+$" - REG_RC="^[0-9]+\.[0-9]+\.[0-9]+-rc[0-9]+$" - if [[ "${{ github.event.release.tag_name }}" =~ $REG_B ]] || [[ "${{ inputs.release_type }}" =~ $REG_B ]]; then - echo "TAG_TYPE=beta" - echo "TAG_TYPE=beta" >> "$GITHUB_ENV" - elif [[ "${{ github.event.release.tag_name }}" =~ $REG_RC ]] || [[ "${{ inputs.release_type }}" =~ $REG_RC ]]; then - echo "TAG_TYPE=rc" - echo "TAG_TYPE=rc" >> "$GITHUB_ENV" - fi - - - name: Set git urls to https instead of ssh - run: | - git config --global url."https://github.com/".insteadOf ssh://git@github.com/ - - - name: Get npm cache directory - id: npm-cache - shell: bash - run: | - echo "dir=$(npm config get cache)" >> "$GITHUB_OUTPUT" - - - name: Cache npm - uses: actions/cache@v4 - with: - path: ${{ steps.npm-cache.outputs.dir }} - key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node- - - - name: Get pip cache dir - id: pip-cache - shell: bash - run: | - echo "dir=$(pip cache dir)" >> "$GITHUB_OUTPUT" - - - name: Cache pip - uses: actions/cache@v4 - with: - path: ${{ steps.pip-cache.outputs.dir }} - key: ${{ runner.os }}-pip-${{ hashFiles('**/setup.py') }} - restore-keys: | - ${{ runner.os }}-pip- - - - uses: Chia-Network/actions/setup-python@main - name: Install Python ${{ matrix.python-version }} - with: - python-version: ${{ matrix.python-version }} - - - name: Setup Node 18.x - uses: actions/setup-node@v4 - with: - node-version: '18.x' - - - name: Test for secrets access - id: check_secrets - shell: bash - run: | - unset HAS_SIGNING_SECRET - - if [ -n "$SIGNING_SECRET" ]; then HAS_SIGNING_SECRET='true' ; fi - echo "HAS_SIGNING_SECRET=${HAS_SIGNING_SECRET}" >> "$GITHUB_OUTPUT" - env: - SIGNING_SECRET: "${{ secrets.SM_CLIENT_CERT_FILE_B64 }}" - - - name: Setup Certificate - if: steps.check_secrets.outputs.HAS_SIGNING_SECRET - shell: bash - run: | - echo "${{ secrets.SM_CLIENT_CERT_FILE_B64 }}" | base64 --decode > /d/Certificate_pkcs12.p12 - - - name: Set signing variables - if: steps.check_secrets.outputs.HAS_SIGNING_SECRET - shell: bash - run: | - echo "SM_HOST=${{ secrets.SM_HOST }}" >> "$GITHUB_ENV" - echo "SM_API_KEY=${{ secrets.SM_API_KEY }}" >> "$GITHUB_ENV" - echo "SM_CLIENT_CERT_FILE=D:\\Certificate_pkcs12.p12" >> "$GITHUB_ENV" - echo "SM_CLIENT_CERT_PASSWORD=${{ secrets.SM_CLIENT_CERT_PASSWORD }}" >> "$GITHUB_ENV" - echo "SM_CODE_SIGNING_CERT_SHA1_HASH=${{ secrets.SM_CODE_SIGNING_CERT_SHA1_HASH }}" >> "$GITHUB_ENV" - echo "C:\Program Files (x86)\Windows Kits\10\App Certification Kit" >> $GITHUB_PATH - echo "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools" >> $GITHUB_PATH - echo "C:\Program Files\DigiCert\DigiCert One Signing Manager Tools" >> $GITHUB_PATH - - - name: Setup SSM KSP on windows latest - if: steps.check_secrets.outputs.HAS_SIGNING_SECRET - shell: cmd - run: | - curl -X GET https://download.chia.net/dc/smtools-windows-x64.msi -o smtools-windows-x64.msi - msiexec /i smtools-windows-x64.msi /quiet /qn - smksp_registrar.exe list - smctl.exe keypair ls - C:\Windows\System32\certutil.exe -csp "DigiCert Signing Manager KSP" -key -user - smksp_cert_sync.exe - - # Create our own venv outside of the git directory JUST for getting the ACTUAL version so that install can't break it - - name: Get version number - id: version_number - shell: bash - run: | - python -m venv ../venv - source ../venv/Scripts/activate - pip3 install setuptools_scm - CHIA_INSTALLER_VERSION=$(python ./build_scripts/installer-version.py) - echo "$CHIA_INSTALLER_VERSION" - echo "CHIA_INSTALLER_VERSION=$CHIA_INSTALLER_VERSION" >> "$GITHUB_OUTPUT" - deactivate - - - name: Get latest madmax plotter - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - shell: bash - run: | - LATEST_MADMAX=$(gh api repos/Chia-Network/chia-plotter-madmax/releases/latest --jq 'select(.prerelease == false) | .tag_name') - mkdir "$GITHUB_WORKSPACE"\\madmax - gh release download -R Chia-Network/chia-plotter-madmax "$LATEST_MADMAX" -p 'chia_plot-*.exe' -O "$GITHUB_WORKSPACE"\\madmax\\chia_plot.exe - gh release download -R Chia-Network/chia-plotter-madmax "$LATEST_MADMAX" -p 'chia_plot_k34-*.exe' -O "$GITHUB_WORKSPACE"\\madmax\\chia_plot_k34.exe - - - name: Fetch bladebit versions - shell: bash - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - # Fetch the latest version of each type - LATEST_RELEASE=$(gh api repos/Chia-Network/bladebit/releases/latest --jq 'select(.prerelease == false) | .tag_name') - LATEST_BETA=$(gh api repos/Chia-Network/bladebit/releases --jq 'map(select(.prerelease) | select(.tag_name | test("^v[0-9]+\\.[0-9]+\\.[0-9]+-beta[0-9]+$"))) | first | .tag_name') - LATEST_RC=$(gh api repos/Chia-Network/bladebit/releases --jq 'map(select(.prerelease) | select(.tag_name | test("^v[0-9]+\\.[0-9]+\\.[0-9]+-rc[0-9]+$"))) | first | .tag_name') - - # Compare the versions and choose the newest that matches the requirements - if [[ "$TAG_TYPE" == "beta" || -z "$TAG_TYPE" ]]; then - # For beta or dev builds (indicated by the absence of a tag), use the latest version available - LATEST_VERSION=$(printf "%s\n%s\n%s\n" "$LATEST_RELEASE" "$LATEST_BETA" "$LATEST_RC" | sed '/-/!s/$/_/' | sort -V | sed 's/_$//' | tail -n 1) - elif [[ "$TAG_TYPE" == "rc" ]]; then - # For RC builds, use the latest RC or full release if it's newer - LATEST_VERSION=$(printf "%s\n%s\n" "$LATEST_RELEASE" "$LATEST_RC" | sed '/-/!s/$/_/' | sort -V | sed 's/_$//' | tail -n 1) - else - # For full releases, use the latest full release - LATEST_VERSION="$LATEST_RELEASE" - fi - echo "LATEST_VERSION=$LATEST_VERSION" >> "$GITHUB_ENV" - - - name: Get latest bladebit plotter - shell: bash - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - # Download and extract the chosen version - mkdir "$GITHUB_WORKSPACE\\bladebit" - cd "$GITHUB_WORKSPACE\\bladebit" - gh release download -R Chia-Network/bladebit "$LATEST_VERSION" -p 'bladebit*windows-x86-64.zip' - ls *.zip | xargs -I{} bash -c 'unzip {} && rm {}' - cd "$OLDPWD" - - - uses: ./.github/actions/install - with: - python-version: ${{ matrix.python-version }} - development: true - constraints-file-artifact-name: constraints-file-intel - - - uses: chia-network/actions/activate-venv@main - - - name: Prepare GUI cache - id: gui-ref - shell: bash - run: | - gui_ref=$(git submodule status chia-blockchain-gui | sed -e 's/^ //g' -e 's/ chia-blockchain-gui.*$//g') - echo "${gui_ref}" - echo "GUI_REF=${gui_ref}" >> "$GITHUB_OUTPUT" - echo "rm -rf ./chia-blockchain-gui" - rm -rf ./chia-blockchain-gui - - - name: Cache GUI - uses: actions/cache@v4 - id: cache-gui - with: - path: .\chia-blockchain-gui - key: ${{ runner.os }}-chia-blockchain-gui-${{ steps.gui-ref.outputs.GUI_REF }} - - - if: steps.cache-gui.outputs.cache-hit != 'true' - name: Build GUI - continue-on-error: false - run: | - cd .\build_scripts - .\build_windows-1-gui.ps1 - - - name: Build Windows installer - env: - CHIA_INSTALLER_VERSION: ${{ steps.version_number.outputs.CHIA_INSTALLER_VERSION }} - HAS_SIGNING_SECRET: ${{ steps.check_secrets.outputs.HAS_SIGNING_SECRET }} - run: | - $env:path="C:\Program` Files` (x86)\Microsoft` Visual` Studio\2019\Enterprise\SDK\ScopeCppSDK\vc15\VC\bin\;$env:path" - $env:path="C:\Program` Files` (x86)\Windows` Kits\10\App` Certification` Kit;$env:path" - cd .\build_scripts - .\build_windows-2-installer.ps1 - - - name: Upload Installer to artifacts - uses: actions/upload-artifact@v4 - with: - name: chia-installers-windows-exe-intel - path: ${{ github.workspace }}\chia-blockchain-gui\release-builds\ - - - name: Remove Windows exe and installer to exclude from cache - run: | - Remove-Item .\chia-blockchain-gui\packages\gui\dist -Recurse -Force - Remove-Item .\chia-blockchain-gui\packages\gui\daemon -Recurse -Force - Remove-Item .\chia-blockchain-gui\Chia-win32-x64 -Recurse -Force - Remove-Item .\chia-blockchain-gui\release-builds -Recurse -Force + - name: Checkout Code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + submodules: recursive + + - name: Set Env + uses: Chia-Network/actions/setjobenv@main + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Check tag type + shell: bash + run: | + REG_B="^[0-9]+\.[0-9]+\.[0-9]+-b[0-9]+$" + REG_RC="^[0-9]+\.[0-9]+\.[0-9]+-rc[0-9]+$" + if [[ "${{ github.event.release.tag_name }}" =~ $REG_B ]] || [[ "${{ inputs.release_type }}" =~ $REG_B ]]; then + echo "TAG_TYPE=beta" + echo "TAG_TYPE=beta" >> "$GITHUB_ENV" + elif [[ "${{ github.event.release.tag_name }}" =~ $REG_RC ]] || [[ "${{ inputs.release_type }}" =~ $REG_RC ]]; then + echo "TAG_TYPE=rc" + echo "TAG_TYPE=rc" >> "$GITHUB_ENV" + fi + + - name: Set git urls to https instead of ssh + run: | + git config --global url."https://github.com/".insteadOf ssh://git@github.com/ + + - name: Get npm cache directory + id: npm-cache + shell: bash + run: | + echo "dir=$(npm config get cache)" >> "$GITHUB_OUTPUT" + + - name: Cache npm + uses: actions/cache@v4 + with: + path: ${{ steps.npm-cache.outputs.dir }} + key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node- + + - name: Get pip cache dir + id: pip-cache + shell: bash + run: | + echo "dir=$(pip cache dir)" >> "$GITHUB_OUTPUT" + + - name: Cache pip + uses: actions/cache@v4 + with: + path: ${{ steps.pip-cache.outputs.dir }} + key: ${{ runner.os }}-pip-${{ hashFiles('**/setup.py') }} + restore-keys: | + ${{ runner.os }}-pip- + + - uses: Chia-Network/actions/setup-python@main + name: Install Python ${{ matrix.python-version }} + with: + python-version: ${{ matrix.python-version }} + + - name: Setup Node 18.x + uses: actions/setup-node@v4 + with: + node-version: "18.x" + + - name: Test for secrets access + id: check_secrets + shell: bash + run: | + unset HAS_SIGNING_SECRET + + if [ -n "$SIGNING_SECRET" ]; then HAS_SIGNING_SECRET='true' ; fi + echo "HAS_SIGNING_SECRET=${HAS_SIGNING_SECRET}" >> "$GITHUB_OUTPUT" + env: + SIGNING_SECRET: "${{ secrets.SM_CLIENT_CERT_FILE_B64 }}" + + - name: Setup Certificate + if: steps.check_secrets.outputs.HAS_SIGNING_SECRET + shell: bash + run: | + echo "${{ secrets.SM_CLIENT_CERT_FILE_B64 }}" | base64 --decode > /d/Certificate_pkcs12.p12 + + - name: Set signing variables + if: steps.check_secrets.outputs.HAS_SIGNING_SECRET + shell: bash + run: | + echo "SM_HOST=${{ secrets.SM_HOST }}" >> "$GITHUB_ENV" + echo "SM_API_KEY=${{ secrets.SM_API_KEY }}" >> "$GITHUB_ENV" + echo "SM_CLIENT_CERT_FILE=D:\\Certificate_pkcs12.p12" >> "$GITHUB_ENV" + echo "SM_CLIENT_CERT_PASSWORD=${{ secrets.SM_CLIENT_CERT_PASSWORD }}" >> "$GITHUB_ENV" + echo "SM_CODE_SIGNING_CERT_SHA1_HASH=${{ secrets.SM_CODE_SIGNING_CERT_SHA1_HASH }}" >> "$GITHUB_ENV" + echo "C:\Program Files (x86)\Windows Kits\10\App Certification Kit" >> $GITHUB_PATH + echo "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools" >> $GITHUB_PATH + echo "C:\Program Files\DigiCert\DigiCert One Signing Manager Tools" >> $GITHUB_PATH + + - name: Setup SSM KSP on windows latest + if: steps.check_secrets.outputs.HAS_SIGNING_SECRET + shell: cmd + run: | + curl -X GET https://download.chia.net/dc/smtools-windows-x64.msi -o smtools-windows-x64.msi + msiexec /i smtools-windows-x64.msi /quiet /qn + smksp_registrar.exe list + smctl.exe keypair ls + C:\Windows\System32\certutil.exe -csp "DigiCert Signing Manager KSP" -key -user + smksp_cert_sync.exe + + # Create our own venv outside of the git directory JUST for getting the ACTUAL version so that install can't break it + - name: Get version number + id: version_number + shell: bash + run: | + python -m venv ../venv + source ../venv/Scripts/activate + pip3 install setuptools_scm + CHIA_INSTALLER_VERSION=$(python ./build_scripts/installer-version.py) + echo "$CHIA_INSTALLER_VERSION" + echo "CHIA_INSTALLER_VERSION=$CHIA_INSTALLER_VERSION" >> "$GITHUB_OUTPUT" + deactivate + + - name: Get latest madmax plotter + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + shell: bash + run: | + LATEST_MADMAX=$(gh api repos/Chia-Network/chia-plotter-madmax/releases/latest --jq 'select(.prerelease == false) | .tag_name') + mkdir "$GITHUB_WORKSPACE"\\madmax + gh release download -R Chia-Network/chia-plotter-madmax "$LATEST_MADMAX" -p 'chia_plot-*.exe' -O "$GITHUB_WORKSPACE"\\madmax\\chia_plot.exe + gh release download -R Chia-Network/chia-plotter-madmax "$LATEST_MADMAX" -p 'chia_plot_k34-*.exe' -O "$GITHUB_WORKSPACE"\\madmax\\chia_plot_k34.exe + + - name: Fetch bladebit versions + shell: bash + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + # Fetch the latest version of each type + LATEST_RELEASE=$(gh api repos/Chia-Network/bladebit/releases/latest --jq 'select(.prerelease == false) | .tag_name') + LATEST_BETA=$(gh api repos/Chia-Network/bladebit/releases --jq 'map(select(.prerelease) | select(.tag_name | test("^v[0-9]+\\.[0-9]+\\.[0-9]+-beta[0-9]+$"))) | first | .tag_name') + LATEST_RC=$(gh api repos/Chia-Network/bladebit/releases --jq 'map(select(.prerelease) | select(.tag_name | test("^v[0-9]+\\.[0-9]+\\.[0-9]+-rc[0-9]+$"))) | first | .tag_name') + + # Compare the versions and choose the newest that matches the requirements + if [[ "$TAG_TYPE" == "beta" || -z "$TAG_TYPE" ]]; then + # For beta or dev builds (indicated by the absence of a tag), use the latest version available + LATEST_VERSION=$(printf "%s\n%s\n%s\n" "$LATEST_RELEASE" "$LATEST_BETA" "$LATEST_RC" | sed '/-/!s/$/_/' | sort -V | sed 's/_$//' | tail -n 1) + elif [[ "$TAG_TYPE" == "rc" ]]; then + # For RC builds, use the latest RC or full release if it's newer + LATEST_VERSION=$(printf "%s\n%s\n" "$LATEST_RELEASE" "$LATEST_RC" | sed '/-/!s/$/_/' | sort -V | sed 's/_$//' | tail -n 1) + else + # For full releases, use the latest full release + LATEST_VERSION="$LATEST_RELEASE" + fi + echo "LATEST_VERSION=$LATEST_VERSION" >> "$GITHUB_ENV" + + - name: Get latest bladebit plotter + shell: bash + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + # Download and extract the chosen version + mkdir "$GITHUB_WORKSPACE\\bladebit" + cd "$GITHUB_WORKSPACE\\bladebit" + gh release download -R Chia-Network/bladebit "$LATEST_VERSION" -p 'bladebit*windows-x86-64.zip' + ls *.zip | xargs -I{} bash -c 'unzip {} && rm {}' + cd "$OLDPWD" + + - uses: ./.github/actions/install + with: + python-version: ${{ matrix.python-version }} + development: true + constraints-file-artifact-name: constraints-file-intel + + - uses: chia-network/actions/activate-venv@main + + - name: Prepare GUI cache + id: gui-ref + shell: bash + run: | + gui_ref=$(git submodule status chia-blockchain-gui | sed -e 's/^ //g' -e 's/ chia-blockchain-gui.*$//g') + echo "${gui_ref}" + echo "GUI_REF=${gui_ref}" >> "$GITHUB_OUTPUT" + echo "rm -rf ./chia-blockchain-gui" + rm -rf ./chia-blockchain-gui + + - name: Cache GUI + uses: actions/cache@v4 + id: cache-gui + with: + path: .\chia-blockchain-gui + key: ${{ runner.os }}-chia-blockchain-gui-${{ steps.gui-ref.outputs.GUI_REF }} + + - if: steps.cache-gui.outputs.cache-hit != 'true' + name: Build GUI + continue-on-error: false + run: | + cd .\build_scripts + .\build_windows-1-gui.ps1 + + - name: Build Windows installer + env: + CHIA_INSTALLER_VERSION: ${{ steps.version_number.outputs.CHIA_INSTALLER_VERSION }} + HAS_SIGNING_SECRET: ${{ steps.check_secrets.outputs.HAS_SIGNING_SECRET }} + run: | + $env:path="C:\Program` Files` (x86)\Microsoft` Visual` Studio\2019\Enterprise\SDK\ScopeCppSDK\vc15\VC\bin\;$env:path" + $env:path="C:\Program` Files` (x86)\Windows` Kits\10\App` Certification` Kit;$env:path" + cd .\build_scripts + .\build_windows-2-installer.ps1 + + - name: Upload Installer to artifacts + uses: actions/upload-artifact@v4 + with: + name: chia-installers-windows-exe-intel + path: ${{ github.workspace }}\chia-blockchain-gui\release-builds\ + + - name: Remove Windows exe and installer to exclude from cache + run: | + Remove-Item .\chia-blockchain-gui\packages\gui\dist -Recurse -Force + Remove-Item .\chia-blockchain-gui\packages\gui\daemon -Recurse -Force + Remove-Item .\chia-blockchain-gui\Chia-win32-x64 -Recurse -Force + Remove-Item .\chia-blockchain-gui\release-builds -Recurse -Force publish: name: Publish EXE @@ -277,7 +277,7 @@ jobs: run: shell: bash needs: - - build + - build timeout-minutes: 5 strategy: fail-fast: false @@ -288,132 +288,132 @@ jobs: CHIA_INSTALLER_VERSION: ${{ needs.build.outputs.chia-installer-version }} steps: - - uses: Chia-Network/actions/clean-workspace@main - - - uses: Chia-Network/actions/setup-python@main - with: - python-version: ${{ matrix.python-version }} - - - uses: chia-network/actions/create-venv@main - id: create-venv - - - uses: chia-network/actions/activate-venv@main - with: - directories: ${{ steps.create-venv.outputs.activate-venv-directories }} - - - name: Download constraints file - uses: actions/download-artifact@v4 - with: - name: constraints-file-intel - path: venv - - - name: Install utilities - run: | - pip install --constraint venv/constraints.txt py3createtorrent - - - name: Download packages - uses: actions/download-artifact@v4 - with: - name: chia-installers-windows-exe-intel - path: chia-blockchain-gui/release-builds/ - - - name: Set Env - uses: Chia-Network/actions/setjobenv@main - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Test for secrets access - id: check_secrets - run: | - unset HAS_AWS_SECRET - unset HAS_GLUE_SECRET - - if [ -n "$AWS_SECRET" ]; then HAS_AWS_SECRET='true' ; fi - echo HAS_AWS_SECRET=${HAS_AWS_SECRET} >> "$GITHUB_OUTPUT" - - if [ -n "$GLUE_API_URL" ]; then HAS_GLUE_SECRET='true' ; fi - echo HAS_GLUE_SECRET=${HAS_GLUE_SECRET} >> "$GITHUB_OUTPUT" - env: - SIGNING_SECRET: "${{ secrets.SM_CLIENT_CERT_FILE_B64 }}" - AWS_SECRET: "${{ secrets.CHIA_AWS_ACCOUNT_ID }}" - GLUE_API_URL: "${{ secrets.GLUE_API_URL }}" - - - name: Install AWS CLI - if: steps.check_secrets.outputs.HAS_AWS_SECRET - shell: pwsh - run: | + - uses: Chia-Network/actions/clean-workspace@main + + - uses: Chia-Network/actions/setup-python@main + with: + python-version: ${{ matrix.python-version }} + + - uses: chia-network/actions/create-venv@main + id: create-venv + + - uses: chia-network/actions/activate-venv@main + with: + directories: ${{ steps.create-venv.outputs.activate-venv-directories }} + + - name: Download constraints file + uses: actions/download-artifact@v4 + with: + name: constraints-file-intel + path: venv + + - name: Install utilities + run: | + pip install --constraint venv/constraints.txt py3createtorrent + + - name: Download packages + uses: actions/download-artifact@v4 + with: + name: chia-installers-windows-exe-intel + path: chia-blockchain-gui/release-builds/ + + - name: Set Env + uses: Chia-Network/actions/setjobenv@main + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Test for secrets access + id: check_secrets + run: | + unset HAS_AWS_SECRET + unset HAS_GLUE_SECRET + + if [ -n "$AWS_SECRET" ]; then HAS_AWS_SECRET='true' ; fi + echo HAS_AWS_SECRET=${HAS_AWS_SECRET} >> "$GITHUB_OUTPUT" + + if [ -n "$GLUE_API_URL" ]; then HAS_GLUE_SECRET='true' ; fi + echo HAS_GLUE_SECRET=${HAS_GLUE_SECRET} >> "$GITHUB_OUTPUT" + env: + SIGNING_SECRET: "${{ secrets.SM_CLIENT_CERT_FILE_B64 }}" + AWS_SECRET: "${{ secrets.CHIA_AWS_ACCOUNT_ID }}" + GLUE_API_URL: "${{ secrets.GLUE_API_URL }}" + + - name: Install AWS CLI + if: steps.check_secrets.outputs.HAS_AWS_SECRET + shell: pwsh + run: | msiexec.exe /i https://awscli.amazonaws.com/AWSCLIV2.msi - - name: Configure AWS credentials - if: steps.check_secrets.outputs.HAS_AWS_SECRET - uses: aws-actions/configure-aws-credentials@v4 - with: - role-to-assume: arn:aws:iam::${{ secrets.CHIA_AWS_ACCOUNT_ID }}:role/installer-upload - aws-region: us-west-2 - - - name: Upload to s3 - if: steps.check_secrets.outputs.HAS_AWS_SECRET - run: | - GIT_SHORT_HASH=$(echo "${GITHUB_SHA}" | cut -c1-8) - CHIA_DEV_BUILD=${CHIA_INSTALLER_VERSION}-$GIT_SHORT_HASH - echo CHIA_DEV_BUILD=${CHIA_DEV_BUILD} >> "$GITHUB_OUTPUT" - echo ${CHIA_DEV_BUILD} - pwd - aws s3 cp chia-blockchain-gui/release-builds/windows-installer/ChiaSetup-${CHIA_INSTALLER_VERSION}.exe s3://download.chia.net/dev/ChiaSetup-${CHIA_DEV_BUILD}.exe - - - name: Create Checksums - shell: pwsh - run: | - certutil.exe -hashfile ${{ github.workspace }}/chia-blockchain-gui/release-builds/windows-installer/ChiaSetup-${{ env.CHIA_INSTALLER_VERSION }}.exe SHA256 > ${{ github.workspace }}/chia-blockchain-gui/release-builds/windows-installer/ChiaSetup-${{ env.CHIA_INSTALLER_VERSION }}.exe.sha256 - ls ${{ github.workspace }}/chia-blockchain-gui/release-builds/windows-installer/ - - - name: Create torrent - if: env.FULL_RELEASE == 'true' - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - py3createtorrent -f -t udp://tracker.opentrackr.org:1337/announce "${GITHUB_WORKSPACE}"/chia-blockchain-gui/release-builds/windows-installer/ChiaSetup-${{ env.CHIA_INSTALLER_VERSION }}.exe -o "${GITHUB_WORKSPACE}"/chia-blockchain-gui/release-builds/windows-installer/ChiaSetup-${{ env.CHIA_INSTALLER_VERSION }}.exe.torrent --webseed https://download.chia.net/install/ChiaSetup-${{ env.CHIA_INSTALLER_VERSION }}.exe - ls - gh release upload --repo ${{ github.repository }} $RELEASE_TAG "${GITHUB_WORKSPACE}"/chia-blockchain-gui/release-builds/windows-installer/ChiaSetup-${{ env.CHIA_INSTALLER_VERSION }}.exe.torrent - - - name: Upload Dev Installer - if: steps.check_secrets.outputs.HAS_AWS_SECRET && github.ref == 'refs/heads/main' - run: | - aws s3 cp "${GITHUB_WORKSPACE}"/chia-blockchain-gui/release-builds/windows-installer/ChiaSetup-${{ env.CHIA_INSTALLER_VERSION }}.exe s3://download.chia.net/latest-dev/ChiaSetup-latest-dev.exe - aws s3 cp "${GITHUB_WORKSPACE}"/chia-blockchain-gui/release-builds/windows-installer/ChiaSetup-${{ env.CHIA_INSTALLER_VERSION }}.exe.sha256 s3://download.chia.net/latest-dev/ChiaSetup-latest-dev.exe.sha256 - - - name: Upload Release Files - if: steps.check_secrets.outputs.HAS_AWS_SECRET && env.FULL_RELEASE == 'true' - run: | - aws s3 cp "${GITHUB_WORKSPACE}"/chia-blockchain-gui/release-builds/windows-installer/ChiaSetup-${{ env.CHIA_INSTALLER_VERSION }}.exe s3://download.chia.net/install/ - aws s3 cp "${GITHUB_WORKSPACE}"/chia-blockchain-gui/release-builds/windows-installer/ChiaSetup-${{ env.CHIA_INSTALLER_VERSION }}.exe.sha256 s3://download.chia.net/install/ - aws s3 cp "${GITHUB_WORKSPACE}"/chia-blockchain-gui/release-builds/windows-installer/ChiaSetup-${{ env.CHIA_INSTALLER_VERSION }}.exe.torrent s3://download.chia.net/torrents/ - - - name: Upload release artifacts - if: env.RELEASE == 'true' - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - gh release upload --repo ${{ github.repository }} $RELEASE_TAG "${GITHUB_WORKSPACE}"/chia-blockchain-gui/release-builds/windows-installer/ChiaSetup-${{ env.CHIA_INSTALLER_VERSION }}.exe - - - uses: Chia-Network/actions/github/jwt@main - if: steps.check_secrets.outputs.HAS_GLUE_SECRET - - - name: Mark pre-release installer complete - if: steps.check_secrets.outputs.HAS_GLUE_SECRET && env.PRE_RELEASE == 'true' - run: | - curl -s -XPOST -H "Authorization: Bearer ${{ env.JWT_TOKEN }}" --data '{"chia_ref": "${{ env.RELEASE_TAG }}"}' ${{ secrets.GLUE_API_URL }}/api/v1/${{ env.RFC_REPO }}-prerelease/${{ env.RELEASE_TAG }}/success/build-windows - - - name: Mark release installer complete - if: steps.check_secrets.outputs.HAS_GLUE_SECRET && env.FULL_RELEASE == 'true' - run: | - curl -s -XPOST -H "Authorization: Bearer ${{ env.JWT_TOKEN }}" --data '{"chia_ref": "${{ env.RELEASE_TAG }}"}' ${{ secrets.GLUE_API_URL }}/api/v1/${{ env.RFC_REPO }}/${{ env.RELEASE_TAG }}/success/build-windows + - name: Configure AWS credentials + if: steps.check_secrets.outputs.HAS_AWS_SECRET + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: arn:aws:iam::${{ secrets.CHIA_AWS_ACCOUNT_ID }}:role/installer-upload + aws-region: us-west-2 + + - name: Upload to s3 + if: steps.check_secrets.outputs.HAS_AWS_SECRET + run: | + GIT_SHORT_HASH=$(echo "${GITHUB_SHA}" | cut -c1-8) + CHIA_DEV_BUILD=${CHIA_INSTALLER_VERSION}-$GIT_SHORT_HASH + echo CHIA_DEV_BUILD=${CHIA_DEV_BUILD} >> "$GITHUB_OUTPUT" + echo ${CHIA_DEV_BUILD} + pwd + aws s3 cp chia-blockchain-gui/release-builds/windows-installer/ChiaSetup-${CHIA_INSTALLER_VERSION}.exe s3://download.chia.net/dev/ChiaSetup-${CHIA_DEV_BUILD}.exe + + - name: Create Checksums + shell: pwsh + run: | + certutil.exe -hashfile ${{ github.workspace }}/chia-blockchain-gui/release-builds/windows-installer/ChiaSetup-${{ env.CHIA_INSTALLER_VERSION }}.exe SHA256 > ${{ github.workspace }}/chia-blockchain-gui/release-builds/windows-installer/ChiaSetup-${{ env.CHIA_INSTALLER_VERSION }}.exe.sha256 + ls ${{ github.workspace }}/chia-blockchain-gui/release-builds/windows-installer/ + + - name: Create torrent + if: env.FULL_RELEASE == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + py3createtorrent -f -t udp://tracker.opentrackr.org:1337/announce "${GITHUB_WORKSPACE}"/chia-blockchain-gui/release-builds/windows-installer/ChiaSetup-${{ env.CHIA_INSTALLER_VERSION }}.exe -o "${GITHUB_WORKSPACE}"/chia-blockchain-gui/release-builds/windows-installer/ChiaSetup-${{ env.CHIA_INSTALLER_VERSION }}.exe.torrent --webseed https://download.chia.net/install/ChiaSetup-${{ env.CHIA_INSTALLER_VERSION }}.exe + ls + gh release upload --repo ${{ github.repository }} $RELEASE_TAG "${GITHUB_WORKSPACE}"/chia-blockchain-gui/release-builds/windows-installer/ChiaSetup-${{ env.CHIA_INSTALLER_VERSION }}.exe.torrent + + - name: Upload Dev Installer + if: steps.check_secrets.outputs.HAS_AWS_SECRET && github.ref == 'refs/heads/main' + run: | + aws s3 cp "${GITHUB_WORKSPACE}"/chia-blockchain-gui/release-builds/windows-installer/ChiaSetup-${{ env.CHIA_INSTALLER_VERSION }}.exe s3://download.chia.net/latest-dev/ChiaSetup-latest-dev.exe + aws s3 cp "${GITHUB_WORKSPACE}"/chia-blockchain-gui/release-builds/windows-installer/ChiaSetup-${{ env.CHIA_INSTALLER_VERSION }}.exe.sha256 s3://download.chia.net/latest-dev/ChiaSetup-latest-dev.exe.sha256 + + - name: Upload Release Files + if: steps.check_secrets.outputs.HAS_AWS_SECRET && env.FULL_RELEASE == 'true' + run: | + aws s3 cp "${GITHUB_WORKSPACE}"/chia-blockchain-gui/release-builds/windows-installer/ChiaSetup-${{ env.CHIA_INSTALLER_VERSION }}.exe s3://download.chia.net/install/ + aws s3 cp "${GITHUB_WORKSPACE}"/chia-blockchain-gui/release-builds/windows-installer/ChiaSetup-${{ env.CHIA_INSTALLER_VERSION }}.exe.sha256 s3://download.chia.net/install/ + aws s3 cp "${GITHUB_WORKSPACE}"/chia-blockchain-gui/release-builds/windows-installer/ChiaSetup-${{ env.CHIA_INSTALLER_VERSION }}.exe.torrent s3://download.chia.net/torrents/ + + - name: Upload release artifacts + if: env.RELEASE == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh release upload --repo ${{ github.repository }} $RELEASE_TAG "${GITHUB_WORKSPACE}"/chia-blockchain-gui/release-builds/windows-installer/ChiaSetup-${{ env.CHIA_INSTALLER_VERSION }}.exe + + - uses: Chia-Network/actions/github/jwt@main + if: steps.check_secrets.outputs.HAS_GLUE_SECRET + + - name: Mark pre-release installer complete + if: steps.check_secrets.outputs.HAS_GLUE_SECRET && env.PRE_RELEASE == 'true' + run: | + curl -s -XPOST -H "Authorization: Bearer ${{ env.JWT_TOKEN }}" --data '{"chia_ref": "${{ env.RELEASE_TAG }}"}' ${{ secrets.GLUE_API_URL }}/api/v1/${{ env.RFC_REPO }}-prerelease/${{ env.RELEASE_TAG }}/success/build-windows + + - name: Mark release installer complete + if: steps.check_secrets.outputs.HAS_GLUE_SECRET && env.FULL_RELEASE == 'true' + run: | + curl -s -XPOST -H "Authorization: Bearer ${{ env.JWT_TOKEN }}" --data '{"chia_ref": "${{ env.RELEASE_TAG }}"}' ${{ secrets.GLUE_API_URL }}/api/v1/${{ env.RFC_REPO }}/${{ env.RELEASE_TAG }}/success/build-windows test: name: Test ${{ matrix.os.name }} runs-on: ${{ matrix.os.runs-on[matrix.arch.matrix] }} needs: - - build + - build strategy: fail-fast: false matrix: @@ -431,24 +431,24 @@ jobs: matrix: intel steps: - - uses: Chia-Network/actions/clean-workspace@main - - - name: Download packages - uses: actions/download-artifact@v4 - with: - name: chia-installers-windows-exe-intel - path: packages - - - name: Install package - env: - INSTALL_PATH: ${{ github.workspace }}\installed - run: | - dir ./packages/ - $env:INSTALLER_PATH = (Get-ChildItem packages/windows-installer/ChiaSetup-*.exe) - Start-Process -Wait -FilePath $env:INSTALLER_PATH -ArgumentList "/S", ("/D=" + $env:INSTALL_PATH) - - - name: Run chia version - env: - INSTALL_PATH: ${{ github.workspace }}\installed - run: | - & ($env:INSTALL_PATH + "\resources\app.asar.unpacked\daemon\chia.exe") version + - uses: Chia-Network/actions/clean-workspace@main + + - name: Download packages + uses: actions/download-artifact@v4 + with: + name: chia-installers-windows-exe-intel + path: packages + + - name: Install package + env: + INSTALL_PATH: ${{ github.workspace }}\installed + run: | + dir ./packages/ + $env:INSTALLER_PATH = (Get-ChildItem packages/windows-installer/ChiaSetup-*.exe) + Start-Process -Wait -FilePath $env:INSTALLER_PATH -ArgumentList "/S", ("/D=" + $env:INSTALL_PATH) + + - name: Run chia version + env: + INSTALL_PATH: ${{ github.workspace }}\installed + run: | + & ($env:INSTALL_PATH + "\resources\app.asar.unpacked\daemon\chia.exe") version diff --git a/.github/workflows/check-commit-signing.yml b/.github/workflows/check-commit-signing.yml index d1a88e008fae..5e49eee68ad6 100644 --- a/.github/workflows/check-commit-signing.yml +++ b/.github/workflows/check-commit-signing.yml @@ -3,12 +3,12 @@ name: 🚨 Check commit signing on: push: branches: - - long_lived/** - - main - - release/** + - long_lived/** + - main + - release/** pull_request: branches: - - '**' + - "**" concurrency: # SHA is added to the end if on `main` to let all main workflows run @@ -22,9 +22,9 @@ jobs: timeout-minutes: 5 steps: - - name: Checkout Code - uses: actions/checkout@v4 - with: - fetch-depth: 0 + - name: Checkout Code + uses: actions/checkout@v4 + with: + fetch-depth: 0 - - uses: chia-network/actions/check-commit-signing@main + - uses: chia-network/actions/check-commit-signing@main diff --git a/.github/workflows/check_wheel_availability.yaml b/.github/workflows/check_wheel_availability.yaml index 2464cdc2be35..214e97d9f12e 100644 --- a/.github/workflows/check_wheel_availability.yaml +++ b/.github/workflows/check_wheel_availability.yaml @@ -3,14 +3,14 @@ name: 🚨 Check Dependency Artifacts on: push: branches: - - 'long_lived/**' + - "long_lived/**" - main - - 'release/**' + - "release/**" release: types: [published] pull_request: branches: - - '**' + - "**" concurrency: # SHA is added to the end if on `main` to let all main workflows run @@ -44,28 +44,28 @@ jobs: matrix: arm - name: Intel matrix: intel - python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] + python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] exclude: - os: matrix: macos arch: matrix: arm - python-version: '3.8' + python-version: "3.8" - os: matrix: windows arch: matrix: arm steps: - - uses: Chia-Network/actions/clean-workspace@main + - uses: Chia-Network/actions/clean-workspace@main - - name: Checkout Code - uses: actions/checkout@v4 + - name: Checkout Code + uses: actions/checkout@v4 - - uses: Chia-Network/actions/setup-python@main - with: - python-version: ${{ matrix.python-version }} - force-pyenv: ${{ matrix.os.matrix == 'macos' && matrix.arch.matrix == 'intel' }} + - uses: Chia-Network/actions/setup-python@main + with: + python-version: ${{ matrix.python-version }} + force-pyenv: ${{ matrix.os.matrix == 'macos' && matrix.arch.matrix == 'intel' }} - - name: Check Wheel Availability - run: python build_scripts/check_dependency_artifacts.py + - name: Check Wheel Availability + run: python build_scripts/check_dependency_artifacts.py diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index c2a407003a3f..1903590ae2b4 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -14,14 +14,14 @@ name: 🚨 CodeQL on: push: branches: - - 'long_lived/**' + - "long_lived/**" - main - - 'release/**' + - "release/**" pull_request: # The branches below must be a subset of the branches above - branches: [ main ] + branches: [main] schedule: - - cron: '34 14 * * 3' + - cron: "34 14 * * 3" concurrency: # SHA is added to the end if on `main` to let all main workflows run @@ -36,40 +36,40 @@ jobs: strategy: fail-fast: false matrix: - language: [ 'python' ] + language: ["python"] # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] # Learn more: # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed steps: - - name: Checkout repository - uses: actions/checkout@v4 + - name: Checkout repository + uses: actions/checkout@v4 - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v3 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v3 + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v3 - # ℹ️ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl + # ℹ️ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl - # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language + # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language - #- run: | - # make bootstrap - # make release + #- run: | + # make bootstrap + # make release - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index b7a0ea90d58e..3bc3e1a7768c 100644 --- a/.github/workflows/dependency-review.yml +++ b/.github/workflows/dependency-review.yml @@ -5,7 +5,7 @@ # # Source repository: https://github.com/actions/dependency-review-action # Public documentation: https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-dependency-review#dependency-review-enforcement -name: '🚨 Dependency Review' +name: "🚨 Dependency Review" on: [pull_request] permissions: @@ -15,10 +15,10 @@ jobs: dependency-review: runs-on: ubuntu-latest steps: - - name: 'Checkout Repository' + - name: "Checkout Repository" uses: actions/checkout@v4 - - name: 'Dependency Review' + - name: "Dependency Review" uses: actions/dependency-review-action@v4 with: deny-licenses: AGPL-1.0-only, AGPL-1.0-or-later, AGPL-1.0-or-later, AGPL-3.0-or-later, GPL-1.0-only, GPL-1.0-or-later, GPL-2.0-only, GPL-2.0-or-later, GPL-3.0-only, GPL-3.0-or-later diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 8962b93c28e4..04c76ae7c99b 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -4,9 +4,9 @@ on: pull_request: push: branches: - - 'long_lived/**' + - "long_lived/**" - main - - 'release/**' + - "release/**" concurrency: # SHA is added to the end if on `main` to let all main workflows run @@ -42,7 +42,7 @@ jobs: - name: Intel matrix: intel python: - - major_dot_minor: '3.10' + - major_dot_minor: "3.10" exclude: - os: matrix: windows @@ -50,29 +50,29 @@ jobs: matrix: arm steps: - - name: Clean workspace - uses: Chia-Network/actions/clean-workspace@main + - name: Clean workspace + uses: Chia-Network/actions/clean-workspace@main - - uses: Chia-Network/actions/git-mark-workspace-safe@main + - uses: Chia-Network/actions/git-mark-workspace-safe@main - - name: disable git autocrlf - run: | - git config --global core.autocrlf false + - name: disable git autocrlf + run: | + git config --global core.autocrlf false - - uses: actions/checkout@v4 + - uses: actions/checkout@v4 - - uses: Chia-Network/actions/setup-python@main - with: - python-version: ${{ matrix.python.major_dot_minor }} + - uses: Chia-Network/actions/setup-python@main + with: + python-version: ${{ matrix.python.major_dot_minor }} - - uses: ./.github/actions/install - with: - python-version: ${{ matrix.python.major_dot_minor }} - development: true + - uses: ./.github/actions/install + with: + python-version: ${{ matrix.python.major_dot_minor }} + development: true - - uses: chia-network/actions/activate-venv@main + - uses: chia-network/actions/activate-venv@main - - env: - CHIA_MANAGE_CLVM_CHECK_USE_CACHE: "false" - CHIA_MANAGE_MYPY_CHECK_EXCLUSIONS: "true" - run: pre-commit run --all-files --verbose + - env: + CHIA_MANAGE_CLVM_CHECK_USE_CACHE: "false" + CHIA_MANAGE_MYPY_CHECK_EXCLUSIONS: "true" + run: pre-commit run --all-files --verbose diff --git a/.github/workflows/stale-issue.yml b/.github/workflows/stale-issue.yml index e902f78f451a..0bfa6b108b87 100644 --- a/.github/workflows/stale-issue.yml +++ b/.github/workflows/stale-issue.yml @@ -1,7 +1,7 @@ -name: 'Close stale issues' +name: "Close stale issues" on: schedule: - - cron: '0 11 * * *' + - cron: "0 11 * * *" jobs: stale: diff --git a/.github/workflows/super-linter.yml b/.github/workflows/super-linter.yml index 438b499c214d..f40b8635d773 100644 --- a/.github/workflows/super-linter.yml +++ b/.github/workflows/super-linter.yml @@ -18,14 +18,14 @@ name: 🚨 GitHub Super Linter on: push: branches: - - 'long_lived/**' + - "long_lived/**" - main - - 'release/**' + - "release/**" release: types: [published] pull_request: branches: - - '**' + - "**" concurrency: # SHA is added to the end if on `main` to let all main workflows run @@ -58,7 +58,7 @@ jobs: ################################ - name: Lint Code Base uses: github/super-linter@v5 -# uses: docker://github/super-linter:v3.10.2 + # uses: docker://github/super-linter:v3.10.2 env: VALIDATE_ALL_CODEBASE: true DEFAULT_BRANCH: main @@ -81,5 +81,3 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} FILTER_REGEX_EXCLUDE: .*github/ISSUE_TEMPLATE/config.yml # ACTIONS_RUNNER_DEBUG: true - -... diff --git a/.github/workflows/test-install-scripts.yml b/.github/workflows/test-install-scripts.yml index 6e37bc93bc87..2f0ca60b7e20 100644 --- a/.github/workflows/test-install-scripts.yml +++ b/.github/workflows/test-install-scripts.yml @@ -3,18 +3,18 @@ name: 🏗️ Test Install Scripts on: push: paths-ignore: - - '**.md' + - "**.md" branches: - - 'long_lived/**' + - "long_lived/**" - main - - 'release/**' + - "release/**" release: types: [published] pull_request: paths-ignore: - - '**.md' + - "**.md" branches: - - '**' + - "**" concurrency: # SHA is added to the end if on `main` to let all main workflows run @@ -44,37 +44,37 @@ jobs: value: true steps: - - name: Checkout Code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Setup Python environment - uses: Chia-Network/actions/setup-python@main - with: - python-version: ${{ matrix.python.major-dot-minor }} - - - uses: ./.github/actions/install - with: - python-version: ${{ matrix.python.major-dot-minor }} - development: ${{ matrix.development.value }} - do-system-installs: true - - - uses: chia-network/actions/activate-venv@main - - - name: Run chia --help - run: | - chia --help - - - name: Run install-gui script (Linux, macOS) - if: matrix.os.matrix != 'windows' - run: | - sh install-gui.sh - - - name: Run install-gui script (Windows) - if: matrix.os.matrix == 'windows' - run: | - ./Install-gui.ps1 + - name: Checkout Code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Python environment + uses: Chia-Network/actions/setup-python@main + with: + python-version: ${{ matrix.python.major-dot-minor }} + + - uses: ./.github/actions/install + with: + python-version: ${{ matrix.python.major-dot-minor }} + development: ${{ matrix.development.value }} + do-system-installs: true + + - uses: chia-network/actions/activate-venv@main + + - name: Run chia --help + run: | + chia --help + + - name: Run install-gui script (Linux, macOS) + if: matrix.os.matrix != 'windows' + run: | + sh install-gui.sh + + - name: Run install-gui script (Windows) + if: matrix.os.matrix == 'windows' + run: | + ./Install-gui.ps1 test_scripts_in_docker: name: Test Install Scripts ${{ matrix.distribution.name }} ${{ matrix.arch.name }} @@ -84,53 +84,53 @@ jobs: fail-fast: false matrix: os: - - name: Linux - matrix: linux - runs-on: - intel: ubuntu-latest - arm: [linux, arm64] + - name: Linux + matrix: linux + runs-on: + intel: ubuntu-latest + arm: [linux, arm64] distribution: - - name: amazonlinux:2023 - type: amazon - url: "docker://amazonlinux:2023" - - name: arch:latest - type: arch - url: "docker://archlinux:latest" - - name: debian:bullseye - type: debian - # https://packages.debian.org/bullseye/python/python3 (3.9) - url: "docker://debian:bullseye" - - name: debian:bookworm - type: debian - # https://packages.debian.org/bookworm/python/python3 (3.11) - url: "docker://debian:bookworm" - - name: fedora:37 - type: fedora - # (37, 3.11) https://packages.fedoraproject.org/search?query=python3&releases=Fedora+37&start=0 - url: "docker://fedora:37" - - name: fedora:38 - type: fedora - # (38, 3.11) https://packages.fedoraproject.org/search?query=python3&releases=Fedora+38&start=0 - url: "docker://fedora:38" - - name: rockylinux:8 - type: rocky - url: "docker://rockylinux:8" - - name: rockylinux:9 - type: rocky - url: "docker://rockylinux:9" - - name: ubuntu:focal (20.04) - type: ubuntu - # https://packages.ubuntu.com/focal/python3 (20.04, 3.8) - url: "docker://ubuntu:focal" - - name: ubuntu:jammy (22.04) - type: ubuntu - # https://packages.ubuntu.com/jammy/python3 (22.04, 3.10) - url: "docker://ubuntu:jammy" + - name: amazonlinux:2023 + type: amazon + url: "docker://amazonlinux:2023" + - name: arch:latest + type: arch + url: "docker://archlinux:latest" + - name: debian:bullseye + type: debian + # https://packages.debian.org/bullseye/python/python3 (3.9) + url: "docker://debian:bullseye" + - name: debian:bookworm + type: debian + # https://packages.debian.org/bookworm/python/python3 (3.11) + url: "docker://debian:bookworm" + - name: fedora:37 + type: fedora + # (37, 3.11) https://packages.fedoraproject.org/search?query=python3&releases=Fedora+37&start=0 + url: "docker://fedora:37" + - name: fedora:38 + type: fedora + # (38, 3.11) https://packages.fedoraproject.org/search?query=python3&releases=Fedora+38&start=0 + url: "docker://fedora:38" + - name: rockylinux:8 + type: rocky + url: "docker://rockylinux:8" + - name: rockylinux:9 + type: rocky + url: "docker://rockylinux:9" + - name: ubuntu:focal (20.04) + type: ubuntu + # https://packages.ubuntu.com/focal/python3 (20.04, 3.8) + url: "docker://ubuntu:focal" + - name: ubuntu:jammy (22.04) + type: ubuntu + # https://packages.ubuntu.com/jammy/python3 (22.04, 3.10) + url: "docker://ubuntu:jammy" arch: - - name: ARM64 - matrix: arm - - name: Intel - matrix: intel + - name: ARM64 + matrix: arm + - name: Intel + matrix: intel exclude: - distribution: type: arch @@ -138,68 +138,68 @@ jobs: matrix: arm steps: - - name: Prepare Amazon Linux - if: ${{ matrix.distribution.type == 'amazon' }} - run: | - yum install --assumeyes git sudo - - - name: Prepare Arch - if: ${{ matrix.distribution.type == 'arch' }} - run: | - pacman --noconfirm -Syu - pacman --noconfirm -S base git sudo openssl-1.1 - # The behavior we follow in install.sh is unique with Arch in that - # we leave it to the user to install the appropriate version of python, - # so we need to install python here in order for the test to succeed. - pacman --noconfirm -U --needed https://archive.archlinux.org/packages/p/python/python-3.9.9-1-x86_64.pkg.tar.zst - - - name: Prepare Debian - if: ${{ matrix.distribution.type == 'debian' }} - env: - DEBIAN_FRONTEND: noninteractive - run: | - apt-get --yes update - apt-get install --yes git lsb-release sudo python3-venv - - - name: Prepare Fedora - if: ${{ matrix.distribution.type == 'fedora' }} - run: | - yum install --assumeyes git - - - name: Prepare Rocky - if: ${{ matrix.distribution.type == 'rocky' }} - run: | - yum install --assumeyes git sudo python39 - - - name: Prepare Ubuntu - if: ${{ matrix.distribution.type == 'ubuntu' }} - env: - DEBIAN_FRONTEND: noninteractive - run: | - # for bionic - apt-get --yes update - apt-get install --yes software-properties-common - add-apt-repository --yes ppa:git-core/ppa - apt-get --yes update - apt-get install --yes git lsb-release sudo python3-venv - - - name: Add safe git directory - run: git config --global --add safe.directory "$GITHUB_WORKSPACE" - - # after installing git so we use that copy - - name: Checkout Code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - uses: ./.github/actions/install - with: - python-version: ${{ matrix.python-version }} - development: true - do-system-installs: true - - - uses: chia-network/actions/activate-venv@main - - - name: Run chia --help - run: | - chia --help + - name: Prepare Amazon Linux + if: ${{ matrix.distribution.type == 'amazon' }} + run: | + yum install --assumeyes git sudo + + - name: Prepare Arch + if: ${{ matrix.distribution.type == 'arch' }} + run: | + pacman --noconfirm -Syu + pacman --noconfirm -S base git sudo openssl-1.1 + # The behavior we follow in install.sh is unique with Arch in that + # we leave it to the user to install the appropriate version of python, + # so we need to install python here in order for the test to succeed. + pacman --noconfirm -U --needed https://archive.archlinux.org/packages/p/python/python-3.9.9-1-x86_64.pkg.tar.zst + + - name: Prepare Debian + if: ${{ matrix.distribution.type == 'debian' }} + env: + DEBIAN_FRONTEND: noninteractive + run: | + apt-get --yes update + apt-get install --yes git lsb-release sudo python3-venv + + - name: Prepare Fedora + if: ${{ matrix.distribution.type == 'fedora' }} + run: | + yum install --assumeyes git + + - name: Prepare Rocky + if: ${{ matrix.distribution.type == 'rocky' }} + run: | + yum install --assumeyes git sudo python39 + + - name: Prepare Ubuntu + if: ${{ matrix.distribution.type == 'ubuntu' }} + env: + DEBIAN_FRONTEND: noninteractive + run: | + # for bionic + apt-get --yes update + apt-get install --yes software-properties-common + add-apt-repository --yes ppa:git-core/ppa + apt-get --yes update + apt-get install --yes git lsb-release sudo python3-venv + + - name: Add safe git directory + run: git config --global --add safe.directory "$GITHUB_WORKSPACE" + + # after installing git so we use that copy + - name: Checkout Code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: ./.github/actions/install + with: + python-version: ${{ matrix.python-version }} + development: true + do-system-installs: true + + - uses: chia-network/actions/activate-venv@main + + - name: Run chia --help + run: | + chia --help diff --git a/.github/workflows/test-single.yml b/.github/workflows/test-single.yml index bd6e821933d4..4347acc52756 100644 --- a/.github/workflows/test-single.yml +++ b/.github/workflows/test-single.yml @@ -33,7 +33,6 @@ on: required: true type: string - concurrency: # SHA is added to the end if on `main` to let all main workflows run group: ${{ github.ref }}-${{ github.workflow }}-${{ inputs.concurrency_name }}-${{ github.event_name }}-${{ (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/') || startsWith(github.ref, 'refs/heads/long_lived/')) && github.sha || '' }} @@ -59,45 +58,45 @@ jobs: file_name: ${{ inputs.file_name }} runs-on: ${{ inputs.runs-on }} python: - - name: '3.8' - file_name: '3.8' - action: '3.8' - apt: '3.8' - install_sh: '3.8' - matrix: '3.8' + - name: "3.8" + file_name: "3.8" + action: "3.8" + apt: "3.8" + install_sh: "3.8" + matrix: "3.8" exclude_from: limited: True main: True - - name: '3.9' - file_name: '3.9' - action: '3.9' - apt: '3.9' - install_sh: '3.9' - matrix: '3.9' + - name: "3.9" + file_name: "3.9" + action: "3.9" + apt: "3.9" + install_sh: "3.9" + matrix: "3.9" exclude_from: limited: True main: True - - name: '3.10' - file_name: '3.10' - action: '3.10' - apt: '3.10' - install_sh: '3.10' - matrix: '3.10' - - name: '3.11' - file_name: '3.11' - action: '3.11' - apt: '3.11' - install_sh: '3.11' - matrix: '3.11' + - name: "3.10" + file_name: "3.10" + action: "3.10" + apt: "3.10" + install_sh: "3.10" + matrix: "3.10" + - name: "3.11" + file_name: "3.11" + action: "3.11" + apt: "3.11" + install_sh: "3.11" + matrix: "3.11" exclude_from: limited: True main: True - - name: '3.12' - file_name: '3.12' - action: '3.12' - apt: '3.12' - install_sh: '3.12' - matrix: '3.12' + - name: "3.12" + file_name: "3.12" + action: "3.12" + apt: "3.12" + install_sh: "3.12" + matrix: "3.12" exclude_from: limited: True main: True @@ -105,7 +104,7 @@ jobs: - os: matrix: macos python: - matrix: '3.8' + matrix: "3.8" - os: matrix: windows configuration: @@ -192,7 +191,6 @@ jobs: ${{ github.workspace }}/.chia/test-plots key: ${{ env.BLOCKS_AND_PLOTS_VERSION }} - - name: Checkout test blocks and plots if: matrix.configuration.checkout_blocks_and_plots && steps.test-blocks-plots.outputs.cache-hit != 'true' env: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c334cb3bc034..84e8034f8691 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -3,21 +3,21 @@ name: 🧪 test on: push: paths-ignore: - - '**.md' + - "**.md" branches: - - long_lived/** - - main - - release/** + - long_lived/** + - main + - release/** tags: - - '**' + - "**" pull_request: paths-ignore: - - '**.md' + - "**.md" branches: - - '**' + - "**" workflow_dispatch: null schedule: - - cron: '0 13 * * *' + - cron: "0 13 * * *" concurrency: group: ${{ github.ref }}-${{ github.workflow }}-${{ github.event_name }}--${{ (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/') || startsWith(github.ref, 'refs/heads/long_lived/')) && github.sha || '' }} @@ -35,7 +35,7 @@ jobs: - name: Setup Python environment uses: Chia-Network/actions/setup-python@main with: - python-version: '3.10' + python-version: "3.10" - name: Generate matrix configuration id: configure @@ -102,11 +102,11 @@ jobs: name: Ubuntu runs-on: ubuntu-latest python: - - name: '3.10' - action: '3.10' - apt: '3.10' - install_sh: '3.10' - matrix: '3.10' + - name: "3.10" + action: "3.10" + apt: "3.10" + install_sh: "3.10" + matrix: "3.10" steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/trigger-docker-dev.yml b/.github/workflows/trigger-docker-dev.yml index cfed0cba1079..33e78fd1dc3e 100644 --- a/.github/workflows/trigger-docker-dev.yml +++ b/.github/workflows/trigger-docker-dev.yml @@ -3,13 +3,13 @@ name: 📦🚀 Trigger Dev Docker Build on: push: paths-ignore: - - '**.md' + - "**.md" branches: - - 'long_lived/**' - - 'release/**' + - "long_lived/**" + - "release/**" pull_request: paths-ignore: - - '**.md' + - "**.md" concurrency: # SHA is added to the end if on `main` to let all main workflows run diff --git a/.github/workflows/trigger-docker-main.yml b/.github/workflows/trigger-docker-main.yml index d29e9d7e038b..e6b44207ea8e 100644 --- a/.github/workflows/trigger-docker-main.yml +++ b/.github/workflows/trigger-docker-main.yml @@ -3,7 +3,7 @@ name: 📦🚀 Trigger Main Docker Build on: push: paths-ignore: - - '**.md' + - "**.md" branches: - main diff --git a/.github/workflows/upload-pypi-source.yml b/.github/workflows/upload-pypi-source.yml index 960c2cbc4893..196a5a4ea575 100644 --- a/.github/workflows/upload-pypi-source.yml +++ b/.github/workflows/upload-pypi-source.yml @@ -3,18 +3,18 @@ name: 🚨🚀 Lint and upload source distribution on: push: paths-ignore: - - '**.md' + - "**.md" branches: - - 'long_lived/**' + - "long_lived/**" - main - - 'release/**' + - "release/**" release: types: [published] pull_request: paths-ignore: - - '**.md' + - "**.md" branches: - - '**' + - "**" concurrency: # SHA is added to the end if on `main` to let all main workflows run @@ -57,10 +57,10 @@ jobs: - name: Intel matrix: intel python: - - major_dot_minor: '3.8' - - major_dot_minor: '3.9' - - major_dot_minor: '3.10' - - major_dot_minor: '3.11' + - major_dot_minor: "3.8" + - major_dot_minor: "3.9" + - major_dot_minor: "3.10" + - major_dot_minor: "3.11" check: - name: mypy command: | @@ -73,37 +73,37 @@ jobs: arch: matrix: arm python: - major_dot_minor: '3.8' + major_dot_minor: "3.8" - os: matrix: windows arch: matrix: arm steps: - - uses: chia-network/actions/clean-workspace@main + - uses: chia-network/actions/clean-workspace@main - - name: Add safe git directory - uses: chia-network/actions/git-mark-workspace-safe@main + - name: Add safe git directory + uses: chia-network/actions/git-mark-workspace-safe@main - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - submodules: recursive + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + submodules: recursive - - uses: chia-network/actions/setup-python@main - with: - python-version: ${{ matrix.python.major_dot_minor }} + - uses: chia-network/actions/setup-python@main + with: + python-version: ${{ matrix.python.major_dot_minor }} - - uses: ./.github/actions/install - with: - python-version: ${{ matrix.python.major_dot_minor }} - development: true + - uses: ./.github/actions/install + with: + python-version: ${{ matrix.python.major_dot_minor }} + development: true - - uses: chia-network/actions/activate-venv@main + - uses: chia-network/actions/activate-venv@main - - name: Check with ${{ matrix.check.name }} - run: | - ${{ matrix.check.command }} + - name: Check with ${{ matrix.check.name }} + run: | + ${{ matrix.check.command }} check: name: ${{ matrix.os.emoji }} ${{ matrix.check.name }} - ${{ matrix.os.name }} ${{ matrix.arch.name }} ${{ matrix.python.major_dot_minor }} @@ -123,7 +123,7 @@ jobs: - name: Intel matrix: intel python: - - major_dot_minor: '3.10' + - major_dot_minor: "3.10" check: - name: black command: black --check --diff . @@ -137,30 +137,30 @@ jobs: git diff --exit-code steps: - - uses: chia-network/actions/clean-workspace@main + - uses: chia-network/actions/clean-workspace@main - - name: Add safe git directory - uses: chia-network/actions/git-mark-workspace-safe@main + - name: Add safe git directory + uses: chia-network/actions/git-mark-workspace-safe@main - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - submodules: recursive + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + submodules: recursive - - uses: chia-network/actions/setup-python@main - with: - python-version: ${{ matrix.python.major_dot_minor }} + - uses: chia-network/actions/setup-python@main + with: + python-version: ${{ matrix.python.major_dot_minor }} - - uses: ./.github/actions/install - with: - python-version: ${{ matrix.python.major_dot_minor }} - development: true + - uses: ./.github/actions/install + with: + python-version: ${{ matrix.python.major_dot_minor }} + development: true - - uses: chia-network/actions/activate-venv@main + - uses: chia-network/actions/activate-venv@main - - name: Check with ${{ matrix.check.name }} - run: | - ${{ matrix.check.command }} + - name: Check with ${{ matrix.check.name }} + run: | + ${{ matrix.check.command }} upload_source_dist: name: Lint and Upload source distribution @@ -170,40 +170,40 @@ jobs: - mypy - check steps: - - name: Add safe git directory - uses: chia-network/actions/git-mark-workspace-safe@main - - - name: Checkout Code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - submodules: recursive - - - uses: Chia-Network/actions/setup-python@main - name: Install Python - with: - python-version: '3.10' - - - uses: ./.github/actions/install - with: - python-version: ${{ matrix.python.major_dot_minor }} - development: true - - - uses: chia-network/actions/activate-venv@main - - - name: Build source distribution - run: | - python -m build --sdist --outdir dist . - - - name: Upload artifacts - uses: actions/upload-artifact@v4 - with: - name: dist - path: ./dist - - - name: Publish distribution to PyPI - if: startsWith(github.ref, 'refs/tags') - uses: pypa/gh-action-pypi-publish@release/v1 - with: - packages-dir: dist/ - skip-existing: true + - name: Add safe git directory + uses: chia-network/actions/git-mark-workspace-safe@main + + - name: Checkout Code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + submodules: recursive + + - uses: Chia-Network/actions/setup-python@main + name: Install Python + with: + python-version: "3.10" + + - uses: ./.github/actions/install + with: + python-version: ${{ matrix.python.major_dot_minor }} + development: true + + - uses: chia-network/actions/activate-venv@main + + - name: Build source distribution + run: | + python -m build --sdist --outdir dist . + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: dist + path: ./dist + + - name: Publish distribution to PyPI + if: startsWith(github.ref, 'refs/tags') + uses: pypa/gh-action-pypi-publish@release/v1 + with: + packages-dir: dist/ + skip-existing: true diff --git a/.markdown-lint.yml b/.markdown-lint.yml index 54a2067a9350..8a06b619ba51 100644 --- a/.markdown-lint.yml +++ b/.markdown-lint.yml @@ -18,21 +18,21 @@ ############### # Rules by id # ############### -MD004: false # Unordered list style +MD004: false # Unordered list style MD007: - indent: 2 # Unordered list indentation + indent: 2 # Unordered list indentation MD013: - line_length: 808 # Line length + line_length: 808 # Line length MD024: allow_different_nesting: true MD026: - punctuation: ".,;:!。,;:" # List of not allowed -MD029: false # Ordered list item prefix -MD033: false # Allow inline HTML -MD036: false # Emphasis used instead of a heading -MD041: false # Allow file to start without h1 + punctuation: ".,;:!。,;:" # List of not allowed +MD029: false # Ordered list item prefix +MD033: false # Allow inline HTML +MD036: false # Emphasis used instead of a heading +MD041: false # Allow file to start without h1 ################# # Rules by tags # ################# -blank_lines: false # Error on blank lines +blank_lines: false # Error on blank lines diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3820f3d6e5ec..2b7edb35f27a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,83 +1,88 @@ repos: -- repo: local + - repo: local hooks: - - id: check-sql + - id: check-sql name: Validate SQL statements entry: ./activated.py python -m tests.check_sql_statements language: system pass_filenames: false -- repo: local + - repo: local hooks: - - id: init_py_files + - id: init_py_files name: __init__.py files entry: ./activated.py python tests/build-init-files.py -v --root . language: system pass_filenames: false -- repo: local + - repo: local hooks: - - id: pyupgrade + - id: pyupgrade name: pyupgrade entry: ./activated.py pyupgrade --py38-plus --keep-runtime-typing language: system types: [python] -- repo: local + - repo: local hooks: - - id: black + - id: black name: black entry: ./activated.py black language: system require_serial: true types_or: [python, pyi] -- repo: https://github.com/pre-commit/pre-commit-hooks + - repo: https://github.com/pre-commit/mirrors-prettier + rev: v3.1.0 + hooks: + - id: prettier + types_or: [ini, json, toml, yaml] + - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.3.0 hooks: - - id: check-yaml - - id: mixed-line-ending + - id: check-yaml + - id: mixed-line-ending args: ["--fix=lf"] - - id: end-of-file-fixer + - id: end-of-file-fixer exclude: ".*?(.hex|.clsp|.clvm|.clib)" - - id: trailing-whitespace - - id: check-merge-conflict - - id: check-ast - - id: debug-statements -- repo: local + - id: trailing-whitespace + - id: check-merge-conflict + - id: check-ast + - id: debug-statements + - repo: local hooks: - - id: clvm_hex + - id: clvm_hex name: .clsp.hex files entry: ./activated.py python tools/manage_clvm.py check language: system pass_filenames: false -- repo: local + - repo: local hooks: - - id: chialispp + - id: chialispp name: Pretty print chialisp files entry: ./activated.py python tools/chialispp.py . language: system pass_filenames: false -- repo: local + - repo: local hooks: - - id: build mypy.ini + - id: build mypy.ini name: build mypy.ini entry: ./activated.py python manage-mypy.py build-mypy-ini language: system pass_filenames: false -- repo: local + - repo: local hooks: - - id: mypy + - id: mypy name: mypy entry: ./activated.py mypy language: system pass_filenames: false -- repo: local + - repo: local hooks: - - id: isort + - id: isort name: isort entry: ./activated.py isort language: system types: [python] -- repo: local + - repo: local hooks: - - id: flake8 + - id: flake8 name: Flake8 entry: ./activated.py flake8 language: system diff --git a/.prettierrc.yaml b/.prettierrc.yaml new file mode 100644 index 000000000000..f69198b9c3ba --- /dev/null +++ b/.prettierrc.yaml @@ -0,0 +1,4 @@ +tabWidth: 2 +singleQuote: false +experimentalTernaries: true +useTabs: false diff --git a/build_scripts/electron-builder.json b/build_scripts/electron-builder.json index fb13f3ae433a..e4bcb903ca66 100644 --- a/build_scripts/electron-builder.json +++ b/build_scripts/electron-builder.json @@ -4,25 +4,15 @@ "asar": true, "asarUnpack": "**/daemon/**", "npmRebuild": false, - "files": [ - "build", - "daemon", - "!node_modules", - "!src", - "!public" - ], + "files": ["build", "daemon", "!node_modules", "!src", "!public"], "protocols": [ { "name": "Chia URL", - "schemes": [ - "chia" - ] + "schemes": ["chia"] }, { "name": "Chia XCH Address", - "schemes": [ - "xch" - ] + "schemes": ["xch"] } ], "win": { diff --git a/chia/wallet/puzzles/deployed_puzzle_hashes.json b/chia/wallet/puzzles/deployed_puzzle_hashes.json index 332222e8d618..a137f8c9d6ab 100644 --- a/chia/wallet/puzzles/deployed_puzzle_hashes.json +++ b/chia/wallet/puzzles/deployed_puzzle_hashes.json @@ -1,65 +1,65 @@ { - "augmented_condition": "d303eafa617bedf0bc05850dd014e10fbddf622187dc07891a2aacba9d8a93f6", - "block_program_zero": "f0a38c8efe58895ae527c65c37f700a4238504691b83990e5dd91bd8b3c30eae", - "cat_v2": "37bef360ee858133b69d595a906dc45d01af50379dad515eb9518abb7c1d2a7a", - "chialisp_deserialisation": "94ec19077f9a34e0b11ad2456af0170f4cc03f11230ca42e3f82e6e644ac4f5d", - "conditions_w_fee_announce": "1a169582dc619f2542f8eb79f02823e1595ba0aca53820f503eda5ff20b47856", - "covenant_layer": "b982796850336aabf9ab17c3f21e299f0c633444117ab5e9ebeafadf1860d9fc", - "create_nft_launcher_from_did": "7a32d2d9571d3436791c0ad3d7fcfdb9c43ace2b0f0ff13f98d29f0cc093f445", - "credential_restriction": "2fdfc1f058cfd65e7ec4e253bfeb394da163ecd0036f508df8629b0a2b8fde96", - "dao_cat_eve": "488f55bedaca5a599544dfd5ab341e2e5c7e6fca67d9b98a3d856f876c52f53e", - "dao_cat_launcher": "a01a838d18d4e031e937c79fa3f80f213fa00a3e64af6c16a1f137770cd3a567", - "dao_finished_state": "694c99e1fb07671771bbca3d110880693a9ecc37a6529891ec979d0f3e760eba", - "dao_lockup": "d6215f0916715a69fbbf2d1a679f437fde81787adeb90c666642fb9c2deff7ce", - "dao_proposal": "fe6d5c0373c1750598d137ce50b5b025a203655ccab4ab3329315abad49c3586", - "dao_proposal_timer": "1acd912fca662d1474f7a6c762280fc1430875bef518883387086c1125027526", - "dao_proposal_validator": "92209b0f7efb2dbaaaa3aab94dcadcafa9d008d39661763841c7d92065b3fd34", - "dao_spend_p2_singleton_v2": "7bc8942159e600f56a87e1d9c059c8705307ec2fb996a949503298dedfed00be", - "dao_treasury": "637d78acd395b6bb03211bcfc5f5f2e878cba2d62b2f53871d49a8b928411b19", - "dao_update_proposal": "fc032384cfece9b542c3e1ea77ba119fb1013a3d74b622302c0b670447e4343d", - "decompress_coin_spend_entry": "9d98ed08770d31be4bd1bde4705dab388db5e7e9c349f5a76fc3c347aa3a0b79", - "decompress_coin_spend_entry_with_prefix": "92aa4bc8060a8836355a1884075141b4791ce1b67ae6092bb166b2845954bc89", - "decompress_puzzle": "fe94c58f1117afe315e0450daca1c62460ec1a1c439cd4018d79967a5d7d1370", - "delegated_tail": "999c3696e167f8a79d938adc11feba3a3dcb39ccff69a426d570706e7b8ec399", - "did_innerpuz": "33143d2bef64f14036742673afd158126b94284b4530a28c354fac202b0c910e", - "eml_covenant_morpher": "6a87946257f555ae82aca6a11b5205058b844f634ecb6c7dc6b0c54eb2996308", - "eml_transfer_program_covenant_adapter": "4218fbebbb6f3c0907ebe8a672fa5d1e4bc655645a3a0073601e6c9b50b07c47", - "eml_update_metadata_with_DID": "d3a9a1fc20f247d009b4b0e941707d50b91885c99d0b27ef882e1294e771139d", - "everything_with_signature": "1720d13250a7c16988eaf530331cefa9dd57a76b2c82236bec8bbbff91499b89", - "exigent_metadata_layer": "d5fd32e069fda83e230ccd8f6a7c4f652231aed5c755514b3d996cbeff4182b8", - "flag_proofs_checker": "fe2e3c631562fbb9be095297f762bf573705a0197164e9361ad5d50e045ba241", - "genesis_by_coin_id": "493afb89eed93ab86741b2aa61b8f5de495d33ff9b781dfc8919e602b2afa150", - "genesis_by_coin_id_or_singleton": "40170305e3a71c3e7523f37fbcfc3188f9f949da0818a6331f28251e76e8c56f", - "genesis_by_puzzle_hash": "de5a6e06d41518be97ff6365694f4f89475dda773dede267caa33da63b434e36", - "graftroot_dl_offers": "0893e36a88c064fddfa6f8abdb42c044584a98cb4273b80cccc83b4867b701a1", - "nft_intermediate_launcher": "7a32d2d9571d3436791c0ad3d7fcfdb9c43ace2b0f0ff13f98d29f0cc093f445", - "nft_metadata_updater_default": "fe8a4b4e27a2e29a4d3fc7ce9d527adbcaccbab6ada3903ccf3ba9a769d2d78b", - "nft_metadata_updater_updateable": "0b1ffba1601777c06b78ab38636e9624f2f8da73be9b36e0ce17c8d8ef3bad9f", - "nft_ownership_layer": "c5abea79afaa001b5427dfa0c8cf42ca6f38f5841b78f9b3c252733eb2de2726", - "nft_ownership_transfer_program_one_way_claim_with_royalties": "025dee0fb1e9fa110302a7e9bfb6e381ca09618e2778b0184fa5c6b275cfce1f", - "nft_state_layer": "a04d9f57764f54a43e4030befb4d80026e870519aaa66334aef8304f5d0393c2", - "notification": "b8b9d8ffca6d5cba5422ead7f477ecfc8f6aaaa1c024b8c3aeb1956b24a0ab1e", - "p2_1_of_n": "46b29fd87fbeb6737600c4543931222a6c1ed3db6fa5601a3ca284a9f4efe780", - "p2_announced_delegated_puzzle": "c4d24c3c5349376f3e8f3aba202972091713b4ec4915f0f26192ae4ace0bd04d", - "p2_conditions": "1c77d7d5efde60a7a1d2d27db6d746bc8e568aea1ef8586ca967a0d60b83cc36", - "p2_delegated_conditions": "0ff94726f1a8dea5c3f70d3121945190778d3b2b3fcda3735a1f290977e98341", - "p2_delegated_puzzle": "542cde70d1102cd1b763220990873efc8ab15625ded7eae22cc11e21ef2e2f7c", - "p2_delegated_puzzle_or_hidden_puzzle": "e9aaa49f45bad5c889b86ee3341550c155cfdd10c3a6757de618d20612fffd52", - "p2_m_of_n_delegate_direct": "0f199d5263ac1a62b077c159404a71abd3f9691cc57520bf1d4c5cb501504457", - "p2_parent": "b10ce2d0b18dcf8c21ddfaf55d9b9f0adcbf1e0beb55b1a8b9cad9bbff4e5f22", - "p2_puzzle_hash": "13e29a62b42cd2ef72a79e4bacdc59733ca6310d65af83d349360d36ec622363", - "p2_singleton": "40f828d8dd55603f4ff9fbf6b73271e904e69406982f4fbefae2c8dcceaf9834", - "p2_singleton_aggregator": "f79a31fcfe3736cc75720617b4cdcb4376b4b8f8f71108617710612b909a4924", - "p2_singleton_or_delayed_puzhash": "adb656e0211e2ab4f42069a4c5efc80dc907e7062be08bf1628c8e5b6d94d25b", - "p2_singleton_via_delegated_puzzle": "9590eaa169e45b655a31d3c06bbd355a3e2b2e3e410d3829748ce08ab249c39e", - "pool_member_innerpuz": "a8490702e333ddd831a3ac9c22d0fa26d2bfeaf2d33608deb22f0e0123eb0494", - "pool_waitingroom_innerpuz": "a317541a765bf8375e1c6e7c13503d0d2cbf56cacad5182befe947e78e2c0307", - "rom_bootstrap_generator": "161bade1f822dcd62ab712ebaf30f3922a301e48a639e4295c5685f8bece7bd9", - "settlement_payments": "cfbfdeed5c4ca2de3d0bf520b9cb4bb7743a359bd2e6a188d19ce7dffc21d3e7", - "singleton_launcher": "eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9", - "singleton_top_layer": "24e044101e57b3d8c908b8a38ad57848afd29d3eecc439dba45f4412df4954fd", - "singleton_top_layer_v1_1": "7faa3253bfddd1e0decb0906b2dc6247bbc4cf608f58345d173adb63e8b47c9f", - "standard_vc_backdoor_puzzle": "fbce76408ebaf9b3d0b8cd90cc68607755eeca67cd7432d5eea85f3f498cc002", - "std_parent_morpher": "8c3f1dc2e46c0d7ec4c2cbd007e23c0368ff8f80c5bc0101647a5c27626ebce6", - "viral_backdoor": "00848115554ea674131f89f311707a959ad3f4647482648f3fe91ba289131f51" + "augmented_condition": "d303eafa617bedf0bc05850dd014e10fbddf622187dc07891a2aacba9d8a93f6", + "block_program_zero": "f0a38c8efe58895ae527c65c37f700a4238504691b83990e5dd91bd8b3c30eae", + "cat_v2": "37bef360ee858133b69d595a906dc45d01af50379dad515eb9518abb7c1d2a7a", + "chialisp_deserialisation": "94ec19077f9a34e0b11ad2456af0170f4cc03f11230ca42e3f82e6e644ac4f5d", + "conditions_w_fee_announce": "1a169582dc619f2542f8eb79f02823e1595ba0aca53820f503eda5ff20b47856", + "covenant_layer": "b982796850336aabf9ab17c3f21e299f0c633444117ab5e9ebeafadf1860d9fc", + "create_nft_launcher_from_did": "7a32d2d9571d3436791c0ad3d7fcfdb9c43ace2b0f0ff13f98d29f0cc093f445", + "credential_restriction": "2fdfc1f058cfd65e7ec4e253bfeb394da163ecd0036f508df8629b0a2b8fde96", + "dao_cat_eve": "488f55bedaca5a599544dfd5ab341e2e5c7e6fca67d9b98a3d856f876c52f53e", + "dao_cat_launcher": "a01a838d18d4e031e937c79fa3f80f213fa00a3e64af6c16a1f137770cd3a567", + "dao_finished_state": "694c99e1fb07671771bbca3d110880693a9ecc37a6529891ec979d0f3e760eba", + "dao_lockup": "d6215f0916715a69fbbf2d1a679f437fde81787adeb90c666642fb9c2deff7ce", + "dao_proposal": "fe6d5c0373c1750598d137ce50b5b025a203655ccab4ab3329315abad49c3586", + "dao_proposal_timer": "1acd912fca662d1474f7a6c762280fc1430875bef518883387086c1125027526", + "dao_proposal_validator": "92209b0f7efb2dbaaaa3aab94dcadcafa9d008d39661763841c7d92065b3fd34", + "dao_spend_p2_singleton_v2": "7bc8942159e600f56a87e1d9c059c8705307ec2fb996a949503298dedfed00be", + "dao_treasury": "637d78acd395b6bb03211bcfc5f5f2e878cba2d62b2f53871d49a8b928411b19", + "dao_update_proposal": "fc032384cfece9b542c3e1ea77ba119fb1013a3d74b622302c0b670447e4343d", + "decompress_coin_spend_entry": "9d98ed08770d31be4bd1bde4705dab388db5e7e9c349f5a76fc3c347aa3a0b79", + "decompress_coin_spend_entry_with_prefix": "92aa4bc8060a8836355a1884075141b4791ce1b67ae6092bb166b2845954bc89", + "decompress_puzzle": "fe94c58f1117afe315e0450daca1c62460ec1a1c439cd4018d79967a5d7d1370", + "delegated_tail": "999c3696e167f8a79d938adc11feba3a3dcb39ccff69a426d570706e7b8ec399", + "did_innerpuz": "33143d2bef64f14036742673afd158126b94284b4530a28c354fac202b0c910e", + "eml_covenant_morpher": "6a87946257f555ae82aca6a11b5205058b844f634ecb6c7dc6b0c54eb2996308", + "eml_transfer_program_covenant_adapter": "4218fbebbb6f3c0907ebe8a672fa5d1e4bc655645a3a0073601e6c9b50b07c47", + "eml_update_metadata_with_DID": "d3a9a1fc20f247d009b4b0e941707d50b91885c99d0b27ef882e1294e771139d", + "everything_with_signature": "1720d13250a7c16988eaf530331cefa9dd57a76b2c82236bec8bbbff91499b89", + "exigent_metadata_layer": "d5fd32e069fda83e230ccd8f6a7c4f652231aed5c755514b3d996cbeff4182b8", + "flag_proofs_checker": "fe2e3c631562fbb9be095297f762bf573705a0197164e9361ad5d50e045ba241", + "genesis_by_coin_id": "493afb89eed93ab86741b2aa61b8f5de495d33ff9b781dfc8919e602b2afa150", + "genesis_by_coin_id_or_singleton": "40170305e3a71c3e7523f37fbcfc3188f9f949da0818a6331f28251e76e8c56f", + "genesis_by_puzzle_hash": "de5a6e06d41518be97ff6365694f4f89475dda773dede267caa33da63b434e36", + "graftroot_dl_offers": "0893e36a88c064fddfa6f8abdb42c044584a98cb4273b80cccc83b4867b701a1", + "nft_intermediate_launcher": "7a32d2d9571d3436791c0ad3d7fcfdb9c43ace2b0f0ff13f98d29f0cc093f445", + "nft_metadata_updater_default": "fe8a4b4e27a2e29a4d3fc7ce9d527adbcaccbab6ada3903ccf3ba9a769d2d78b", + "nft_metadata_updater_updateable": "0b1ffba1601777c06b78ab38636e9624f2f8da73be9b36e0ce17c8d8ef3bad9f", + "nft_ownership_layer": "c5abea79afaa001b5427dfa0c8cf42ca6f38f5841b78f9b3c252733eb2de2726", + "nft_ownership_transfer_program_one_way_claim_with_royalties": "025dee0fb1e9fa110302a7e9bfb6e381ca09618e2778b0184fa5c6b275cfce1f", + "nft_state_layer": "a04d9f57764f54a43e4030befb4d80026e870519aaa66334aef8304f5d0393c2", + "notification": "b8b9d8ffca6d5cba5422ead7f477ecfc8f6aaaa1c024b8c3aeb1956b24a0ab1e", + "p2_1_of_n": "46b29fd87fbeb6737600c4543931222a6c1ed3db6fa5601a3ca284a9f4efe780", + "p2_announced_delegated_puzzle": "c4d24c3c5349376f3e8f3aba202972091713b4ec4915f0f26192ae4ace0bd04d", + "p2_conditions": "1c77d7d5efde60a7a1d2d27db6d746bc8e568aea1ef8586ca967a0d60b83cc36", + "p2_delegated_conditions": "0ff94726f1a8dea5c3f70d3121945190778d3b2b3fcda3735a1f290977e98341", + "p2_delegated_puzzle": "542cde70d1102cd1b763220990873efc8ab15625ded7eae22cc11e21ef2e2f7c", + "p2_delegated_puzzle_or_hidden_puzzle": "e9aaa49f45bad5c889b86ee3341550c155cfdd10c3a6757de618d20612fffd52", + "p2_m_of_n_delegate_direct": "0f199d5263ac1a62b077c159404a71abd3f9691cc57520bf1d4c5cb501504457", + "p2_parent": "b10ce2d0b18dcf8c21ddfaf55d9b9f0adcbf1e0beb55b1a8b9cad9bbff4e5f22", + "p2_puzzle_hash": "13e29a62b42cd2ef72a79e4bacdc59733ca6310d65af83d349360d36ec622363", + "p2_singleton": "40f828d8dd55603f4ff9fbf6b73271e904e69406982f4fbefae2c8dcceaf9834", + "p2_singleton_aggregator": "f79a31fcfe3736cc75720617b4cdcb4376b4b8f8f71108617710612b909a4924", + "p2_singleton_or_delayed_puzhash": "adb656e0211e2ab4f42069a4c5efc80dc907e7062be08bf1628c8e5b6d94d25b", + "p2_singleton_via_delegated_puzzle": "9590eaa169e45b655a31d3c06bbd355a3e2b2e3e410d3829748ce08ab249c39e", + "pool_member_innerpuz": "a8490702e333ddd831a3ac9c22d0fa26d2bfeaf2d33608deb22f0e0123eb0494", + "pool_waitingroom_innerpuz": "a317541a765bf8375e1c6e7c13503d0d2cbf56cacad5182befe947e78e2c0307", + "rom_bootstrap_generator": "161bade1f822dcd62ab712ebaf30f3922a301e48a639e4295c5685f8bece7bd9", + "settlement_payments": "cfbfdeed5c4ca2de3d0bf520b9cb4bb7743a359bd2e6a188d19ce7dffc21d3e7", + "singleton_launcher": "eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9", + "singleton_top_layer": "24e044101e57b3d8c908b8a38ad57848afd29d3eecc439dba45f4412df4954fd", + "singleton_top_layer_v1_1": "7faa3253bfddd1e0decb0906b2dc6247bbc4cf608f58345d173adb63e8b47c9f", + "standard_vc_backdoor_puzzle": "fbce76408ebaf9b3d0b8cd90cc68607755eeca67cd7432d5eea85f3f498cc002", + "std_parent_morpher": "8c3f1dc2e46c0d7ec4c2cbd007e23c0368ff8f80c5bc0101647a5c27626ebce6", + "viral_backdoor": "00848115554ea674131f89f311707a959ad3f4647482648f3fe91ba289131f51" } diff --git a/tests/farmer_harvester/test_third_party_harvesters_data.json b/tests/farmer_harvester/test_third_party_harvesters_data.json index 956f054ab72a..924fee0cc82d 100644 --- a/tests/farmer_harvester/test_third_party_harvesters_data.json +++ b/tests/farmer_harvester/test_third_party_harvesters_data.json @@ -1,11 +1,29 @@ { - "block": "AAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAwA4wPjsMRCmPwcFJr79MiZb7kkJ65B5GSbk0yklZkbeFK4VedPOsqTV1XJNfN9RKjLb4ZADQH5gJrJl9o/4kL8WZL5AAEbnR6qPGqbJ82QrZBw6wEnlKdLJ3RGQXvHuQQUUBDAh5CJJqU8tUHbRcmll7PCdUTpYP0W7mWzymM8DawgzUlmIAtTvQOMRGJCDR4/Zyn97RQAAACgE6MrFV7l0Ni5T1cXRfJQ5ofL8dVGPYsFSGzmWO4xV4gmKjC7QdCeRYzSa7wnxu6VXVjNco2KYCr5MzyXcqgUKZtquBbEBjrTjX6UQGEy2TJFqri3xvYChRlYeJhL8PZqsONBwPRVQZGEff5hYyI392yuvZsrIgMzfyf6hUigTiNm4eOnUq+uzB2Neh1UIawRkc+pGm54bvqEDAkgr5d+pQHjsMRCmPwcFJr79MiZb7kkJ65B5GSbk0yklZkbeFK4VQAAAAAABgAAAQCy3hvnylmQO/6Wd4clKKQfpVl9rDXkdxvVC8RQhtibCqrjJavDfQS+f/gHUsiayWPjTdaAiY1/h2qjX6nE0/Fe4Q0PRs75i/v4YELaHH7qi9kiie7VjSoKePN0bF6/UyoBALBgKzJFi6KmVd4fYkbJVptu58jPHZTqmDwmkJy/ufCqSR++yOfd9A3l5IrCoBfxCAUhUTN9pWcKBW/3WTbvX3fm7xiDzHxBCeRq6PSTWbBsUnJX46yErdTJtZ3fGv9AA+OwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhVAAAAAAAMAOMAALEgp63gxy4oKtjfa4Yaf7ztEdH2ItneiGCa0Nteul3XTuMGmK46OT1eFBMmxfHMIdalKFcdS/lAtX+UPcnq0CPTkHzT8LRKoVbugqFSG5v0R7Ivvtv+SQXCsGv3ZluwCAIBAeOwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhVAAAAAAAGAAABALLeG+fKWZA7/pZ3hyUopB+lWX2sNeR3G9ULxFCG2JsKquMlq8N9BL5/+AdSyJrJY+NN1oCJjX+HaqNfqcTT8V7hDQ9GzvmL+/hgQtocfuqL2SKJ7tWNKgp483RsXr9TKgEAsGArMkWLoqZV3h9iRslWm27nyM8dlOqYPCaQnL+58KpJH77I5930DeXkisKgF/EIBSFRM32lZwoFb/dZNu9fd+bvGIPMfEEJ5Gro9JNZsGxSclfjrISt1Mm1nd8a/0AD47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFUAAAAAAAwA4wAAsSCnreDHLigq2N9rhhp/vO0R0fYi2d6IYJrQ2166XddO4waYrjo5PV4UEybF8cwh1qUoVx1L+UC1f5Q9yerQI9OQfNPwtEqhVu6CoVIbm/RHsi++2/5JBcKwa/dmW7AIAgEAAQECAAABfgIAXPxQpqNtotf9cr0KveN3ESb4jD4EXWkjyfJ4NjHwtSgBd985j6DMAqrGbbDelT4I6qnKhaO3+fet+GZ7u1kGYAv2M5p2IIk0H0iKkfJkZ5Ab0vSJmz7X5S9jpG+EX00pAQAAAAAAAAFVaML03NwaaCRYMCn6gB4C2BiX2ewMx9kPFU7deZk45fjJAwAA74PqanCu0wfZC3+MhZRgeH2Z1I5lYxp8tNlLDvLdoOXvJgXaktxYli7q05oET6YQg5oAKTjJI7cW+7xpsDqBLu5NF+YPw13UeCN+SbkpW1iieoS4X4ieSozK093M26EcAgAAAAAAAAP/1Kx2ovk/rX/KhmxxrkwVCpHd+goMOOpsXvoH21sgJilgvwEAeHsW/sufLYvXzss1sZb22dkmYQE0XzvfsoBqa76U/fPRU6nkiz5RvrObOVHwd6uP5BgNOiPcDtNiWKNi2qAYZYkCA+nCGcNPnw6XQUfBdtWSPWAD2It27LzHRHAfy4FmAQAAAgAAAX4AAOpEdRcCenrFJPQHGZU/n8QtNivaZpYUVtLaykU2/GP/vQ8+ltNd2udBEARP5SWFb/TV4uvlvbj5y1e31yYJFA5Bht+Lm3IE41xHBQMGzwHvAOoqH/vNbKfbRkwO61R9FAIBAAAAAAACqtCGDGqk+Og5sOxVlWz7NFUo4wIJU/sjoteKLMbIf7FqYp8BAAE7d6zZsZSC+fYn+1pJqOhq6p6AfRjD4rY7Woqsl02RPwpzk5OhXk+Iuiz7k1rEVQmYBZU5jQt4cwt3hmU5mgF9QY0S5JNkr/6+oTFUcCpoBYngYOXQPwmgYi77Gk1QADkEAAAAAAAIAHDm8NUDjwVrfv2qVqjVk1PcGtSigZH6pNQEBpPN0iCe6u8BABz3JneJI/sMZvcaR6UciWQojLar7MX1Hjl54CUqneDlP5nRMEZs8VqzBvlYE9aku2H5aLRSwSbXo8Npd1ApbgUxT/qpBQsOLG5vJB1oKE6ROzAmYGw2115gtLGBLAoIEgIBAAECAAABfgIAXPxQpqNtotf9cr0KveN3ESb4jD4EXWkjyfJ4NjHwtSgBd985j6DMAqrGbbDelT4I6qnKhaO3+fet+GZ7u1kGYAv2M5p2IIk0H0iKkfJkZ5Ab0vSJmz7X5S9jpG+EX00pAQAAAAAAAAFVaML03NwaaCRYMCn6gB4C2BiX2ewMx9kPFU7deZk45fjJAwAA74PqanCu0wfZC3+MhZRgeH2Z1I5lYxp8tNlLDvLdoOXvJgXaktxYli7q05oET6YQg5oAKTjJI7cW+7xpsDqBLu5NF+YPw13UeCN+SbkpW1iieoS4X4ieSozK093M26EcAgAAAAAAAAP/1Kx2ovk/rX/KhmxxrkwVCpHd+goMOOpsXvoH21sgJilgvwEAeHsW/sufLYvXzss1sZb22dkmYQE0XzvfsoBqa76U/fPRU6nkiz5RvrObOVHwd6uP5BgNOiPcDtNiWKNi2qAYZYkCA+nCGcNPnw6XQUfBdtWSPWAD2It27LzHRHAfy4FmAQAAAgAAAX4AAOpEdRcCenrFJPQHGZU/n8QtNivaZpYUVtLaykU2/GP/vQ8+ltNd2udBEARP5SWFb/TV4uvlvbj5y1e31yYJFA5Bht+Lm3IE41xHBQMGzwHvAOoqH/vNbKfbRkwO61R9FAIBAAAAAAACqtCGDGqk+Og5sOxVlWz7NFUo4wIJU/sjoteKLMbIf7FqYp8BAAE7d6zZsZSC+fYn+1pJqOhq6p6AfRjD4rY7Woqsl02RPwpzk5OhXk+Iuiz7k1rEVQmYBZU5jQt4cwt3hmU5mgF9QY0S5JNkr/6+oTFUcCpoBYngYOXQPwmgYi77Gk1QADkEAAAAAAAIAHDm8NUDjwVrfv2qVqjVk1PcGtSigZH6pNQEBpPN0iCe6u8BABz3JneJI/sMZvcaR6UciWQojLar7MX1Hjl54CUqneDlP5nRMEZs8VqzBvlYE9aku2H5aLRSwSbXo8Npd1ApbgUxT/qpBQsOLG5vJB1oKE6ROzAmYGw2115gtLGBLAoIEgIBAADjsMRCmPwcFJr79MiZb7kkJ65B5GSbk0yklZkbeFK4Vap9N4Z1TvuirQv+Fatxz++ejWT9Er1aixkzXHaAE4j6bCK9Pd13LhTHAZHxhffI1c5Y19IwYe+/wgWqzFiauFHSPaFGlaGIrlcI3RUiY8TbiD6yft65NheNTZiLjzzl/AAAAAAAPYdl06WX7B2ZZj9smBbZFbn2hhOslACYhMSt2u/M5q8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6LHybdz6ER+qeZnIoWaB54JJtLvgUb7t7SlUAhbMqWmi5DE5Jx7QMFhAdLe2k5J/QDGoQk7nSlgkRJnpdEoKr8CAnpCNuUjK7N7XbsIUDL1bmBoVw/yLOYXtpy2cIhlTyC3sAFzitM5EEInBsSCFU99EGyIjKPd4fbrX4/rxM0Qs0R1hQGjvMbzNlGEGksFRW855dqRomxoY9K7B2Z0tSh2j4+ume1yuoXLKvgZQ14DBFzJ/uMZ1dia07q/1jrVYiO6mC2WapZfbJIg74Vy3+8d9kaPPjrVYhcINQro4lVaeTy9O9YB47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFUAAAAAZXn6Am40C5z/s3qYnKVE5rt4Cix4kB0/szc4doURowYXr6AdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1lvw2ShkUWR7i/+Uiw6M961XEllY64TU0yp8/eRB4DAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", - "signage_points": [ - [false, "BOOwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhVAAAAAAAIAAADAF9Pqr5864eW4tjbPbZmISJzli4r8elRcXNS4NKE7HsY9Fldr9t+3U4OKueyMbznynX1Ua/OpRsyZ5cTqgH69i83X4Ieg1wzPMLSpNjJ5e2q4XAt2C8fndY4QeVy31h9EQEAAgAAAX4DAIXnQ0/vPG4mP9tgWhSOSDCKf799bXJX1FBuxFL3M5g6b8TwkdwcV8wz3fmucNMr1oXnQe357uwZdMssA/Fl/hpbg9tsKUWU4AeL6fww5f8NJgxIyAYbm/9nyV9nWnsiLgEAAAAAAAABxxTvgblTRaKn7eRrc/nXRi3rsWXdZ5x3J3d1zNjv1QRtZX0CALaQBm6XXWjYlWslsE4G7b6x3b43uXOcoQP1u3zixxvfHUn6hR4X2tRX8qdwyx9YFJVyyNkjt1b0qKKMU8Wb3Chh6ov/RmE6SdcgY9YLb8exhBM69Npu2g1z9j/oCPYUMQEAAAAAAAAFVTy2Yks9w7adJGpHszOrhvfAvVs0iWoGIit6ilvXqgu/jZ0DAFTvXpvA2d71INC453oGN5dpX8xkMbgNI6spqZUPAB3woR6Gg4PCR7CX8RxR+WPrTKHOyDla1QJK4PYM1qfh3SHfl66GmccZYwwD3uRw8TgUZcxe+hud9OohZ5032VaXPgEAAOOwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhVAAAAAAAIAAADAF9Pqr5864eW4tjbPbZmISJzli4r8elRcXNS4NKE7HsY9Fldr9t+3U4OKueyMbznynX1Ua/OpRsyZ5cTqgH69i83X4Ieg1wzPMLSpNjJ5e2q4XAt2C8fndY4QeVy31h9EQEAAgAAAX4DAIXnQ0/vPG4mP9tgWhSOSDCKf799bXJX1FBuxFL3M5g6b8TwkdwcV8wz3fmucNMr1oXnQe357uwZdMssA/Fl/hpbg9tsKUWU4AeL6fww5f8NJgxIyAYbm/9nyV9nWnsiLgEAAAAAAAABxxTvgblTRaKn7eRrc/nXRi3rsWXdZ5x3J3d1zNjv1QRtZX0CALaQBm6XXWjYlWslsE4G7b6x3b43uXOcoQP1u3zixxvfHUn6hR4X2tRX8qdwyx9YFJVyyNkjt1b0qKKMU8Wb3Chh6ov/RmE6SdcgY9YLb8exhBM69Npu2g1z9j/oCPYUMQEAAAAAAAAFVTy2Yks9w7adJGpHszOrhvfAvVs0iWoGIit6ilvXqgu/jZ0DAFTvXpvA2d71INC453oGN5dpX8xkMbgNI6spqZUPAB3woR6Gg4PCR7CX8RxR+WPrTKHOyDla1QJK4PYM1qfh3SHfl66GmccZYwwD3uRw8TgUZcxe+hud9OohZ5032VaXPgEAAA=="], - [false, "BeOwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhVAAAAAAAKAAAAABXjy8RsXbUvVrSzmVDG9YSk68uCAWJL1uoO3E2jgWzbCn8ggiPoxOm9XMw0ZSekpfzULKUqMxGCcl5SxKRLfl2/xNSI6S4gcGsNRKOEIk52cN2UMGi0SaZ2gowZZOj7JwEAAgAAAX4CAJWBp2UDnYvlQJzlzeP1OuLr4aYHmcD0XyuF0rCPA/laed3duSi2u/fGqJMQlmbcZZhRJhutABSDXgGNQjzR7wEFJgBAKxgKGSvdNyNc5eMhOEngmK9hUfMD/JQkhWMnBQYAAAAAAAACOMDtuyBUHMoe8UQql+cSPLeX+e2imJoduK2MMrZoPVsvMakDABri6L5LI+MHJ5w2RnokG61SWqxNuYXSWU2zbHb2oEXXcl1yU+Y+KZSckPywfQ4azFXb7UXWjy6k25pJdJ1F2w0/C879hlCjRKfUcdqhrHA7fn4larAy+ezGlDVYf7tLAwEAAAAAAAAGqqTB+JyozfECvPY9ZZJCiYWP7AkoBgvKLzt4xF2AeRHMEqEBAH4VLZ25E9yTjT8VWAg04TGrPLV/wWTkHA8hlHUkOLe9jGBwTnmz2RM0R8qzrC2EzHeon7+aXT5t/NQV8hbynSbbFUIMdyffE/LJG7jtZQVzjZtFdRCLpqopgQLlj69mKwIBAOOwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhVAAAAAAAKAAAAABXjy8RsXbUvVrSzmVDG9YSk68uCAWJL1uoO3E2jgWzbCn8ggiPoxOm9XMw0ZSekpfzULKUqMxGCcl5SxKRLfl2/xNSI6S4gcGsNRKOEIk52cN2UMGi0SaZ2gowZZOj7JwEAAgAAAX4CAJWBp2UDnYvlQJzlzeP1OuLr4aYHmcD0XyuF0rCPA/laed3duSi2u/fGqJMQlmbcZZhRJhutABSDXgGNQjzR7wEFJgBAKxgKGSvdNyNc5eMhOEngmK9hUfMD/JQkhWMnBQYAAAAAAAACOMDtuyBUHMoe8UQql+cSPLeX+e2imJoduK2MMrZoPVsvMakDABri6L5LI+MHJ5w2RnokG61SWqxNuYXSWU2zbHb2oEXXcl1yU+Y+KZSckPywfQ4azFXb7UXWjy6k25pJdJ1F2w0/C879hlCjRKfUcdqhrHA7fn4larAy+ezGlDVYf7tLAwEAAAAAAAAGqqTB+JyozfECvPY9ZZJCiYWP7AkoBgvKLzt4xF2AeRHMEqEBAH4VLZ25E9yTjT8VWAg04TGrPLV/wWTkHA8hlHUkOLe9jGBwTnmz2RM0R8qzrC2EzHeon7+aXT5t/NQV8hbynSbbFUIMdyffE/LJG7jtZQVzjZtFdRCLpqopgQLlj69mKwIBAA=="], - [false, "BuOwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhVAAAAAAAMAAABAAfCTnH4z/tATKEUM3sLqYL8ZhDIZsTwzJJBuL3B1wPvTpsKXibzwp2L3QpjL8pace8XHnXKFQLM5qW1gHZnZ0mPZ2M5nZ3tbrFvwW6Ri0jigWLo5b0GRlcek5qsoAX2NAEAAgAAAX4CAAMIPyF8RLPT+pJysZsSQZ3umM3ngelBF+69CsEynDE0haMgM4i4RztuGonuO487Djp7Ux0Is8nYGNL4iq4yUS1YmjKAsyQDgJU+Lwf5ZNFI89/7/tYmuDNH1TM86ctkDwEAAAAAAAACqtDBTKdKMp9LUHyuLQypw/lw2e/5NcxpbGjnYJoSyWOwp38BALmXOMvsg2Y7AzY5A51xgpHFmEQXsdE4hUzulncl0JCKS/bzX+BypUff33szDSsYA+MQgYgqdIfqyXmaKW8Emw5YhE5TKLmrbrhDx8vzNJl8Ory9EBcGGpesM2SS6z+oAgYFAAAAAAAH/6idNPcaECeISGXZFdp99YZuSj/J9S2bAbOGuysDr4SU4V0BAOvQCHEbCAm0FeV5VkvvfGvFxAmdFTQrW2KUvJUpLWHO5OpNQuLbSuHr573B40IFXS7cRybMJLHRITUgQfv9gzNQUqZpKkW7BB0vGSxbBtFMfiMyCRK1gBPFI5/zWC8hOwEAAOOwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhVAAAAAAAMAAABAAfCTnH4z/tATKEUM3sLqYL8ZhDIZsTwzJJBuL3B1wPvTpsKXibzwp2L3QpjL8pace8XHnXKFQLM5qW1gHZnZ0mPZ2M5nZ3tbrFvwW6Ri0jigWLo5b0GRlcek5qsoAX2NAEAAgAAAX4CAAMIPyF8RLPT+pJysZsSQZ3umM3ngelBF+69CsEynDE0haMgM4i4RztuGonuO487Djp7Ux0Is8nYGNL4iq4yUS1YmjKAsyQDgJU+Lwf5ZNFI89/7/tYmuDNH1TM86ctkDwEAAAAAAAACqtDBTKdKMp9LUHyuLQypw/lw2e/5NcxpbGjnYJoSyWOwp38BALmXOMvsg2Y7AzY5A51xgpHFmEQXsdE4hUzulncl0JCKS/bzX+BypUff33szDSsYA+MQgYgqdIfqyXmaKW8Emw5YhE5TKLmrbrhDx8vzNJl8Ory9EBcGGpesM2SS6z+oAgYFAAAAAAAH/6idNPcaECeISGXZFdp99YZuSj/J9S2bAbOGuysDr4SU4V0BAOvQCHEbCAm0FeV5VkvvfGvFxAmdFTQrW2KUvJUpLWHO5OpNQuLbSuHr573B40IFXS7cRybMJLHRITUgQfv9gzNQUqZpKkW7BB0vGSxbBtFMfiMyCRK1gBPFI5/zWC8hOwEAAA=="], - [false, "B+OwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhVAAAAAAAOAAADADve9/PwoEXv54o6mwTagkH4wvLHOtp1K8RWP43GdNyrXOUFRix8kqhVwdFUBnB7hB6MSxSYnWTGyMMoGjdjcy/vJ9IQFb9SaoRwVqMu+Le+6RbdErYOqQ7OEpD7VJdHDQIBAgAAAX4CAEey9G7F33NNDJUN80MgIe00mRZTYFAk3OYhXPCt+eOXgq166apGQAcgNFIVr2Nh8+BTxpxVjcJhAGc30o8+yAlj49pZKDQzQpIVnlC/I0pzcKK+9BvvSqo1ZzLw0sYVCgEAAAAAAAADHHy/reKO958YCcXvYDf4qpP4dqj/YNzYQVFo6SIoBf08sHEDADGNTq9S8OlxPUS6gV5GGThItn4ouJMWGFLmu+514+qMoszYkhZAaRmqDPhTYas8QbG1A8JO8bjkH/Hh8wvqWg7l/4QFYeRUktlsYFDReFhhRETliw42NXw3pNK/E178GQIBAAAAAAAJVRDOFOGylOWfk7clcgLbKw7OCXeR33Gz4CMcXkqKS1XZrEkDAKXBlcajDHPWVrmJeZLdFLZZ67ck6/v7nz4o5w4AIHFGUYmEifx89gAKNagsk4dmG7zMCvKiepV45haXB5MKABCrG1SaogF+t1vbO/181W8iI+SFLyV9W1exSYKdVRx6GAEAAOOwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhVAAAAAAAOAAADADve9/PwoEXv54o6mwTagkH4wvLHOtp1K8RWP43GdNyrXOUFRix8kqhVwdFUBnB7hB6MSxSYnWTGyMMoGjdjcy/vJ9IQFb9SaoRwVqMu+Le+6RbdErYOqQ7OEpD7VJdHDQIBAgAAAX4CAEey9G7F33NNDJUN80MgIe00mRZTYFAk3OYhXPCt+eOXgq166apGQAcgNFIVr2Nh8+BTxpxVjcJhAGc30o8+yAlj49pZKDQzQpIVnlC/I0pzcKK+9BvvSqo1ZzLw0sYVCgEAAAAAAAADHHy/reKO958YCcXvYDf4qpP4dqj/YNzYQVFo6SIoBf08sHEDADGNTq9S8OlxPUS6gV5GGThItn4ouJMWGFLmu+514+qMoszYkhZAaRmqDPhTYas8QbG1A8JO8bjkH/Hh8wvqWg7l/4QFYeRUktlsYFDReFhhRETliw42NXw3pNK/E178GQIBAAAAAAAJVRDOFOGylOWfk7clcgLbKw7OCXeR33Gz4CMcXkqKS1XZrEkDAKXBlcajDHPWVrmJeZLdFLZZ67ck6/v7nz4o5w4AIHFGUYmEifx89gAKNagsk4dmG7zMCvKiepV45haXB5MKABCrG1SaogF+t1vbO/181W8iI+SFLyV9W1exSYKdVRx6GAEAAA=="], - [false, "B+OwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhVAAAAAAAOAAADADve9/PwoEXv54o6mwTagkH4wvLHOtp1K8RWP43GdNyrXOUFRix8kqhVwdFUBnB7hB6MSxSYnWTGyMMoGjdjcy/vJ9IQFb9SaoRwVqMu+Le+6RbdErYOqQ7OEpD7VJdHDQIBAgAAAX4AALKiYlqIVbCGJIG62TNvxZohoDWu4jjX6gnSr0g2XiC+tKsOqct5+uFU5u7wZpCiTEmwh9vWkAzTfaT8oojmXhiT+rHj6/HXgMWzMFJSfVegDytqGKk0dwgsEBgS/rdeAgEAAAAAAAAAcUiW24/5D+N9hl7EwkGsJQPqDjP1PggPknzW6gdQzON5XOMDAIfntgTuAecOYuCpjhT8J8q034eNdvyXxyU7BKV/f8rINhnfd+TmwOIs4hy1KUmaSJlNb14yWEwVTgC0TmSr5UPGE3PtfOpNBWJ18JqttDbtFOmIEnBa1JGBlcjYn1NPQwEAAAAAAAABVKD+rwh3VNv591aLstY+RWFC2Afof7oOpnBWgD5BLiv7prkDANNsqOaZJysO27Vkb0Gvqg3SAqSBpBuHACrqbdltvRzkschgkG72L2cJBdwYPzDAP+7wwQUi7WAD074JEM7gaQh5ZpRkr9o55hdytVYJllez/xQuuBsk/GpZc7pTWKPiHAIBAKp9N4Z1TvuirQv+Fatxz++ejWT9Er1aixkzXHaAE4j6AAAAAAAB/x0BANvkpbnjnFI4CtQ9rh6TDbpyT5mM9rN/LsZN9p0EAyFfXvUvfH8M4Nd2vGx5lpbYlwi9yMB7Ukd1GPTxRjI21husIYeNZPq6rwkU97qKZ1yjTk7S+nqhxP+Qc/LXIEIVDQEAAgAAAX4DAFHSrIIB4v/1YrMPNo1007HW0rhmz72JWgOdtXN+AvLFB9GaIk2c18URo6N4w2N9zMnddicEe9jLxGH0sP87SAzooZivp8fj2xZAd7oD+rPLfzc+C+qIFRAUMH0XMySICAIBAAAAAAAAcUjHHN/i/BrmF5iO3yN3G7JxUnonOynW4svL7PmUmmPZmlsDACqmxC2lb6NT+uIfF5GVDWWiiHD5cVRuKDZtxnG0ohuhAZpwJn0tgQVMb4KOyYYig01Tzq8uc+n0dQJaMwoZxWU/qt0TXGnZxdT57vqZ2uG3WtJqceFr4bAtbnOOIEQUfwEAAAAAAAABVKCLfkdNmP0DSAkT4DTFKWMvQHaKLacsYiwuvwBNk0INlIMCAHHHqeLZigtLhZ4eiW8iqIlLxD5MiZpTyEo4dR+pLpc/YZkEFvzooIh1Nwqq9NCLNhCtlpzIsXkcggBSai8lrApogRgRdCicLfREkK5shfjBoA+IKNux1EiB7fZnU8ahEwYAAA=="], - [true, "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFUAAAAAABAAAAMAg+muXpq+yX1QK2TyDk8DVuq+m27j/Yt8pzUA+xrJSujYIP5YAnnBBVhlMhY601oB1Z8fDKgqRTnHYcT0x6m8AdDvFSsvOlMvaZpB6LWqZPPAdcUMUZY1m331r14NojoMAgAAAAAAAZM5JTlqIOgTlGeMcG8YQyY4lQhrw4hViMP/ptipHfOzAAAAAAAD/x0BAEpX7M741mg/QVrl0GPrheEb/hIBkjLnSZWVSg1TUNgwY+idk5qW8RcWGcHXSYv2SThU3aoMccQELp0ilGaS/E/P++slaL/9fRCDNzwa7FEz9rznbfb8LPgSxpFGIIouTwEAqn03hnVO+6KtC/4Vq3HP756NZP0SvVqLGTNcdoATiPoAAAAAAAP/HQAA+OTBgtPCJ55SFosol8sQ7zJXbR4e7PpL2mh6MfEXAgyxE6Nfrwsk5NrJgon0dlqilR4f8kuGRKSPrabGyuApDg/ltBwc0npC1coJnHNfZ+M/5KT3oLm65GfDAxA8FAgGAQCPpt0tP4aBOemWPc8vD314E0iVETAMcZcAzQgVst8bpgFCHYRP2oqnKyU2Vo0py+RJ52Jl9bzWhQSi58urFcHMjQsCAAABfgAAAGJxQuVtKiEG5+arLUwI+n5xPdpr3IkBfGQTDnBINC3sGvl0Dt2HIYa7wtFPAPvC9XxH4lWBpcZBr0eurvO9BGtv0q4Ax7aBxTanEo7mD2BmTyqEcMJPDEal66dwnGgFDAoAAAAAAADjWNHnRbEeFXEjMyiGjoVUcnGN7yilXBaiKscqfeRwk3EE+QAA7DstMVwzkyMgxoAjAKwu2eprfrTfsk+ZN9Hm8Hu7gN047hYdZO7VbhqLVGyLtB/2iM8xEpwQg1jqZ0/Grx79XK8cKhUNB5lgBHAZuEUzwn2+NnsTtQt30XvXkOCILBg8AQAAAAAAAAKqCPP2c0zxEJas7XhQ/4V4YTF9DS6qpht/xI2eYbMRDN075QMAAMh4MBwQEH8SbyZIgKVXl0/ONNFS0Wt6RNq+ZNlWzax1viT8qQ5f980/U+mgtcNjPi5uU4BSPyXyez+o1iVGLVMVfZkRvcr6CCAeserVZH9xvJ8Y591u39TqWzEJ+BcuAgEAAQIAAAF+AQDY5jIWu27SdbOlqV91ZSQe88zc914quzlxlV0YVd2d9G143UY00FA2gOrTdEm3Nxun2lok10KvkJ7nKrZkB641NcQR6Fe2/VD4cZfEM/49AIcCu2+2VFni5cE5+VuicFIBAAAAAAAAAONYuS+1LqTiBHIzsVlWPgeo7oD3jWjrEzskaWdgKTLSexlZAAC91VydC2tNiypXrmXbXaKN+91dn3vE3jKDxi2JqHM/a3CuHa8S2fTdKGOzykijeUgtUXMysvaxH1wLnNvfWKIO0rwiG+OPBBSvcKVU67Lq+blmeEozwUDHlDztnBKDXhYCAAAAAAAAAqoI3btnF0UrBJNqAmeksSYfXcq0zgQj4D6iOqnZLArB1vCHAwAhfPU2Vk7+/Ub0bqCjC4DtUTJ1NH6iDvIJGUu9FQusY+ic9okCTF1iaeaZNamXe7EjjIe8hs1pJiIc1MO91zEKSue0pjyivf/63UXB1V2AeJeI8pd9Q6SzDJ4Mvw6s4BQEAQACAAABfgMAWSuq1RUP8zCnVUPgeemCUmQcqIRuZEGD5MZh/6b6/G8kuU8+liICs09Imqgxb0tq3xhJNoUJ9Hf95fxLpd93HBvlTHqw15S+CigZ4ghgfdvg04wcRx+fWoCaeTZXImoKAwIAAAAAAADjWK0CyA1MW3NWYusMsW/nPJlyVmc9V/Hhvjb7ts4iOEozIwMAY8fPHr7logHFRTArCukLT7Zu3+zKzVOIOH7CMNhlhimWAOpaCNRsgzd89VZFGeyFyjk1iDPtUgcaafYdRSlRBKEr42jALYPzLDvh577N0DBlQMQtlKEvGfe7ENI06OAUAQAAAAAAAAKqCJDirA/mIuk98oGmDg5wTEQrxsd7BO7APlZ7lEYxCnKXiQAASBNj/VDZW2e9oBmARk38OPi9FZK6ldAxVqVnDa3hDPy0tVKFzmIRlSKOHW38kI/VzTdeSsWh+JWD6SM1swfvQGsoe+5mPxDUNhU7bzkbOAFS7+J2HnTeuJyBjwGAEhwvAQAA"] + "block": "AAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAwA4wPjsMRCmPwcFJr79MiZb7kkJ65B5GSbk0yklZkbeFK4VedPOsqTV1XJNfN9RKjLb4ZADQH5gJrJl9o/4kL8WZL5AAEbnR6qPGqbJ82QrZBw6wEnlKdLJ3RGQXvHuQQUUBDAh5CJJqU8tUHbRcmll7PCdUTpYP0W7mWzymM8DawgzUlmIAtTvQOMRGJCDR4/Zyn97RQAAACgE6MrFV7l0Ni5T1cXRfJQ5ofL8dVGPYsFSGzmWO4xV4gmKjC7QdCeRYzSa7wnxu6VXVjNco2KYCr5MzyXcqgUKZtquBbEBjrTjX6UQGEy2TJFqri3xvYChRlYeJhL8PZqsONBwPRVQZGEff5hYyI392yuvZsrIgMzfyf6hUigTiNm4eOnUq+uzB2Neh1UIawRkc+pGm54bvqEDAkgr5d+pQHjsMRCmPwcFJr79MiZb7kkJ65B5GSbk0yklZkbeFK4VQAAAAAABgAAAQCy3hvnylmQO/6Wd4clKKQfpVl9rDXkdxvVC8RQhtibCqrjJavDfQS+f/gHUsiayWPjTdaAiY1/h2qjX6nE0/Fe4Q0PRs75i/v4YELaHH7qi9kiie7VjSoKePN0bF6/UyoBALBgKzJFi6KmVd4fYkbJVptu58jPHZTqmDwmkJy/ufCqSR++yOfd9A3l5IrCoBfxCAUhUTN9pWcKBW/3WTbvX3fm7xiDzHxBCeRq6PSTWbBsUnJX46yErdTJtZ3fGv9AA+OwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhVAAAAAAAMAOMAALEgp63gxy4oKtjfa4Yaf7ztEdH2ItneiGCa0Nteul3XTuMGmK46OT1eFBMmxfHMIdalKFcdS/lAtX+UPcnq0CPTkHzT8LRKoVbugqFSG5v0R7Ivvtv+SQXCsGv3ZluwCAIBAeOwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhVAAAAAAAGAAABALLeG+fKWZA7/pZ3hyUopB+lWX2sNeR3G9ULxFCG2JsKquMlq8N9BL5/+AdSyJrJY+NN1oCJjX+HaqNfqcTT8V7hDQ9GzvmL+/hgQtocfuqL2SKJ7tWNKgp483RsXr9TKgEAsGArMkWLoqZV3h9iRslWm27nyM8dlOqYPCaQnL+58KpJH77I5930DeXkisKgF/EIBSFRM32lZwoFb/dZNu9fd+bvGIPMfEEJ5Gro9JNZsGxSclfjrISt1Mm1nd8a/0AD47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFUAAAAAAAwA4wAAsSCnreDHLigq2N9rhhp/vO0R0fYi2d6IYJrQ2166XddO4waYrjo5PV4UEybF8cwh1qUoVx1L+UC1f5Q9yerQI9OQfNPwtEqhVu6CoVIbm/RHsi++2/5JBcKwa/dmW7AIAgEAAQECAAABfgIAXPxQpqNtotf9cr0KveN3ESb4jD4EXWkjyfJ4NjHwtSgBd985j6DMAqrGbbDelT4I6qnKhaO3+fet+GZ7u1kGYAv2M5p2IIk0H0iKkfJkZ5Ab0vSJmz7X5S9jpG+EX00pAQAAAAAAAAFVaML03NwaaCRYMCn6gB4C2BiX2ewMx9kPFU7deZk45fjJAwAA74PqanCu0wfZC3+MhZRgeH2Z1I5lYxp8tNlLDvLdoOXvJgXaktxYli7q05oET6YQg5oAKTjJI7cW+7xpsDqBLu5NF+YPw13UeCN+SbkpW1iieoS4X4ieSozK093M26EcAgAAAAAAAAP/1Kx2ovk/rX/KhmxxrkwVCpHd+goMOOpsXvoH21sgJilgvwEAeHsW/sufLYvXzss1sZb22dkmYQE0XzvfsoBqa76U/fPRU6nkiz5RvrObOVHwd6uP5BgNOiPcDtNiWKNi2qAYZYkCA+nCGcNPnw6XQUfBdtWSPWAD2It27LzHRHAfy4FmAQAAAgAAAX4AAOpEdRcCenrFJPQHGZU/n8QtNivaZpYUVtLaykU2/GP/vQ8+ltNd2udBEARP5SWFb/TV4uvlvbj5y1e31yYJFA5Bht+Lm3IE41xHBQMGzwHvAOoqH/vNbKfbRkwO61R9FAIBAAAAAAACqtCGDGqk+Og5sOxVlWz7NFUo4wIJU/sjoteKLMbIf7FqYp8BAAE7d6zZsZSC+fYn+1pJqOhq6p6AfRjD4rY7Woqsl02RPwpzk5OhXk+Iuiz7k1rEVQmYBZU5jQt4cwt3hmU5mgF9QY0S5JNkr/6+oTFUcCpoBYngYOXQPwmgYi77Gk1QADkEAAAAAAAIAHDm8NUDjwVrfv2qVqjVk1PcGtSigZH6pNQEBpPN0iCe6u8BABz3JneJI/sMZvcaR6UciWQojLar7MX1Hjl54CUqneDlP5nRMEZs8VqzBvlYE9aku2H5aLRSwSbXo8Npd1ApbgUxT/qpBQsOLG5vJB1oKE6ROzAmYGw2115gtLGBLAoIEgIBAAECAAABfgIAXPxQpqNtotf9cr0KveN3ESb4jD4EXWkjyfJ4NjHwtSgBd985j6DMAqrGbbDelT4I6qnKhaO3+fet+GZ7u1kGYAv2M5p2IIk0H0iKkfJkZ5Ab0vSJmz7X5S9jpG+EX00pAQAAAAAAAAFVaML03NwaaCRYMCn6gB4C2BiX2ewMx9kPFU7deZk45fjJAwAA74PqanCu0wfZC3+MhZRgeH2Z1I5lYxp8tNlLDvLdoOXvJgXaktxYli7q05oET6YQg5oAKTjJI7cW+7xpsDqBLu5NF+YPw13UeCN+SbkpW1iieoS4X4ieSozK093M26EcAgAAAAAAAAP/1Kx2ovk/rX/KhmxxrkwVCpHd+goMOOpsXvoH21sgJilgvwEAeHsW/sufLYvXzss1sZb22dkmYQE0XzvfsoBqa76U/fPRU6nkiz5RvrObOVHwd6uP5BgNOiPcDtNiWKNi2qAYZYkCA+nCGcNPnw6XQUfBdtWSPWAD2It27LzHRHAfy4FmAQAAAgAAAX4AAOpEdRcCenrFJPQHGZU/n8QtNivaZpYUVtLaykU2/GP/vQ8+ltNd2udBEARP5SWFb/TV4uvlvbj5y1e31yYJFA5Bht+Lm3IE41xHBQMGzwHvAOoqH/vNbKfbRkwO61R9FAIBAAAAAAACqtCGDGqk+Og5sOxVlWz7NFUo4wIJU/sjoteKLMbIf7FqYp8BAAE7d6zZsZSC+fYn+1pJqOhq6p6AfRjD4rY7Woqsl02RPwpzk5OhXk+Iuiz7k1rEVQmYBZU5jQt4cwt3hmU5mgF9QY0S5JNkr/6+oTFUcCpoBYngYOXQPwmgYi77Gk1QADkEAAAAAAAIAHDm8NUDjwVrfv2qVqjVk1PcGtSigZH6pNQEBpPN0iCe6u8BABz3JneJI/sMZvcaR6UciWQojLar7MX1Hjl54CUqneDlP5nRMEZs8VqzBvlYE9aku2H5aLRSwSbXo8Npd1ApbgUxT/qpBQsOLG5vJB1oKE6ROzAmYGw2115gtLGBLAoIEgIBAADjsMRCmPwcFJr79MiZb7kkJ65B5GSbk0yklZkbeFK4Vap9N4Z1TvuirQv+Fatxz++ejWT9Er1aixkzXHaAE4j6bCK9Pd13LhTHAZHxhffI1c5Y19IwYe+/wgWqzFiauFHSPaFGlaGIrlcI3RUiY8TbiD6yft65NheNTZiLjzzl/AAAAAAAPYdl06WX7B2ZZj9smBbZFbn2hhOslACYhMSt2u/M5q8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6LHybdz6ER+qeZnIoWaB54JJtLvgUb7t7SlUAhbMqWmi5DE5Jx7QMFhAdLe2k5J/QDGoQk7nSlgkRJnpdEoKr8CAnpCNuUjK7N7XbsIUDL1bmBoVw/yLOYXtpy2cIhlTyC3sAFzitM5EEInBsSCFU99EGyIjKPd4fbrX4/rxM0Qs0R1hQGjvMbzNlGEGksFRW855dqRomxoY9K7B2Z0tSh2j4+ume1yuoXLKvgZQ14DBFzJ/uMZ1dia07q/1jrVYiO6mC2WapZfbJIg74Vy3+8d9kaPPjrVYhcINQro4lVaeTy9O9YB47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFUAAAAAZXn6Am40C5z/s3qYnKVE5rt4Cix4kB0/szc4doURowYXr6AdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1lvw2ShkUWR7i/+Uiw6M961XEllY64TU0yp8/eRB4DAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "signage_points": [ + [ + false, + "BOOwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhVAAAAAAAIAAADAF9Pqr5864eW4tjbPbZmISJzli4r8elRcXNS4NKE7HsY9Fldr9t+3U4OKueyMbznynX1Ua/OpRsyZ5cTqgH69i83X4Ieg1wzPMLSpNjJ5e2q4XAt2C8fndY4QeVy31h9EQEAAgAAAX4DAIXnQ0/vPG4mP9tgWhSOSDCKf799bXJX1FBuxFL3M5g6b8TwkdwcV8wz3fmucNMr1oXnQe357uwZdMssA/Fl/hpbg9tsKUWU4AeL6fww5f8NJgxIyAYbm/9nyV9nWnsiLgEAAAAAAAABxxTvgblTRaKn7eRrc/nXRi3rsWXdZ5x3J3d1zNjv1QRtZX0CALaQBm6XXWjYlWslsE4G7b6x3b43uXOcoQP1u3zixxvfHUn6hR4X2tRX8qdwyx9YFJVyyNkjt1b0qKKMU8Wb3Chh6ov/RmE6SdcgY9YLb8exhBM69Npu2g1z9j/oCPYUMQEAAAAAAAAFVTy2Yks9w7adJGpHszOrhvfAvVs0iWoGIit6ilvXqgu/jZ0DAFTvXpvA2d71INC453oGN5dpX8xkMbgNI6spqZUPAB3woR6Gg4PCR7CX8RxR+WPrTKHOyDla1QJK4PYM1qfh3SHfl66GmccZYwwD3uRw8TgUZcxe+hud9OohZ5032VaXPgEAAOOwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhVAAAAAAAIAAADAF9Pqr5864eW4tjbPbZmISJzli4r8elRcXNS4NKE7HsY9Fldr9t+3U4OKueyMbznynX1Ua/OpRsyZ5cTqgH69i83X4Ieg1wzPMLSpNjJ5e2q4XAt2C8fndY4QeVy31h9EQEAAgAAAX4DAIXnQ0/vPG4mP9tgWhSOSDCKf799bXJX1FBuxFL3M5g6b8TwkdwcV8wz3fmucNMr1oXnQe357uwZdMssA/Fl/hpbg9tsKUWU4AeL6fww5f8NJgxIyAYbm/9nyV9nWnsiLgEAAAAAAAABxxTvgblTRaKn7eRrc/nXRi3rsWXdZ5x3J3d1zNjv1QRtZX0CALaQBm6XXWjYlWslsE4G7b6x3b43uXOcoQP1u3zixxvfHUn6hR4X2tRX8qdwyx9YFJVyyNkjt1b0qKKMU8Wb3Chh6ov/RmE6SdcgY9YLb8exhBM69Npu2g1z9j/oCPYUMQEAAAAAAAAFVTy2Yks9w7adJGpHszOrhvfAvVs0iWoGIit6ilvXqgu/jZ0DAFTvXpvA2d71INC453oGN5dpX8xkMbgNI6spqZUPAB3woR6Gg4PCR7CX8RxR+WPrTKHOyDla1QJK4PYM1qfh3SHfl66GmccZYwwD3uRw8TgUZcxe+hud9OohZ5032VaXPgEAAA==" + ], + [ + false, + "BeOwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhVAAAAAAAKAAAAABXjy8RsXbUvVrSzmVDG9YSk68uCAWJL1uoO3E2jgWzbCn8ggiPoxOm9XMw0ZSekpfzULKUqMxGCcl5SxKRLfl2/xNSI6S4gcGsNRKOEIk52cN2UMGi0SaZ2gowZZOj7JwEAAgAAAX4CAJWBp2UDnYvlQJzlzeP1OuLr4aYHmcD0XyuF0rCPA/laed3duSi2u/fGqJMQlmbcZZhRJhutABSDXgGNQjzR7wEFJgBAKxgKGSvdNyNc5eMhOEngmK9hUfMD/JQkhWMnBQYAAAAAAAACOMDtuyBUHMoe8UQql+cSPLeX+e2imJoduK2MMrZoPVsvMakDABri6L5LI+MHJ5w2RnokG61SWqxNuYXSWU2zbHb2oEXXcl1yU+Y+KZSckPywfQ4azFXb7UXWjy6k25pJdJ1F2w0/C879hlCjRKfUcdqhrHA7fn4larAy+ezGlDVYf7tLAwEAAAAAAAAGqqTB+JyozfECvPY9ZZJCiYWP7AkoBgvKLzt4xF2AeRHMEqEBAH4VLZ25E9yTjT8VWAg04TGrPLV/wWTkHA8hlHUkOLe9jGBwTnmz2RM0R8qzrC2EzHeon7+aXT5t/NQV8hbynSbbFUIMdyffE/LJG7jtZQVzjZtFdRCLpqopgQLlj69mKwIBAOOwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhVAAAAAAAKAAAAABXjy8RsXbUvVrSzmVDG9YSk68uCAWJL1uoO3E2jgWzbCn8ggiPoxOm9XMw0ZSekpfzULKUqMxGCcl5SxKRLfl2/xNSI6S4gcGsNRKOEIk52cN2UMGi0SaZ2gowZZOj7JwEAAgAAAX4CAJWBp2UDnYvlQJzlzeP1OuLr4aYHmcD0XyuF0rCPA/laed3duSi2u/fGqJMQlmbcZZhRJhutABSDXgGNQjzR7wEFJgBAKxgKGSvdNyNc5eMhOEngmK9hUfMD/JQkhWMnBQYAAAAAAAACOMDtuyBUHMoe8UQql+cSPLeX+e2imJoduK2MMrZoPVsvMakDABri6L5LI+MHJ5w2RnokG61SWqxNuYXSWU2zbHb2oEXXcl1yU+Y+KZSckPywfQ4azFXb7UXWjy6k25pJdJ1F2w0/C879hlCjRKfUcdqhrHA7fn4larAy+ezGlDVYf7tLAwEAAAAAAAAGqqTB+JyozfECvPY9ZZJCiYWP7AkoBgvKLzt4xF2AeRHMEqEBAH4VLZ25E9yTjT8VWAg04TGrPLV/wWTkHA8hlHUkOLe9jGBwTnmz2RM0R8qzrC2EzHeon7+aXT5t/NQV8hbynSbbFUIMdyffE/LJG7jtZQVzjZtFdRCLpqopgQLlj69mKwIBAA==" + ], + [ + false, + "BuOwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhVAAAAAAAMAAABAAfCTnH4z/tATKEUM3sLqYL8ZhDIZsTwzJJBuL3B1wPvTpsKXibzwp2L3QpjL8pace8XHnXKFQLM5qW1gHZnZ0mPZ2M5nZ3tbrFvwW6Ri0jigWLo5b0GRlcek5qsoAX2NAEAAgAAAX4CAAMIPyF8RLPT+pJysZsSQZ3umM3ngelBF+69CsEynDE0haMgM4i4RztuGonuO487Djp7Ux0Is8nYGNL4iq4yUS1YmjKAsyQDgJU+Lwf5ZNFI89/7/tYmuDNH1TM86ctkDwEAAAAAAAACqtDBTKdKMp9LUHyuLQypw/lw2e/5NcxpbGjnYJoSyWOwp38BALmXOMvsg2Y7AzY5A51xgpHFmEQXsdE4hUzulncl0JCKS/bzX+BypUff33szDSsYA+MQgYgqdIfqyXmaKW8Emw5YhE5TKLmrbrhDx8vzNJl8Ory9EBcGGpesM2SS6z+oAgYFAAAAAAAH/6idNPcaECeISGXZFdp99YZuSj/J9S2bAbOGuysDr4SU4V0BAOvQCHEbCAm0FeV5VkvvfGvFxAmdFTQrW2KUvJUpLWHO5OpNQuLbSuHr573B40IFXS7cRybMJLHRITUgQfv9gzNQUqZpKkW7BB0vGSxbBtFMfiMyCRK1gBPFI5/zWC8hOwEAAOOwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhVAAAAAAAMAAABAAfCTnH4z/tATKEUM3sLqYL8ZhDIZsTwzJJBuL3B1wPvTpsKXibzwp2L3QpjL8pace8XHnXKFQLM5qW1gHZnZ0mPZ2M5nZ3tbrFvwW6Ri0jigWLo5b0GRlcek5qsoAX2NAEAAgAAAX4CAAMIPyF8RLPT+pJysZsSQZ3umM3ngelBF+69CsEynDE0haMgM4i4RztuGonuO487Djp7Ux0Is8nYGNL4iq4yUS1YmjKAsyQDgJU+Lwf5ZNFI89/7/tYmuDNH1TM86ctkDwEAAAAAAAACqtDBTKdKMp9LUHyuLQypw/lw2e/5NcxpbGjnYJoSyWOwp38BALmXOMvsg2Y7AzY5A51xgpHFmEQXsdE4hUzulncl0JCKS/bzX+BypUff33szDSsYA+MQgYgqdIfqyXmaKW8Emw5YhE5TKLmrbrhDx8vzNJl8Ory9EBcGGpesM2SS6z+oAgYFAAAAAAAH/6idNPcaECeISGXZFdp99YZuSj/J9S2bAbOGuysDr4SU4V0BAOvQCHEbCAm0FeV5VkvvfGvFxAmdFTQrW2KUvJUpLWHO5OpNQuLbSuHr573B40IFXS7cRybMJLHRITUgQfv9gzNQUqZpKkW7BB0vGSxbBtFMfiMyCRK1gBPFI5/zWC8hOwEAAA==" + ], + [ + false, + "B+OwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhVAAAAAAAOAAADADve9/PwoEXv54o6mwTagkH4wvLHOtp1K8RWP43GdNyrXOUFRix8kqhVwdFUBnB7hB6MSxSYnWTGyMMoGjdjcy/vJ9IQFb9SaoRwVqMu+Le+6RbdErYOqQ7OEpD7VJdHDQIBAgAAAX4CAEey9G7F33NNDJUN80MgIe00mRZTYFAk3OYhXPCt+eOXgq166apGQAcgNFIVr2Nh8+BTxpxVjcJhAGc30o8+yAlj49pZKDQzQpIVnlC/I0pzcKK+9BvvSqo1ZzLw0sYVCgEAAAAAAAADHHy/reKO958YCcXvYDf4qpP4dqj/YNzYQVFo6SIoBf08sHEDADGNTq9S8OlxPUS6gV5GGThItn4ouJMWGFLmu+514+qMoszYkhZAaRmqDPhTYas8QbG1A8JO8bjkH/Hh8wvqWg7l/4QFYeRUktlsYFDReFhhRETliw42NXw3pNK/E178GQIBAAAAAAAJVRDOFOGylOWfk7clcgLbKw7OCXeR33Gz4CMcXkqKS1XZrEkDAKXBlcajDHPWVrmJeZLdFLZZ67ck6/v7nz4o5w4AIHFGUYmEifx89gAKNagsk4dmG7zMCvKiepV45haXB5MKABCrG1SaogF+t1vbO/181W8iI+SFLyV9W1exSYKdVRx6GAEAAOOwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhVAAAAAAAOAAADADve9/PwoEXv54o6mwTagkH4wvLHOtp1K8RWP43GdNyrXOUFRix8kqhVwdFUBnB7hB6MSxSYnWTGyMMoGjdjcy/vJ9IQFb9SaoRwVqMu+Le+6RbdErYOqQ7OEpD7VJdHDQIBAgAAAX4CAEey9G7F33NNDJUN80MgIe00mRZTYFAk3OYhXPCt+eOXgq166apGQAcgNFIVr2Nh8+BTxpxVjcJhAGc30o8+yAlj49pZKDQzQpIVnlC/I0pzcKK+9BvvSqo1ZzLw0sYVCgEAAAAAAAADHHy/reKO958YCcXvYDf4qpP4dqj/YNzYQVFo6SIoBf08sHEDADGNTq9S8OlxPUS6gV5GGThItn4ouJMWGFLmu+514+qMoszYkhZAaRmqDPhTYas8QbG1A8JO8bjkH/Hh8wvqWg7l/4QFYeRUktlsYFDReFhhRETliw42NXw3pNK/E178GQIBAAAAAAAJVRDOFOGylOWfk7clcgLbKw7OCXeR33Gz4CMcXkqKS1XZrEkDAKXBlcajDHPWVrmJeZLdFLZZ67ck6/v7nz4o5w4AIHFGUYmEifx89gAKNagsk4dmG7zMCvKiepV45haXB5MKABCrG1SaogF+t1vbO/181W8iI+SFLyV9W1exSYKdVRx6GAEAAA==" + ], + [ + false, + "B+OwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhVAAAAAAAOAAADADve9/PwoEXv54o6mwTagkH4wvLHOtp1K8RWP43GdNyrXOUFRix8kqhVwdFUBnB7hB6MSxSYnWTGyMMoGjdjcy/vJ9IQFb9SaoRwVqMu+Le+6RbdErYOqQ7OEpD7VJdHDQIBAgAAAX4AALKiYlqIVbCGJIG62TNvxZohoDWu4jjX6gnSr0g2XiC+tKsOqct5+uFU5u7wZpCiTEmwh9vWkAzTfaT8oojmXhiT+rHj6/HXgMWzMFJSfVegDytqGKk0dwgsEBgS/rdeAgEAAAAAAAAAcUiW24/5D+N9hl7EwkGsJQPqDjP1PggPknzW6gdQzON5XOMDAIfntgTuAecOYuCpjhT8J8q034eNdvyXxyU7BKV/f8rINhnfd+TmwOIs4hy1KUmaSJlNb14yWEwVTgC0TmSr5UPGE3PtfOpNBWJ18JqttDbtFOmIEnBa1JGBlcjYn1NPQwEAAAAAAAABVKD+rwh3VNv591aLstY+RWFC2Afof7oOpnBWgD5BLiv7prkDANNsqOaZJysO27Vkb0Gvqg3SAqSBpBuHACrqbdltvRzkschgkG72L2cJBdwYPzDAP+7wwQUi7WAD074JEM7gaQh5ZpRkr9o55hdytVYJllez/xQuuBsk/GpZc7pTWKPiHAIBAKp9N4Z1TvuirQv+Fatxz++ejWT9Er1aixkzXHaAE4j6AAAAAAAB/x0BANvkpbnjnFI4CtQ9rh6TDbpyT5mM9rN/LsZN9p0EAyFfXvUvfH8M4Nd2vGx5lpbYlwi9yMB7Ukd1GPTxRjI21husIYeNZPq6rwkU97qKZ1yjTk7S+nqhxP+Qc/LXIEIVDQEAAgAAAX4DAFHSrIIB4v/1YrMPNo1007HW0rhmz72JWgOdtXN+AvLFB9GaIk2c18URo6N4w2N9zMnddicEe9jLxGH0sP87SAzooZivp8fj2xZAd7oD+rPLfzc+C+qIFRAUMH0XMySICAIBAAAAAAAAcUjHHN/i/BrmF5iO3yN3G7JxUnonOynW4svL7PmUmmPZmlsDACqmxC2lb6NT+uIfF5GVDWWiiHD5cVRuKDZtxnG0ohuhAZpwJn0tgQVMb4KOyYYig01Tzq8uc+n0dQJaMwoZxWU/qt0TXGnZxdT57vqZ2uG3WtJqceFr4bAtbnOOIEQUfwEAAAAAAAABVKCLfkdNmP0DSAkT4DTFKWMvQHaKLacsYiwuvwBNk0INlIMCAHHHqeLZigtLhZ4eiW8iqIlLxD5MiZpTyEo4dR+pLpc/YZkEFvzooIh1Nwqq9NCLNhCtlpzIsXkcggBSai8lrApogRgRdCicLfREkK5shfjBoA+IKNux1EiB7fZnU8ahEwYAAA==" + ], + [ + true, + "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFUAAAAAABAAAAMAg+muXpq+yX1QK2TyDk8DVuq+m27j/Yt8pzUA+xrJSujYIP5YAnnBBVhlMhY601oB1Z8fDKgqRTnHYcT0x6m8AdDvFSsvOlMvaZpB6LWqZPPAdcUMUZY1m331r14NojoMAgAAAAAAAZM5JTlqIOgTlGeMcG8YQyY4lQhrw4hViMP/ptipHfOzAAAAAAAD/x0BAEpX7M741mg/QVrl0GPrheEb/hIBkjLnSZWVSg1TUNgwY+idk5qW8RcWGcHXSYv2SThU3aoMccQELp0ilGaS/E/P++slaL/9fRCDNzwa7FEz9rznbfb8LPgSxpFGIIouTwEAqn03hnVO+6KtC/4Vq3HP756NZP0SvVqLGTNcdoATiPoAAAAAAAP/HQAA+OTBgtPCJ55SFosol8sQ7zJXbR4e7PpL2mh6MfEXAgyxE6Nfrwsk5NrJgon0dlqilR4f8kuGRKSPrabGyuApDg/ltBwc0npC1coJnHNfZ+M/5KT3oLm65GfDAxA8FAgGAQCPpt0tP4aBOemWPc8vD314E0iVETAMcZcAzQgVst8bpgFCHYRP2oqnKyU2Vo0py+RJ52Jl9bzWhQSi58urFcHMjQsCAAABfgAAAGJxQuVtKiEG5+arLUwI+n5xPdpr3IkBfGQTDnBINC3sGvl0Dt2HIYa7wtFPAPvC9XxH4lWBpcZBr0eurvO9BGtv0q4Ax7aBxTanEo7mD2BmTyqEcMJPDEal66dwnGgFDAoAAAAAAADjWNHnRbEeFXEjMyiGjoVUcnGN7yilXBaiKscqfeRwk3EE+QAA7DstMVwzkyMgxoAjAKwu2eprfrTfsk+ZN9Hm8Hu7gN047hYdZO7VbhqLVGyLtB/2iM8xEpwQg1jqZ0/Grx79XK8cKhUNB5lgBHAZuEUzwn2+NnsTtQt30XvXkOCILBg8AQAAAAAAAAKqCPP2c0zxEJas7XhQ/4V4YTF9DS6qpht/xI2eYbMRDN075QMAAMh4MBwQEH8SbyZIgKVXl0/ONNFS0Wt6RNq+ZNlWzax1viT8qQ5f980/U+mgtcNjPi5uU4BSPyXyez+o1iVGLVMVfZkRvcr6CCAeserVZH9xvJ8Y591u39TqWzEJ+BcuAgEAAQIAAAF+AQDY5jIWu27SdbOlqV91ZSQe88zc914quzlxlV0YVd2d9G143UY00FA2gOrTdEm3Nxun2lok10KvkJ7nKrZkB641NcQR6Fe2/VD4cZfEM/49AIcCu2+2VFni5cE5+VuicFIBAAAAAAAAAONYuS+1LqTiBHIzsVlWPgeo7oD3jWjrEzskaWdgKTLSexlZAAC91VydC2tNiypXrmXbXaKN+91dn3vE3jKDxi2JqHM/a3CuHa8S2fTdKGOzykijeUgtUXMysvaxH1wLnNvfWKIO0rwiG+OPBBSvcKVU67Lq+blmeEozwUDHlDztnBKDXhYCAAAAAAAAAqoI3btnF0UrBJNqAmeksSYfXcq0zgQj4D6iOqnZLArB1vCHAwAhfPU2Vk7+/Ub0bqCjC4DtUTJ1NH6iDvIJGUu9FQusY+ic9okCTF1iaeaZNamXe7EjjIe8hs1pJiIc1MO91zEKSue0pjyivf/63UXB1V2AeJeI8pd9Q6SzDJ4Mvw6s4BQEAQACAAABfgMAWSuq1RUP8zCnVUPgeemCUmQcqIRuZEGD5MZh/6b6/G8kuU8+liICs09Imqgxb0tq3xhJNoUJ9Hf95fxLpd93HBvlTHqw15S+CigZ4ghgfdvg04wcRx+fWoCaeTZXImoKAwIAAAAAAADjWK0CyA1MW3NWYusMsW/nPJlyVmc9V/Hhvjb7ts4iOEozIwMAY8fPHr7logHFRTArCukLT7Zu3+zKzVOIOH7CMNhlhimWAOpaCNRsgzd89VZFGeyFyjk1iDPtUgcaafYdRSlRBKEr42jALYPzLDvh577N0DBlQMQtlKEvGfe7ENI06OAUAQAAAAAAAAKqCJDirA/mIuk98oGmDg5wTEQrxsd7BO7APlZ7lEYxCnKXiQAASBNj/VDZW2e9oBmARk38OPi9FZK6ldAxVqVnDa3hDPy0tVKFzmIRlSKOHW38kI/VzTdeSsWh+JWD6SM1swfvQGsoe+5mPxDUNhU7bzkbOAFS7+J2HnTeuJyBjwGAEhwvAQAA" ] + ] } diff --git a/tests/tools/1315537.json b/tests/tools/1315537.json index cd73f6fff97e..bf1ef2e0ce30 100644 --- a/tests/tools/1315537.json +++ b/tests/tools/1315537.json @@ -1,170 +1,170 @@ { - "block": { - "challenge_chain_ip_proof": { - "normalized_to_identity": false, - "witness": "0x0300da92bf856738516c2108795cc49ce909eaea03670c21353e64a8e129c1411e013fba39f47e46099804ac58214a4f298f42418da346af8172eae00155b9201b433b839b5b68e8cb5bad5fe717dcc19e855b75467ee98e454ff57c403e6c92d3500100000000000019fb90c831a1ef470ed49618911d81d5a0a7b20c21f8047601f99980e461feee77cb412b000030dc99ab25cfe0990748488cb04e11246aa44dac9b668233b5086a379a31402efb2aaf3ed35e513d7bd830ab0735a033a57cb0cdfd16fbddd3ca15ee13c2b323c16e8ed0bd7df81fc1dedf8683fa1034871afee60f97ec977606bc6b9cdf3835010000000000004df24c9f4c6ddf2474c71ece6043d5d80eabebe2435564c91ca4c9bd109a18b9b7ffaea10300c3f9e25c24e232ef0566f3d89f8bf0c17f5eef55867c1ba67717194aa7b8419242432ea50c0a98e7b3a36b79ee89bedbfc2836734ad5ab93945f8b3774dd04601d52059ba54fd3f7fd40c4d8aec7409af5c4e39fc015477800b6c8775bf52b3b0100", - "witness_type": 2 + "block": { + "challenge_chain_ip_proof": { + "normalized_to_identity": false, + "witness": "0x0300da92bf856738516c2108795cc49ce909eaea03670c21353e64a8e129c1411e013fba39f47e46099804ac58214a4f298f42418da346af8172eae00155b9201b433b839b5b68e8cb5bad5fe717dcc19e855b75467ee98e454ff57c403e6c92d3500100000000000019fb90c831a1ef470ed49618911d81d5a0a7b20c21f8047601f99980e461feee77cb412b000030dc99ab25cfe0990748488cb04e11246aa44dac9b668233b5086a379a31402efb2aaf3ed35e513d7bd830ab0735a033a57cb0cdfd16fbddd3ca15ee13c2b323c16e8ed0bd7df81fc1dedf8683fa1034871afee60f97ec977606bc6b9cdf3835010000000000004df24c9f4c6ddf2474c71ece6043d5d80eabebe2435564c91ca4c9bd109a18b9b7ffaea10300c3f9e25c24e232ef0566f3d89f8bf0c17f5eef55867c1ba67717194aa7b8419242432ea50c0a98e7b3a36b79ee89bedbfc2836734ad5ab93945f8b3774dd04601d52059ba54fd3f7fd40c4d8aec7409af5c4e39fc015477800b6c8775bf52b3b0100", + "witness_type": 2 + }, + "challenge_chain_sp_proof": { + "normalized_to_identity": false, + "witness": "0x020018465198576e5a2c7fe942dd42f7fc4c7218239830225f384ed9210e86c84b33ee2a1480621e6e2c58e00fca12ee216be3a5e4616da6ae83d62c113e4aa2b75751420e4600b4c0825ae51f6af6fe32e5fea16494c3c9f12722c9ae670771bd09010000000000000d3414c858e0b05a06953e39cf36c29923031e3f114351071245a976aed4a0b22b72a58f0100e872b1186719ff1d922b6824909e440bb91165b952e3fb1e24b236446b7b38882867ab1906667dd7c014ce6f7a8254ddacd3075401d6d42b9bdd03448d53862c4f2ecca5c5369beb5329940b68cca31ee3f361c93db95ce16e035cb93851801302000000000000279b748e385c76f45587c3f3fb69b6aacf052880918f5a1221a3eaeab03f08ce3f3f2d630100d4be7bf1811aa020b2ab1c3b23a150d61683fad6801bb0dff2c998a6dfc0d06cc1363b3b822d0a352063cba747d317b79b6d531c7b13b6d341ed0fe640b6f44f4b4cc719bd5243ec5b070f60010450d4f2061a32830aa25a5ed141175800b4570100", + "witness_type": 2 + }, + "finished_sub_slots": [], + "foliage": { + "foliage_block_data": { + "extension_data": "0x0000000000000000000000000000000000000000000000000000000003a2c7c9", + "farmer_reward_puzzle_hash": "0xda5542ace1d90fd6cf9f7e74c0db2a4d75c15cd883984737c2776401fe16c053", + "pool_signature": null, + "pool_target": { + "max_height": 0, + "puzzle_hash": "0xd8a339fbb28da3dd446519abdce314c067313c7955a321bf6c84717b91e18761" + }, + "unfinished_reward_block_hash": "0xdacb07f373b2519d396fd0282f0dda7fc1043c7cb781c90d11ef95b05ad9ab90" + }, + "foliage_block_data_signature": "0x8052952aa41e94b29ce39776782ab6b08cfbfd0e4f6a2494805276066b5b67e52f7ec07acff95ca8be0786a4439985960967c9a2bb10ebf60532127b4f63f1f8837b37953a28f32ef7b50455f06def9975d5a457118c8f5e5d05227ea4746636", + "foliage_transaction_block_hash": "0xcd4e468900bfbeb4576da9ba51547d175553ddc00e034951d0bd0ab2913ef865", + "foliage_transaction_block_signature": "0x866d588999b7594e48baa4ee2eb8a27dd5d754118d36ed591c7cba9e0ba949da47d69e3dcba8b93ce1269865eff9fa48163f2d6e44f9f01119cf9060c540d004425fc2696f86f6099291bd3df82a1e8ae267f00ad64a0db514f8ad970c2e4e97", + "prev_block_hash": "0xace924502bba8ac7615f61dd8ed512c8025d6275dca90bf012fde066f5f591cd", + "reward_block_hash": "0x0ee42cc431e0a901ea2386f0c452fb0abf97c8d6f00ff1e90db1ff4ef57a3705" + }, + "foliage_transaction_block": { + "additions_root": "0xe5d91743b0adbc0a021e0d8032bb5b325b5163319af51277500943f148ed89b6", + "filter_hash": "0x01a6a3dfb1eeb44d025e89698f8233b726ff2bbbd5349251deb3e7b99017e42d", + "prev_transaction_block_hash": "0xace924502bba8ac7615f61dd8ed512c8025d6275dca90bf012fde066f5f591cd", + "removals_root": "0x25e0f1ea4c5add869a1b6bef977a554ffa82d8e39dbbe5196aa164cc61c385f2", + "timestamp": 1659023980, + "transactions_info_hash": "0xc9cef625b7dacc1d0321b91d8c4fa9a9aacd3cfc68d2c5cc3ffa7d5005c1fbdb" + }, + "infused_challenge_chain_ip_proof": { + "normalized_to_identity": false, + "witness": "0x0300cef1088a954913939fff4e26a00c0efae61862979d0042afd83720ef4528151be1f2e93910f5917cd17e0e04bb5143b96821429fc563b569a991f2fc4d54142409f84c40a4b6751c521b9c28d6cdbc0f851d3933fea3938aa64454594461622f0100000000000019fb90f6e627b37f3e99087a50ea6eff8983d1645ce13700647cb6caa3288e76ccad58bd030050d102856fe32cdc933b471466ba352a5108974b92cb41c31d701e846df99aabef9904706ea2434f828a6867759d9ad34d8fadce6ffb3d801642821de09756510f8b4db9e65d5cbf5485d292f888eb8db3720543d763399725b1ecbb48f59752010000000000004df24cc909745ce7f03e7264d88ccabc36673178426ae3c102bf69232d034fa2a7d10ebb03008cd17157fb69b8ca141293c69d3c5a68c314f5192500793a480a8bed1f95aa0a1cb4c2238da5ba3e0112ffe41ec7f63bfa0036ecd50f345120b98407820e5e57c3e223001733133ad933f33a1d05ae1121287f7af04393ce6ab8ce0df44ab81c0100", + "witness_type": 2 + }, + "reward_chain_block": { + "challenge_chain_ip_vdf": { + "challenge": "0x77c90715190e779d8442c57f05d4ba078d1b2c97c5014d6506e40b724690218a", + "number_of_iterations": 19595761, + "output": { + "data": "0x0300615017e1a2f7e0665f7dad57c1263f2411a875ed1ccaaf197d42096b1ac25c7d019c3f8af96b3de1076a4d52141e4dd6fa8a7fe64e73f5511001a5c71c6325014501fa4c19e7507cd44f09c19158ffb88f6ae76e12fd387d77f791f2d3901b080201" + } + }, + "challenge_chain_sp_signature": "0x8463fca1459940aff234cc2f40a440e5441a50c294d95429dd0dda46e5c2e56ecd7ee2bca4688efdd4ee67293b8784a1178cd2a274b7bd603b9c174012a8742cbc92ff80bdc3d9b626ba7c7612015461870b52c7b6d84e262baea5781ca92d10", + "challenge_chain_sp_vdf": { + "challenge": "0x77c90715190e779d8442c57f05d4ba078d1b2c97c5014d6506e40b724690218a", + "number_of_iterations": 15826944, + "output": { + "data": "0x0300c4917bf6eba2011e942ac8a6ea0fd5a498da1b3b5a715932dffe0e748c4fd391bad64691cf0478f9d954bd2732b06751ce9ddcff3cc81e84d5c2a513f7f7ea21c7a513aacea3a3220729703d64f0c6da8586c38d7ed7ec9bd2dfe2cc68323d0b0100" + } + }, + "height": 1315537, + "infused_challenge_chain_ip_vdf": { + "challenge": "0x5925b3525b03e39b034766d2207dbe59a93ad650e716b37b3df80ce73292dd3d", + "number_of_iterations": 7662500, + "output": { + "data": "0x0300152ffd8ebee7e6556c9ac69287ddd77e57eb8c4bebc62eae34e41b13f47e965ccde0fac267fcb78456ca7f2a0f5e4594e58ccda767c20390f5142b9d38e363196e5e6615d9dcc4df850b781ef9d40ac90ecb274da77904ee600416b4eef6f2050401" + } + }, + "is_transaction_block": true, + "pos_ss_cc_challenge_hash": "0x77c90715190e779d8442c57f05d4ba078d1b2c97c5014d6506e40b724690218a", + "proof_of_space": { + "challenge": "0x8e9a2d45f654a2d5e60bbb39801416654994df0dde987ac5f9e6ba3789ee8c4f", + "plot_public_key": "0xa2962f1e967ddc60db437b9ffd3d9d53f3951b33b678f77d3791f8d6123427630764495bdf2e6b1f580cc0d01f7af119", + "pool_contract_puzzle_hash": "0xd8a339fbb28da3dd446519abdce314c067313c7955a321bf6c84717b91e18761", + "pool_public_key": null, + "proof": "0x1b94db80cf5ce5da0a00263c93c8b7fa3d9a203138e3afc399e12a4fbb7fd8b88c2a351ecadee9ad7c2875f79ae9e2770099efb38f2ec21247fa59af7449417619f64a848d82bc60515276e3e1814e6bbea997055f156e4fef2194738e49164d73caecf78a418e9cc3e0fa2786b794c535253255a00dff79c0447e5951ba525d51dbeb516b12f9e65ef2deff00a6d314811ef44601a8461b2d3bac6f5f27487ac2168899b1b0550a44c9edcbda8738868f768d0f88cac7b3edec062eea295427cf83cb0a6ec9807a27a36bf544797d2e49417db87f44a590605f8a8a5fad5da08dec531793eee4f0782e17a4f6f1867c46eeb755959c58321706123dee013d95", + "size": 32 + }, + "reward_chain_ip_vdf": { + "challenge": "0x364924705858ac66a701cdd41a4675f4db11ee71f7b867b78da5294a3a7b51c9", + "number_of_iterations": 7662500, + "output": { + "data": "0x0200da1506aedeff15bceb59d041bdc5e3bbad9f49935379a304426250c6bacb3a5b10bef636218082b6fd9606bcec01de6ed647cceb9f3ef6725197b73d4a58a758c3e2361fe7fe406051fb41b43338e9d2c529d89121fa029742702a0a94ced3490100" + } + }, + "reward_chain_sp_signature": "0x97205fdebf92052fe6e23c25e8bfb7244bc53c462de5b3f159ac5310cffafad34fa0d6ec26cd4023c7d096fd81e2c7110aae153bbab02341035dcf083b1b71b0bc1cb43a899e98632e58923f424f4237d8dbc6686137f53d7a1d5aaa9d44a589", + "reward_chain_sp_vdf": { + "challenge": "0x364924705858ac66a701cdd41a4675f4db11ee71f7b867b78da5294a3a7b51c9", + "number_of_iterations": 3893683, + "output": { + "data": "0x000023e870afdec75a42b3465d2c04c1a436ddfd39f49f09c9ff124b0432f797c625c8f9365fe40887c05be50cb4df292b5734adce290be3b322a34c026951621f64cf0e5586ce97adcee96377c4dbac9e959e72d62909fc5aa3cfb3e2e066d5b72a0100" + } + }, + "signage_point_index": 14, + "total_iters": 3017735602673, + "weight": 102735167796 + }, + "reward_chain_ip_proof": { + "normalized_to_identity": false, + "witness": "0x0200b9560deb0466dc6ee33e68d716b1cdc4d9c9dec96c2095e4c802fb31c7bfd7165069cc002f1bd12445741a5594fab6c2af7b59d928035f9c703c6cef18c4351b808ab571ef2d8528875734dae355a55ff00ee797c07acf0aac02c489f37159170100000000000019fb9083d87c2b49bf762489d1ba23e70135dd10306f8a33c4a1d298b20a62493b8b9c4d03007cad87e30a6f679afd0d101264857eec35e4303681122dd268fa2ccc0aea5fcc2af3d8f25036b4503e2b77e369ded94ed91b3d600b4c24aac874c4b4e4d3943def43878c857a703ab7c98e0bc3e6b5a9fc42d4a4dae445a1e2f22f3cd57e2b37010000000000004df24cfddbafd92807e3d8cf1114972b5d4e04158f312abb9d8ec788f9d86aa5b575370101002cea9d55f9ec9141b765d844dddcfc48ee99b53a547bddbd2ed18fa829dc48a04ae9013e15963393bd5ed820c9a2400f70bac29825472bf8481042dd7e6314044d94db6ea427a8efb635240c58dde1baa58d1e1176deca62c7f1fb91f4c8d8040a08", + "witness_type": 2 + }, + "reward_chain_sp_proof": { + "normalized_to_identity": false, + "witness": "0x00002510a007fa2af76c41a359d3a77033440a48cf2d705d9ae46d270a78aabb1b593ca92ccd85cdf99c90404ea8e07b8dd7d733c83d0f4d2fc998fbb0e458eccf2fe86bc316132a895a05d2b95d7c1f386eb21ef84f2c993bf5e5d9a22c8b763a24020100000000000d34149b7b8b8d38204e3a16ca162193df93083a447bc98d10a1a0e277546e27246e5f4f0000e82565b2c758a49d8bc31a2634eaa9765c7ae3baf251b5592ea8cf6de709a7fdfe0f2e376e7e5f8fc0ce7f57f7b99fcd467371d2e5f53a1e04db53249336be0fe3c7824d882b3f1effc42f2eab8975d6c5ab82dda011d4958845570ac0a2011f02010000000000279b74de2f025eee2dbcfad6e9ae28022a9416d75c384fec483a7bb087258d4811fc704f01006b02d5a80202c1f2385538b8d2e7731539c11629dd43e4a67fb290418b00e8d8fc143d31c9942aea9d2b7ae1ad69eb092b621075d3adc804c7605a012eefb962b393eb2729403c1a6e7fac5b32fcafea1b054e1ae33177d576c88172f6781a410100", + "witness_type": 2 + }, + "transactions_generator": "0xff01ffffffa089853bfdabb1bbe24da0252fc46741f8b86f270acf862217819b7b12fa344f01ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0acd09ec94eebd2504b4d83abaf21e26156e5b1bf8ecfa45fdf30539be4ad84f690f5ad60bbe2960d45faaa12d92947c0ff018080ff85009502f900ffff80ffff01ffff33ffa020a2284ec41cdcc3c54e6b44f8801db2dc28f3aa01c115674b598757d62f09a6ff830186a080ffff33ffa078cccdff5b501c3064731544aa470452782ef4ebb72771e1d1d1391a36cf478dff85009501726080ffff3cffa0f7b37a208bed9a1cb6fdbd7dc8942672910789054aff9cb32cf2f164d078119e8080ff808080ffffa033d11293062a013d5f7e4f13796c62c754a08ad9d562be475d404bf3405406dbffff02ffff01ff02ffff01ff02ff5effff04ff02ffff04ffff04ff05ffff04ffff0bff34ff0580ffff04ff0bff80808080ffff04ffff02ff17ff2f80ffff04ff5fffff04ffff02ff2effff04ff02ffff04ff17ff80808080ffff04ffff02ff2affff04ff02ffff04ff82027fffff04ff82057fffff04ff820b7fff808080808080ffff04ff81bfffff04ff82017fffff04ff8202ffffff04ff8205ffffff04ff820bffff80808080808080808080808080ffff04ffff01ffffffff3d46ff02ff333cffff0401ff01ff81cb02ffffff20ff02ffff03ff05ffff01ff02ff32ffff04ff02ffff04ff0dffff04ffff0bff7cffff0bff34ff2480ffff0bff7cffff0bff7cffff0bff34ff2c80ff0980ffff0bff7cff0bffff0bff34ff8080808080ff8080808080ffff010b80ff0180ffff02ffff03ffff22ffff09ffff0dff0580ff2280ffff09ffff0dff0b80ff2280ffff15ff17ffff0181ff8080ffff01ff0bff05ff0bff1780ffff01ff088080ff0180ffff02ffff03ff0bffff01ff02ffff03ffff09ffff02ff2effff04ff02ffff04ff13ff80808080ff820b9f80ffff01ff02ff56ffff04ff02ffff04ffff02ff13ffff04ff5fffff04ff17ffff04ff2fffff04ff81bfffff04ff82017fffff04ff1bff8080808080808080ffff04ff82017fff8080808080ffff01ff088080ff0180ffff01ff02ffff03ff17ffff01ff02ffff03ffff20ff81bf80ffff0182017fffff01ff088080ff0180ffff01ff088080ff018080ff0180ff04ffff04ff05ff2780ffff04ffff10ff0bff5780ff778080ffffff02ffff03ff05ffff01ff02ffff03ffff09ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff01818f80ffff01ff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ffff04ff81b9ff82017980ff808080808080ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff09ff11ff5880ffff01ff04ff58ffff04ffff02ff76ffff04ff02ffff04ff13ffff04ff29ffff04ffff0bff34ff5b80ffff04ff2bff80808080808080ff398080ffff01ff02ffff03ffff09ff11ff7880ffff01ff02ffff03ffff20ffff02ffff03ffff09ffff0121ffff0dff298080ffff01ff02ffff03ffff09ffff0cff29ff80ff3480ff5c80ffff01ff0101ff8080ff0180ff8080ff018080ffff0109ffff01ff088080ff0180ffff010980ff018080ff0180ffff04ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff04ffff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ff17ff808080808080ff80808080808080ff0180ffff01ff04ff80ffff04ff80ff17808080ff0180ffff02ffff03ff05ffff01ff04ff09ffff02ff56ffff04ff02ffff04ff0dffff04ff0bff808080808080ffff010b80ff0180ff0bff7cffff0bff34ff2880ffff0bff7cffff0bff7cffff0bff34ff2c80ff0580ffff0bff7cffff02ff32ffff04ff02ffff04ff07ffff04ffff0bff34ff3480ff8080808080ffff0bff34ff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ffff04ffff04ff30ffff04ff5fff808080ffff02ff7effff04ff02ffff04ffff04ffff04ff2fff0580ffff04ff5fff82017f8080ffff04ffff02ff26ffff04ff02ffff04ff0bffff04ff05ffff01ff808080808080ffff04ff17ffff04ff81bfffff04ff82017fffff04ffff02ff2affff04ff02ffff04ff8204ffffff04ffff02ff76ffff04ff02ffff04ff09ffff04ff820affffff04ffff0bff34ff2d80ffff04ff15ff80808080808080ffff04ff8216ffff808080808080ffff04ff8205ffffff04ff820bffff808080808080808080808080ff02ff5affff04ff02ffff04ff5fffff04ff3bffff04ffff02ffff03ff17ffff01ff09ff2dffff02ff2affff04ff02ffff04ff27ffff04ffff02ff76ffff04ff02ffff04ff29ffff04ff57ffff04ffff0bff34ff81b980ffff04ff59ff80808080808080ffff04ff81b7ff80808080808080ff8080ff0180ffff04ff17ffff04ff05ffff04ff8202ffffff04ffff04ffff04ff78ffff04ffff0eff5cffff02ff2effff04ff02ffff04ffff04ff2fffff04ff82017fff808080ff8080808080ff808080ffff04ffff04ff20ffff04ffff0bff81bfff5cffff02ff2effff04ff02ffff04ffff04ff15ffff04ffff10ff82017fffff11ff8202dfff2b80ff8202ff80ff808080ff8080808080ff808080ff138080ff80808080808080808080ff018080ffff04ffff01a037bef360ee858133b69d595a906dc45d01af50379dad515eb9518abb7c1d2a7affff04ffff01a0c2808f37e758b713150da4860091dd94a90a781bc4f18377d20de6291b3d506dffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b096d5723556450fd3b3949451236fcf84800a3b1b829e4edae22df94ec54216ac34e184a1a2c3330f6a9b3dbc31fded82ff018080ff0180808080ff830186a0ffffff80ffff01ffff33ffa01a09c8036279722f2216bc3714c1bc7842b0f7983554a980eee10381bed0e1fdff830186a080ffff33ff80ff818fffff02ffff01ff02ffff03ff2fffff01ff0880ffff01ff02ffff03ffff09ff2dff0280ff80ffff01ff088080ff018080ff0180ffff04ffff01a033d11293062a013d5f7e4f13796c62c754a08ad9d562be475d404bf3405406dbff018080ff808080ff8080ff80ffa06fb12ab32556537803112badcfaf828bfe1b79eb4181b3adc5d571680295ce6cffffa033d11293062a013d5f7e4f13796c62c754a08ad9d562be475d404bf3405406dbffa020a2284ec41cdcc3c54e6b44f8801db2dc28f3aa01c115674b598757d62f09a6ff830186a080ffffa033d11293062a013d5f7e4f13796c62c754a08ad9d562be475d404bf3405406dbffa01a09c8036279722f2216bc3714c1bc7842b0f7983554a980eee10381bed0e1fdff830186a080ff80ff8080808080", + "transactions_generator_ref_list": [], + "transactions_info": { + "aggregated_signature": "0xa4de8bcc42e00bf28277f3140b069e091cdb35e920137bd28e03506f5c1e6ab8b289845ac994d51249f7a554ebf525650fbc579b4ceadd0cefbf0816bb96da54361b72b1ad8d7648a20bf5c3c9b1465e61f639f1ba18c06514388b33b932f9c6", + "cost": 46944153, + "fees": 0, + "generator_refs_root": "0x0101010101010101010101010101010101010101010101010101010101010101", + "generator_root": "0x76b894a83999ce808c27eb4bdc570f0dcef05d3223672d12a19b221db08c7bb5", + "reward_claims_incorporated": [ + { + "amount": 1750000000000, + "parent_coin_info": "0xae83525ba8d1dd3f09b277de18ca3e43000000000000000000000000001412d0", + "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" }, - "challenge_chain_sp_proof": { - "normalized_to_identity": false, - "witness": "0x020018465198576e5a2c7fe942dd42f7fc4c7218239830225f384ed9210e86c84b33ee2a1480621e6e2c58e00fca12ee216be3a5e4616da6ae83d62c113e4aa2b75751420e4600b4c0825ae51f6af6fe32e5fea16494c3c9f12722c9ae670771bd09010000000000000d3414c858e0b05a06953e39cf36c29923031e3f114351071245a976aed4a0b22b72a58f0100e872b1186719ff1d922b6824909e440bb91165b952e3fb1e24b236446b7b38882867ab1906667dd7c014ce6f7a8254ddacd3075401d6d42b9bdd03448d53862c4f2ecca5c5369beb5329940b68cca31ee3f361c93db95ce16e035cb93851801302000000000000279b748e385c76f45587c3f3fb69b6aacf052880918f5a1221a3eaeab03f08ce3f3f2d630100d4be7bf1811aa020b2ab1c3b23a150d61683fad6801bb0dff2c998a6dfc0d06cc1363b3b822d0a352063cba747d317b79b6d531c7b13b6d341ed0fe640b6f44f4b4cc719bd5243ec5b070f60010450d4f2061a32830aa25a5ed141175800b4570100", - "witness_type": 2 + { + "amount": 250000000000, + "parent_coin_info": "0xfc0af20d20c4b3e92ef2a48bd291ccb2000000000000000000000000001412d0", + "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" }, - "finished_sub_slots": [], - "foliage": { - "foliage_block_data": { - "extension_data": "0x0000000000000000000000000000000000000000000000000000000003a2c7c9", - "farmer_reward_puzzle_hash": "0xda5542ace1d90fd6cf9f7e74c0db2a4d75c15cd883984737c2776401fe16c053", - "pool_signature": null, - "pool_target": { - "max_height": 0, - "puzzle_hash": "0xd8a339fbb28da3dd446519abdce314c067313c7955a321bf6c84717b91e18761" - }, - "unfinished_reward_block_hash": "0xdacb07f373b2519d396fd0282f0dda7fc1043c7cb781c90d11ef95b05ad9ab90" - }, - "foliage_block_data_signature": "0x8052952aa41e94b29ce39776782ab6b08cfbfd0e4f6a2494805276066b5b67e52f7ec07acff95ca8be0786a4439985960967c9a2bb10ebf60532127b4f63f1f8837b37953a28f32ef7b50455f06def9975d5a457118c8f5e5d05227ea4746636", - "foliage_transaction_block_hash": "0xcd4e468900bfbeb4576da9ba51547d175553ddc00e034951d0bd0ab2913ef865", - "foliage_transaction_block_signature": "0x866d588999b7594e48baa4ee2eb8a27dd5d754118d36ed591c7cba9e0ba949da47d69e3dcba8b93ce1269865eff9fa48163f2d6e44f9f01119cf9060c540d004425fc2696f86f6099291bd3df82a1e8ae267f00ad64a0db514f8ad970c2e4e97", - "prev_block_hash": "0xace924502bba8ac7615f61dd8ed512c8025d6275dca90bf012fde066f5f591cd", - "reward_block_hash": "0x0ee42cc431e0a901ea2386f0c452fb0abf97c8d6f00ff1e90db1ff4ef57a3705" + { + "amount": 1750000000000, + "parent_coin_info": "0xae83525ba8d1dd3f09b277de18ca3e43000000000000000000000000001412cf", + "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" }, - "foliage_transaction_block": { - "additions_root": "0xe5d91743b0adbc0a021e0d8032bb5b325b5163319af51277500943f148ed89b6", - "filter_hash": "0x01a6a3dfb1eeb44d025e89698f8233b726ff2bbbd5349251deb3e7b99017e42d", - "prev_transaction_block_hash": "0xace924502bba8ac7615f61dd8ed512c8025d6275dca90bf012fde066f5f591cd", - "removals_root": "0x25e0f1ea4c5add869a1b6bef977a554ffa82d8e39dbbe5196aa164cc61c385f2", - "timestamp": 1659023980, - "transactions_info_hash": "0xc9cef625b7dacc1d0321b91d8c4fa9a9aacd3cfc68d2c5cc3ffa7d5005c1fbdb" + { + "amount": 250000000000, + "parent_coin_info": "0xfc0af20d20c4b3e92ef2a48bd291ccb2000000000000000000000000001412cf", + "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" }, - "infused_challenge_chain_ip_proof": { - "normalized_to_identity": false, - "witness": "0x0300cef1088a954913939fff4e26a00c0efae61862979d0042afd83720ef4528151be1f2e93910f5917cd17e0e04bb5143b96821429fc563b569a991f2fc4d54142409f84c40a4b6751c521b9c28d6cdbc0f851d3933fea3938aa64454594461622f0100000000000019fb90f6e627b37f3e99087a50ea6eff8983d1645ce13700647cb6caa3288e76ccad58bd030050d102856fe32cdc933b471466ba352a5108974b92cb41c31d701e846df99aabef9904706ea2434f828a6867759d9ad34d8fadce6ffb3d801642821de09756510f8b4db9e65d5cbf5485d292f888eb8db3720543d763399725b1ecbb48f59752010000000000004df24cc909745ce7f03e7264d88ccabc36673178426ae3c102bf69232d034fa2a7d10ebb03008cd17157fb69b8ca141293c69d3c5a68c314f5192500793a480a8bed1f95aa0a1cb4c2238da5ba3e0112ffe41ec7f63bfa0036ecd50f345120b98407820e5e57c3e223001733133ad933f33a1d05ae1121287f7af04393ce6ab8ce0df44ab81c0100", - "witness_type": 2 + { + "amount": 1750000000000, + "parent_coin_info": "0xae83525ba8d1dd3f09b277de18ca3e43000000000000000000000000001412ce", + "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" }, - "reward_chain_block": { - "challenge_chain_ip_vdf": { - "challenge": "0x77c90715190e779d8442c57f05d4ba078d1b2c97c5014d6506e40b724690218a", - "number_of_iterations": 19595761, - "output": { - "data": "0x0300615017e1a2f7e0665f7dad57c1263f2411a875ed1ccaaf197d42096b1ac25c7d019c3f8af96b3de1076a4d52141e4dd6fa8a7fe64e73f5511001a5c71c6325014501fa4c19e7507cd44f09c19158ffb88f6ae76e12fd387d77f791f2d3901b080201" - } - }, - "challenge_chain_sp_signature": "0x8463fca1459940aff234cc2f40a440e5441a50c294d95429dd0dda46e5c2e56ecd7ee2bca4688efdd4ee67293b8784a1178cd2a274b7bd603b9c174012a8742cbc92ff80bdc3d9b626ba7c7612015461870b52c7b6d84e262baea5781ca92d10", - "challenge_chain_sp_vdf": { - "challenge": "0x77c90715190e779d8442c57f05d4ba078d1b2c97c5014d6506e40b724690218a", - "number_of_iterations": 15826944, - "output": { - "data": "0x0300c4917bf6eba2011e942ac8a6ea0fd5a498da1b3b5a715932dffe0e748c4fd391bad64691cf0478f9d954bd2732b06751ce9ddcff3cc81e84d5c2a513f7f7ea21c7a513aacea3a3220729703d64f0c6da8586c38d7ed7ec9bd2dfe2cc68323d0b0100" - } - }, - "height": 1315537, - "infused_challenge_chain_ip_vdf": { - "challenge": "0x5925b3525b03e39b034766d2207dbe59a93ad650e716b37b3df80ce73292dd3d", - "number_of_iterations": 7662500, - "output": { - "data": "0x0300152ffd8ebee7e6556c9ac69287ddd77e57eb8c4bebc62eae34e41b13f47e965ccde0fac267fcb78456ca7f2a0f5e4594e58ccda767c20390f5142b9d38e363196e5e6615d9dcc4df850b781ef9d40ac90ecb274da77904ee600416b4eef6f2050401" - } - }, - "is_transaction_block": true, - "pos_ss_cc_challenge_hash": "0x77c90715190e779d8442c57f05d4ba078d1b2c97c5014d6506e40b724690218a", - "proof_of_space": { - "challenge": "0x8e9a2d45f654a2d5e60bbb39801416654994df0dde987ac5f9e6ba3789ee8c4f", - "plot_public_key": "0xa2962f1e967ddc60db437b9ffd3d9d53f3951b33b678f77d3791f8d6123427630764495bdf2e6b1f580cc0d01f7af119", - "pool_contract_puzzle_hash": "0xd8a339fbb28da3dd446519abdce314c067313c7955a321bf6c84717b91e18761", - "pool_public_key": null, - "proof": "0x1b94db80cf5ce5da0a00263c93c8b7fa3d9a203138e3afc399e12a4fbb7fd8b88c2a351ecadee9ad7c2875f79ae9e2770099efb38f2ec21247fa59af7449417619f64a848d82bc60515276e3e1814e6bbea997055f156e4fef2194738e49164d73caecf78a418e9cc3e0fa2786b794c535253255a00dff79c0447e5951ba525d51dbeb516b12f9e65ef2deff00a6d314811ef44601a8461b2d3bac6f5f27487ac2168899b1b0550a44c9edcbda8738868f768d0f88cac7b3edec062eea295427cf83cb0a6ec9807a27a36bf544797d2e49417db87f44a590605f8a8a5fad5da08dec531793eee4f0782e17a4f6f1867c46eeb755959c58321706123dee013d95", - "size": 32 - }, - "reward_chain_ip_vdf": { - "challenge": "0x364924705858ac66a701cdd41a4675f4db11ee71f7b867b78da5294a3a7b51c9", - "number_of_iterations": 7662500, - "output": { - "data": "0x0200da1506aedeff15bceb59d041bdc5e3bbad9f49935379a304426250c6bacb3a5b10bef636218082b6fd9606bcec01de6ed647cceb9f3ef6725197b73d4a58a758c3e2361fe7fe406051fb41b43338e9d2c529d89121fa029742702a0a94ced3490100" - } - }, - "reward_chain_sp_signature": "0x97205fdebf92052fe6e23c25e8bfb7244bc53c462de5b3f159ac5310cffafad34fa0d6ec26cd4023c7d096fd81e2c7110aae153bbab02341035dcf083b1b71b0bc1cb43a899e98632e58923f424f4237d8dbc6686137f53d7a1d5aaa9d44a589", - "reward_chain_sp_vdf": { - "challenge": "0x364924705858ac66a701cdd41a4675f4db11ee71f7b867b78da5294a3a7b51c9", - "number_of_iterations": 3893683, - "output": { - "data": "0x000023e870afdec75a42b3465d2c04c1a436ddfd39f49f09c9ff124b0432f797c625c8f9365fe40887c05be50cb4df292b5734adce290be3b322a34c026951621f64cf0e5586ce97adcee96377c4dbac9e959e72d62909fc5aa3cfb3e2e066d5b72a0100" - } - }, - "signage_point_index": 14, - "total_iters": 3017735602673, - "weight": 102735167796 + { + "amount": 250000000000, + "parent_coin_info": "0xfc0af20d20c4b3e92ef2a48bd291ccb2000000000000000000000000001412ce", + "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" }, - "reward_chain_ip_proof": { - "normalized_to_identity": false, - "witness": "0x0200b9560deb0466dc6ee33e68d716b1cdc4d9c9dec96c2095e4c802fb31c7bfd7165069cc002f1bd12445741a5594fab6c2af7b59d928035f9c703c6cef18c4351b808ab571ef2d8528875734dae355a55ff00ee797c07acf0aac02c489f37159170100000000000019fb9083d87c2b49bf762489d1ba23e70135dd10306f8a33c4a1d298b20a62493b8b9c4d03007cad87e30a6f679afd0d101264857eec35e4303681122dd268fa2ccc0aea5fcc2af3d8f25036b4503e2b77e369ded94ed91b3d600b4c24aac874c4b4e4d3943def43878c857a703ab7c98e0bc3e6b5a9fc42d4a4dae445a1e2f22f3cd57e2b37010000000000004df24cfddbafd92807e3d8cf1114972b5d4e04158f312abb9d8ec788f9d86aa5b575370101002cea9d55f9ec9141b765d844dddcfc48ee99b53a547bddbd2ed18fa829dc48a04ae9013e15963393bd5ed820c9a2400f70bac29825472bf8481042dd7e6314044d94db6ea427a8efb635240c58dde1baa58d1e1176deca62c7f1fb91f4c8d8040a08", - "witness_type": 2 + { + "amount": 1750000000000, + "parent_coin_info": "0xae83525ba8d1dd3f09b277de18ca3e43000000000000000000000000001412cd", + "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" }, - "reward_chain_sp_proof": { - "normalized_to_identity": false, - "witness": "0x00002510a007fa2af76c41a359d3a77033440a48cf2d705d9ae46d270a78aabb1b593ca92ccd85cdf99c90404ea8e07b8dd7d733c83d0f4d2fc998fbb0e458eccf2fe86bc316132a895a05d2b95d7c1f386eb21ef84f2c993bf5e5d9a22c8b763a24020100000000000d34149b7b8b8d38204e3a16ca162193df93083a447bc98d10a1a0e277546e27246e5f4f0000e82565b2c758a49d8bc31a2634eaa9765c7ae3baf251b5592ea8cf6de709a7fdfe0f2e376e7e5f8fc0ce7f57f7b99fcd467371d2e5f53a1e04db53249336be0fe3c7824d882b3f1effc42f2eab8975d6c5ab82dda011d4958845570ac0a2011f02010000000000279b74de2f025eee2dbcfad6e9ae28022a9416d75c384fec483a7bb087258d4811fc704f01006b02d5a80202c1f2385538b8d2e7731539c11629dd43e4a67fb290418b00e8d8fc143d31c9942aea9d2b7ae1ad69eb092b621075d3adc804c7605a012eefb962b393eb2729403c1a6e7fac5b32fcafea1b054e1ae33177d576c88172f6781a410100", - "witness_type": 2 + { + "amount": 250000000000, + "parent_coin_info": "0xfc0af20d20c4b3e92ef2a48bd291ccb2000000000000000000000000001412cd", + "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" }, - "transactions_generator": "0xff01ffffffa089853bfdabb1bbe24da0252fc46741f8b86f270acf862217819b7b12fa344f01ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0acd09ec94eebd2504b4d83abaf21e26156e5b1bf8ecfa45fdf30539be4ad84f690f5ad60bbe2960d45faaa12d92947c0ff018080ff85009502f900ffff80ffff01ffff33ffa020a2284ec41cdcc3c54e6b44f8801db2dc28f3aa01c115674b598757d62f09a6ff830186a080ffff33ffa078cccdff5b501c3064731544aa470452782ef4ebb72771e1d1d1391a36cf478dff85009501726080ffff3cffa0f7b37a208bed9a1cb6fdbd7dc8942672910789054aff9cb32cf2f164d078119e8080ff808080ffffa033d11293062a013d5f7e4f13796c62c754a08ad9d562be475d404bf3405406dbffff02ffff01ff02ffff01ff02ff5effff04ff02ffff04ffff04ff05ffff04ffff0bff34ff0580ffff04ff0bff80808080ffff04ffff02ff17ff2f80ffff04ff5fffff04ffff02ff2effff04ff02ffff04ff17ff80808080ffff04ffff02ff2affff04ff02ffff04ff82027fffff04ff82057fffff04ff820b7fff808080808080ffff04ff81bfffff04ff82017fffff04ff8202ffffff04ff8205ffffff04ff820bffff80808080808080808080808080ffff04ffff01ffffffff3d46ff02ff333cffff0401ff01ff81cb02ffffff20ff02ffff03ff05ffff01ff02ff32ffff04ff02ffff04ff0dffff04ffff0bff7cffff0bff34ff2480ffff0bff7cffff0bff7cffff0bff34ff2c80ff0980ffff0bff7cff0bffff0bff34ff8080808080ff8080808080ffff010b80ff0180ffff02ffff03ffff22ffff09ffff0dff0580ff2280ffff09ffff0dff0b80ff2280ffff15ff17ffff0181ff8080ffff01ff0bff05ff0bff1780ffff01ff088080ff0180ffff02ffff03ff0bffff01ff02ffff03ffff09ffff02ff2effff04ff02ffff04ff13ff80808080ff820b9f80ffff01ff02ff56ffff04ff02ffff04ffff02ff13ffff04ff5fffff04ff17ffff04ff2fffff04ff81bfffff04ff82017fffff04ff1bff8080808080808080ffff04ff82017fff8080808080ffff01ff088080ff0180ffff01ff02ffff03ff17ffff01ff02ffff03ffff20ff81bf80ffff0182017fffff01ff088080ff0180ffff01ff088080ff018080ff0180ff04ffff04ff05ff2780ffff04ffff10ff0bff5780ff778080ffffff02ffff03ff05ffff01ff02ffff03ffff09ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff01818f80ffff01ff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ffff04ff81b9ff82017980ff808080808080ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff09ff11ff5880ffff01ff04ff58ffff04ffff02ff76ffff04ff02ffff04ff13ffff04ff29ffff04ffff0bff34ff5b80ffff04ff2bff80808080808080ff398080ffff01ff02ffff03ffff09ff11ff7880ffff01ff02ffff03ffff20ffff02ffff03ffff09ffff0121ffff0dff298080ffff01ff02ffff03ffff09ffff0cff29ff80ff3480ff5c80ffff01ff0101ff8080ff0180ff8080ff018080ffff0109ffff01ff088080ff0180ffff010980ff018080ff0180ffff04ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff04ffff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ff17ff808080808080ff80808080808080ff0180ffff01ff04ff80ffff04ff80ff17808080ff0180ffff02ffff03ff05ffff01ff04ff09ffff02ff56ffff04ff02ffff04ff0dffff04ff0bff808080808080ffff010b80ff0180ff0bff7cffff0bff34ff2880ffff0bff7cffff0bff7cffff0bff34ff2c80ff0580ffff0bff7cffff02ff32ffff04ff02ffff04ff07ffff04ffff0bff34ff3480ff8080808080ffff0bff34ff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ffff04ffff04ff30ffff04ff5fff808080ffff02ff7effff04ff02ffff04ffff04ffff04ff2fff0580ffff04ff5fff82017f8080ffff04ffff02ff26ffff04ff02ffff04ff0bffff04ff05ffff01ff808080808080ffff04ff17ffff04ff81bfffff04ff82017fffff04ffff02ff2affff04ff02ffff04ff8204ffffff04ffff02ff76ffff04ff02ffff04ff09ffff04ff820affffff04ffff0bff34ff2d80ffff04ff15ff80808080808080ffff04ff8216ffff808080808080ffff04ff8205ffffff04ff820bffff808080808080808080808080ff02ff5affff04ff02ffff04ff5fffff04ff3bffff04ffff02ffff03ff17ffff01ff09ff2dffff02ff2affff04ff02ffff04ff27ffff04ffff02ff76ffff04ff02ffff04ff29ffff04ff57ffff04ffff0bff34ff81b980ffff04ff59ff80808080808080ffff04ff81b7ff80808080808080ff8080ff0180ffff04ff17ffff04ff05ffff04ff8202ffffff04ffff04ffff04ff78ffff04ffff0eff5cffff02ff2effff04ff02ffff04ffff04ff2fffff04ff82017fff808080ff8080808080ff808080ffff04ffff04ff20ffff04ffff0bff81bfff5cffff02ff2effff04ff02ffff04ffff04ff15ffff04ffff10ff82017fffff11ff8202dfff2b80ff8202ff80ff808080ff8080808080ff808080ff138080ff80808080808080808080ff018080ffff04ffff01a037bef360ee858133b69d595a906dc45d01af50379dad515eb9518abb7c1d2a7affff04ffff01a0c2808f37e758b713150da4860091dd94a90a781bc4f18377d20de6291b3d506dffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b096d5723556450fd3b3949451236fcf84800a3b1b829e4edae22df94ec54216ac34e184a1a2c3330f6a9b3dbc31fded82ff018080ff0180808080ff830186a0ffffff80ffff01ffff33ffa01a09c8036279722f2216bc3714c1bc7842b0f7983554a980eee10381bed0e1fdff830186a080ffff33ff80ff818fffff02ffff01ff02ffff03ff2fffff01ff0880ffff01ff02ffff03ffff09ff2dff0280ff80ffff01ff088080ff018080ff0180ffff04ffff01a033d11293062a013d5f7e4f13796c62c754a08ad9d562be475d404bf3405406dbff018080ff808080ff8080ff80ffa06fb12ab32556537803112badcfaf828bfe1b79eb4181b3adc5d571680295ce6cffffa033d11293062a013d5f7e4f13796c62c754a08ad9d562be475d404bf3405406dbffa020a2284ec41cdcc3c54e6b44f8801db2dc28f3aa01c115674b598757d62f09a6ff830186a080ffffa033d11293062a013d5f7e4f13796c62c754a08ad9d562be475d404bf3405406dbffa01a09c8036279722f2216bc3714c1bc7842b0f7983554a980eee10381bed0e1fdff830186a080ff80ff8080808080", - "transactions_generator_ref_list": [], - "transactions_info": { - "aggregated_signature": "0xa4de8bcc42e00bf28277f3140b069e091cdb35e920137bd28e03506f5c1e6ab8b289845ac994d51249f7a554ebf525650fbc579b4ceadd0cefbf0816bb96da54361b72b1ad8d7648a20bf5c3c9b1465e61f639f1ba18c06514388b33b932f9c6", - "cost": 46944153, - "fees": 0, - "generator_refs_root": "0x0101010101010101010101010101010101010101010101010101010101010101", - "generator_root": "0x76b894a83999ce808c27eb4bdc570f0dcef05d3223672d12a19b221db08c7bb5", - "reward_claims_incorporated": [ - { - "amount": 1750000000000, - "parent_coin_info": "0xae83525ba8d1dd3f09b277de18ca3e43000000000000000000000000001412d0", - "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" - }, - { - "amount": 250000000000, - "parent_coin_info": "0xfc0af20d20c4b3e92ef2a48bd291ccb2000000000000000000000000001412d0", - "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" - }, - { - "amount": 1750000000000, - "parent_coin_info": "0xae83525ba8d1dd3f09b277de18ca3e43000000000000000000000000001412cf", - "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" - }, - { - "amount": 250000000000, - "parent_coin_info": "0xfc0af20d20c4b3e92ef2a48bd291ccb2000000000000000000000000001412cf", - "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" - }, - { - "amount": 1750000000000, - "parent_coin_info": "0xae83525ba8d1dd3f09b277de18ca3e43000000000000000000000000001412ce", - "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" - }, - { - "amount": 250000000000, - "parent_coin_info": "0xfc0af20d20c4b3e92ef2a48bd291ccb2000000000000000000000000001412ce", - "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" - }, - { - "amount": 1750000000000, - "parent_coin_info": "0xae83525ba8d1dd3f09b277de18ca3e43000000000000000000000000001412cd", - "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" - }, - { - "amount": 250000000000, - "parent_coin_info": "0xfc0af20d20c4b3e92ef2a48bd291ccb2000000000000000000000000001412cd", - "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" - }, - { - "amount": 1750000000000, - "parent_coin_info": "0xae83525ba8d1dd3f09b277de18ca3e43000000000000000000000000001412cc", - "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" - }, - { - "amount": 250000000000, - "parent_coin_info": "0xfc0af20d20c4b3e92ef2a48bd291ccb2000000000000000000000000001412cc", - "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" - } - ] + { + "amount": 1750000000000, + "parent_coin_info": "0xae83525ba8d1dd3f09b277de18ca3e43000000000000000000000000001412cc", + "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" + }, + { + "amount": 250000000000, + "parent_coin_info": "0xfc0af20d20c4b3e92ef2a48bd291ccb2000000000000000000000000001412cc", + "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" } - }, - "success": true + ] + } + }, + "success": true } diff --git a/tests/tools/1315544.json b/tests/tools/1315544.json index de92f04e6efe..167389ce410f 100644 --- a/tests/tools/1315544.json +++ b/tests/tools/1315544.json @@ -1,160 +1,160 @@ { - "block": { - "challenge_chain_ip_proof": { - "normalized_to_identity": false, - "witness": "0x02007aedc85b75c186b66204578bed3ef68d1a58e597c197ec297e17a602dbf3bc760adbabc8e687b74d8e15d381828dce3ac87c2c120eaaf5a366cf982ad8243777c97fda90387876fa558f4c92bcccd4bb00d36e0d87713de66fb7dd34bf4975820100000000000001d3f8b8bb12cb76abea15ca656066e1bcf29042a7b724427a3c1b8a5cca54c8338bc64b00005ecece6042713ddfb7d4a29a32ec798c1df22fd841c7c8d6d33ba1e1465378b6d8c7a8bbe5194fd4d1bad3651743dcf4e69b0105a1f503a14726967e88820027f921fe7959e640dbb5e2424465ce5ff92077566595d1e4c0a9b9e8d5f97f1e2702000000000000057be89b9ec62ed508b05becdee28a59fe05dbc9fec72a3ed5d196693f0afb189e22afd902004cfd89cc5139d948f2c00a994fa81be5af5ed7a915e25539feb1127e32eec727c021a778539a5125c1843f29dbdded93819470695c03d69e186dbbd82c8f4c52090d5ff8c178bbf72b8ccb1652083ec6b27561587e7fe24f254b57e526be243a0100", - "witness_type": 2 + "block": { + "challenge_chain_ip_proof": { + "normalized_to_identity": false, + "witness": "0x02007aedc85b75c186b66204578bed3ef68d1a58e597c197ec297e17a602dbf3bc760adbabc8e687b74d8e15d381828dce3ac87c2c120eaaf5a366cf982ad8243777c97fda90387876fa558f4c92bcccd4bb00d36e0d87713de66fb7dd34bf4975820100000000000001d3f8b8bb12cb76abea15ca656066e1bcf29042a7b724427a3c1b8a5cca54c8338bc64b00005ecece6042713ddfb7d4a29a32ec798c1df22fd841c7c8d6d33ba1e1465378b6d8c7a8bbe5194fd4d1bad3651743dcf4e69b0105a1f503a14726967e88820027f921fe7959e640dbb5e2424465ce5ff92077566595d1e4c0a9b9e8d5f97f1e2702000000000000057be89b9ec62ed508b05becdee28a59fe05dbc9fec72a3ed5d196693f0afb189e22afd902004cfd89cc5139d948f2c00a994fa81be5af5ed7a915e25539feb1127e32eec727c021a778539a5125c1843f29dbdded93819470695c03d69e186dbbd82c8f4c52090d5ff8c178bbf72b8ccb1652083ec6b27561587e7fe24f254b57e526be243a0100", + "witness_type": 2 + }, + "challenge_chain_sp_proof": { + "normalized_to_identity": false, + "witness": "0x03002de4eac0fa7912866e9d36948a092f34b35c1da1c21962a01027a2db7871932e599223cac3e8249b451c1093624467e46fa14e6422f718ce3960eab22a03f716b35fa1208381ea910681bbe7a38e6de443508b94283f9147edbb51aea8d60500020100000000000331f8f089f2e65a19709a02dbd108d496a160dccfe74a43ea8eba9d917701eec2b84e61030029b3356c9028f7be41b3a91b1b83f0c6fdb710676b6559f3f376c94139c26521c4ee7e606feb88080f0b9ed38b4c74b7318633f49be9013d9af5a4f131248451b78d415152891a2feb1a371ce06984bbe6ba3b8d3514979573120ad7a9828a10010000000000000995e8c3f5034f2d31c89bce47c6339d5427817ab1ef401fa3a97e55333f99c4217b40d90300e0ed4159e0edb6705b45340d2a8849d7f83a7d2461f74aa3108dcfa584b078fedbc18abde0d9446dfd0a95c3befcd6c35b1e2d4d8bcbed59fe2532a4760ffd088da2d2d1fc5c871dccc41ef60e2ea15e87b5fee7ccf4c9a4b97be37598143f110100", + "witness_type": 2 + }, + "finished_sub_slots": [], + "foliage": { + "foliage_block_data": { + "extension_data": "0x0000000000000000000000000000000000000000000000000000000003a2c7c9", + "farmer_reward_puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a", + "pool_signature": "0xaa45d1e88901ba0a662ec208cae94b84f95f48b98f910863509f3f8cac05d5e38bc75903e5d913f005ae911e9096f8770ccce9b471f75b97d0ba627784d21f7ce334080fe61f97d618a9a88dde703d5a4445af9c0bd29240bc653e5cddc61217", + "pool_target": { + "max_height": 0, + "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" }, - "challenge_chain_sp_proof": { - "normalized_to_identity": false, - "witness": "0x03002de4eac0fa7912866e9d36948a092f34b35c1da1c21962a01027a2db7871932e599223cac3e8249b451c1093624467e46fa14e6422f718ce3960eab22a03f716b35fa1208381ea910681bbe7a38e6de443508b94283f9147edbb51aea8d60500020100000000000331f8f089f2e65a19709a02dbd108d496a160dccfe74a43ea8eba9d917701eec2b84e61030029b3356c9028f7be41b3a91b1b83f0c6fdb710676b6559f3f376c94139c26521c4ee7e606feb88080f0b9ed38b4c74b7318633f49be9013d9af5a4f131248451b78d415152891a2feb1a371ce06984bbe6ba3b8d3514979573120ad7a9828a10010000000000000995e8c3f5034f2d31c89bce47c6339d5427817ab1ef401fa3a97e55333f99c4217b40d90300e0ed4159e0edb6705b45340d2a8849d7f83a7d2461f74aa3108dcfa584b078fedbc18abde0d9446dfd0a95c3befcd6c35b1e2d4d8bcbed59fe2532a4760ffd088da2d2d1fc5c871dccc41ef60e2ea15e87b5fee7ccf4c9a4b97be37598143f110100", - "witness_type": 2 + "unfinished_reward_block_hash": "0x9120b0cdb1c54b045168cfa4409e1a9a59cbc2e3383b0e9cc8de35e9354c7730" + }, + "foliage_block_data_signature": "0xa97ec30d2627e06e0d79b2c88355e26103ed885ec3415bc2a366da4143b7b46eeb3561808214c2232f5191a4ba49ea2c0112be0bb865a3c65fb66fbb79f28f4640f5b819765b11106bfa9ce06bc6397898cf214e8b5cf4029865052b4d46a72b", + "foliage_transaction_block_hash": "0x2b3cc6a12f9512888c310f8926be4d5d7118460f7fe12e5bc4920599d521aaca", + "foliage_transaction_block_signature": "0xb7076976a0c91ea7da83b70b3267d3c20bfb69e5ccf15fa1c6f5a6bf7408ce2a4a8a52a90968149de6297abb1e884d8c08c4d6608824bc8ecd6d685683dbda9e1a310424beb55adfeb9586c1224910f8cd3bbd0824bea38ecaa93d3d654543a9", + "prev_block_hash": "0x5816b892f05f6c4d0c40a09275beac090138b296fa9422f1038f50a801b62229", + "reward_block_hash": "0xf6c0970f8cd5825b970da4f5894a9b23720f33be4437c75cb67ada31aadee334" + }, + "foliage_transaction_block": { + "additions_root": "0xbc80cd9d1394534186bbe9b71a1ab68e3fae050bc6c4ad8281460f97120cc693", + "filter_hash": "0x1e6709e4fbfef451d79257f997a99842ba89f022c6a85063fe93b4e0953be167", + "prev_transaction_block_hash": "0x622cd27b0610068187f1640846a9d6249e259b18e1c8b46b9fe607259c0f9ea8", + "removals_root": "0x9aa0a44986af3fa01f379a9c145802f1c95c124224f8fb156e8233e634f7038c", + "timestamp": 1659024114, + "transactions_info_hash": "0x1a548b2f098a1bfc123a22e0b0edcae39df0e1a594794e49e20ffe1fa1e4290f" + }, + "infused_challenge_chain_ip_proof": { + "normalized_to_identity": false, + "witness": "0x0100416f0e83532b8cde385b21bb70727e25b2fc48d1b89152034baf94e5f866d2ec0061b9a01f2628d6dbc957d550fcb945497c2c4771bebcc7a61091c0cb09ac07368ab01f3aa2800d666143e21633265c8f94a945108753f714407237d260930c0201000000000001d3f8bbe722e3831055ec311174978a9b84327062310b625c62c7c4ce7deca4ec3f748b0000683ac41a92dfa0e611f086c7ca3c31c4bbbeacf099cfd51338f970526623f65b8c6911f32cbd277544ec248892ed115b04653511c7bf8b0b1f55ab8987527a6d5fc37ccf369b79ebc802a521bbb50c018366f5e641221906b39f36598fec523801000000000000057be887a78cdf8cd2d7ecfc1ea9d4e738319f23004a99a12815f5ce8c94ceb2cd03075300008005a7052acd9cf1a3f125de6957b29d64ef767d050722e237ebd11386d7782be2310b1bc7901f96ad93953210720e242e0d57300e0eeee59dc20d3540c4610edf0883df7eee058125a1b29197c5890804b3b0923fa8b7e102cf300b4369710a0100", + "witness_type": 2 + }, + "reward_chain_block": { + "challenge_chain_ip_vdf": { + "challenge": "0x77c90715190e779d8442c57f05d4ba078d1b2c97c5014d6506e40b724690218a", + "number_of_iterations": 36209621, + "output": { + "data": "0x0000c876c63bba0e8618c9531ba66f889dfb87a7b328aac439306486172c46de7d0da36052db2bd22463a87e6e57129f93d250e040f9ac84081580dd38c662eab118331150c3d30a9efc14294ee7d888c3065893369fd148609da8b30e028fd6b8370100" + } + }, + "challenge_chain_sp_signature": "0x92fb7c700fc1296dea0376b66621b216c29cabeea4152693392a5fa18402f5e31b644746252ead1be28d220c14e561180099dadf10f80b38f7ea2e80b494680c0cbdf14f29a3e89e1eb247e47e47c6439b1ec4d459a47da511bb6e67cf5668b5", + "challenge_chain_sp_vdf": { + "challenge": "0x77c90715190e779d8442c57f05d4ba078d1b2c97c5014d6506e40b724690218a", + "number_of_iterations": 32784384, + "output": { + "data": "0x0300f6ac4feb3f4d5c35892002d949712ab3a02d3130113965682b2f007718ad6b8b238fdcececa802ad2c109301d9f2119e52d30149d2567f90f43fe69e1806a74eed39ed02e40f0f50bef10b1ab72a9455eb12d2d97bfb3b93a3dbc0904073d5520100" + } + }, + "height": 1315544, + "infused_challenge_chain_ip_vdf": { + "challenge": "0x5925b3525b03e39b034766d2207dbe59a93ad650e716b37b3df80ce73292dd3d", + "number_of_iterations": 539174, + "output": { + "data": "0x0100ced7f17425173bf073963c7b45bf6fa331ad26ae9d5ca91581417cd6c5eeaad0fc7407b663c8956d65b4962449b57c2a07b765ed10b4927d110333590297985703453a0b6eb0a48b645e53368fb76b5794cf68864ec7ca6e1eccb30d3675391d0100" + } + }, + "is_transaction_block": true, + "pos_ss_cc_challenge_hash": "0x77c90715190e779d8442c57f05d4ba078d1b2c97c5014d6506e40b724690218a", + "proof_of_space": { + "challenge": "0x0a04e2874d668c9bbed374dfcff74f5cb33a592c1df12ad5ebbbf4b97a4622f0", + "plot_public_key": "0xb92f2c3a8f2171caf2a2c6cdec18a0e55d8a35af5052dc6e77d97eab717a059a92620848b432ce8f29a73dcbe19565de", + "pool_contract_puzzle_hash": null, + "pool_public_key": "0xa932882ec9c6c20bc843ddd09592dadf293fdbb2523d92e08c5c536fee5d60678613dec909053a0f41a03fcb787b97d2", + "proof": "0xa8379712afbfcd3bda3fac63e295d038926c44e29c1e04b29f2dcbe7bce5b5ed2db88c8f2d9dc414367014b4ceb82d14b7efe1952345a8f18c6b2a64b23ac39ed6fb61891b74414f189ecc13e9f5a39a4477ad0d4506a8ad585d5aa301a2b0e303a33ae316dbb27213a2fefb3fb6afba00d7db6c5d7e9e39a9370ca3a1cd43226f314e9200824b8c8be64658659e2aa4cebd147e1e142f283f30c22af418be9f33f42208bb427536ba8626d3d07b7ed0188bec22ad17c18f47a293ae8917d516b99d3d8004f0c7c6b4e345e78d9dd6e11ffa013517ee40d8e237f8de69c78ae0103a1714fcbb344e0e81ca832e47527af939c426d3e65e8b02e8fc5c7dffb600", + "size": 32 + }, + "reward_chain_ip_vdf": { + "challenge": "0x8c7e3d014fae9088b459f61671b3bdd2911ebdf4dd7b2add569a3ffbaa3c1ec5", + "number_of_iterations": 539174, + "output": { + "data": "0x0300484cb9611527d860385b1adbf4da704ef099dd843bfabf6dfddaa4593f4fc12584e14a4d84e46729f9309e45304fd47cc8ef5aa04d7e7fc64a1899db8aeffb009b5bdd03d512cb37bbf70443a6790a7b6b47be23d392fafbc751c68361d990070100" + } + }, + "reward_chain_sp_signature": "0xa8d8b1d4a6f4a99138b5b51b8590c0882d022af2205eed354c89887b70ae9b06ea86a0f705dbc121bde84d6ba261ba7d06823c36b1a6a8fb98099cbd9ebf19bf328deeee2c6835844c3c82e372cba8fc8489b959d90e71c9beb6552f0e65764c", + "reward_chain_sp_vdf": { + "challenge": "0xabd0db9abdf5587a3aa7476402a4ea7c5058c7e14f6ad6b12ff705b3cfd9ff26", + "number_of_iterations": 942342, + "output": { + "data": "0x00001f1c422add02c3823437e38833977d16bfea93aa2d8add8eaa85eb67451521f791e1a95ef5c63ef528ae7696f2f2a03702cee83d8069c8233fd651b027b233208bc93fa1a97e8a2eccda14ff46d0c56dc9ed8c54cacb298653297145178503030100" + } + }, + "signage_point_index": 29, + "total_iters": 3017752216533, + "weight": 102735420468 + }, + "reward_chain_ip_proof": { + "normalized_to_identity": false, + "witness": "0x00005e1fc4ae798473ce7064a9e0ee2c5a9948e735200e659f451e3cff8c02eb4286767db58144b3f9391731e52ff6876753b5af81da24dc141759847e457f1b6738b7eeb16d842b255294e71a80bcf39b0f1bd4678f0a8d3c4230924fc4c6e668120100000000000001d3f8910e7b9a7b1a38021bd120264ceefc7ea759ade8675f3567aa28fb2bd5b57e14f30100fd6493c3654e24587abdd392027887f37d6549ab50b55e777ec7138f0ef5979df27c244b28c8a7ad45e94b1402ba01f08daba25f39a06dceeca5a2a53b83371c054a240029d5e5a6ad5142eaaf725cdfac9895884adeb091a358e9e9ed7b5a2601000000000000057be8f8a66710b9e84c9f3136d72cdf2bcf79ceac8b475ac69f1ed7fc9793e59a2bc5030300c4972a051e6a7b33722e542e650dc449b1d2b7fc4f397a046a9f9c2296f973d636a9ad8987b8d55f838a7c1445f9ebe739eae9eed6f05c4718fa969c0992db119b1c52a264e1e1228e3a8eb169ed944924bbee77dd6a29c6ffc1987bf6ea96060200", + "witness_type": 2 + }, + "reward_chain_sp_proof": { + "normalized_to_identity": false, + "witness": "0x0000490a24be3a2bc48c2f8ee07600e8c0fae7dac82bdd26aecc6f426f65e53538b12b2bed593a9da0aceda9a9704939be785bad49297288c9bb8f42fbab61787a04e8aa6e8dbfdf54a9efd43d20e307335e886d1cb972dd63bd345f017a755f2b0a030100000000000331f8e818a92f254b45b9342fa564deb36d20f694b4268a10ae80813d0d5032322dccbb0100f5413d6548c843979f89c78dfae4bdfc61b06823f5beb12621c1cf6737875498ef4bda0e210493ba1686388cc527bbf3bd4e72cad58a89301d6507150e2709279b9d5eef06a61fc72faf3ddf6442652fe0f68bfc309d1c7407be39df441b9c0e010000000000000995e8dd6b547b5e2417772a5addc90bc04d17beed1332624e2ee5f651788b41e82ee32d0100b5edbc74d2b8ea0f114876ffa0e541b0428a46db8cb88c5ee4a74c0654d6ba242d7affe4c7831a8395ce83df4dabd7b4fa9a2aa990b92d76806e60abeef9d827da32c10aa416aa16cb890c9780ff816ada911b77487053f957d0dd660e929b0f0200", + "witness_type": 2 + }, + "transactions_generator": "0xff01ffffffa06fb12ab32556537803112badcfaf828bfe1b79eb4181b3adc5d571680295ce6cffff02ffff01ff02ffff01ff02ff5effff04ff02ffff04ffff04ff05ffff04ffff0bff34ff0580ffff04ff0bff80808080ffff04ffff02ff17ff2f80ffff04ff5fffff04ffff02ff2effff04ff02ffff04ff17ff80808080ffff04ffff02ff2affff04ff02ffff04ff82027fffff04ff82057fffff04ff820b7fff808080808080ffff04ff81bfffff04ff82017fffff04ff8202ffffff04ff8205ffffff04ff820bffff80808080808080808080808080ffff04ffff01ffffffff3d46ff02ff333cffff0401ff01ff81cb02ffffff20ff02ffff03ff05ffff01ff02ff32ffff04ff02ffff04ff0dffff04ffff0bff7cffff0bff34ff2480ffff0bff7cffff0bff7cffff0bff34ff2c80ff0980ffff0bff7cff0bffff0bff34ff8080808080ff8080808080ffff010b80ff0180ffff02ffff03ffff22ffff09ffff0dff0580ff2280ffff09ffff0dff0b80ff2280ffff15ff17ffff0181ff8080ffff01ff0bff05ff0bff1780ffff01ff088080ff0180ffff02ffff03ff0bffff01ff02ffff03ffff09ffff02ff2effff04ff02ffff04ff13ff80808080ff820b9f80ffff01ff02ff56ffff04ff02ffff04ffff02ff13ffff04ff5fffff04ff17ffff04ff2fffff04ff81bfffff04ff82017fffff04ff1bff8080808080808080ffff04ff82017fff8080808080ffff01ff088080ff0180ffff01ff02ffff03ff17ffff01ff02ffff03ffff20ff81bf80ffff0182017fffff01ff088080ff0180ffff01ff088080ff018080ff0180ff04ffff04ff05ff2780ffff04ffff10ff0bff5780ff778080ffffff02ffff03ff05ffff01ff02ffff03ffff09ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff01818f80ffff01ff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ffff04ff81b9ff82017980ff808080808080ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff09ff11ff5880ffff01ff04ff58ffff04ffff02ff76ffff04ff02ffff04ff13ffff04ff29ffff04ffff0bff34ff5b80ffff04ff2bff80808080808080ff398080ffff01ff02ffff03ffff09ff11ff7880ffff01ff02ffff03ffff20ffff02ffff03ffff09ffff0121ffff0dff298080ffff01ff02ffff03ffff09ffff0cff29ff80ff3480ff5c80ffff01ff0101ff8080ff0180ff8080ff018080ffff0109ffff01ff088080ff0180ffff010980ff018080ff0180ffff04ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff04ffff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ff17ff808080808080ff80808080808080ff0180ffff01ff04ff80ffff04ff80ff17808080ff0180ffff02ffff03ff05ffff01ff04ff09ffff02ff56ffff04ff02ffff04ff0dffff04ff0bff808080808080ffff010b80ff0180ff0bff7cffff0bff34ff2880ffff0bff7cffff0bff7cffff0bff34ff2c80ff0580ffff0bff7cffff02ff32ffff04ff02ffff04ff07ffff04ffff0bff34ff3480ff8080808080ffff0bff34ff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ffff04ffff04ff30ffff04ff5fff808080ffff02ff7effff04ff02ffff04ffff04ffff04ff2fff0580ffff04ff5fff82017f8080ffff04ffff02ff26ffff04ff02ffff04ff0bffff04ff05ffff01ff808080808080ffff04ff17ffff04ff81bfffff04ff82017fffff04ffff02ff2affff04ff02ffff04ff8204ffffff04ffff02ff76ffff04ff02ffff04ff09ffff04ff820affffff04ffff0bff34ff2d80ffff04ff15ff80808080808080ffff04ff8216ffff808080808080ffff04ff8205ffffff04ff820bffff808080808080808080808080ff02ff5affff04ff02ffff04ff5fffff04ff3bffff04ffff02ffff03ff17ffff01ff09ff2dffff02ff2affff04ff02ffff04ff27ffff04ffff02ff76ffff04ff02ffff04ff29ffff04ff57ffff04ffff0bff34ff81b980ffff04ff59ff80808080808080ffff04ff81b7ff80808080808080ff8080ff0180ffff04ff17ffff04ff05ffff04ff8202ffffff04ffff04ffff04ff78ffff04ffff0eff5cffff02ff2effff04ff02ffff04ffff04ff2fffff04ff82017fff808080ff8080808080ff808080ffff04ffff04ff20ffff04ffff0bff81bfff5cffff02ff2effff04ff02ffff04ffff04ff15ffff04ffff10ff82017fffff11ff8202dfff2b80ff8202ff80ff808080ff8080808080ff808080ff138080ff80808080808080808080ff018080ffff04ffff01a037bef360ee858133b69d595a906dc45d01af50379dad515eb9518abb7c1d2a7affff04ffff01a0c2808f37e758b713150da4860091dd94a90a781bc4f18377d20de6291b3d506dffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b096d5723556450fd3b3949451236fcf84800a3b1b829e4edae22df94ec54216ac34e184a1a2c3330f6a9b3dbc31fded82ff018080ff0180808080ff830186a0ffffff80ffff01ffff33ffa00000000000000000000000000000000000000000000000000000000000000000ff8203e8ffffa000000000000000000000000000000000000000000000000000000000000000008080ffff33ffa08285f2bb7f25d016fd7e0a1530643325c3aca1cff2f26492a7ab7b5a76984fd7ff830182b880ffff3cffa0ecb775859b4c9e0ddd21f33f9d3d43e5950d531c782f1e78ed48cf1fcd75c8968080ff8080ffffa033d11293062a013d5f7e4f13796c62c754a08ad9d562be475d404bf3405406dbffa01a09c8036279722f2216bc3714c1bc7842b0f7983554a980eee10381bed0e1fdff830186a080ffa090941ac42b92aad0ed1de5d599d854072fcf1f4bb82cd37e365852f0a730cf5dffffa06fb12ab32556537803112badcfaf828bfe1b79eb4181b3adc5d571680295ce6cffa020a2284ec41cdcc3c54e6b44f8801db2dc28f3aa01c115674b598757d62f09a6ff830186a080ffffa06fb12ab32556537803112badcfaf828bfe1b79eb4181b3adc5d571680295ce6cffa01a09c8036279722f2216bc3714c1bc7842b0f7983554a980eee10381bed0e1fdff830186a080ff80ff808080ffffa033d11293062a013d5f7e4f13796c62c754a08ad9d562be475d404bf3405406dbffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0a3358a762212c56259fff1f36502a88866dc7cd2ec2d46b65ecead99f20bffa71a372400d09e25f38d60d1a5f13da67bff018080ff850095017260ffff80ffff01ffff33ffa00f2d3318aecaa2fc56085a1ce5f116dd15ad35b6ec925f1b9c316a528ae6fd75ff845966a86080ffff34ff843b9aca0080ffff3cffa05362c6bd592439ec58c3560dfdb3055d6520596f6943d903e83adeab6d48697080ffff3dffa0c622f22c7161b790044d77ef182a9f7c4dddeeb86c8924a39c11ec3ba62d87aa8080ff8080808080", + "transactions_generator_ref_list": [], + "transactions_info": { + "aggregated_signature": "0x88662bf0fa0279e02bb53dfedfb50bc5623206c12dab0797db795c237426a052011987b6e3c9b4bdac5234ee4b32cfd21607f7a9cca6728569ad890ee003afd7ec3564ac551382c90ddc52f861c7a8b3327c52a231a61eab5c8432e3323abf91", + "cost": 47903753, + "fees": 1000000000, + "generator_refs_root": "0x0101010101010101010101010101010101010101010101010101010101010101", + "generator_root": "0x00df7d78327d84ed6784e6fe14a8235cc18b807e9f9e8ebe430318034552cfbb", + "reward_claims_incorporated": [ + { + "amount": 1750000000000, + "parent_coin_info": "0xae83525ba8d1dd3f09b277de18ca3e43000000000000000000000000001412d5", + "puzzle_hash": "0xb21f91de153a292a4948159128601cce717ac2d7a01d1827efe21959638e0528" }, - "finished_sub_slots": [], - "foliage": { - "foliage_block_data": { - "extension_data": "0x0000000000000000000000000000000000000000000000000000000003a2c7c9", - "farmer_reward_puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a", - "pool_signature": "0xaa45d1e88901ba0a662ec208cae94b84f95f48b98f910863509f3f8cac05d5e38bc75903e5d913f005ae911e9096f8770ccce9b471f75b97d0ba627784d21f7ce334080fe61f97d618a9a88dde703d5a4445af9c0bd29240bc653e5cddc61217", - "pool_target": { - "max_height": 0, - "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" - }, - "unfinished_reward_block_hash": "0x9120b0cdb1c54b045168cfa4409e1a9a59cbc2e3383b0e9cc8de35e9354c7730" - }, - "foliage_block_data_signature": "0xa97ec30d2627e06e0d79b2c88355e26103ed885ec3415bc2a366da4143b7b46eeb3561808214c2232f5191a4ba49ea2c0112be0bb865a3c65fb66fbb79f28f4640f5b819765b11106bfa9ce06bc6397898cf214e8b5cf4029865052b4d46a72b", - "foliage_transaction_block_hash": "0x2b3cc6a12f9512888c310f8926be4d5d7118460f7fe12e5bc4920599d521aaca", - "foliage_transaction_block_signature": "0xb7076976a0c91ea7da83b70b3267d3c20bfb69e5ccf15fa1c6f5a6bf7408ce2a4a8a52a90968149de6297abb1e884d8c08c4d6608824bc8ecd6d685683dbda9e1a310424beb55adfeb9586c1224910f8cd3bbd0824bea38ecaa93d3d654543a9", - "prev_block_hash": "0x5816b892f05f6c4d0c40a09275beac090138b296fa9422f1038f50a801b62229", - "reward_block_hash": "0xf6c0970f8cd5825b970da4f5894a9b23720f33be4437c75cb67ada31aadee334" + { + "amount": 250000000001, + "parent_coin_info": "0xfc0af20d20c4b3e92ef2a48bd291ccb2000000000000000000000000001412d5", + "puzzle_hash": "0xec9d7c3abef4cb992e272c3faaf1514138218eeefd947fec37208c5e810d85b2" }, - "foliage_transaction_block": { - "additions_root": "0xbc80cd9d1394534186bbe9b71a1ab68e3fae050bc6c4ad8281460f97120cc693", - "filter_hash": "0x1e6709e4fbfef451d79257f997a99842ba89f022c6a85063fe93b4e0953be167", - "prev_transaction_block_hash": "0x622cd27b0610068187f1640846a9d6249e259b18e1c8b46b9fe607259c0f9ea8", - "removals_root": "0x9aa0a44986af3fa01f379a9c145802f1c95c124224f8fb156e8233e634f7038c", - "timestamp": 1659024114, - "transactions_info_hash": "0x1a548b2f098a1bfc123a22e0b0edcae39df0e1a594794e49e20ffe1fa1e4290f" + { + "amount": 1750000000000, + "parent_coin_info": "0xae83525ba8d1dd3f09b277de18ca3e43000000000000000000000000001412d4", + "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" }, - "infused_challenge_chain_ip_proof": { - "normalized_to_identity": false, - "witness": "0x0100416f0e83532b8cde385b21bb70727e25b2fc48d1b89152034baf94e5f866d2ec0061b9a01f2628d6dbc957d550fcb945497c2c4771bebcc7a61091c0cb09ac07368ab01f3aa2800d666143e21633265c8f94a945108753f714407237d260930c0201000000000001d3f8bbe722e3831055ec311174978a9b84327062310b625c62c7c4ce7deca4ec3f748b0000683ac41a92dfa0e611f086c7ca3c31c4bbbeacf099cfd51338f970526623f65b8c6911f32cbd277544ec248892ed115b04653511c7bf8b0b1f55ab8987527a6d5fc37ccf369b79ebc802a521bbb50c018366f5e641221906b39f36598fec523801000000000000057be887a78cdf8cd2d7ecfc1ea9d4e738319f23004a99a12815f5ce8c94ceb2cd03075300008005a7052acd9cf1a3f125de6957b29d64ef767d050722e237ebd11386d7782be2310b1bc7901f96ad93953210720e242e0d57300e0eeee59dc20d3540c4610edf0883df7eee058125a1b29197c5890804b3b0923fa8b7e102cf300b4369710a0100", - "witness_type": 2 + { + "amount": 250000000000, + "parent_coin_info": "0xfc0af20d20c4b3e92ef2a48bd291ccb2000000000000000000000000001412d4", + "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" }, - "reward_chain_block": { - "challenge_chain_ip_vdf": { - "challenge": "0x77c90715190e779d8442c57f05d4ba078d1b2c97c5014d6506e40b724690218a", - "number_of_iterations": 36209621, - "output": { - "data": "0x0000c876c63bba0e8618c9531ba66f889dfb87a7b328aac439306486172c46de7d0da36052db2bd22463a87e6e57129f93d250e040f9ac84081580dd38c662eab118331150c3d30a9efc14294ee7d888c3065893369fd148609da8b30e028fd6b8370100" - } - }, - "challenge_chain_sp_signature": "0x92fb7c700fc1296dea0376b66621b216c29cabeea4152693392a5fa18402f5e31b644746252ead1be28d220c14e561180099dadf10f80b38f7ea2e80b494680c0cbdf14f29a3e89e1eb247e47e47c6439b1ec4d459a47da511bb6e67cf5668b5", - "challenge_chain_sp_vdf": { - "challenge": "0x77c90715190e779d8442c57f05d4ba078d1b2c97c5014d6506e40b724690218a", - "number_of_iterations": 32784384, - "output": { - "data": "0x0300f6ac4feb3f4d5c35892002d949712ab3a02d3130113965682b2f007718ad6b8b238fdcececa802ad2c109301d9f2119e52d30149d2567f90f43fe69e1806a74eed39ed02e40f0f50bef10b1ab72a9455eb12d2d97bfb3b93a3dbc0904073d5520100" - } - }, - "height": 1315544, - "infused_challenge_chain_ip_vdf": { - "challenge": "0x5925b3525b03e39b034766d2207dbe59a93ad650e716b37b3df80ce73292dd3d", - "number_of_iterations": 539174, - "output": { - "data": "0x0100ced7f17425173bf073963c7b45bf6fa331ad26ae9d5ca91581417cd6c5eeaad0fc7407b663c8956d65b4962449b57c2a07b765ed10b4927d110333590297985703453a0b6eb0a48b645e53368fb76b5794cf68864ec7ca6e1eccb30d3675391d0100" - } - }, - "is_transaction_block": true, - "pos_ss_cc_challenge_hash": "0x77c90715190e779d8442c57f05d4ba078d1b2c97c5014d6506e40b724690218a", - "proof_of_space": { - "challenge": "0x0a04e2874d668c9bbed374dfcff74f5cb33a592c1df12ad5ebbbf4b97a4622f0", - "plot_public_key": "0xb92f2c3a8f2171caf2a2c6cdec18a0e55d8a35af5052dc6e77d97eab717a059a92620848b432ce8f29a73dcbe19565de", - "pool_contract_puzzle_hash": null, - "pool_public_key": "0xa932882ec9c6c20bc843ddd09592dadf293fdbb2523d92e08c5c536fee5d60678613dec909053a0f41a03fcb787b97d2", - "proof": "0xa8379712afbfcd3bda3fac63e295d038926c44e29c1e04b29f2dcbe7bce5b5ed2db88c8f2d9dc414367014b4ceb82d14b7efe1952345a8f18c6b2a64b23ac39ed6fb61891b74414f189ecc13e9f5a39a4477ad0d4506a8ad585d5aa301a2b0e303a33ae316dbb27213a2fefb3fb6afba00d7db6c5d7e9e39a9370ca3a1cd43226f314e9200824b8c8be64658659e2aa4cebd147e1e142f283f30c22af418be9f33f42208bb427536ba8626d3d07b7ed0188bec22ad17c18f47a293ae8917d516b99d3d8004f0c7c6b4e345e78d9dd6e11ffa013517ee40d8e237f8de69c78ae0103a1714fcbb344e0e81ca832e47527af939c426d3e65e8b02e8fc5c7dffb600", - "size": 32 - }, - "reward_chain_ip_vdf": { - "challenge": "0x8c7e3d014fae9088b459f61671b3bdd2911ebdf4dd7b2add569a3ffbaa3c1ec5", - "number_of_iterations": 539174, - "output": { - "data": "0x0300484cb9611527d860385b1adbf4da704ef099dd843bfabf6dfddaa4593f4fc12584e14a4d84e46729f9309e45304fd47cc8ef5aa04d7e7fc64a1899db8aeffb009b5bdd03d512cb37bbf70443a6790a7b6b47be23d392fafbc751c68361d990070100" - } - }, - "reward_chain_sp_signature": "0xa8d8b1d4a6f4a99138b5b51b8590c0882d022af2205eed354c89887b70ae9b06ea86a0f705dbc121bde84d6ba261ba7d06823c36b1a6a8fb98099cbd9ebf19bf328deeee2c6835844c3c82e372cba8fc8489b959d90e71c9beb6552f0e65764c", - "reward_chain_sp_vdf": { - "challenge": "0xabd0db9abdf5587a3aa7476402a4ea7c5058c7e14f6ad6b12ff705b3cfd9ff26", - "number_of_iterations": 942342, - "output": { - "data": "0x00001f1c422add02c3823437e38833977d16bfea93aa2d8add8eaa85eb67451521f791e1a95ef5c63ef528ae7696f2f2a03702cee83d8069c8233fd651b027b233208bc93fa1a97e8a2eccda14ff46d0c56dc9ed8c54cacb298653297145178503030100" - } - }, - "signage_point_index": 29, - "total_iters": 3017752216533, - "weight": 102735420468 + { + "amount": 1750000000000, + "parent_coin_info": "0xae83525ba8d1dd3f09b277de18ca3e43000000000000000000000000001412d3", + "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" }, - "reward_chain_ip_proof": { - "normalized_to_identity": false, - "witness": "0x00005e1fc4ae798473ce7064a9e0ee2c5a9948e735200e659f451e3cff8c02eb4286767db58144b3f9391731e52ff6876753b5af81da24dc141759847e457f1b6738b7eeb16d842b255294e71a80bcf39b0f1bd4678f0a8d3c4230924fc4c6e668120100000000000001d3f8910e7b9a7b1a38021bd120264ceefc7ea759ade8675f3567aa28fb2bd5b57e14f30100fd6493c3654e24587abdd392027887f37d6549ab50b55e777ec7138f0ef5979df27c244b28c8a7ad45e94b1402ba01f08daba25f39a06dceeca5a2a53b83371c054a240029d5e5a6ad5142eaaf725cdfac9895884adeb091a358e9e9ed7b5a2601000000000000057be8f8a66710b9e84c9f3136d72cdf2bcf79ceac8b475ac69f1ed7fc9793e59a2bc5030300c4972a051e6a7b33722e542e650dc449b1d2b7fc4f397a046a9f9c2296f973d636a9ad8987b8d55f838a7c1445f9ebe739eae9eed6f05c4718fa969c0992db119b1c52a264e1e1228e3a8eb169ed944924bbee77dd6a29c6ffc1987bf6ea96060200", - "witness_type": 2 + { + "amount": 250000000000, + "parent_coin_info": "0xfc0af20d20c4b3e92ef2a48bd291ccb2000000000000000000000000001412d3", + "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" }, - "reward_chain_sp_proof": { - "normalized_to_identity": false, - "witness": "0x0000490a24be3a2bc48c2f8ee07600e8c0fae7dac82bdd26aecc6f426f65e53538b12b2bed593a9da0aceda9a9704939be785bad49297288c9bb8f42fbab61787a04e8aa6e8dbfdf54a9efd43d20e307335e886d1cb972dd63bd345f017a755f2b0a030100000000000331f8e818a92f254b45b9342fa564deb36d20f694b4268a10ae80813d0d5032322dccbb0100f5413d6548c843979f89c78dfae4bdfc61b06823f5beb12621c1cf6737875498ef4bda0e210493ba1686388cc527bbf3bd4e72cad58a89301d6507150e2709279b9d5eef06a61fc72faf3ddf6442652fe0f68bfc309d1c7407be39df441b9c0e010000000000000995e8dd6b547b5e2417772a5addc90bc04d17beed1332624e2ee5f651788b41e82ee32d0100b5edbc74d2b8ea0f114876ffa0e541b0428a46db8cb88c5ee4a74c0654d6ba242d7affe4c7831a8395ce83df4dabd7b4fa9a2aa990b92d76806e60abeef9d827da32c10aa416aa16cb890c9780ff816ada911b77487053f957d0dd660e929b0f0200", - "witness_type": 2 + { + "amount": 1750000000000, + "parent_coin_info": "0xae83525ba8d1dd3f09b277de18ca3e43000000000000000000000000001412d2", + "puzzle_hash": "0xd8a339fbb28da3dd446519abdce314c067313c7955a321bf6c84717b91e18761" }, - "transactions_generator": "0xff01ffffffa06fb12ab32556537803112badcfaf828bfe1b79eb4181b3adc5d571680295ce6cffff02ffff01ff02ffff01ff02ff5effff04ff02ffff04ffff04ff05ffff04ffff0bff34ff0580ffff04ff0bff80808080ffff04ffff02ff17ff2f80ffff04ff5fffff04ffff02ff2effff04ff02ffff04ff17ff80808080ffff04ffff02ff2affff04ff02ffff04ff82027fffff04ff82057fffff04ff820b7fff808080808080ffff04ff81bfffff04ff82017fffff04ff8202ffffff04ff8205ffffff04ff820bffff80808080808080808080808080ffff04ffff01ffffffff3d46ff02ff333cffff0401ff01ff81cb02ffffff20ff02ffff03ff05ffff01ff02ff32ffff04ff02ffff04ff0dffff04ffff0bff7cffff0bff34ff2480ffff0bff7cffff0bff7cffff0bff34ff2c80ff0980ffff0bff7cff0bffff0bff34ff8080808080ff8080808080ffff010b80ff0180ffff02ffff03ffff22ffff09ffff0dff0580ff2280ffff09ffff0dff0b80ff2280ffff15ff17ffff0181ff8080ffff01ff0bff05ff0bff1780ffff01ff088080ff0180ffff02ffff03ff0bffff01ff02ffff03ffff09ffff02ff2effff04ff02ffff04ff13ff80808080ff820b9f80ffff01ff02ff56ffff04ff02ffff04ffff02ff13ffff04ff5fffff04ff17ffff04ff2fffff04ff81bfffff04ff82017fffff04ff1bff8080808080808080ffff04ff82017fff8080808080ffff01ff088080ff0180ffff01ff02ffff03ff17ffff01ff02ffff03ffff20ff81bf80ffff0182017fffff01ff088080ff0180ffff01ff088080ff018080ff0180ff04ffff04ff05ff2780ffff04ffff10ff0bff5780ff778080ffffff02ffff03ff05ffff01ff02ffff03ffff09ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff01818f80ffff01ff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ffff04ff81b9ff82017980ff808080808080ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff09ff11ff5880ffff01ff04ff58ffff04ffff02ff76ffff04ff02ffff04ff13ffff04ff29ffff04ffff0bff34ff5b80ffff04ff2bff80808080808080ff398080ffff01ff02ffff03ffff09ff11ff7880ffff01ff02ffff03ffff20ffff02ffff03ffff09ffff0121ffff0dff298080ffff01ff02ffff03ffff09ffff0cff29ff80ff3480ff5c80ffff01ff0101ff8080ff0180ff8080ff018080ffff0109ffff01ff088080ff0180ffff010980ff018080ff0180ffff04ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff04ffff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ff17ff808080808080ff80808080808080ff0180ffff01ff04ff80ffff04ff80ff17808080ff0180ffff02ffff03ff05ffff01ff04ff09ffff02ff56ffff04ff02ffff04ff0dffff04ff0bff808080808080ffff010b80ff0180ff0bff7cffff0bff34ff2880ffff0bff7cffff0bff7cffff0bff34ff2c80ff0580ffff0bff7cffff02ff32ffff04ff02ffff04ff07ffff04ffff0bff34ff3480ff8080808080ffff0bff34ff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ffff04ffff04ff30ffff04ff5fff808080ffff02ff7effff04ff02ffff04ffff04ffff04ff2fff0580ffff04ff5fff82017f8080ffff04ffff02ff26ffff04ff02ffff04ff0bffff04ff05ffff01ff808080808080ffff04ff17ffff04ff81bfffff04ff82017fffff04ffff02ff2affff04ff02ffff04ff8204ffffff04ffff02ff76ffff04ff02ffff04ff09ffff04ff820affffff04ffff0bff34ff2d80ffff04ff15ff80808080808080ffff04ff8216ffff808080808080ffff04ff8205ffffff04ff820bffff808080808080808080808080ff02ff5affff04ff02ffff04ff5fffff04ff3bffff04ffff02ffff03ff17ffff01ff09ff2dffff02ff2affff04ff02ffff04ff27ffff04ffff02ff76ffff04ff02ffff04ff29ffff04ff57ffff04ffff0bff34ff81b980ffff04ff59ff80808080808080ffff04ff81b7ff80808080808080ff8080ff0180ffff04ff17ffff04ff05ffff04ff8202ffffff04ffff04ffff04ff78ffff04ffff0eff5cffff02ff2effff04ff02ffff04ffff04ff2fffff04ff82017fff808080ff8080808080ff808080ffff04ffff04ff20ffff04ffff0bff81bfff5cffff02ff2effff04ff02ffff04ffff04ff15ffff04ffff10ff82017fffff11ff8202dfff2b80ff8202ff80ff808080ff8080808080ff808080ff138080ff80808080808080808080ff018080ffff04ffff01a037bef360ee858133b69d595a906dc45d01af50379dad515eb9518abb7c1d2a7affff04ffff01a0c2808f37e758b713150da4860091dd94a90a781bc4f18377d20de6291b3d506dffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b096d5723556450fd3b3949451236fcf84800a3b1b829e4edae22df94ec54216ac34e184a1a2c3330f6a9b3dbc31fded82ff018080ff0180808080ff830186a0ffffff80ffff01ffff33ffa00000000000000000000000000000000000000000000000000000000000000000ff8203e8ffffa000000000000000000000000000000000000000000000000000000000000000008080ffff33ffa08285f2bb7f25d016fd7e0a1530643325c3aca1cff2f26492a7ab7b5a76984fd7ff830182b880ffff3cffa0ecb775859b4c9e0ddd21f33f9d3d43e5950d531c782f1e78ed48cf1fcd75c8968080ff8080ffffa033d11293062a013d5f7e4f13796c62c754a08ad9d562be475d404bf3405406dbffa01a09c8036279722f2216bc3714c1bc7842b0f7983554a980eee10381bed0e1fdff830186a080ffa090941ac42b92aad0ed1de5d599d854072fcf1f4bb82cd37e365852f0a730cf5dffffa06fb12ab32556537803112badcfaf828bfe1b79eb4181b3adc5d571680295ce6cffa020a2284ec41cdcc3c54e6b44f8801db2dc28f3aa01c115674b598757d62f09a6ff830186a080ffffa06fb12ab32556537803112badcfaf828bfe1b79eb4181b3adc5d571680295ce6cffa01a09c8036279722f2216bc3714c1bc7842b0f7983554a980eee10381bed0e1fdff830186a080ff80ff808080ffffa033d11293062a013d5f7e4f13796c62c754a08ad9d562be475d404bf3405406dbffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0a3358a762212c56259fff1f36502a88866dc7cd2ec2d46b65ecead99f20bffa71a372400d09e25f38d60d1a5f13da67bff018080ff850095017260ffff80ffff01ffff33ffa00f2d3318aecaa2fc56085a1ce5f116dd15ad35b6ec925f1b9c316a528ae6fd75ff845966a86080ffff34ff843b9aca0080ffff3cffa05362c6bd592439ec58c3560dfdb3055d6520596f6943d903e83adeab6d48697080ffff3dffa0c622f22c7161b790044d77ef182a9f7c4dddeeb86c8924a39c11ec3ba62d87aa8080ff8080808080", - "transactions_generator_ref_list": [], - "transactions_info": { - "aggregated_signature": "0x88662bf0fa0279e02bb53dfedfb50bc5623206c12dab0797db795c237426a052011987b6e3c9b4bdac5234ee4b32cfd21607f7a9cca6728569ad890ee003afd7ec3564ac551382c90ddc52f861c7a8b3327c52a231a61eab5c8432e3323abf91", - "cost": 47903753, - "fees": 1000000000, - "generator_refs_root": "0x0101010101010101010101010101010101010101010101010101010101010101", - "generator_root": "0x00df7d78327d84ed6784e6fe14a8235cc18b807e9f9e8ebe430318034552cfbb", - "reward_claims_incorporated": [ - { - "amount": 1750000000000, - "parent_coin_info": "0xae83525ba8d1dd3f09b277de18ca3e43000000000000000000000000001412d5", - "puzzle_hash": "0xb21f91de153a292a4948159128601cce717ac2d7a01d1827efe21959638e0528" - }, - { - "amount": 250000000001, - "parent_coin_info": "0xfc0af20d20c4b3e92ef2a48bd291ccb2000000000000000000000000001412d5", - "puzzle_hash": "0xec9d7c3abef4cb992e272c3faaf1514138218eeefd947fec37208c5e810d85b2" - }, - { - "amount": 1750000000000, - "parent_coin_info": "0xae83525ba8d1dd3f09b277de18ca3e43000000000000000000000000001412d4", - "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" - }, - { - "amount": 250000000000, - "parent_coin_info": "0xfc0af20d20c4b3e92ef2a48bd291ccb2000000000000000000000000001412d4", - "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" - }, - { - "amount": 1750000000000, - "parent_coin_info": "0xae83525ba8d1dd3f09b277de18ca3e43000000000000000000000000001412d3", - "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" - }, - { - "amount": 250000000000, - "parent_coin_info": "0xfc0af20d20c4b3e92ef2a48bd291ccb2000000000000000000000000001412d3", - "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" - }, - { - "amount": 1750000000000, - "parent_coin_info": "0xae83525ba8d1dd3f09b277de18ca3e43000000000000000000000000001412d2", - "puzzle_hash": "0xd8a339fbb28da3dd446519abdce314c067313c7955a321bf6c84717b91e18761" - }, - { - "amount": 250000000000, - "parent_coin_info": "0xfc0af20d20c4b3e92ef2a48bd291ccb2000000000000000000000000001412d2", - "puzzle_hash": "0xda5542ace1d90fd6cf9f7e74c0db2a4d75c15cd883984737c2776401fe16c053" - } - ] + { + "amount": 250000000000, + "parent_coin_info": "0xfc0af20d20c4b3e92ef2a48bd291ccb2000000000000000000000000001412d2", + "puzzle_hash": "0xda5542ace1d90fd6cf9f7e74c0db2a4d75c15cd883984737c2776401fe16c053" } - }, - "success": true + ] + } + }, + "success": true } diff --git a/tests/tools/1315630.json b/tests/tools/1315630.json index 1c668299bfad..41ff3182f824 100644 --- a/tests/tools/1315630.json +++ b/tests/tools/1315630.json @@ -1,150 +1,150 @@ { - "block": { - "challenge_chain_ip_proof": { - "normalized_to_identity": false, - "witness": "0x0000cd59d4df0ae6ce20beceec26050b78ba4681efeef2d69799ce8b3cce9dc5d1f7d1106d333592c03ad388ef989daea3a334c92981296e315f352f01601b1d2739acb73462e0dd63e18599cd7c1005b00c8dce4529f28fa0406d4f3e51c5705a4302000000000000052b70f1d6d53996ff0dc6b7caa7aa5ef9feaf92ce59190da8d270bad0806a2818d82c3901005a3fa8f01a9a9be74daa759a216b9cc2a5fc603dbf97be00f1441c7c6d2d48b4b5a08ef61573340e1a3a9e245b78d1d9000e65611568395eecbb54c1624afc1c91490ab7c716fe0e64cf16b5e60b162434c73bd6691e11263fe0a47d751cb614030000000000000f8250c73a9a38280688b87c5c9b9ec06b29bcf471b266734e39438e49ac3ee561508b7903000adddf11c1e50ffb8b7096c21649e438e3f6eecaf8ab642dd9a1ae80a4f73aef61b5996981f23ffc60695b941595ea62e3859e4a0f12b40c9d0d209fe27940719dce87fd6dcffad6c9886ab6dd17b32201aee61b24ce46046ceb97b14e2f2d700100", - "witness_type": 2 - }, - "challenge_chain_sp_proof": { - "normalized_to_identity": false, - "witness": "0x030082684bda614fff7fe0ff34652d24bc17b6f1ea3ed202c38b40eed281c0877d7ea5416443a4c6b11f567ebad6ffa92f1f15d7d693b625bef52268e7ae9e5f7c31d3d9d2a111b9473b50b71fc3d2dc6f1ab00ec0a2e9a1f46ea12b702afd5a500601000000000000011300e17c99c0c6788f9cdac23f669e3bb8108b4dad96ef130a0e8c5c8e10b626cfd99f020022adf9d6e15563765b5db6b5cc4c38c7c6eb476134de7e7ff5a4b8badff0646f09126c24e43c39e671f4da070eba93138e4a3e96e46836202d1ab08e9d3a13095ba135901c67de22f30b2da249677bb9780c4ca2ca4ff1a8f390fa9a01dd30070b08000000000003396491a08353a1578cd0a3d46bbba9d2aff6d760a3cb86359af8a5bb850a7dc05da03f030022665d4ea2ebee37d6dfd2c97222ecdecc04657a8283d8543ca6f51c3f33fd15448481e32a8137b3e416386e1f59e416e71c4a56ed01ad7fb0da233c4216e92bf97f6a2d0ce432f04cf68fd0acfbe4b1226b287308adab5c56615e3535a4f2060201", - "witness_type": 2 - }, - "finished_sub_slots": [], - "foliage": { - "foliage_block_data": { - "extension_data": "0x0000000000000000000000000000000000000000000000000000000003a2c7c9", - "farmer_reward_puzzle_hash": "0x04b42f5809bb6c732edd39bde34a5dc01cbd7da9d71c48ba782222009f7aa69c", - "pool_signature": "0xabcb0fe0f2cbdc740cc196cab62364622896e01c2c7769da18ba102ade3a6428978c4addb80e9d0804db5eb00d9c94aa17ad66cf0acea8844352e9d0a94fe18fcdb327c6a1ba848b2ecb06c8a7b66692b5bb983f1d6178017425005b2274a001", - "pool_target": { - "max_height": 0, - "puzzle_hash": "0x04b42f5809bb6c732edd39bde34a5dc01cbd7da9d71c48ba782222009f7aa69c" - }, - "unfinished_reward_block_hash": "0xc88079061bbf62f9a8062a35166252afa348df2a3d87c2e25bdea035fb13c15a" - }, - "foliage_block_data_signature": "0x8727f05260ac9d34813074e48ff83847c93dad473731cfbdba93ab0f7dd38b3cc5580b9aa35526cefbc05e20e9a76e4005bbff838f04311dae08d1cfc5ee6d38387b13748d022379d54905c9765ee7c11b9e938ead7d236f4c23296e691142ef", - "foliage_transaction_block_hash": "0xaaf12a2522ee70353bc2deb2294a24cd20edfb50a57bbd430377a385da2a801d", - "foliage_transaction_block_signature": "0x8f9c5cd8dea46b8838e582f14c10b1207432adbe72f647c10c5c3afa3bce9edf34c015c8d72182a4b7db7e6ba0eeb40f0080bbf6f9e8986c8edb0f0439ac7ad5ee9a9e1d77f7e4b35ddba3228a488f9c91a1ddfc38760373aaf13fdd565105d3", - "prev_block_hash": "0xe6af538418759cf2782bed6b5dc83b521e246b84fdca2ef6619a1921bbb058fc", - "reward_block_hash": "0xe48ebe4db08d3f1723c79a910f4713a2f104ea97776a2fe1423e333e0fe2410c" + "block": { + "challenge_chain_ip_proof": { + "normalized_to_identity": false, + "witness": "0x0000cd59d4df0ae6ce20beceec26050b78ba4681efeef2d69799ce8b3cce9dc5d1f7d1106d333592c03ad388ef989daea3a334c92981296e315f352f01601b1d2739acb73462e0dd63e18599cd7c1005b00c8dce4529f28fa0406d4f3e51c5705a4302000000000000052b70f1d6d53996ff0dc6b7caa7aa5ef9feaf92ce59190da8d270bad0806a2818d82c3901005a3fa8f01a9a9be74daa759a216b9cc2a5fc603dbf97be00f1441c7c6d2d48b4b5a08ef61573340e1a3a9e245b78d1d9000e65611568395eecbb54c1624afc1c91490ab7c716fe0e64cf16b5e60b162434c73bd6691e11263fe0a47d751cb614030000000000000f8250c73a9a38280688b87c5c9b9ec06b29bcf471b266734e39438e49ac3ee561508b7903000adddf11c1e50ffb8b7096c21649e438e3f6eecaf8ab642dd9a1ae80a4f73aef61b5996981f23ffc60695b941595ea62e3859e4a0f12b40c9d0d209fe27940719dce87fd6dcffad6c9886ab6dd17b32201aee61b24ce46046ceb97b14e2f2d700100", + "witness_type": 2 + }, + "challenge_chain_sp_proof": { + "normalized_to_identity": false, + "witness": "0x030082684bda614fff7fe0ff34652d24bc17b6f1ea3ed202c38b40eed281c0877d7ea5416443a4c6b11f567ebad6ffa92f1f15d7d693b625bef52268e7ae9e5f7c31d3d9d2a111b9473b50b71fc3d2dc6f1ab00ec0a2e9a1f46ea12b702afd5a500601000000000000011300e17c99c0c6788f9cdac23f669e3bb8108b4dad96ef130a0e8c5c8e10b626cfd99f020022adf9d6e15563765b5db6b5cc4c38c7c6eb476134de7e7ff5a4b8badff0646f09126c24e43c39e671f4da070eba93138e4a3e96e46836202d1ab08e9d3a13095ba135901c67de22f30b2da249677bb9780c4ca2ca4ff1a8f390fa9a01dd30070b08000000000003396491a08353a1578cd0a3d46bbba9d2aff6d760a3cb86359af8a5bb850a7dc05da03f030022665d4ea2ebee37d6dfd2c97222ecdecc04657a8283d8543ca6f51c3f33fd15448481e32a8137b3e416386e1f59e416e71c4a56ed01ad7fb0da233c4216e92bf97f6a2d0ce432f04cf68fd0acfbe4b1226b287308adab5c56615e3535a4f2060201", + "witness_type": 2 + }, + "finished_sub_slots": [], + "foliage": { + "foliage_block_data": { + "extension_data": "0x0000000000000000000000000000000000000000000000000000000003a2c7c9", + "farmer_reward_puzzle_hash": "0x04b42f5809bb6c732edd39bde34a5dc01cbd7da9d71c48ba782222009f7aa69c", + "pool_signature": "0xabcb0fe0f2cbdc740cc196cab62364622896e01c2c7769da18ba102ade3a6428978c4addb80e9d0804db5eb00d9c94aa17ad66cf0acea8844352e9d0a94fe18fcdb327c6a1ba848b2ecb06c8a7b66692b5bb983f1d6178017425005b2274a001", + "pool_target": { + "max_height": 0, + "puzzle_hash": "0x04b42f5809bb6c732edd39bde34a5dc01cbd7da9d71c48ba782222009f7aa69c" }, - "foliage_transaction_block": { - "additions_root": "0x356eb13a48e7a1905f3d34413c4d2cf7c3554f650c7f8bce6ee74699a8b525ba", - "filter_hash": "0x8765e15070cda397b5ffe8fa42a2034716012ee05e526542cd2e4ee58e04f012", - "prev_transaction_block_hash": "0x5e52cf24d9ff63d4c702d80b303e389232ff39343c0ba8cdf35dbacc61b76378", - "removals_root": "0xc5db2b9009db300b2942241b8eb9807e8eca4dc1d7a6e0f06a6383d390171efd", - "timestamp": 1659025646, - "transactions_info_hash": "0x9c6f02a46a797b2595efe0e83afc398a2f2178d3add85bd674f568b33aeca959" + "unfinished_reward_block_hash": "0xc88079061bbf62f9a8062a35166252afa348df2a3d87c2e25bdea035fb13c15a" + }, + "foliage_block_data_signature": "0x8727f05260ac9d34813074e48ff83847c93dad473731cfbdba93ab0f7dd38b3cc5580b9aa35526cefbc05e20e9a76e4005bbff838f04311dae08d1cfc5ee6d38387b13748d022379d54905c9765ee7c11b9e938ead7d236f4c23296e691142ef", + "foliage_transaction_block_hash": "0xaaf12a2522ee70353bc2deb2294a24cd20edfb50a57bbd430377a385da2a801d", + "foliage_transaction_block_signature": "0x8f9c5cd8dea46b8838e582f14c10b1207432adbe72f647c10c5c3afa3bce9edf34c015c8d72182a4b7db7e6ba0eeb40f0080bbf6f9e8986c8edb0f0439ac7ad5ee9a9e1d77f7e4b35ddba3228a488f9c91a1ddfc38760373aaf13fdd565105d3", + "prev_block_hash": "0xe6af538418759cf2782bed6b5dc83b521e246b84fdca2ef6619a1921bbb058fc", + "reward_block_hash": "0xe48ebe4db08d3f1723c79a910f4713a2f104ea97776a2fe1423e333e0fe2410c" + }, + "foliage_transaction_block": { + "additions_root": "0x356eb13a48e7a1905f3d34413c4d2cf7c3554f650c7f8bce6ee74699a8b525ba", + "filter_hash": "0x8765e15070cda397b5ffe8fa42a2034716012ee05e526542cd2e4ee58e04f012", + "prev_transaction_block_hash": "0x5e52cf24d9ff63d4c702d80b303e389232ff39343c0ba8cdf35dbacc61b76378", + "removals_root": "0xc5db2b9009db300b2942241b8eb9807e8eca4dc1d7a6e0f06a6383d390171efd", + "timestamp": 1659025646, + "transactions_info_hash": "0x9c6f02a46a797b2595efe0e83afc398a2f2178d3add85bd674f568b33aeca959" + }, + "infused_challenge_chain_ip_proof": { + "normalized_to_identity": false, + "witness": "0x03007ebc98acaa4aeacd19a94664423c0cb41a50f729e73097dc30ef5c0ce1559634406b3a75364e6e820263aae44cb90b8c2402b6bdc8c3a86ff09ae5eaa7bfc2482d90d93e52c8259c6707f78a235577d02e2f99508e71ae29ac468c862a41807501000000000000052b70c6dfb5725b769476185d51bf7c539d1d1e58bde7d5c3dd94d223483df9b5b785590100c56e02d2a8903f47e00c57ce1a18bffa72547ea5504d8ccc09e33b6731d1a57724bc85f0331208df5276b2bf9f07dc6601d488484be6598ec828fdb520856a2ac4c8bdb9171e0ca45500a21e15170838c21982f1ee94a2dcfce01796947d1e3c020000000000000f8250f069c3feb0e152d0d127a560c08d18a4986bbe86f542d40eb86ccfc1f084051cf10200bbf9fd103989cf7ccfbd8119b66084443510b11d68328aad2573fb6d32838973c49306a9596abbe83ff4d1a1d8deeeca55cf518c0743ae57fa0f7401b6f7245c972bc6a7274e882ab78d68ded22e25988a4e3cfb3d7f6665761c45a89553894c0100", + "witness_type": 2 + }, + "reward_chain_block": { + "challenge_chain_ip_vdf": { + "challenge": "0x0e5a808b040f1e8b95d91919851149020949daf9063f6f4ef6d3bf89226ad484", + "number_of_iterations": 6416314, + "output": { + "data": "0x02000c3367d48d9b1cf05ff928cd1d31da093aa0e0bd0c4cf9d679ddc2fd5b217cb2627d8a4db915a25fd67b4ec81a37c552f7f69266546a05f852ffe52c19f93c734ba1b3d974e8a9ef0b6d381e44fcf53139da1878a6cd3e7e03b2b9a3b6ee1d770100" + } + }, + "challenge_chain_sp_signature": "0x955dee68cc4280f6e98b8dd21fdd94bf1b3085bba250e4759d0d4705d04436c83e6061f15117e578638c113720d7ad340f3fec73d7cad09dbf938d85c6d66bb6a77216ddc602a8dac4e800207d40289e3bd77dfc39d33aea9f8942acb0712740", + "challenge_chain_sp_vdf": { + "challenge": "0x0e5a808b040f1e8b95d91919851149020949daf9063f6f4ef6d3bf89226ad484", + "number_of_iterations": 2228224, + "output": { + "data": "0x02007772854f2294e0780e1b54ff105296881675cd5f018fa598d9367d7469fa84a80a817846d66a50345b4e8fad5c923d5855022b5ccc2491aa4b2cea36042571080fc0ddb72ec20eac239beccafd36d2eff6d9945de19a286e477438256c7013170100" + } + }, + "height": 1315630, + "infused_challenge_chain_ip_vdf": { + "challenge": "0xa2e31105a3fe6427c5c1b74c7198c3154066b8c6b7fe9aed7cf66884694827c1", + "number_of_iterations": 1524709, + "output": { + "data": "0x02006d6bfe2ad5a017f4349738ebed42193cc50ab63a134e560c0e9469aa096eb4cbdb9465aa6de1edd1b78d27f98b9b575244b43f22161350b9a4854332565241719bc086951da52015664225563681bbc1e81ec917e5863aef641f90d7362ea09a0100" + } + }, + "is_transaction_block": true, + "pos_ss_cc_challenge_hash": "0x0e5a808b040f1e8b95d91919851149020949daf9063f6f4ef6d3bf89226ad484", + "proof_of_space": { + "challenge": "0x5c75dbd7ac587e7f71dabf879eab79542c8eb3b5cc2615fdb48287acc3f3f74d", + "plot_public_key": "0xae9ea5737e7cb1872de077a25ac4bef5be3a5568a6f9530eceef8cb0c7d5f57b6998fa106cc24098ef3ef79546e10189", + "pool_contract_puzzle_hash": null, + "pool_public_key": "0xaaadc5966216b09c427ce142216507d3ceec6378a7ea76e37bd58d409fbee03313e920f57ac2c6007f9de632ee0e4591", + "proof": "0x5e1b06f7bb45ddf5834f9c25aacf79276abeda6b647149652dcc6d15c95bfe9c6a0d5f870db156bb3bef0168fe0d5d07f7fb68c126cd19442f18bf7e8b0d155fe7bd38da350a9dea3e965a182e93c77894f51ba9345c50e2f86b9442fdc262d41bd3a1e17429c7863324c048b34aa3f27539d956f6bed23da7efb05e81a787d2cd00368701c8e932433e1ac4440cce008f1aa874631361cc3512db7c4f86ded060c34da7f4b6b8307fb344adfe2262e62541274ad4a49e74a94bec92a82824351e6364437bf27f713c12f4dc8d5185a9a3d78ff44bdb68a20e5467a4a325a5658e1c092dd836c270dec973460850de2a299719e89956c74c0cb08da644aa66dc", + "size": 32 + }, + "reward_chain_ip_vdf": { + "challenge": "0x85b7b47ebd363cc551b2d3c129f8c9903a831c990df45f0d775b36b01baae154", + "number_of_iterations": 1524709, + "output": { + "data": "0x000099480911302650d62706f532f66c95fba5c650585174388ddd310890ecf7288aa63d16930c0e1722f2d069bdc5c47f1315e0c5b61e2a62446938a1ae5bf64629ba26ade73ae7790e9b06649df0cfa4d764c9ce859634c20dffc3b968e44ed6590100" + } + }, + "reward_chain_sp_signature": "0x8638a620804378628a10005b5c37c392979a5e71177b699d9df45f27c8096492018efa5f1a09e16d500dfc7ebb69ae271579ee922fe946c8c994e02ac60dc27c0e88dba18f3e90230ed716c9ac5f8e1be16418c3539cd2caf24f1c60c3a14890", + "reward_chain_sp_vdf": { + "challenge": "0x123703ce8a97fe00a62aa0e8938523e5fc4872801f9df4b7f1b3646d4bd18a1d", + "number_of_iterations": 317039, + "output": { + "data": "0x0100023ce79ae22f234ddef90372a0dc7ba443c6cb236d07f449b6564debc2e9ae1760e7d8bfa60535d11dad36bb704c7f86c9cedbdb5665a144f4260e364854bd2abbb1950dd96a22fa829a137661d8cc888dd4456ae4bd662b13c78a0ddfdd64480100" + } + }, + "signage_point_index": 2, + "total_iters": 3017938429882, + "weight": 102738626100 + }, + "reward_chain_ip_proof": { + "normalized_to_identity": false, + "witness": "0x00006d8fd01db8111921698fd3eec1af4162a19a90e6c45890b1fb69b34cca34ab595f523bfe1416dc7a4623fa456bf72689c87cb429f6d1bb64f102a0acf84e8b587136a27f4b7b61b17d3f1a12c4457bce3732a8ce04a9fb0c4549eddbd7a4c26a01000000000000052b70994742de0736c278ddfd3c40ca67bd7d8366b714c70dbf29e15bf852d2a969007f0000b84c548457a6718c1ac2b2918a9e5674a61abb1f95bad2d0e3cee1dfe45c36e830f18804f3ecda5c9d4a4f34d9076db1e9c0a9d0e47c5ad58cf3c3e5c1bcd34807f47a50ee86efc4edaed11024972858fae7b91c87787a19adadf131b3cab854010000000000000f8250abb0ef98de1b93e0dae7940338a6baabc00c451ccb577406629bad56a994a5b0b10000f23f20529d02d57ce1fecbea6dbb6734263575afcc72ce9fe84af0a17e7d56d449fb6e6dccedb907031d0cbf5c2700fdf1363f87cb5bb0558824e64881bb891743aff0945935be666c68d6f536e7fcbfeb362cdb939c8cbfbd4b094576a4d8160100", + "witness_type": 2 + }, + "reward_chain_sp_proof": { + "normalized_to_identity": false, + "witness": "0x0000f2d00fde31a2775f87b3dc8319a803e006562ad56408de05537381b497bb22689512d21ba97ad878948f3662c986456e7ff4e5e9a13f0d4821426370eb48ea1b7738c845428a2fd79d42a82e2fb83590080f108dca7b86e33a84eb2df8ad7e0402000000000000011300addb3b78b963669a5b9809402a5baec6bd52cb5a7489d20f3878dc7630cc9d30830200701ba32e50a708870b9ed1872156c73a51c12269de4ff8a9cedc5bd9347f1fb888693cc1cb405878ffdeb807c32a0c49a398699b81e8162298af8018c7a02808c9a59a4f35a1073ad85270a1a479af74713be264978e19a820372bd8d99e3e0a05000000000000033964b00ac71e3015ce9d530fa153a206f8454660b4203639380610566039c9593ae42303005c0d5e437e3a8b2cf342da07e4aab1752b63eded6a36385d5caed333aa0d3af4803bed7d4ddbf42fe28a05691117045b93f2c52e85a217abe33c835d5ca33d2325c8dc76d2e6f46df8e4be1df4fd90193d7e40994bee650b61002fa780e302240301", + "witness_type": 2 + }, + "transactions_generator": "0xff01ffffffa090941ac42b92aad0ed1de5d599d854072fcf1f4bb82cd37e365852f0a730cf5dffff02ffff01ff02ffff01ff02ff5effff04ff02ffff04ffff04ff05ffff04ffff0bff34ff0580ffff04ff0bff80808080ffff04ffff02ff17ff2f80ffff04ff5fffff04ffff02ff2effff04ff02ffff04ff17ff80808080ffff04ffff02ff2affff04ff02ffff04ff82027fffff04ff82057fffff04ff820b7fff808080808080ffff04ff81bfffff04ff82017fffff04ff8202ffffff04ff8205ffffff04ff820bffff80808080808080808080808080ffff04ffff01ffffffff3d46ff02ff333cffff0401ff01ff81cb02ffffff20ff02ffff03ff05ffff01ff02ff32ffff04ff02ffff04ff0dffff04ffff0bff7cffff0bff34ff2480ffff0bff7cffff0bff7cffff0bff34ff2c80ff0980ffff0bff7cff0bffff0bff34ff8080808080ff8080808080ffff010b80ff0180ffff02ffff03ffff22ffff09ffff0dff0580ff2280ffff09ffff0dff0b80ff2280ffff15ff17ffff0181ff8080ffff01ff0bff05ff0bff1780ffff01ff088080ff0180ffff02ffff03ff0bffff01ff02ffff03ffff09ffff02ff2effff04ff02ffff04ff13ff80808080ff820b9f80ffff01ff02ff56ffff04ff02ffff04ffff02ff13ffff04ff5fffff04ff17ffff04ff2fffff04ff81bfffff04ff82017fffff04ff1bff8080808080808080ffff04ff82017fff8080808080ffff01ff088080ff0180ffff01ff02ffff03ff17ffff01ff02ffff03ffff20ff81bf80ffff0182017fffff01ff088080ff0180ffff01ff088080ff018080ff0180ff04ffff04ff05ff2780ffff04ffff10ff0bff5780ff778080ffffff02ffff03ff05ffff01ff02ffff03ffff09ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff01818f80ffff01ff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ffff04ff81b9ff82017980ff808080808080ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff09ff11ff5880ffff01ff04ff58ffff04ffff02ff76ffff04ff02ffff04ff13ffff04ff29ffff04ffff0bff34ff5b80ffff04ff2bff80808080808080ff398080ffff01ff02ffff03ffff09ff11ff7880ffff01ff02ffff03ffff20ffff02ffff03ffff09ffff0121ffff0dff298080ffff01ff02ffff03ffff09ffff0cff29ff80ff3480ff5c80ffff01ff0101ff8080ff0180ff8080ff018080ffff0109ffff01ff088080ff0180ffff010980ff018080ff0180ffff04ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff04ffff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ff17ff808080808080ff80808080808080ff0180ffff01ff04ff80ffff04ff80ff17808080ff0180ffff02ffff03ff05ffff01ff04ff09ffff02ff56ffff04ff02ffff04ff0dffff04ff0bff808080808080ffff010b80ff0180ff0bff7cffff0bff34ff2880ffff0bff7cffff0bff7cffff0bff34ff2c80ff0580ffff0bff7cffff02ff32ffff04ff02ffff04ff07ffff04ffff0bff34ff3480ff8080808080ffff0bff34ff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ffff04ffff04ff30ffff04ff5fff808080ffff02ff7effff04ff02ffff04ffff04ffff04ff2fff0580ffff04ff5fff82017f8080ffff04ffff02ff26ffff04ff02ffff04ff0bffff04ff05ffff01ff808080808080ffff04ff17ffff04ff81bfffff04ff82017fffff04ffff02ff2affff04ff02ffff04ff8204ffffff04ffff02ff76ffff04ff02ffff04ff09ffff04ff820affffff04ffff0bff34ff2d80ffff04ff15ff80808080808080ffff04ff8216ffff808080808080ffff04ff8205ffffff04ff820bffff808080808080808080808080ff02ff5affff04ff02ffff04ff5fffff04ff3bffff04ffff02ffff03ff17ffff01ff09ff2dffff02ff2affff04ff02ffff04ff27ffff04ffff02ff76ffff04ff02ffff04ff29ffff04ff57ffff04ffff0bff34ff81b980ffff04ff59ff80808080808080ffff04ff81b7ff80808080808080ff8080ff0180ffff04ff17ffff04ff05ffff04ff8202ffffff04ffff04ffff04ff78ffff04ffff0eff5cffff02ff2effff04ff02ffff04ffff04ff2fffff04ff82017fff808080ff8080808080ff808080ffff04ffff04ff20ffff04ffff0bff81bfff5cffff02ff2effff04ff02ffff04ffff04ff15ffff04ffff10ff82017fffff11ff8202dfff2b80ff8202ff80ff808080ff8080808080ff808080ff138080ff80808080808080808080ff018080ffff04ffff01a037bef360ee858133b69d595a906dc45d01af50379dad515eb9518abb7c1d2a7affff04ffff01a0c2808f37e758b713150da4860091dd94a90a781bc4f18377d20de6291b3d506dffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0976cc436d5d07f564a346beb6656b67edb08113249b664c00e278ce62aef126e37b74ca5520b38c347f7bcccb93e8c4aff018080ff0180808080ff830182b8ffffff80ffff01ffff33ffa00000000000000000000000000000000000000000000000000000000000000000ff8203e8ffffa00000000000000000000000000000000000000000000000000000000000000000ffa248656c6c6f2c20706c656173652066696e64206d652c2049276d2061206d656d6f218080ffff33ffa0dc3f8f94ebd697ab2828e8001256ce60d50748033fb7192e3318f592571dcdb8ff83017ed080ffff3cffa095a700a6c54146fb9051dc9ece0501cf9d9ac794518e2ac31ce700f48000521d8080ff8080ffffa06fb12ab32556537803112badcfaf828bfe1b79eb4181b3adc5d571680295ce6cffa01a09c8036279722f2216bc3714c1bc7842b0f7983554a980eee10381bed0e1fdff830186a080ffa0cc6dca2748865d77eb411e3a44827ad970a0cd8488ad26f6a83842fe4e0e4054ffffa090941ac42b92aad0ed1de5d599d854072fcf1f4bb82cd37e365852f0a730cf5dffa0c621cd597aa525338d3e4e499a34e0d0b1040304a2f4766b48a368aa57d3ab6fff830182b880ffffa090941ac42b92aad0ed1de5d599d854072fcf1f4bb82cd37e365852f0a730cf5dffa08285f2bb7f25d016fd7e0a1530643325c3aca1cff2f26492a7ab7b5a76984fd7ff830182b880ff80ff808080ffffa045af95cbd701c44e236496e4eb4caeea55dd2d72720df5725a6bff5a8f62e4d3ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b8b717e27f0e7346902144abe7488a44e698ac9c9ac3fb2faccaeac5f325ac861909ab2fe97fc6fdb433e0f7973d6f06ff018080ff8502540be400ffff80ffff01ffff34ff8502540be40080ffff3cffa07efd57196dd74d44901f2a54678e2572d284b38d2a14c7b5986e5c54a9649e6c80ffff3dffa07aa7df89a8a2345cd17bdab08d80f802d919f1945bd4888775cd33c8c697a0108080ff8080808080", + "transactions_generator_ref_list": [], + "transactions_info": { + "aggregated_signature": "0xa48cbe7f99595fe377dcc7aabdcb3ec1e09681781815829ceaf16199808359c61dc0e645cef9c88800c510e40a2c94310724dab5dcf1ebb4d7776bb970cbb424e52205ecae0b15ebf139812167f79548d24145e1c46753cabc00616aa6976c8c", + "cost": 46010575, + "fees": 10000000000, + "generator_refs_root": "0x0101010101010101010101010101010101010101010101010101010101010101", + "generator_root": "0x684216aa1e2a46511cdf4329e923c6ace62366268e9d70750eb9cc8e5c1cfc4b", + "reward_claims_incorporated": [ + { + "amount": 1750000000000, + "parent_coin_info": "0xae83525ba8d1dd3f09b277de18ca3e4300000000000000000000000000141328", + "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" }, - "infused_challenge_chain_ip_proof": { - "normalized_to_identity": false, - "witness": "0x03007ebc98acaa4aeacd19a94664423c0cb41a50f729e73097dc30ef5c0ce1559634406b3a75364e6e820263aae44cb90b8c2402b6bdc8c3a86ff09ae5eaa7bfc2482d90d93e52c8259c6707f78a235577d02e2f99508e71ae29ac468c862a41807501000000000000052b70c6dfb5725b769476185d51bf7c539d1d1e58bde7d5c3dd94d223483df9b5b785590100c56e02d2a8903f47e00c57ce1a18bffa72547ea5504d8ccc09e33b6731d1a57724bc85f0331208df5276b2bf9f07dc6601d488484be6598ec828fdb520856a2ac4c8bdb9171e0ca45500a21e15170838c21982f1ee94a2dcfce01796947d1e3c020000000000000f8250f069c3feb0e152d0d127a560c08d18a4986bbe86f542d40eb86ccfc1f084051cf10200bbf9fd103989cf7ccfbd8119b66084443510b11d68328aad2573fb6d32838973c49306a9596abbe83ff4d1a1d8deeeca55cf518c0743ae57fa0f7401b6f7245c972bc6a7274e882ab78d68ded22e25988a4e3cfb3d7f6665761c45a89553894c0100", - "witness_type": 2 + { + "amount": 250000000000, + "parent_coin_info": "0xfc0af20d20c4b3e92ef2a48bd291ccb200000000000000000000000000141328", + "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" }, - "reward_chain_block": { - "challenge_chain_ip_vdf": { - "challenge": "0x0e5a808b040f1e8b95d91919851149020949daf9063f6f4ef6d3bf89226ad484", - "number_of_iterations": 6416314, - "output": { - "data": "0x02000c3367d48d9b1cf05ff928cd1d31da093aa0e0bd0c4cf9d679ddc2fd5b217cb2627d8a4db915a25fd67b4ec81a37c552f7f69266546a05f852ffe52c19f93c734ba1b3d974e8a9ef0b6d381e44fcf53139da1878a6cd3e7e03b2b9a3b6ee1d770100" - } - }, - "challenge_chain_sp_signature": "0x955dee68cc4280f6e98b8dd21fdd94bf1b3085bba250e4759d0d4705d04436c83e6061f15117e578638c113720d7ad340f3fec73d7cad09dbf938d85c6d66bb6a77216ddc602a8dac4e800207d40289e3bd77dfc39d33aea9f8942acb0712740", - "challenge_chain_sp_vdf": { - "challenge": "0x0e5a808b040f1e8b95d91919851149020949daf9063f6f4ef6d3bf89226ad484", - "number_of_iterations": 2228224, - "output": { - "data": "0x02007772854f2294e0780e1b54ff105296881675cd5f018fa598d9367d7469fa84a80a817846d66a50345b4e8fad5c923d5855022b5ccc2491aa4b2cea36042571080fc0ddb72ec20eac239beccafd36d2eff6d9945de19a286e477438256c7013170100" - } - }, - "height": 1315630, - "infused_challenge_chain_ip_vdf": { - "challenge": "0xa2e31105a3fe6427c5c1b74c7198c3154066b8c6b7fe9aed7cf66884694827c1", - "number_of_iterations": 1524709, - "output": { - "data": "0x02006d6bfe2ad5a017f4349738ebed42193cc50ab63a134e560c0e9469aa096eb4cbdb9465aa6de1edd1b78d27f98b9b575244b43f22161350b9a4854332565241719bc086951da52015664225563681bbc1e81ec917e5863aef641f90d7362ea09a0100" - } - }, - "is_transaction_block": true, - "pos_ss_cc_challenge_hash": "0x0e5a808b040f1e8b95d91919851149020949daf9063f6f4ef6d3bf89226ad484", - "proof_of_space": { - "challenge": "0x5c75dbd7ac587e7f71dabf879eab79542c8eb3b5cc2615fdb48287acc3f3f74d", - "plot_public_key": "0xae9ea5737e7cb1872de077a25ac4bef5be3a5568a6f9530eceef8cb0c7d5f57b6998fa106cc24098ef3ef79546e10189", - "pool_contract_puzzle_hash": null, - "pool_public_key": "0xaaadc5966216b09c427ce142216507d3ceec6378a7ea76e37bd58d409fbee03313e920f57ac2c6007f9de632ee0e4591", - "proof": "0x5e1b06f7bb45ddf5834f9c25aacf79276abeda6b647149652dcc6d15c95bfe9c6a0d5f870db156bb3bef0168fe0d5d07f7fb68c126cd19442f18bf7e8b0d155fe7bd38da350a9dea3e965a182e93c77894f51ba9345c50e2f86b9442fdc262d41bd3a1e17429c7863324c048b34aa3f27539d956f6bed23da7efb05e81a787d2cd00368701c8e932433e1ac4440cce008f1aa874631361cc3512db7c4f86ded060c34da7f4b6b8307fb344adfe2262e62541274ad4a49e74a94bec92a82824351e6364437bf27f713c12f4dc8d5185a9a3d78ff44bdb68a20e5467a4a325a5658e1c092dd836c270dec973460850de2a299719e89956c74c0cb08da644aa66dc", - "size": 32 - }, - "reward_chain_ip_vdf": { - "challenge": "0x85b7b47ebd363cc551b2d3c129f8c9903a831c990df45f0d775b36b01baae154", - "number_of_iterations": 1524709, - "output": { - "data": "0x000099480911302650d62706f532f66c95fba5c650585174388ddd310890ecf7288aa63d16930c0e1722f2d069bdc5c47f1315e0c5b61e2a62446938a1ae5bf64629ba26ade73ae7790e9b06649df0cfa4d764c9ce859634c20dffc3b968e44ed6590100" - } - }, - "reward_chain_sp_signature": "0x8638a620804378628a10005b5c37c392979a5e71177b699d9df45f27c8096492018efa5f1a09e16d500dfc7ebb69ae271579ee922fe946c8c994e02ac60dc27c0e88dba18f3e90230ed716c9ac5f8e1be16418c3539cd2caf24f1c60c3a14890", - "reward_chain_sp_vdf": { - "challenge": "0x123703ce8a97fe00a62aa0e8938523e5fc4872801f9df4b7f1b3646d4bd18a1d", - "number_of_iterations": 317039, - "output": { - "data": "0x0100023ce79ae22f234ddef90372a0dc7ba443c6cb236d07f449b6564debc2e9ae1760e7d8bfa60535d11dad36bb704c7f86c9cedbdb5665a144f4260e364854bd2abbb1950dd96a22fa829a137661d8cc888dd4456ae4bd662b13c78a0ddfdd64480100" - } - }, - "signage_point_index": 2, - "total_iters": 3017938429882, - "weight": 102738626100 + { + "amount": 1750000000000, + "parent_coin_info": "0xae83525ba8d1dd3f09b277de18ca3e4300000000000000000000000000141327", + "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" }, - "reward_chain_ip_proof": { - "normalized_to_identity": false, - "witness": "0x00006d8fd01db8111921698fd3eec1af4162a19a90e6c45890b1fb69b34cca34ab595f523bfe1416dc7a4623fa456bf72689c87cb429f6d1bb64f102a0acf84e8b587136a27f4b7b61b17d3f1a12c4457bce3732a8ce04a9fb0c4549eddbd7a4c26a01000000000000052b70994742de0736c278ddfd3c40ca67bd7d8366b714c70dbf29e15bf852d2a969007f0000b84c548457a6718c1ac2b2918a9e5674a61abb1f95bad2d0e3cee1dfe45c36e830f18804f3ecda5c9d4a4f34d9076db1e9c0a9d0e47c5ad58cf3c3e5c1bcd34807f47a50ee86efc4edaed11024972858fae7b91c87787a19adadf131b3cab854010000000000000f8250abb0ef98de1b93e0dae7940338a6baabc00c451ccb577406629bad56a994a5b0b10000f23f20529d02d57ce1fecbea6dbb6734263575afcc72ce9fe84af0a17e7d56d449fb6e6dccedb907031d0cbf5c2700fdf1363f87cb5bb0558824e64881bb891743aff0945935be666c68d6f536e7fcbfeb362cdb939c8cbfbd4b094576a4d8160100", - "witness_type": 2 + { + "amount": 250000000000, + "parent_coin_info": "0xfc0af20d20c4b3e92ef2a48bd291ccb200000000000000000000000000141327", + "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" }, - "reward_chain_sp_proof": { - "normalized_to_identity": false, - "witness": "0x0000f2d00fde31a2775f87b3dc8319a803e006562ad56408de05537381b497bb22689512d21ba97ad878948f3662c986456e7ff4e5e9a13f0d4821426370eb48ea1b7738c845428a2fd79d42a82e2fb83590080f108dca7b86e33a84eb2df8ad7e0402000000000000011300addb3b78b963669a5b9809402a5baec6bd52cb5a7489d20f3878dc7630cc9d30830200701ba32e50a708870b9ed1872156c73a51c12269de4ff8a9cedc5bd9347f1fb888693cc1cb405878ffdeb807c32a0c49a398699b81e8162298af8018c7a02808c9a59a4f35a1073ad85270a1a479af74713be264978e19a820372bd8d99e3e0a05000000000000033964b00ac71e3015ce9d530fa153a206f8454660b4203639380610566039c9593ae42303005c0d5e437e3a8b2cf342da07e4aab1752b63eded6a36385d5caed333aa0d3af4803bed7d4ddbf42fe28a05691117045b93f2c52e85a217abe33c835d5ca33d2325c8dc76d2e6f46df8e4be1df4fd90193d7e40994bee650b61002fa780e302240301", - "witness_type": 2 + { + "amount": 1750000000000, + "parent_coin_info": "0xae83525ba8d1dd3f09b277de18ca3e4300000000000000000000000000141326", + "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" }, - "transactions_generator": "0xff01ffffffa090941ac42b92aad0ed1de5d599d854072fcf1f4bb82cd37e365852f0a730cf5dffff02ffff01ff02ffff01ff02ff5effff04ff02ffff04ffff04ff05ffff04ffff0bff34ff0580ffff04ff0bff80808080ffff04ffff02ff17ff2f80ffff04ff5fffff04ffff02ff2effff04ff02ffff04ff17ff80808080ffff04ffff02ff2affff04ff02ffff04ff82027fffff04ff82057fffff04ff820b7fff808080808080ffff04ff81bfffff04ff82017fffff04ff8202ffffff04ff8205ffffff04ff820bffff80808080808080808080808080ffff04ffff01ffffffff3d46ff02ff333cffff0401ff01ff81cb02ffffff20ff02ffff03ff05ffff01ff02ff32ffff04ff02ffff04ff0dffff04ffff0bff7cffff0bff34ff2480ffff0bff7cffff0bff7cffff0bff34ff2c80ff0980ffff0bff7cff0bffff0bff34ff8080808080ff8080808080ffff010b80ff0180ffff02ffff03ffff22ffff09ffff0dff0580ff2280ffff09ffff0dff0b80ff2280ffff15ff17ffff0181ff8080ffff01ff0bff05ff0bff1780ffff01ff088080ff0180ffff02ffff03ff0bffff01ff02ffff03ffff09ffff02ff2effff04ff02ffff04ff13ff80808080ff820b9f80ffff01ff02ff56ffff04ff02ffff04ffff02ff13ffff04ff5fffff04ff17ffff04ff2fffff04ff81bfffff04ff82017fffff04ff1bff8080808080808080ffff04ff82017fff8080808080ffff01ff088080ff0180ffff01ff02ffff03ff17ffff01ff02ffff03ffff20ff81bf80ffff0182017fffff01ff088080ff0180ffff01ff088080ff018080ff0180ff04ffff04ff05ff2780ffff04ffff10ff0bff5780ff778080ffffff02ffff03ff05ffff01ff02ffff03ffff09ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff01818f80ffff01ff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ffff04ff81b9ff82017980ff808080808080ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff09ff11ff5880ffff01ff04ff58ffff04ffff02ff76ffff04ff02ffff04ff13ffff04ff29ffff04ffff0bff34ff5b80ffff04ff2bff80808080808080ff398080ffff01ff02ffff03ffff09ff11ff7880ffff01ff02ffff03ffff20ffff02ffff03ffff09ffff0121ffff0dff298080ffff01ff02ffff03ffff09ffff0cff29ff80ff3480ff5c80ffff01ff0101ff8080ff0180ff8080ff018080ffff0109ffff01ff088080ff0180ffff010980ff018080ff0180ffff04ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff04ffff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ff17ff808080808080ff80808080808080ff0180ffff01ff04ff80ffff04ff80ff17808080ff0180ffff02ffff03ff05ffff01ff04ff09ffff02ff56ffff04ff02ffff04ff0dffff04ff0bff808080808080ffff010b80ff0180ff0bff7cffff0bff34ff2880ffff0bff7cffff0bff7cffff0bff34ff2c80ff0580ffff0bff7cffff02ff32ffff04ff02ffff04ff07ffff04ffff0bff34ff3480ff8080808080ffff0bff34ff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ffff04ffff04ff30ffff04ff5fff808080ffff02ff7effff04ff02ffff04ffff04ffff04ff2fff0580ffff04ff5fff82017f8080ffff04ffff02ff26ffff04ff02ffff04ff0bffff04ff05ffff01ff808080808080ffff04ff17ffff04ff81bfffff04ff82017fffff04ffff02ff2affff04ff02ffff04ff8204ffffff04ffff02ff76ffff04ff02ffff04ff09ffff04ff820affffff04ffff0bff34ff2d80ffff04ff15ff80808080808080ffff04ff8216ffff808080808080ffff04ff8205ffffff04ff820bffff808080808080808080808080ff02ff5affff04ff02ffff04ff5fffff04ff3bffff04ffff02ffff03ff17ffff01ff09ff2dffff02ff2affff04ff02ffff04ff27ffff04ffff02ff76ffff04ff02ffff04ff29ffff04ff57ffff04ffff0bff34ff81b980ffff04ff59ff80808080808080ffff04ff81b7ff80808080808080ff8080ff0180ffff04ff17ffff04ff05ffff04ff8202ffffff04ffff04ffff04ff78ffff04ffff0eff5cffff02ff2effff04ff02ffff04ffff04ff2fffff04ff82017fff808080ff8080808080ff808080ffff04ffff04ff20ffff04ffff0bff81bfff5cffff02ff2effff04ff02ffff04ffff04ff15ffff04ffff10ff82017fffff11ff8202dfff2b80ff8202ff80ff808080ff8080808080ff808080ff138080ff80808080808080808080ff018080ffff04ffff01a037bef360ee858133b69d595a906dc45d01af50379dad515eb9518abb7c1d2a7affff04ffff01a0c2808f37e758b713150da4860091dd94a90a781bc4f18377d20de6291b3d506dffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0976cc436d5d07f564a346beb6656b67edb08113249b664c00e278ce62aef126e37b74ca5520b38c347f7bcccb93e8c4aff018080ff0180808080ff830182b8ffffff80ffff01ffff33ffa00000000000000000000000000000000000000000000000000000000000000000ff8203e8ffffa00000000000000000000000000000000000000000000000000000000000000000ffa248656c6c6f2c20706c656173652066696e64206d652c2049276d2061206d656d6f218080ffff33ffa0dc3f8f94ebd697ab2828e8001256ce60d50748033fb7192e3318f592571dcdb8ff83017ed080ffff3cffa095a700a6c54146fb9051dc9ece0501cf9d9ac794518e2ac31ce700f48000521d8080ff8080ffffa06fb12ab32556537803112badcfaf828bfe1b79eb4181b3adc5d571680295ce6cffa01a09c8036279722f2216bc3714c1bc7842b0f7983554a980eee10381bed0e1fdff830186a080ffa0cc6dca2748865d77eb411e3a44827ad970a0cd8488ad26f6a83842fe4e0e4054ffffa090941ac42b92aad0ed1de5d599d854072fcf1f4bb82cd37e365852f0a730cf5dffa0c621cd597aa525338d3e4e499a34e0d0b1040304a2f4766b48a368aa57d3ab6fff830182b880ffffa090941ac42b92aad0ed1de5d599d854072fcf1f4bb82cd37e365852f0a730cf5dffa08285f2bb7f25d016fd7e0a1530643325c3aca1cff2f26492a7ab7b5a76984fd7ff830182b880ff80ff808080ffffa045af95cbd701c44e236496e4eb4caeea55dd2d72720df5725a6bff5a8f62e4d3ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b8b717e27f0e7346902144abe7488a44e698ac9c9ac3fb2faccaeac5f325ac861909ab2fe97fc6fdb433e0f7973d6f06ff018080ff8502540be400ffff80ffff01ffff34ff8502540be40080ffff3cffa07efd57196dd74d44901f2a54678e2572d284b38d2a14c7b5986e5c54a9649e6c80ffff3dffa07aa7df89a8a2345cd17bdab08d80f802d919f1945bd4888775cd33c8c697a0108080ff8080808080", - "transactions_generator_ref_list": [], - "transactions_info": { - "aggregated_signature": "0xa48cbe7f99595fe377dcc7aabdcb3ec1e09681781815829ceaf16199808359c61dc0e645cef9c88800c510e40a2c94310724dab5dcf1ebb4d7776bb970cbb424e52205ecae0b15ebf139812167f79548d24145e1c46753cabc00616aa6976c8c", - "cost": 46010575, - "fees": 10000000000, - "generator_refs_root": "0x0101010101010101010101010101010101010101010101010101010101010101", - "generator_root": "0x684216aa1e2a46511cdf4329e923c6ace62366268e9d70750eb9cc8e5c1cfc4b", - "reward_claims_incorporated": [ - { - "amount": 1750000000000, - "parent_coin_info": "0xae83525ba8d1dd3f09b277de18ca3e4300000000000000000000000000141328", - "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" - }, - { - "amount": 250000000000, - "parent_coin_info": "0xfc0af20d20c4b3e92ef2a48bd291ccb200000000000000000000000000141328", - "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" - }, - { - "amount": 1750000000000, - "parent_coin_info": "0xae83525ba8d1dd3f09b277de18ca3e4300000000000000000000000000141327", - "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" - }, - { - "amount": 250000000000, - "parent_coin_info": "0xfc0af20d20c4b3e92ef2a48bd291ccb200000000000000000000000000141327", - "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" - }, - { - "amount": 1750000000000, - "parent_coin_info": "0xae83525ba8d1dd3f09b277de18ca3e4300000000000000000000000000141326", - "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" - }, - { - "amount": 250000000000, - "parent_coin_info": "0xfc0af20d20c4b3e92ef2a48bd291ccb200000000000000000000000000141326", - "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" - } - ] + { + "amount": 250000000000, + "parent_coin_info": "0xfc0af20d20c4b3e92ef2a48bd291ccb200000000000000000000000000141326", + "puzzle_hash": "0x5bfd572ad892ec7287ef358df19e45800422f46879f6f3b6867cbe58bd16703a" } - }, - "success": true + ] + } + }, + "success": true } diff --git a/tests/tools/300000.json b/tests/tools/300000.json index 852f677acbcc..63edd3226c1f 100644 --- a/tests/tools/300000.json +++ b/tests/tools/300000.json @@ -1,105 +1,105 @@ { - "block": { - "challenge_chain_ip_proof": { - "normalized_to_identity": false, - "witness": "0x0000f5725f532e01020fccb548dd8d5ac9369565e4c881825d161c10924bb66fe70daed501ac39b9bac31718fdba20ea1e0df31ea36691a36b5785fac8946328c737ed619cd658df7d9d2821312ea68ff6367a0035b78e013fd7131b97821d56bb1e0100000000000003f930c3f2812519f90ece15e4e9029ebd153122e8d8113f78054834321d0d51a1ea14b50000a1df1894708a21431bee1829ed738372c029a4d701f2e27645a659cae50d17a25817d0abca67bbe8f1c9168ab66cf71d7e44cd296433580564193e18036d470fa2722808745d94808ecacaa26abad0da3630e807e2ae72d092aea01825285d02010000000000000beb2c87466bf3df371e75088046cedbae394d2884dc5ca29cc1b2974640a922825859590300000688dd045f153ad510663a85334fdd96a653016fd9fb1cbee2becdb0985bd2a6da396a7f4f98c1187b40864f898bd603bddbc24a9e7697ea9750e6030d2d44f34fa8c1939347270313c13282f0d6af7f26b8dcce80848f45aafeaa68cc14530100", - "witness_type": 2 - }, - "challenge_chain_sp_proof": { - "normalized_to_identity": false, - "witness": "0x0300079b45573357b7ec6e9c8bee63f27309c1721b374a84bc77b8701544d915e3a5d4bca907a8cde927908644e57331503ca956623a8929245a15e7331e4070c25411aa409ae2c96c189acd1482c4161617d889392db49527e1965c51124fc92c5a010000000000000e71a8f032897290c27809c9b229fd0659bc435b9cf2351c1968efe8bbde89b409728f2d010037ea5c3e059d5da817e191005ba723ca004fd68c2f9debe3790ff72e97b43c21eaf47f252763a30d1ced338020802e17948ef26e8a8065fa020f6246a8746928a4029a6c6f52aae95628bacf66d1116115fed19b6653823734b69ce23082b642010000000000002b54f8df16d648b49cfdea068d3221fb71ff8202e2d8be92bfa63ab01587d02f4e67fecf0200f7540222073903c7baa168bd42317f6abce3ae54230d79b63d692401905d5a9fdb3c82d9e8a987949d5701721c488cdaa0c03075f9e96d41dc08ade21d2bc300d8c5d82f16d98efa7a9117c13e685511b3552765b4d3602902485f3def7ccb010302", - "witness_type": 2 - }, - "finished_sub_slots": [], - "foliage": { - "foliage_block_data": { - "extension_data": "0x0000000000000000000000000000000000000000000000000000000003a2c7c9", - "farmer_reward_puzzle_hash": "0x0ea986421d3bcc6d073038fe4c120483860376d8c1072d6be8b2c1d3d48d3812", - "pool_signature": "0xae5ef60f09f4065912ea3c0b18ae3afadd306f64edc4c1204250aacdab414236e8114e041005ad073513c3897d1f6d3004beac0b12f5d56b397ecb2bb35daf197c47ae974d1038bee7d33dfc9d609373a62b98035ba8d25bf61c6a995b11c165", - "pool_target": { - "max_height": 0, - "puzzle_hash": "0x0ea986421d3bcc6d073038fe4c120483860376d8c1072d6be8b2c1d3d48d3812" - }, - "unfinished_reward_block_hash": "0x0d7533c8eca5f9aee9b8c232ec47bef465b1d5631f5e40ecbec123fd71c7336e" - }, - "foliage_block_data_signature": "0x88ff3db6f0e52ae0ba9558847ffeb3f731cf0f94b3e2c37ec08c00cb9cca39e81390e8b023136b87ad490bd0e5309ac511e3a95a72cd0d8d2ab2347d501b1350c178d4341f80e1cf874596f53a0aca6f3a0cf55464aa4f375df5784b23c15959", - "foliage_transaction_block_hash": null, - "foliage_transaction_block_signature": null, - "prev_block_hash": "0xf8fac7dafb2174e8ced99e016a3a5977fe9108e2eac6ff2655cb7070b1f2f400", - "reward_block_hash": "0x184a367d2635cce46baf779fd6fd505ac5b6ae5443077780ba01a27565ac15b3" - }, - "foliage_transaction_block": null, - "infused_challenge_chain_ip_proof": { - "normalized_to_identity": false, - "witness": "0x0000bf6567f67906994b3ac8bc457acd57b11d06383c82f9a86faa45376c1ece3d4fe8baac63b6dd5ca2a39da6b539c21d5cd4296739b9ff21ec272e2534a35ab72397e4da93d742e3d88114af48c332c64da5c84e265b28ae7fe784bfa21bf409290100000000000003f930c74754a9512f5c741fb056f63db59a55a4aae5ce19570b3835d757c2909fd7fadf0300f008dffb1f5435474e38d89c32e1152b8aaf9412f8edf47f43b34859b9a507f3dc34cb40d5f4a7fdfb9fa63a9e277a450ca72f33f8ebc8bd3e7c3c982321e428ef08af14991be2c8a92f7a6efa97a5e266adb30efb8c23d9fbff5cc2b74e7b13010000000000000beb2c9bfd20dc044275a2c2bcc205676e9aa78753b085661548d480d58437348637a1210200d27a64ae70dfbb769dc48a30bf3a6f170ca801cbb3c1046e5c0dcb0fecca745fc8c03c7f600e6c128e52e207dbe874b9f953cb1b39df1fbcfa22f0f250fc2568f7aea2c33c7f994ffc4253039fdcd63a192d3133d70249f715c366f571ec42160100", - "witness_type": 2 - }, - "reward_chain_block": { - "challenge_chain_ip_vdf": { - "challenge": "0xc627e4207c6842f2a4cf450990815cc1451ec00ea3fcb29fec6abf792b8dcc59", - "number_of_iterations": 7616131, - "output": { - "data": "0x03001da60388bd507fe9dc33808c4ef11e2aa2294a0ade5fb2154c1ee7b55fc19d0d87c4af5a710f584a9f0ae4ef0228189f2fcb818a573bd62387a064d37f19900912475875c0ff36ab61511c47f9c91bc130b24c897ed3055668f7ea6d81ba42020401" - } - }, - "challenge_chain_sp_signature": "0x94d0409cccb05a6deac1f110f98e436fece58ac074b337db063891233a3d987cec8d08d3c215e93bcdfeca59858df42d110b75d23a8f02ecc1b06db89258280c883434af10d9692a8168f6e706ddf8c1bf747e65c4dcb93e55ba579e6452eb50", - "challenge_chain_sp_vdf": { - "challenge": "0xc627e4207c6842f2a4cf450990815cc1451ec00ea3fcb29fec6abf792b8dcc59", - "number_of_iterations": 4259840, - "output": { - "data": "0x02003f9bc7b8c6998affeb87bf4ebaeff14c7776a1e5492a80fc67e5ddd3037dc0ca7e9f2c1a25bbfc422464c70e4ea0e31e9d4206aaa1a5c4141899405ebfe9d82ae842791d48bfe21d1f31eb8a62a464d4d83928990fea3c6e218ddca78677591b0200" - } - }, - "height": 300000, - "infused_challenge_chain_ip_vdf": { - "challenge": "0x361d6612a2911a6ae919857c3c13b8ddaee498134fc690fd809b5ef85c37fc9d", - "number_of_iterations": 1171766, - "output": { - "data": "0x020078c56de302e5ebb1782e34e172ccb954678211bf79a7a4176d19f0147e14be9cbbfc778c5c30a2d565d95827ac6edc8f11d7bed085becbd3d80f99458a921918c525abd8f0a5ade243d45aacad6c5fa77ef67c9639763e75f78cd19519255b0d0302" - } - }, - "is_transaction_block": false, - "pos_ss_cc_challenge_hash": "0xc627e4207c6842f2a4cf450990815cc1451ec00ea3fcb29fec6abf792b8dcc59", - "proof_of_space": { - "challenge": "0x1a23b4a85d0ba4cc485f2f95c73ba71b55a6adbbabab6253f40c8c7351ba051f", - "plot_public_key": "0xb89fea9c84b7b2fb578d3e7d767127a6d3ca60f71fcd3e2a38b69bbbf1a00288acf88d685911d3500ea4b38193c9a850", - "pool_contract_puzzle_hash": null, - "pool_public_key": "0xa932882ec9c6c20bc843ddd09592dadf293fdbb2523d92e08c5c536fee5d60678613dec909053a0f41a03fcb787b97d2", - "proof": "0xa55eae00b6a7f709a0abcf394e568786b6dff14b6beb5c31703e86cb0b9972ce6ef07696b54b93215ede46d6c7a7100b64f88b66cca0efab9e8c92c575e812262364a55e205700eb6aa69f77ca760223deacaa06a7507e9b1a775446e4713e15d6a73036654807b79e23b588c556b5abd62b15bff7f5d9d32d7ff4bdae5b4f3531a25be39dda8c470305efc4fb0d964b0bbb68d002c972b37223e82ddf5efa961138e858bea0b9ad84b707851ccb1b3963af98c5a6ee92f4a5e3ba8356bbd406a820dd13ce0e7e5514adfd4eea37f92c15c2f1420fe36c4ec69864fcf5cf0145ad7eb352635ca511d14a4dba03dd9c3e87363b8fd6fadc2331f745eac9832567", - "size": 32 - }, - "reward_chain_ip_vdf": { - "challenge": "0x9c55eb88e039b54eae3391d9909ce20f17dd19a6506f562fceeaa9e85c28b17c", - "number_of_iterations": 1171766, - "output": { - "data": "0x0200fb0e0266d6072d840f8b9aea5790dc8f93fca8eef950dd9ed166a3bb6d8f617e1267d182712314059f0fae014a579bf1e58a5453a7fddf1b3a02fb6aac255d23054f875e9967c2deae461195f2183938765517bdc553d5f692f75b8e8c8a2d460100" - } - }, - "reward_chain_sp_signature": "0x993b8762ee16ac9bdb14af5a275aa889bc738d982603b894012d4977b3664a015c4ea514bafd3d87ef3b4cade40345ed12434331de746b00cca632c23b3a6f0b9e00bdcce7c4cb78740519d28e9f91fd201775c326ddce87313d4905020aa13b", - "reward_chain_sp_vdf": { - "challenge": "0x5b86f478a8283bd02497b3d9a22187e98da48b459629d77b4bcfe8da7cd7ebf4", - "number_of_iterations": 4259840, - "output": { - "data": "0x000054ec3c7503611630514166715f66fa5e7e9a9ef8dbfc4af01add08605f1cea7e833b901fd80bb73d2bdec22cb13881b2ceefc6eaf8438f19b4bf122611811f7069a545d5d2922a8d6e571d3eb7f37e84123fa967fc9c08ce8a2e192965d288000100" - } - }, - "signage_point_index": 4, - "total_iters": 686511371907, - "weight": 5196937780 - }, - "reward_chain_ip_proof": { - "normalized_to_identity": false, - "witness": "0x0100bf90aade48f8da6a6aa5cea88342645093556fb74f8b1daacf9b3d67bd48c0236aae8967ff09f41730565e8d8fda6fc8ca06cd5c15c310644148bd16438fec3f2ca46210667987ab8cd00be42f47b7c9cdadbe540d348c5b7bd086bbe584d6350100000000000003f930efcf17d15441b9309281c0d27501788a9d49bbff86c7de11b3452e1a9b022075c9010058e40cad2e392c05fcfefbe156a56e611adb05050bc1736b4dc88b051fff022b1ebc1b66ab89f969942bd30c38ef77afbf06900f9075a1d7ee9af7b82f7a6c6201b3e9138dc9100ac8e856193d9f1eb56ebeb4179e8d5f768c481bdd0cbd8e02010000000000000beb2cf4c543266af09709efdb71d1d85315fe1969daf6790d73b1c12a6399cfaf95f8b900006b97e33565f285c59eb4d7247fd3749439cccf1f72c9a2c2152c758b575bef3fc4ebec47a7c47dd28cb6aa0da1932a303e7d395eda7b199d48b9e63bdf0a28276f75a89f429b98e0f6deb8dcf92781c4f33de080d88ec5a1c707f6a167674f400100", - "witness_type": 2 - }, - "reward_chain_sp_proof": { - "normalized_to_identity": false, - "witness": "0x0200f7c222a940a69270100a1b3e483ca315ddcd7d1abb3dff1b39fcdb7566d2469d24dfa935105f95c63cad911203953d4e069e4a19d080dffc15ee179b919e7638972a796e3216de1ec31bd083f5644b85576732249e93c0d49e10ae1f2af44f43010000000000000e71a8fe01034e2dbc6c4fb1274cb6b040060122b2a4a3ec6cb62f3814a15208e1f08bf3010051f8b9638a5da334a156930d2efe469988ca6b7b86dbeb932b2d70b22c0ada74864b759e5280f781c5d29e4d623c51c00e63f611a3964b65951039a61b208f329aa475f5b43ec1d47178d210165e9567b4aff9209b14478c9b923469163d6504010000000000002b54f8b271c3c3ee0af4495ac87356fd338d8a45499283a35527be1ad05c7b08b4c74f89030090aefd792a726d741a3c22c414bd9e533c7703218eccd0316aadf0ae8aa02933f22e92fe53085caf369e9ef20109b16f3377560bb5e8e8082eabf3207d35140a734ab9a5bdd1a3a4d0f501750d9b91c4d9a40a54c51a0f350ca63aadb80691180100", - "witness_type": 2 + "block": { + "challenge_chain_ip_proof": { + "normalized_to_identity": false, + "witness": "0x0000f5725f532e01020fccb548dd8d5ac9369565e4c881825d161c10924bb66fe70daed501ac39b9bac31718fdba20ea1e0df31ea36691a36b5785fac8946328c737ed619cd658df7d9d2821312ea68ff6367a0035b78e013fd7131b97821d56bb1e0100000000000003f930c3f2812519f90ece15e4e9029ebd153122e8d8113f78054834321d0d51a1ea14b50000a1df1894708a21431bee1829ed738372c029a4d701f2e27645a659cae50d17a25817d0abca67bbe8f1c9168ab66cf71d7e44cd296433580564193e18036d470fa2722808745d94808ecacaa26abad0da3630e807e2ae72d092aea01825285d02010000000000000beb2c87466bf3df371e75088046cedbae394d2884dc5ca29cc1b2974640a922825859590300000688dd045f153ad510663a85334fdd96a653016fd9fb1cbee2becdb0985bd2a6da396a7f4f98c1187b40864f898bd603bddbc24a9e7697ea9750e6030d2d44f34fa8c1939347270313c13282f0d6af7f26b8dcce80848f45aafeaa68cc14530100", + "witness_type": 2 + }, + "challenge_chain_sp_proof": { + "normalized_to_identity": false, + "witness": "0x0300079b45573357b7ec6e9c8bee63f27309c1721b374a84bc77b8701544d915e3a5d4bca907a8cde927908644e57331503ca956623a8929245a15e7331e4070c25411aa409ae2c96c189acd1482c4161617d889392db49527e1965c51124fc92c5a010000000000000e71a8f032897290c27809c9b229fd0659bc435b9cf2351c1968efe8bbde89b409728f2d010037ea5c3e059d5da817e191005ba723ca004fd68c2f9debe3790ff72e97b43c21eaf47f252763a30d1ced338020802e17948ef26e8a8065fa020f6246a8746928a4029a6c6f52aae95628bacf66d1116115fed19b6653823734b69ce23082b642010000000000002b54f8df16d648b49cfdea068d3221fb71ff8202e2d8be92bfa63ab01587d02f4e67fecf0200f7540222073903c7baa168bd42317f6abce3ae54230d79b63d692401905d5a9fdb3c82d9e8a987949d5701721c488cdaa0c03075f9e96d41dc08ade21d2bc300d8c5d82f16d98efa7a9117c13e685511b3552765b4d3602902485f3def7ccb010302", + "witness_type": 2 + }, + "finished_sub_slots": [], + "foliage": { + "foliage_block_data": { + "extension_data": "0x0000000000000000000000000000000000000000000000000000000003a2c7c9", + "farmer_reward_puzzle_hash": "0x0ea986421d3bcc6d073038fe4c120483860376d8c1072d6be8b2c1d3d48d3812", + "pool_signature": "0xae5ef60f09f4065912ea3c0b18ae3afadd306f64edc4c1204250aacdab414236e8114e041005ad073513c3897d1f6d3004beac0b12f5d56b397ecb2bb35daf197c47ae974d1038bee7d33dfc9d609373a62b98035ba8d25bf61c6a995b11c165", + "pool_target": { + "max_height": 0, + "puzzle_hash": "0x0ea986421d3bcc6d073038fe4c120483860376d8c1072d6be8b2c1d3d48d3812" }, - "transactions_generator": null, - "transactions_generator_ref_list": [], - "transactions_info": null + "unfinished_reward_block_hash": "0x0d7533c8eca5f9aee9b8c232ec47bef465b1d5631f5e40ecbec123fd71c7336e" + }, + "foliage_block_data_signature": "0x88ff3db6f0e52ae0ba9558847ffeb3f731cf0f94b3e2c37ec08c00cb9cca39e81390e8b023136b87ad490bd0e5309ac511e3a95a72cd0d8d2ab2347d501b1350c178d4341f80e1cf874596f53a0aca6f3a0cf55464aa4f375df5784b23c15959", + "foliage_transaction_block_hash": null, + "foliage_transaction_block_signature": null, + "prev_block_hash": "0xf8fac7dafb2174e8ced99e016a3a5977fe9108e2eac6ff2655cb7070b1f2f400", + "reward_block_hash": "0x184a367d2635cce46baf779fd6fd505ac5b6ae5443077780ba01a27565ac15b3" + }, + "foliage_transaction_block": null, + "infused_challenge_chain_ip_proof": { + "normalized_to_identity": false, + "witness": "0x0000bf6567f67906994b3ac8bc457acd57b11d06383c82f9a86faa45376c1ece3d4fe8baac63b6dd5ca2a39da6b539c21d5cd4296739b9ff21ec272e2534a35ab72397e4da93d742e3d88114af48c332c64da5c84e265b28ae7fe784bfa21bf409290100000000000003f930c74754a9512f5c741fb056f63db59a55a4aae5ce19570b3835d757c2909fd7fadf0300f008dffb1f5435474e38d89c32e1152b8aaf9412f8edf47f43b34859b9a507f3dc34cb40d5f4a7fdfb9fa63a9e277a450ca72f33f8ebc8bd3e7c3c982321e428ef08af14991be2c8a92f7a6efa97a5e266adb30efb8c23d9fbff5cc2b74e7b13010000000000000beb2c9bfd20dc044275a2c2bcc205676e9aa78753b085661548d480d58437348637a1210200d27a64ae70dfbb769dc48a30bf3a6f170ca801cbb3c1046e5c0dcb0fecca745fc8c03c7f600e6c128e52e207dbe874b9f953cb1b39df1fbcfa22f0f250fc2568f7aea2c33c7f994ffc4253039fdcd63a192d3133d70249f715c366f571ec42160100", + "witness_type": 2 + }, + "reward_chain_block": { + "challenge_chain_ip_vdf": { + "challenge": "0xc627e4207c6842f2a4cf450990815cc1451ec00ea3fcb29fec6abf792b8dcc59", + "number_of_iterations": 7616131, + "output": { + "data": "0x03001da60388bd507fe9dc33808c4ef11e2aa2294a0ade5fb2154c1ee7b55fc19d0d87c4af5a710f584a9f0ae4ef0228189f2fcb818a573bd62387a064d37f19900912475875c0ff36ab61511c47f9c91bc130b24c897ed3055668f7ea6d81ba42020401" + } + }, + "challenge_chain_sp_signature": "0x94d0409cccb05a6deac1f110f98e436fece58ac074b337db063891233a3d987cec8d08d3c215e93bcdfeca59858df42d110b75d23a8f02ecc1b06db89258280c883434af10d9692a8168f6e706ddf8c1bf747e65c4dcb93e55ba579e6452eb50", + "challenge_chain_sp_vdf": { + "challenge": "0xc627e4207c6842f2a4cf450990815cc1451ec00ea3fcb29fec6abf792b8dcc59", + "number_of_iterations": 4259840, + "output": { + "data": "0x02003f9bc7b8c6998affeb87bf4ebaeff14c7776a1e5492a80fc67e5ddd3037dc0ca7e9f2c1a25bbfc422464c70e4ea0e31e9d4206aaa1a5c4141899405ebfe9d82ae842791d48bfe21d1f31eb8a62a464d4d83928990fea3c6e218ddca78677591b0200" + } + }, + "height": 300000, + "infused_challenge_chain_ip_vdf": { + "challenge": "0x361d6612a2911a6ae919857c3c13b8ddaee498134fc690fd809b5ef85c37fc9d", + "number_of_iterations": 1171766, + "output": { + "data": "0x020078c56de302e5ebb1782e34e172ccb954678211bf79a7a4176d19f0147e14be9cbbfc778c5c30a2d565d95827ac6edc8f11d7bed085becbd3d80f99458a921918c525abd8f0a5ade243d45aacad6c5fa77ef67c9639763e75f78cd19519255b0d0302" + } + }, + "is_transaction_block": false, + "pos_ss_cc_challenge_hash": "0xc627e4207c6842f2a4cf450990815cc1451ec00ea3fcb29fec6abf792b8dcc59", + "proof_of_space": { + "challenge": "0x1a23b4a85d0ba4cc485f2f95c73ba71b55a6adbbabab6253f40c8c7351ba051f", + "plot_public_key": "0xb89fea9c84b7b2fb578d3e7d767127a6d3ca60f71fcd3e2a38b69bbbf1a00288acf88d685911d3500ea4b38193c9a850", + "pool_contract_puzzle_hash": null, + "pool_public_key": "0xa932882ec9c6c20bc843ddd09592dadf293fdbb2523d92e08c5c536fee5d60678613dec909053a0f41a03fcb787b97d2", + "proof": "0xa55eae00b6a7f709a0abcf394e568786b6dff14b6beb5c31703e86cb0b9972ce6ef07696b54b93215ede46d6c7a7100b64f88b66cca0efab9e8c92c575e812262364a55e205700eb6aa69f77ca760223deacaa06a7507e9b1a775446e4713e15d6a73036654807b79e23b588c556b5abd62b15bff7f5d9d32d7ff4bdae5b4f3531a25be39dda8c470305efc4fb0d964b0bbb68d002c972b37223e82ddf5efa961138e858bea0b9ad84b707851ccb1b3963af98c5a6ee92f4a5e3ba8356bbd406a820dd13ce0e7e5514adfd4eea37f92c15c2f1420fe36c4ec69864fcf5cf0145ad7eb352635ca511d14a4dba03dd9c3e87363b8fd6fadc2331f745eac9832567", + "size": 32 + }, + "reward_chain_ip_vdf": { + "challenge": "0x9c55eb88e039b54eae3391d9909ce20f17dd19a6506f562fceeaa9e85c28b17c", + "number_of_iterations": 1171766, + "output": { + "data": "0x0200fb0e0266d6072d840f8b9aea5790dc8f93fca8eef950dd9ed166a3bb6d8f617e1267d182712314059f0fae014a579bf1e58a5453a7fddf1b3a02fb6aac255d23054f875e9967c2deae461195f2183938765517bdc553d5f692f75b8e8c8a2d460100" + } + }, + "reward_chain_sp_signature": "0x993b8762ee16ac9bdb14af5a275aa889bc738d982603b894012d4977b3664a015c4ea514bafd3d87ef3b4cade40345ed12434331de746b00cca632c23b3a6f0b9e00bdcce7c4cb78740519d28e9f91fd201775c326ddce87313d4905020aa13b", + "reward_chain_sp_vdf": { + "challenge": "0x5b86f478a8283bd02497b3d9a22187e98da48b459629d77b4bcfe8da7cd7ebf4", + "number_of_iterations": 4259840, + "output": { + "data": "0x000054ec3c7503611630514166715f66fa5e7e9a9ef8dbfc4af01add08605f1cea7e833b901fd80bb73d2bdec22cb13881b2ceefc6eaf8438f19b4bf122611811f7069a545d5d2922a8d6e571d3eb7f37e84123fa967fc9c08ce8a2e192965d288000100" + } + }, + "signage_point_index": 4, + "total_iters": 686511371907, + "weight": 5196937780 + }, + "reward_chain_ip_proof": { + "normalized_to_identity": false, + "witness": "0x0100bf90aade48f8da6a6aa5cea88342645093556fb74f8b1daacf9b3d67bd48c0236aae8967ff09f41730565e8d8fda6fc8ca06cd5c15c310644148bd16438fec3f2ca46210667987ab8cd00be42f47b7c9cdadbe540d348c5b7bd086bbe584d6350100000000000003f930efcf17d15441b9309281c0d27501788a9d49bbff86c7de11b3452e1a9b022075c9010058e40cad2e392c05fcfefbe156a56e611adb05050bc1736b4dc88b051fff022b1ebc1b66ab89f969942bd30c38ef77afbf06900f9075a1d7ee9af7b82f7a6c6201b3e9138dc9100ac8e856193d9f1eb56ebeb4179e8d5f768c481bdd0cbd8e02010000000000000beb2cf4c543266af09709efdb71d1d85315fe1969daf6790d73b1c12a6399cfaf95f8b900006b97e33565f285c59eb4d7247fd3749439cccf1f72c9a2c2152c758b575bef3fc4ebec47a7c47dd28cb6aa0da1932a303e7d395eda7b199d48b9e63bdf0a28276f75a89f429b98e0f6deb8dcf92781c4f33de080d88ec5a1c707f6a167674f400100", + "witness_type": 2 + }, + "reward_chain_sp_proof": { + "normalized_to_identity": false, + "witness": "0x0200f7c222a940a69270100a1b3e483ca315ddcd7d1abb3dff1b39fcdb7566d2469d24dfa935105f95c63cad911203953d4e069e4a19d080dffc15ee179b919e7638972a796e3216de1ec31bd083f5644b85576732249e93c0d49e10ae1f2af44f43010000000000000e71a8fe01034e2dbc6c4fb1274cb6b040060122b2a4a3ec6cb62f3814a15208e1f08bf3010051f8b9638a5da334a156930d2efe469988ca6b7b86dbeb932b2d70b22c0ada74864b759e5280f781c5d29e4d623c51c00e63f611a3964b65951039a61b208f329aa475f5b43ec1d47178d210165e9567b4aff9209b14478c9b923469163d6504010000000000002b54f8b271c3c3ee0af4495ac87356fd338d8a45499283a35527be1ad05c7b08b4c74f89030090aefd792a726d741a3c22c414bd9e533c7703218eccd0316aadf0ae8aa02933f22e92fe53085caf369e9ef20109b16f3377560bb5e8e8082eabf3207d35140a734ab9a5bdd1a3a4d0f501750d9b91c4d9a40a54c51a0f350ca63aadb80691180100", + "witness_type": 2 }, - "success": true + "transactions_generator": null, + "transactions_generator_ref_list": [], + "transactions_info": null + }, + "success": true } diff --git a/tests/tools/466212.json b/tests/tools/466212.json index 13772006fb6d..c9ce64a017be 100644 --- a/tests/tools/466212.json +++ b/tests/tools/466212.json @@ -105,9 +105,7 @@ "witness_type": 2 }, "transactions_generator": "0xff02ffff01ff02ffff01ff04ffff02ff02ffff04ff02ffff04ff05ffff04ff0bffff04ff5fffff04ff81bfffff04ffff0cff82027fff17ff2f80ff8080808080808080ff8080ffff04ffff01ff02ffff03ff17ffff01ff04ffff02ff0bffff04ff2fffff04ff05ffff04ff5fffff04ff27ff808080808080ffff02ff02ffff04ff02ffff04ff05ffff04ff0bffff04ff37ffff04ff2fffff04ff5fff808080808080808080ff8080ff0180ff018080ffff04ffff01ff02ff02ffff04ffff0eff05ff0bff1780ff808080ffff04ffff01ff04ff47ffff04ffff02ff05ffff04ff02ffff04ff0bffff04ff8197ffff01ff84ff0180808080808080ffff04ff81a7ff81d7808080ffff04ffff0127ffff04ffff01820115ffff04ffff01ffffffa08878861c20e8036735b8c667a840197a9606a1d68dc9e7eabc678f3d5d071cc2ff85008f47c80a80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40480ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40680ffff3cffa0785adf9cb597be1356d9f77a6ee98058243862c339bae3f4c77ff52eb76eb2f28080ff80808080ffffffa0c5e4695847cfe602eda89abdab27fb0bba2b66733acf471c238ed7e5aac6ef1fff8423d1f20480ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20480ffff3cffa06ad2223efb50ac20c450c8220852c01a7b9b4c2332125dcd516297b9e7b928228080ff80808080ffffffa05d1caca691c232927c6612df890fa79b476935539f4951b616302caa062d7269ff8400b0585e80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585e80ffff3cffa0dcf60f0202ef5ab585f8b57503c20c87acfeb05f5df5aa9d4cda0ee680d6ea878080ff80808080ffffffa0304322cc7b535a72f08d2d1055f6ee554e6a329ff528802946de6b72d548adc3ff8447a3e40b80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20580ffff3cffa09f510ab6b6cbfb4e2164443cea96176008acc1bcaa443c6238053b38f84ab2688080ff80808080ffffffa0461405660baa199c6208805f749a7ba493ab4a111d03b47ffc8340465b6c328bff85008f47c81580ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40b80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40a80ffff3cffa0f9869c321516f79cf359992cc4b98f4ebda7b48ac4a778d46a8db25d58c0226f8080ff80808080ffffffa0a6eae07f57a427d0b1fa42d5999a30309cf4e0128a5b5421d1117da27367e178ff85008f47c80e80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40880ffff3cffa072e0dd6085c7280de9d80ead2ed855f7953032c5a94278850384b32d30c66dd18080ff80808080ffffffa00255aee3ff3d1f91dce9407936aab66a9bad6206c810091a4f13c0e04b2c03efff8400b0585880ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585880ffff3cffa042674916c41e603a4d54876d3202d6b51c3db3a03e8dc38942cfc5d77e976a398080ff80808080ffffffa0f26b737d7ef8252bf3e69caa10a2aee77c6bfb64e74bfb34cd23ad28b3cd4418ff840160b0bc80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff840160b0bc80ffff3cffa0f7c827ac0b567a39245990ac4559ff3b768ec2a6fa05e2ed5ac96a13045229948080ff80808080ffffffa073414843519eebccaa6a903d0db13fdece1e2c446f615b356fe0ad2949e27cefff8402c1616680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b280ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b480ffff3cffa01a5002d89030bd3fa07197a8375cdf8ad37e0dccd027defc7a8478b53c9a1bd98080ff80808080ffffffa0517b3396ef31e8a8fc2fb3dd0ca5592eeb6dc2f4b3745e4f4cb7f3439dc7f425ff840160b0be80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585e80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586080ffff3cffa0583c293d867a724de27dd9d1ae7e740b8790742369edb03c8c08becda8880f6a8080ff80808080ffffffa0396a31474df2fe6b99262854c86414cc83ffeea728b3eb3fa4ec9b4c3ede9030ff8400b0585c80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585c80ffff3cffa0cb3921fb559002838f3bc84c545403f73f9cbd48ff9f427b67b8615aa77dd12d8080ff80808080ffffffa06bc60f7a3ac7ed38145122899e59fd5403e4fd8ed9258fe8e37a5f352d113655ff840160b0b680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585a80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585c80ffff3cffa0c8cef403cf2ce971648796e5f71301c330a814a8918c12922ff7490b2f9361518080ff80808080ffffffa06405d18ebe8767bdf04d342176815250e3f9bad8c3bdf04b04bdfc4d63305570ff8402c1616780ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b480ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b380ffff3cffa0525d0ced2d0ee0be1651061ae9e93de25ffacbf95ceb7dea65b72da85ce4bf338080ff80808080ffffffa0c1c4c69b300dd9f5fbe35f3db56cf19a563dc2fa15055a5e0e0ece0fdaf8db62ff8423d1f20580ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20580ffff3cffa0b197c94aac16fd87f9542c52229af95f9cf412b863283554a45328197b8aaeea8080ff80808080ffffffa0122328830b9de5560c2202b7570df4eedc702e50ccfac6c206d3018e894dc914ff840160b0c180ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586180ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586080ffff3cffa076571a17713e1cd3a0d6f6ea178b9fc59a2a51ac7f826b3b713cee66271bda798080ff80808080ffffffa0f0a44d8ecd481ea15321dd50554236fe6b73c56f8985f62ce2084d2bd99c5695ff8400b0585a80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585a80ffff3cffa01e4adeac5f401cea7071e233a0676b4780bfb810dc386fe9908392504f1b69288080ff80808080ffffffa032863b1bf312f5a70b8a6ff999bb18579353a372dbc12640547e7eba4df1cb66ff8423d1f20380ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20380ffff3cffa0338919f9bb1e2e0a24a7d84bf51f1c29e10f13fafedf91515d1c6a1272131b9b8080ff80808080ffffffa0840ac9610926c54235a798a15bb80e5cc56d794bd6a023024248f6e4f1f24cb1ff8400b0586080ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0586080ffff3cffa0142ce793e8b4a737ac35ec5bf3826310f32445e0114dc33a19fecb9ec32ef5d28080ff80808080ffffffa06b77823f048ac18fe859b499b81d1f88279738b55131eef383c7ab223442dd4aff85008f47c81080ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40780ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40980ffff3cffa09f6bd086bfbfefeb616d37404a3402af9d75eb03c5cef4fa67e9e470838162c58080ff80808080ffffffa01e1e3dd49192585886710bb3545174616cd0a5bb37d539285f5f66deee549d95ff840160b0b580ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585b80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585a80ffff3cffa09742401b3f3a37bff8963137b03c224b75d9c4162c0b39ef77f8add3868b8f808080ff80808080ffffffa08b2f2e0e3b67585aa04cf90d285191f29d974eb7b4146dd853104c6d6acbb6bdff8400b0585f80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585f80ffff3cffa0f0ca71a097c1e3ca4e50d73882ea57034eab98681ef4aea04b989a73d65119bf8080ff80808080ffffffa08ea43de6c2bc4cd361f7c1ca565a1ec223612f8b0680c2f2fa8eac945a062531ff8447a3e40680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20280ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20480ffff3cffa074198d84154c5f3d290131e0b520a9eaf4229a299ff54db2e1d5fd9093856f2f8080ff80808080ffffffa01f855489215b3096b7dde047ba33fd0044397455f4c3e0f5fd579853eee8564fff840160b0b880ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585b80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585d80ffff3cffa0912d2c5a5cd2730e1e80a36612fe4a5a0bcffba457ea5965a263055b16782ec18080ff80808080ffffffa0af457caa43f98a0698f546a8cab8488148e9bfc890367a26e92ea6802fe14468ff85008f47c80c80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40580ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40780ffff3cffa08cb0c968c79f03821c9858a39c647c0e8ffbe033dc1ae074ef9f705266cb0c088080ff80808080ffffffa08eedb83b2727fb46a7419d6d66da328732fde7f8973c4fa67f9bc52ef4262ba6ff840160b0c780ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586480ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586380ffff3cffa044a1af123d98e52f77817050969b0fe84ea2b80eca37488f20865d3a633adb2e8080ff80808080ffffffa0e6972021c0de4a7a2633ea347c09cd8455ad4bf38e403e4b8c16daa1788bf153ff8423d1f20480ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20480ffff3cffa0957532146bdccaa5ba355e75744a354431012422ea48a4ee186f3e1b0c3524928080ff80808080ffffffa052cbaf088145f1a3f50fb2e1a4b69b0a92c36927ccd700811b94b0757c2b92ddff8400b0585a80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585a80ffff3cffa089fa112c3f143deeb88649ed171381b6c63323d8600b3d28eb90cc570a0020408080ff80808080ffffffa063005c31ef4de5e50235297e4f17c80c412a060d6ce1c0113ccd0f55b584487cff85008f47c80f80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40880ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40780ffff3cffa0b93f00b218fdcf3f1e858822166a9d0f2ca36ee71e9acc34cc0da534c912e0fb8080ff80808080ffffffa0234b917751a67e3d19b0f646e154b097dc18da35db86dde730f2f17dddccd817ff8402c1616e80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b880ffff3cffa0e32dd795e6ffb2b5de6e6decfa026dce8e340eafea13fd397c87918ad3ea318a8080ff80808080ffffffa0234b917751a67e3d19b0f646e154b097dc18da35db86dde730f2f17dddccd817ff8402c1616f80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b880ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b780ffff3cffa05e68c58569ec096497c18f46fe87e327d7bf3b64341cca4a11af8de77c837f838080ff80808080ffffffa0aba8f2399dc79dba33404efd4331ae4c2b9739d7337f2704eb9dfe354e48fadbff840160b0b780ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585c80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585b80ffff3cffa089f898b4496440a8ffea96696b3dfce31fa1d614a93c577c36b05f84dc4003778080ff80808080ffffffa0a01dc2e6b59ceb221acaf0ce1f719acdbe8a1a34f9e1e7d35f03c51ca096fbd8ff850e8d4a50ff80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff850746a5288080ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff850746a5287f80ffff3cffa0323166933c8ee86b324bc6d3e8ae59d564b4cc112ae1cc43620e0c6b710d1a278080ff80808080ffffffa0b568d17af1fdd26f82196a8bd2a94e3d46a1060f524600d94f8f1949e6045eedff8402c1616c80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b580ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b780ffff3cffa0f88bddf200f1b9e723e1e4876ea075bb4605b30501a20da250e6800dd2ba22ca8080ff80808080ffffffa005846c12ff1d617e109a7fccba49e92cc2b924e4e21d38b3840df5458c54d948ff8400b0585c80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585c80ffff3cffa0512bc6ba46e39b56d9741fb5537fd6233477d191a9236decf11559308c7e6bdc8080ff80808080ffffffa05da6ed28b88426f9e50f42000f02803ca554694383cf41bdd72da15599832b1dff8400b0585c80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585c80ffff3cffa01c4afe55c00f8d571caac4353f9b3b146c16d72fe876289b5530ba3a5b66bd868080ff80808080ffffffa0a78255b747f8a8291f365b6167e18eeee3358f518779b1e90c9440f266a53e27ff8402c14ea780ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a75480ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a75380ffff3cffa0f15dd51b0b41b819bc614a2ab600f6da70d446678d09ace932cb88b3495520a78080ff80808080ffffffa0b30aea52d8c2225197314756fb1695af77b9f44c2bff5af79dd12bc01b7edacfff8400b0585980ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585980ffff3cffa0be35f4a5bda4a6a5b47967342f1cfc89af1f2f77c55d048aa15152377b3c52ab8080ff80808080ffffffa0ced2354b8b5d29db7eb970cb5583848f1792a64d7b504d453d4830b011184656ff83582c2d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff83582c2d80ffff3cffa02a02785ae916f8005a68723a407d0ccb45e005f75b7b267001a43ce09051145a8080ff80808080ffffffa08df94e8d085e74a811f2f9e7331bceb4c4dedc9ff71ff7de0ac6de13a187902fff8402c1617680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0ba80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0bc80ffff3cffa0741deae38c858f02f8c4e7da6c41dcd331ddb2a58df83d42b8ea900c3cebaa488080ff80808080ffffffa06ad649065d96a983d5fe0d73e537ff0de4c79b45ff269cdac622d0ade7f2ee14ff840160b0c280ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586080ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586280ffff3cffa086a156483af17a976ccf795c66c052e36f2550093081bbb05ad1a7c2dd79ba058080ff80808080ffffffa07001d37dc41e38204a526613b02e85a3ef2440142d40acca00c6135954e4747eff8447a3e40b80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20580ffff3cffa0814f421409b8fd862a811a6b305c14352a0b8c24c35abc4e69cf63d49ebd5f688080ff80808080ffffffa080cfe0b9c4495befe31e3e344c3cde5747c5b98bca677dc80b8a99280203d28dff83582c3080ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff83582c3080ffff3cffa08e8b2125cb3c17fa7855f5934195a001303da79480106cf4c1ba098de1d3f9bb8080ff80808080ffffffa01c759e45ec66fdcd1c4177ffaad06e4958667f514d21740f3ab8cc8a64774c7aff8400b0585f80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585f80ffff3cffa02224f74f1cb51b845901073650eadc9063f5ec80c2f3c9d00eadc09fb593c88b8080ff80808080ffffffa098993f57159e75c9851ff1af169a38aab13c09411172cd2e6bee56749f094b9fff8447a3e40c80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20580ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff3cffa05b77369e332e3d864759264d575387f46ecab07e5bdb454e09d9aef2e60bd9c98080ff80808080ffffffa05589f2207f11788b915380865814ef11a85bff08fe603d27db2e19ebd0b1fd69ff8447a3e40980ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20580ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20480ffff3cffa0dbb3159014ede8af10b0b9d539be461dea65ad97993b00e2581be8f123402e8e8080ff80808080ffffffa0c928cb387e4f0a69ef8aa2aa73841a90dbc55fd90fb985c7298de22dd30f2428ff8447a3e40f80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20880ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff3cffa08b61f79424cf7599a8623165381636c8780f4123916a43c827fad51eb9d110bc8080ff80808080ffffffa05fd78f4d722caab57288a6cd1832e4d47e014fcf91e4dc2d201b47cda25b4d96ff8400b0585d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585d80ffff3cffa0f7850177b64b62e065692eb74f4dbfd9b66cf252109dbb1a3ae51d85436e1d978080ff80808080ffffffa08d5cb65566168f7e4364e83da3b71862a192c4b7075c542f1a99f86ee3482abcff8400b0585a80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585a80ffff3cffa0858a1f05b14b3883b47084a6d5b9ce554e41e49bf8068ec0aa6c2c59e05a37698080ff80808080ffffffa0f9696f37b02165cbda3679cb90c6cab2e288327bbe0303f866f0d6556119e5d9ff85008f47c80d80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40780ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40680ffff3cffa0e720bce229df15673c32067c0462fc13d78a89ae57e2ae19e47fc7088836af7c8080ff80808080ffffffa07583422d0fae81ec2b74bb7c7b4f4a66b7aae8828706610e359e935628539d2aff8447a3e40e80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20880ffff3cffa0f12f42f4373fbf985cc2ca81fe1725c50a769d0a963b5ea8e4b6facca68944668080ff80808080ffffffa04592956ac3730d64face621e260905f6a1184a12dfbd8b7e7f75ccd8495c792dff83582c2d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff83582c2d80ffff3cffa07fa01aa5614a661a7011825538a492b62ca2944366165090f41cbe8b0bfb8dad8080ff80808080ffffffa0a907989be1e136e9bdb13f446505ae04e387c92b033a94872ab196c4b58f3c17ff8402c1617380ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0ba80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b980ffff3cffa06dcb947795317ad408601c861ad29cd4137e0641c9edfa344df9f7c6f6d15b868080ff80808080ffffffa03e24822728e6cb265ba5cc904a5e8a09acbd720b405e12bc4c7740d56541922cff8400b0585c80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585c80ffff3cffa093127d9b10b356eb5b6d4f850407bd7af9420500ce578ea966e60f68924480ab8080ff80808080ffffffa021098b118686a33ad764a6ea3def66fd119386544874a31a622df49f07ecd874ff8447a3e40a80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20480ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff3cffa08a005a1a309a354a34159e52782ae0bbdf0e906907dcb5593f925d717c1020928080ff80808080ffffffa0ba143ce8f167b4dc3f6d1c0868c1387cb9ca25cc3633b03ce3a2e6cb8730893dff84015ec7d480ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff84015ec7d480ffff3cffa0968b0d141ad89247234d88250d1981b7618c5f4642c7760de87e67ad0353d0878080ff80808080ffffffa08adc77779cd51c235b48b8656a2db847e6c7dfb3ad34ce942a64311dc79884c0ff83582c2b80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff83582c2b80ffff3cffa0adfef8c4085bf4e2a797d29237c88121fcaeba6de1a06e44b0240a02faa2ebae8080ff80808080ffffffa020e59e866a31d9039ba5f4ec6b20aad6a127e5554d72ae2e2c30193a383dd74cff8447a3e40f80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20880ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff3cffa0ad954e8e43deb3a468b0e8d8db867195e88eb69486206feeb6fd9739c87f0abb8080ff80808080ffffffa0e6b873a87aac0333acee94b0222fa6cb1d992110cf5527a1578ef375136be40dff85008f47c80f80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40880ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40780ffff3cffa08146ad91ca7c949dda4bc6f7ce20b4b7bb263b63f21edbfd9852a0fd6fa43b2f8080ff80808080ffffffa07b0edf7f6bb489ec2b40657753e7fc5ea954a7c5a9a40c3f3009f5696c36b214ff840160b0c480ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586180ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586380ffff3cffa0492050d937c5d602cbc9dcb261a5824e266b71e5ddee6a85992b2469c58832ae8080ff80808080ffffffa0a7cfdcaa046bdb370c91eb2e08f5d4ab298b1822bad738e73aeae0260a0c7350ff840160b0c480ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586180ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586380ffff3cffa0e33b3b52cd67d77b68d6f0101767370373adaeb34e13dcaa6460b3a6881e390c8080ff80808080ffffffa0616d3ae1b99f54e2e38a5c01b13cdf4d6d76856803d93ea378f229ec78efdf0bff8423d1f20180ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20180ffff3cffa07fa5f6212a801d5cb838cc4a503191c9f8114b5ab3e8ef7a6ac8315e500e17d08080ff80808080ffffffa0e272a0ad059d83a657a69dd19e540c373235cc2fdb78b25810c2b22da0fea209ff8400b0585c80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585c80ffff3cffa0f7d81abfd1493b3e56ce75df11cd32e29cdae6c6b37d5f92d84824c7b92542c28080ff80808080ffffffa0a2e7b4badd0ff0c260c53687ac29c5c646a6f76d07a583ec6e361ad0de0dcdbaff840160b0b680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585a80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585c80ffff3cffa0bdb935dd4ccad0dc3d364327518ec9eee8b74f08de353685d64b8122f3be3ba58080ff80808080ffffffa04fde59076748d0043a4892cecbce74bbd39bd1400206651d739bd47bdba70c81ff85008f47c80b80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40580ffff3cffa09fcf946f6e74e58e03cca94fc4b7f0aa144246cd46eac2d31d4ed9a330ca91ac8080ff80808080ffffffa05dd584607fb995f6497b9f8a59ce3d99a9a233b1af1a394dbf67ccc0074dc0e3ff8400b0585e80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585e80ffff3cffa081644191003a00b14ed956852b60b1a1605390028fabf92cb6add26e69b0b6688080ff80808080ffffffa03871d6cf73542613bad26ff6172510e2be7635064873c516140a5939952ba1deff840160b0b680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585a80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585c80ffff3cffa052c300407f1dacf4a3465f32e55e45f0beea92ee3b5dbebd9e495cbc2c17e0728080ff80808080ffffffa093ae14eb1ffa0c0f69906927750821be3f8e83292f7a35ad0a3230f2727d424dff8400b0585c80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585c80ffff3cffa0ca63b0b91a124e5295754b7c6111a0fd0d75109e112f3ce06943c206a3fa157e8080ff80808080ffffffa0d5c376b1caa928d5e15756721fd650cd9d2c7d9e9b652f3c535f68cb275fde5eff8402c14e9680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a74a80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a74c80ffff3cffa0ab54d89a30436259927a48c3065f02cc96e9152ca2a17860e3b6535af26d0b928080ff80808080ffffffa00f59c4013c59c7a189de5953a20bbde02967bf044b7a58ee559d5e113ccb6cc2ff8402c1616880ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b380ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b580ffff3cffa05ccd49dcbc1837e35fd757f4ef16d12237fb22b0716e00053e774724f1b281038080ff80808080ffffffa09ee74cf1cc05ffd8e49f5d0be075652a481f51274d1e9a0a02a267433118ddcfff8400b0585b80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585b80ffff3cffa0a18ebed52a1b8ece5f99e015f060ebc27da02042996d51bb52bff52c1f0604c98080ff80808080ffffffa0d7cb503b2d0bbdb15b0f73417a1d159071ec1ed26aff5c02ae6937f17128979fff840160b0c080ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585f80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586180ffff3cffa072dadb6acb241e60f5bf3aa93dba1c0f8582cf050dfaef725f5fa925975a6fb38080ff80808080ffffffa07a2e6655fd2072cd20c44223f6d7175acd49914f4bd57a153604c44805e17deeff8423d1f20280ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20280ffff3cffa0f3cb9a238aed6b1e61316b707f1ceeef1e695da320c3bb6ed2142cafb86dd7268080ff80808080ffffffa02f400307767b5b43fa0765ad62571469111753d15af67ad8ea3c06819dca9ffaff840160b0b980ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585d80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585c80ffff3cffa0da9d680a369aeb278ecdd3be7726524eb2025f2c5ff5be3743339260801730658080ff80808080ffffffa06405d18ebe8767bdf04d342176815250e3f9bad8c3bdf04b04bdfc4d63305570ff8402c1616580ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b380ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b280ffff3cffa0743eca63bd0978e5fb1be4a1939d0b036d4173025f691e2f1d7a3274f03541108080ff80808080ffffffa0106f7eafc6e57d0c5f36f748a4c7a30b686b026741bb6f6f2073a8a12c5aff4eff8400b0585a80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585a80ffff3cffa0a2ffb1fb08d0413052e27173be2eb9101ae0ed81ecfce12353cb0c3b88e71fa78080ff80808080ffffffa04a313994c18f1b0a4e563af1835764a157fda68e8e750753515979bb412b05c9ff8400b0585e80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585e80ffff3cffa02b9e1b545ce7da01747d506b0ab8c4720d4ced8d685b1c8ceb152e48390a12d48080ff80808080ffffffa072ceb8e2eb1811953798158c3d989d825f78b396daa08bed2981c28d6da2e0e2ff840160b0b880ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585b80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585d80ffff3cffa02dd3b3d315ca7dfa47e90fbbeca7ff69c7bff97f3229e91d78a223f26bd866df8080ff80808080ffffffa077495825db8106a8a2612fa4454957a7ae724ebc59988dc87b8f194dc86e006cff8447a3e40780ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20480ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20380ffff3cffa0039028e4b90ca1db2f5d39e825dae08b8f47612ae151ec55f3bab19fe21b46c38080ff80808080ffffffa05ada8f21b2c8c8823013ee8567bd84125c9a762f428f395fc32f4585618667e8ff840160b0c280ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586080ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586280ffff3cffa0017d567675dae0683e8125828f4a3c3c48d1149050a39b69c678e39f6af356228080ff80808080ffffffa034facecd85936ef1d7137e62a5acd2906b0960399509f6c0547de6dade483ec7ff8400b0585d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585d80ffff3cffa07005674fbf15ece8591eb505ec5481482fa9eadd868ffb4256ed39534960c93e8080ff80808080ffffffa0f9d2311d7d6a9b41d5361ebd137c2723612e2fc007bf3e0bd25f7f44b5f4d8a1ff8423d1f20380ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20380ffff3cffa07d206b1521004fd917f2fdeec52ff341e3ebc2ffc7198e4e6101cb3a3f7f46398080ff80808080ffffffa091c21525b17ec34390566df445cef111dc4ba445e87d20ed948bcc4f9772928aff85008f47c81280ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40880ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40a80ffff3cffa037e82bdc150732ad26414a7293f73b4fb40d9be245e8bca331a0d1e13884daf98080ff80808080ffffffa057cd00968d77f6f07721a4ed119ca84ffd0284ca2745c2876da693973d2e36acff8402c14ea280ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a75080ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a75280ffff3cffa0393b24efc459bf6f878455adce4f7d243b7619375ed6fb9d89016f88e2a77d4e8080ff80808080ffffffa063463b5fd97714e6ce1f11c81e59535ce3c26a7b1aebbea40f26dfb8a4417caaff8423d1f20780ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20780ffff3cffa01ad799bb4dff9797917c034a58a2fe8cb4b681491bf0fa959323550e740d6cf38080ff80808080ffffffa02731507e5cd841da794c4db2faf937245ad03702cde101041bbbeb69baac693aff8447a3e41080ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20980ffff3cffa086346f41c788660bc0620a45ff47b28972dffe3d7c7ad0bee463400903aa031b8080ff80808080ffffffa04fb9afccaff0f57fe4cf73f6bb481ed920c40f0d54306bb0d3aab9ec21fbff10ff8423d1f20480ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20480ffff3cffa097d75c5703ac0210141c10f7d72ea0318297a3f109a6cdb4f14116a9725476758080ff80808080ffffffa03d336ca8f7dd7ba1e34c846b53e95cb6014cd2eba50b23a6b86e2ca6065b3a78ff8447a3e41080ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20980ffff3cffa0b71ec0308a4c7140b22a05d9de4783c217f1d70f0150392e3ad0ef1d3cf2db7c8080ff80808080ffffffa0cfcb852ca3768cb18672341b5ad9e6e8df1122d1df2da3111cf749669b385eeaff8400b0585d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585d80ffff3cffa0ec02b1ec50e9dff144a268f1279cd890c02ffb768beacd1cd4dc2761c5008c008080ff80808080ffffffa07c1d55712fb1e5bc2e9fccc96040b5111024f57613b85ad23376c83ff99b7cc6ff8402c1617980ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0bd80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0bc80ffff3cffa0eb708a72d6c047a7e2f6e3407fff77beee487dc1aecb1963f8d47ec1039f8e288080ff80808080ffffffa018966331bc725236a541e6b51b13228c43a21b9b28a156ed5b003a76a4a019e5ff8423d1f20980ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20980ffff3cffa0eefd356008f4ccdd817870abc286658d5814032fb4358579cc969aa1bec0d0e98080ff80808080ffffffa013e311405b030daff210a3fd0cf61641f9100e04e42d3b4ba4aa9b09f14408bcff8447a3e40980ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20580ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20480ffff3cffa08cb6f27dde0ac9c693be9e4bba03c3b05b2b7fde6fd188f1ae6b6e16e12ad7958080ff80808080ffffffa0b3cac0f846d343387b00aba98b0dd6c7cb4bdf7464545b97c1e4a30ad824e0c7ff8400b0585e80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585e80ffff3cffa0cba6c10111b673108c9c7ea810e5707e8369bfe5cfb8bb69192a7f21491bbb858080ff80808080ffffffa02b61e8c24f4624debbf4d9c550deba7bd77f8e279343e70c23f2d05aa67f492aff8447a3e41180ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20980ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20880ffff3cffa020d14be89d42d3c5b6cee02b01e80cbd0caf9650b215d9615f366325b908fcbb8080ff80808080ffffffa0d5c376b1caa928d5e15756721fd650cd9d2c7d9e9b652f3c535f68cb275fde5eff8402c14e9580ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a74b80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a74a80ffff3cffa0a972d04a963cc344d8bc8bd47de7876a2fabe42713ea15b54e9343db6b86b4be8080ff80808080ffffffa02475ad46c4fd863adfe8b921982fae7aaa4bb3689f33e1c426a18515d04b4cbeff8400b0585a80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585a80ffff3cffa0287705b2e95f1714a14a7e2af44017309590f286a3ab6d9424d9879d3b1932828080ff80808080ffffffa02ba2394b88dccfc5d1352cf8ae2d3ff1fcc80a262f92bdc3d51da7f0778df548ff8447a3e40f80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20880ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff3cffa087c67b877aaed9d329415d6876f5e165e2b55295c7e9c158d30eda1357cbad2c8080ff80808080ffffffa04454a39198e22fe8a9570c6fa6b7733f702170f2c064060f924177f750a8b585ff8400b0585980ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585980ffff3cffa0bd5bd2505ab58075fd576fd1a15b9fd3ea0781ad18b441d1411715055dc83d538080ff80808080ffffffa0f92a54bbde54131be7943425dbcc89e09ccfce3646cb8e1ebc0e013349e6b78dff8447a3e40480ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20180ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20380ffff3cffa0e5e31e5f75c26d3e777520c6d42ef03c8ec06849026e37eeff63ac7447fd9ef88080ff80808080ffffffa08ea43de6c2bc4cd361f7c1ca565a1ec223612f8b0680c2f2fa8eac945a062531ff8447a3e40580ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20380ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20280ffff3cffa092ff32d80ca10beaded72345bca45e6f6ae715d74768449e2c196d62156a0ad88080ff80808080ffffffa0cd9986fbf5ecd29a4827c65fb4c4d399925a21c180ae9a6f32182b2a6ea9b0f9ff840160b0b180ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff840160b0b180ffff3cffa0dec7622d28ce8bdd70ddb716122c86e96cf5c0465d74f8babde0dc224f3b961a8080ff80808080ffffffa0bb6eb1d65cd99c0190cf44375de7be03544c5764f866650d46705e83d7a56703ff8400b0585980ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585980ffff3cffa0a9850118d550f062f19f0e67961dae16531b392635ecf753d5d2bc6ab103879c8080ff80808080ffffffa01a6a240389268c8d7730e2f3cd56462497c3b599bc83a57941c11379c2454ffcff85008f47c80a80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40480ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40680ffff3cffa0bb7e2b86699c8fae4611b37eb407e7ead2f9492355bcc7120285153feaf15d9d8080ff80808080ffffffa0c29a7890db81abf2990c04247712847abafe0c07107d6e52ad0268cedccb177dff8447a3e41180ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20980ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20880ffff3cffa0daffd0a01b03217651a674d7b1fe507eecef8404f44e9fc227e4c3f546e434728080ff80808080ffffffa00374832834d6cbdc3212e775e48d75c040f4ab612e5ddde64bf3b9c10dc124b3ff8423d1f20780ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20780ffff3cffa077987c6975aa6dc5be5eddd0f31a66812d32f1407472a28a720257cc943287a08080ff80808080ffffffa05589f2207f11788b915380865814ef11a85bff08fe603d27db2e19ebd0b1fd69ff8447a3e40b80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20580ffff3cffa01b0fc99121e00a1e45592dd9fc102de3c429de47b2b07d0a8db5a3aba44870a58080ff80808080ffffffa0fe81f39cb69bbcf4a26fdaec9f19d374dc6327157742ce248a6cc24b1b4c7906ff8423d1f20380ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20380ffff3cffa0766f0b8f771d58bc14998792fa4f80e6c9c30533bcce8f4c71e4d7822d6050b18080ff80808080ffffffa06869bd5515cf15789fef4b5994d46a1d93a78e31ba8d3f30e2d1a3e165e0d610ff8447a3e40b80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20580ffff3cffa049d41f35d7de4a4a0771d9697e920cfcdadaf78493256b1dfaae9798f57d4a268080ff80808080ffffffa0f05f3a96cdfdd6accf5402a1705abcca2ff9ca958b35f15551ac029a16309446ff840160b0b480ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585980ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585b80ffff3cffa008379c3a07fe6356ea76b91e69f5df48d7ad2cdfbbf77d21372fdd30765662978080ff80808080ffffffa032e81d5035e6b71f553f3a7137814c595ccda1e97e8bdb91b12ac5cc5a0751d5ff84015ec7d380ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff84015ec7d380ffff3cffa09b235a572252bbe1194ab4cc13c285e321c0281a4bfeb7b0b63911c9b3b7cade8080ff80808080ffffffa0c5450f6366ec81e3c18d3c30ae4c8e9ca6d418316dd02491a72300b8633c452eff85008f47c81280ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40880ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40a80ffff3cffa00a929a4da227403c4e76470962d57a2ea7816f54f77f82fd38fd5d491aad714e8080ff80808080ffffffa0a90d1637505354df67bdeb5bbd9367cfef47c2d741519cdd93b9797e50ef77c0ff8400b0585e80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585e80ffff3cffa0cf12c6bf7535e5ded43ccbbfd0d503522bf66fc7356955304c2e4eae49f2ebf98080ff80808080ffffffa0f8b75dd56ad5c757e72e847e09cc2f6c5ea683835b2f55f2e65433130464690fff85008f47c81480ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40980ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40b80ffff3cffa02084725033509b03395e8fde6173cf971aca5319e0ea746c1f364794de8ebab78080ff80808080ffffffa014ee0dc301d137bdfef0c1505437d74942b1efeb5fc121698766189bc45127f3ff8447a3e40b80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20580ffff3cffa0cd90b206c2a36ad3ea05fa4e7774e26d8e33337bca64e1b9f81e53fce910314b8080ff80808080ffffffa099f010db51ba681f2fd9c4a56837064063ec35c3f50e08fcfb57b97c0170a788ff8423d1f20380ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20380ffff3cffa08c55d60ca4f328541df49d8d9af09e0da265a1c8ea164b93f92134502f4319758080ff80808080ffffffa07bf570866bc98c92f4e7140675ad6fd2cbd77e25e7f13005eab7e33184a68ea2ff8400b0585c80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585c80ffff3cffa0507d3d57090ae074f58a34ca61cfa50641ca71e4e7b3c210c07cd287281172158080ff80808080ffffffa056006bafd96958821a5d20cb3098bd9d5791cf73312cb10cdb11388874520b9dff85008f47c81480ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40980ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40b80ffff3cffa07d7cee7e762e97d76cd275eeeffc7ae3d3a9929a476dec2d0c5c83a7f932a7af8080ff80808080ffffffa0e774521ad0c9374d09022ced698d77259b2e00ce007595b3f2ec854ab7f59187ff840160b0bb80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585e80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585d80ffff3cffa011f1bc7fe733fca37934b84ba76f211f385b1ba30a020c1fe5b91cb209d526588080ff80808080ffffffa004bbfcb77adaaa4306364477bf605d6e0ad1a21a71de065d8648473b1b3264dcff85008f47c81480ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40980ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40b80ffff3cffa07b3fe365c2ab50afceaa9ace9cabfd050cdab6152570a9391f8874eec9d6c8348080ff80808080ffffffa0c8237c9e5c9a48a1d70937fd43e934a0bc9423d2957c402337bf1b9774b096aeff8423d1f20580ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20580ffff3cffa0768e6edaed111467670976137c2e3cb06107182ae64f7f0438d3a663ec29995f8080ff80808080ffffffa0c7774da3768ecda6d7fa09e0c7b88917d19f9e80d363cd236eb350ae8f38b33aff8423d1f20480ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20480ffff3cffa046ad1c6ae73d65f42ee2aa4cda2695d4cd5b5bad8eeb4d8e19e4e37c8a54f1838080ff80808080ffffffa090c8c197fd2aa7a60dade52100fef96ce016443f21648606194d02bc6c15a7cfff8447a3e40c80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20580ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff3cffa00d997f502d2d3c0b0a2d6f943a41f454b0d83753e13b50eaf6a56c351907640d8080ff80808080ffffffa0fc86114b97ee899a7680f47fe859b135c4de1f2a429d52d89a1127bd01f7085fff840160b0c580ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586380ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586280ffff3cffa0ed4e77d5efbb2e70559da692eacf43c3ba8741b512e5b7c3db05f2a49f368e748080ff80808080ffffffa0a2e7b4badd0ff0c260c53687ac29c5c646a6f76d07a583ec6e361ad0de0dcdbaff840160b0b880ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585b80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585d80ffff3cffa044e87fc37792d99745d3afd8cf98143e4f191ea43a05385ebbda6bbfafc95cfd8080ff80808080ffffffa08a89efa5600227cc82463146dcdff04b02115303bf7116fd17b3cbf42797feb0ff8400b0585d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585d80ffff3cffa04041f97c0a8f90da8d567078295aed9e3c8de8e3acf5ee07a256bd813643a9bb8080ff80808080ffffffa028e7c56c2b26f8f543a91573a16bf96016879280c3362ac7138cbe4d4a39e211ff8400b0585e80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585e80ffff3cffa08868a68f1c36bfb6884a4f7a7ca6f5f5d280a757372b5100ddc29cc878b443f28080ff80808080ffffffa0abea892be3f96b22825a1eff7656931e69b981ea6ba01ec6b38647bd2c4310a2ff8447a3e40980ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20580ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20480ffff3cffa05f6f52bc0e2581d0dd6fd12e54d522921d0a8eebd434bd5a9aba43a483bca3428080ff80808080ffffffa0e0669c6d8bf1333c44e24d88d540ec63cd3c60ae3df990d80f7dcbbd115d8c1fff8447a3e40c80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20580ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff3cffa0f2ad09646a667aba289686e47610e0cad820f7b3cb865fc91f68698711c0b4bf8080ff80808080ffffffa03e87447b560c67cb11b672c5fdc942878850ed3e1495f6d2af2b7fa30f64c5a5ff8402c1616b80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b580ffff3cffa0a4787b7c0d61d1aa6cc01ac1db83ca5061dd6bc99add3417dc5069f00517f1ea8080ff80808080ffffffa008c415be7e52b0b4eb43f7f9d15a62400c26c59b7c989e0f1121865e8c737d6aff8400b0585d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585d80ffff3cffa0e89d7a8f538e7b4fcfa3dc1b030fa4d18ef184f73479ae0b7792a358795aa2858080ff80808080ffffffa01c41b192f6a5542ba1c4377e5c39b3a4de4a0be40a5d46cee31937b1ec8861afff8400b0585d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585d80ffff3cffa0383bd15a87a5bd16370dd8fdc5355abab4dc879824725504497a557b76f822a18080ff80808080ffffffa01fedd5382bb8da21554b6aad4c3cb6f546dc1874e1567defc19d574d758c7e5eff8402c1616c80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b580ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b780ffff3cffa06c689d3f2af9f0195427fbc58de746b948db10ba35872e693e969574f9f0bb038080ff80808080ffffffa083320cf0a1e0742dba24add0c3cb15023efce8e492ddcc5cfb99deae65688a9fff840160b0b980ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585d80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585c80ffff3cffa032371eee525bdbe890381bcc1c1ec0e86276b4b1bc3c8371841d579965feeca58080ff80808080ffffffa0a7dbb40634d0f30228582d7019d31ede54051fb4c9bcbfbeba10563798b298cdff8400b0585980ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585980ffff3cffa02ce6151947d0ab04e7c8c5c67fd58558584b6f21eacd0383f1f5accb704efb818080ff80808080ffffffa035f401240ee0cc196594c2f57378538ae86c2f53249c15046eb2f780762ffde4ff8423d1f20480ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20480ffff3cffa0f579049a4f3954b14dc4ee1c87a153dbba3c33567ddd1726fc76700bb13b5c168080ff80808080ffffffa05c22c586a7d716dc93356167a3eb1a350facbdf183e849b60d7db72b8e2651f2ff8402c1617780ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0bc80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0bb80ffff3cffa0e311945fc96154cb478d74acf90be1bf08c6482f991459c7d609d3051e67f7d68080ff80808080ffffffa0f880e075500dba69409eddfc251fa4ec4ddd025f326cbe14f9083882a7abdaa1ff8447a3e40680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20280ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20480ffff3cffa06d63a9e6ca683807c865baf8715fe6a7da2ce2996329f0d148fd75fcfb8906258080ff80808080ffffffa045dfef331eca21498d5fbdcad5751a5dccee76be309274720290eca2bee0fdebff8423d1f20480ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20480ffff3cffa01fd14791db46f8662f76cd29986a797a79c889d0b20333c6c6063c9bee9f37508080ff80808080ffffffa0e35f79bdea7e263ea4c4bfb1fc95d8b70d6a5903deea160ab962b15432afb905ff840160b0bd80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585f80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585e80ffff3cffa07f4fff25da88101928bf2daa49bca82f5510eaeb3b0d2c8553eb3309b2b55e548080ff80808080ffffffa048be6a715bcc75412698675f68ad5efaa199145e21dfb26b36d0f7325d7c6106ff8400b0585c80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585c80ffff3cffa06812ec5dd11f9ae5ed98f10bf22f0573512333e1bffabdda0f03d5ba3f05dfa48080ff80808080ffffffa04d196e49ceecebfbd9e4d09353c453a1b3ed397d20a89202ac72c0d52f906af7ff85008f47c80f80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40880ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40780ffff3cffa070d38a6a5d222cf97793d437aa7e5e640650c4f92083cd244520f686c8386dff8080ff80808080ffffffa04d3ac56d49a0b0437623c23f5dfc66c37806741ac8480d3e8fdadaf98b36fc0eff8402c1616d80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b780ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b680ffff3cffa00f16a7aa0b689bb58da7aad836673d3ce8514d17930fced384295043b64938238080ff80808080ffffffa036a9abe750adc5e58e87b7201079db558a07bfdb71b03881d907c98108a98427ff85008f47c81080ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40780ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40980ffff3cffa07efacfd57b1afc46eab5e820655e908efd015bfdc593eae0da4bca6e9e7ddf6b8080ff80808080ffffffa00fb62dee2d0d7931c2506728049b50213f62e7c188c2f5e73a239e12a623aaecff8400b0585b80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585b80ffff3cffa04872e0e7c9b96a13b9e9723b497b9893e74add67e9d778934160a7ad43f855ad8080ff80808080ffffffa0b3867ade00c2aad8b0dade0f5a6f8bccc9f5e7a90e696aa22fd4e3c2a60e4487ff8400b0585b80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585b80ffff3cffa02c6e60b68ccbcc44d5be0533533ee93f7905d268c86e65728970cf5e8cdd253d8080ff80808080ffffffa076b1cc36f630ecf26c369353bb247cf4c125661c09aaabcc0ca63a7c1e24c5c9ff85008f47c80d80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40780ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40680ffff3cffa073afb4a140ad07c510945d9be4ab4f5620cbb1624accdff0a1cfc278f74ea6668080ff80808080ffffffa094a558c0406255a99c46dc582dde983ac9a5cc902a3363d4aa48ecdfe9e541b6ff840160b0c680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586280ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586480ffff3cffa0176759ddb3c7d48f8083b5498618540234a2c699a8903d1dca1b2bd6e3841b738080ff80808080ffffffa04e9fe555ef9b2c90258ffde7735f8b29485254cb7f7c72225fde309f6f33e51fff8400b0585a80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585a80ffff3cffa027dbfe095f3917444ff1d441f29fb2c1cbff8b0bc65fd55dde13397a03ca38978080ff80808080ffffffa030d378a60d5f43e7ac1ba6dfe0608a83905e370c89a737a1fbedb51c9a03529eff840160b0bf80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586080ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585f80ffff3cffa0b88df7cca947edfd08ed2aed4656e3e6446c8d3f060894fbec63601a3a6875538080ff80808080ffffffa073009bae4c9267d5bf4d71d0aae092f7c331936d2257e56047913f55546585eeff8400b0585c80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585c80ffff3cffa0019d99dd493618a8e0b0e1b5d183db876bb4a705584aab0d954c49fcc55c10d08080ff80808080ffffffa06c0dce17e589cc178bc43142ee89b663139e921f701c82dde8def57977e8a678ff8447a3e40a80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20480ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff3cffa0ef8b5b4750e180666c97bbe9e135e531ff1069adb6142cda985cfb9956c194398080ff80808080ffffffa0bedace578eaee42c9434a7b9e6c222a51039dad2ce90c0081773fb9b7fab774aff8402c1616e80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b880ffff3cffa096a8e7f2ed71eae104adcc30b84e1e5e79a3d211b45477a10dbde67cbe4773ee8080ff80808080ffffffa09c4dec4cfbcfd084b07b59244b68b3fa4b072d9ac1269746c090cda419707874ff8400b0585d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585d80ffff3cffa01f4b48356da7cbce240f50bc039f862db6b88ba711e53cddf61a0bd04d47318e8080ff80808080ffffffa0b3e7a3211c81900afba047983a9be37ec40634a9c05af3204de34c33139ffe9eff8423d1f20580ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20580ffff3cffa07f81d3e1b909937ed31563af92086f73420b8931001bb53314f2fd1414be2c588080ff80808080ffffffa026e623835062d7613ec1d0bd94482156eef72ed262cb835bc5282bd54dbf4a8eff8402c1616380ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b280ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b180ffff3cffa0525e71a4b36b1b65a3c5516b128f115b849d4dbad1e1c10e7b59ffa8bbea770c8080ff80808080ffffffa0a25e58e8c4e5f45bc8853ae319961cbcdd81260618ea1b9d66e07dbb632ad693ff840160b0c180ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586180ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586080ffff3cffa0fa2e511cbfadf77667f0fa0805cadfd965403463281174a0cb9e8e59133cb5f78080ff80808080ffffffa0f970a6639876d47253950743f853ef0e72ce4a3e5756fd45e6e914d946e5d650ff8400b0585c80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585c80ffff3cffa09477dab5fe03556718f0d150d749c450d39c55d95743d2ce03b4539c49d797628080ff80808080ffffffa06869bd5515cf15789fef4b5994d46a1d93a78e31ba8d3f30e2d1a3e165e0d610ff8447a3e40d80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff3cffa02ea5478b1cc2877b548c37f607abe514bbbe3ba168663c8a2b49849b16794eb18080ff80808080ffffffa082c5c91dd121aa61156c406d0f6fb8d448b951254b322113060e8927605d3d95ff8400b0585d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585d80ffff3cffa05c0ddeb91ffdae7de70dc9136d83908936992ac137d3a7267934519c10844c8e8080ff80808080ffffffa092e4fc9ce595d261794777da86350171159b9335214a517d941d052c30b9e863ff840160b0c480ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586180ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586380ffff3cffa03243a5736b5b2e7d0e5e8d3d8b8df9c578b4cffab4b34b4db91b07233786f2f38080ff80808080ffffffa0c2195ffadc39f352ba019158eb57dac439b484fede90ba62ae4da4384428ad50ff8423d1f20380ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20380ffff3cffa05112471d300ed3886597688d8bcdfaa71e8acc150c8db49aa930d12cf18551438080ff80808080ffffffa04ded3078963282c2b017519c6bd1680f9ac404431bd38bac3905bf6116ddf284ff85008f47c80d80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40780ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40680ffff3cffa0b44ba6030b4592ae240b42e7b43264dc77db76c50a1a2e74adbd1086d335fe148080ff80808080ffffffa06ca4a434bab5a83fe015831829d2aef704e82e9a4e3ecec9c5bf9f50123481e0ff83582c2e80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff83582c2e80ffff3cffa0a55d9e54bf2da7df5967674bce1721ac9bf8859ccc039a83bc216119e80453668080ff80808080ffffffa0f5c3e789b7fec3ae36f96b0789ed96e00a01fe261f3894ae825ab8e442e5dc72ff840160b0ca80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586480ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586680ffff3cffa02e45e8418aea5d7c73dcf557348e3ba34fc5e8df8f9d3af94ce36adea0f0a8778080ff80808080ffffffa031ff480c6f54831488220b21e187cf1ce62e65f8807435b2ca95cd066ee2e3eeff8402c14e9e80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a74e80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a75080ffff3cffa0d1eda1b016bb5a6101e20498fb981c3b493445ba46756338f9efc9a5a20e26858080ff80808080ffffffa0cef2e00bbf13d98e1916e97073c35c5e0a9183dd79ffb875e54f07ed73c4605aff840160b0b680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585a80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585c80ffff3cffa0fb4d53615ebef414db1d92af0e1953dd36ef00026f95a9190766f783d50956298080ff80808080ffffffa0c0b15efb9e6e5572ebfa8eac9b65c2dbd34d367864c72770224aefac344a1c0eff8423d1f20580ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20580ffff3cffa04a9f708ac6e6bc86c9f5956f78a2f9cd5734f53af9b556fb9053b7a7baf71b558080ff80808080ffffffa018aeb68168bf7414894cbd339386f58203c54e8944fff724d269a34fc5525952ff8400b0585d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585d80ffff3cffa0e6d56e7174bebb1d15f3bf2d444c72c1a90564fc5e3545ec7ab85fb0d538e3008080ff80808080ffffffa0169de5d3f25461b39dbc06b10cd4f4ad830ae3e1c72a516122fe403d7fdef827ff8447a3e40e80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20880ffff3cffa072406fa347fd847efcfdbab83cd7fe97f94dc0d38035c8c79c25e69c08f26daa8080ff80808080ffffffa0079bb5b1300bba4499b49f16d967d45fb3ae98ab643dfa918964743389624284ff85008f47c81180ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40980ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40880ffff3cffa042708c50643d107e49d732f40fcd9e5523064307676652b578ca0ee4d359aefe8080ff80808080ffffffa032f552b6d88d145b31133103dc2296727e2d1c63c72469d10681a2c546ed403cff840160b0b480ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585980ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585b80ffff3cffa01812d354e1bbfd6b4798ee074fe0e79c34f0fd739fca4dea0ea0a53bee89e7918080ff80808080ffffffa09b1dc866a54cd0ccc909870639a24a381d951b80510655beef15b6de465ce880ff8400b0585b80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585b80ffff3cffa03806e0f228c788b1ee8f9be710630f2b4b2cfc8453bb2f54c3f81066a86c901a8080ff80808080ffffffa08c38e3f621c5d9beb295695d3151c2aea6737fe6c0ee4222d58c36ae01b085d8ff8400b0586080ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0586080ffff3cffa0ebf149d1820fcf8c6a6c49d3247bea79babd7963c5b1ddc42d8246b1788de3d88080ff80808080ffffffa0633fabb57ed04295c207ec3288e67cf2bee5e910d62063434fc23bbc14b4a5b4ff8447a3e40f80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20880ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff3cffa0277835db8dafbd6107747beca0ce81e6ae39633912c029d9f6a081bc891e02748080ff80808080ffffffa0e8430c15e7a5e1844d9bc076a8ba05479a9f1eff4c85ecd2ffaf0977d074254dff840160b0b980ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585d80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585c80ffff3cffa0698df4e91fef4beffec9a61650fc525137bc9db765a9f9e7e1881ec901d17d308080ff80808080ffffffa04798c0ce33c872d625e831d81e028483c3c487213452128531ab015e61d8622aff8400b0585b80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585b80ffff3cffa036d51552276cd62b929bd2f8bdaf32950a7c7e4dd561e4e6eb0e4c89532560f38080ff80808080ffffffa0aba8f2399dc79dba33404efd4331ae4c2b9739d7337f2704eb9dfe354e48fadbff840160b0b880ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585b80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585d80ffff3cffa017864652a4b1e9a5b7e436becb06218863731f288ba24508f0b4de02f2f6c3b78080ff80808080ffffffa03220fb97dba1fc328ae9a4b5d17ee6fe5204de03fd3133a6443f9d3052fb2b6fff8423d1f20280ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20280ffff3cffa0dd5ec28d79c49f105186f00d4bdf30076f182bde833363cbbab90a41822fa6b18080ff80808080ffffffa0aa6426e351b76cda88dd842f748df8be450050fcd4560a5a13e588255fc19a78ff840160b0b880ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585b80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585d80ffff3cffa08312f83aacb0d2b2805d5e3e83b4094d8dfa60a1c91804a948847c947fe96b988080ff80808080ffffffa036a9abe750adc5e58e87b7201079db558a07bfdb71b03881d907c98108a98427ff85008f47c80f80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40880ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40780ffff3cffa07de795eba4fb7834dc53f718aa795b71f83b12667708e8aff2c896e37702079c8080ff80808080ffffffa062af968d42ae61ff0f6d61868b5f7b6b0ccbf757d5cc225f7c68fb8d8938ab87ff8400b0585a80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585a80ffff3cffa01c6c8e9b2f1c1a3fd67dbc50b7cd82c2abf2e3967f700d38527586be762534d88080ff80808080ffffffa029a50f86a0b1d32d789772f6e8f8b1083f99b8b92770e424b4eb2e81ddeea3ceff8447a3e40e80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20880ffff3cffa0cf880364c99246d602a5195fa957fe18d9f4c81d2193abb0e7d6e80514d2014f8080ff80808080ffffffa0abf9178fa4cf202267fa8ac9f8cadcdb680bdd43d680cc3784d7552150b6fb81ff8400b0585d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585d80ffff3cffa0a030f6b3c5130f953a31ad3363aa411166278c37ea2cc438f59a5a9a705fd1298080ff80808080ffffffa099825fe7f1c0218bd16bbc146b24601f303016ffda3f5dcc515cbd524fdd0cd9ff8402c1617680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0ba80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0bc80ffff3cffa03a237227c22df8ddec0fafb99d91ae161d294bb7095dab55b33241ce9db813258080ff80808080ffffffa0cbe1df6b2a3ac03ec0840a3ba56ae6e3ed05418b5fb63b3176e0daf84eec506bff8423d1f20380ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20380ffff3cffa0dbce5ab1bed905a056b3e105f200a40399ae83512758a35c5e455ad4b781be5a8080ff80808080ffffffa055f5d98630c6be89f9ad9302ae29ae57bf96b984f1fd7f6951bee7e9fd978129ff8447a3e40f80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20880ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff3cffa0f3aa729e9ebc85dd5bf8b35d60d8855fe7e36e742f1192334467cf04c73b04f78080ff80808080ffffffa0c87f198a0f24811863b18e5ae067b1fd641afeea76c30160b23197623028f8d8ff8423d1f20780ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20780ffff3cffa0cf305fb45bf61b99790d708d288be866f16a8716c4c7351eb1e4d4e8ea552db18080ff80808080ffffffa04e278ef7dd70aaec8e3d9c101c37b9c4140bf445f25381b5da53ec641ea43e20ff8447a3e40f80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20880ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff3cffa07c1102a5977bd35b80c07a4d7379879275a98090f9a0882e3103a6321a47c9368080ff80808080ffffffa0ac79a5305259646df5e33462968472b9f70f6909d1781a5b83c5747bfc5520ffff8402c14e9e80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a74e80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a75080ffff3cffa0ca25954b3dc709409381d47c8392bcbfcdb752235385b3900ce0aee272d141e88080ff80808080ffffffa0914264c6c2b99630cbfc2dee996738de9432c81b820cf2b4cb3ad91dc60b19d5ff8423d1f20580ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20580ffff3cffa05f24c00bab833fa84cebe60feb4cb97fd32a14b74cd61a7441e1501372887a8b8080ff80808080ffffffa0d9550b0ff7ad309d903a1078cfde2034ba6c9ca517dba91e7094ed1787d0a1baff8402c14ea080ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a74f80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a75180ffff3cffa0f28a655aa386a12379326000219cf3052d85046c41630d67182a8f58d94bb8ee8080ff80808080ffffffa0f8a7da578a56f8e46da8ea564178404262646bf25f22400b8109f5041215c85cff83582c2d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff83582c2d80ffff3cffa05310e887af70071851a9e5774efa5d830b470f18996f8dccd82f612787c31e838080ff80808080ffffffa02731507e5cd841da794c4db2faf937245ad03702cde101041bbbeb69baac693aff8447a3e41180ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20980ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20880ffff3cffa0615af55ab87e702dcdc7f2ed7ab1615bc34e3a172c28ae4ad81f27392632b1358080ff80808080ffffffa0ebc779082ecc9ce727d06363d48ec07fb0e6bae56ba9f0b6afd04d4a46077d4eff8402c1616480ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b180ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b380ffff3cffa095075e6d7d332d05befdfdc7a40bf4c67382138772b7d98694e8a9c36c9e0fc18080ff80808080ffffffa0724aee3b879467676ccf4b604df68cc794a5e5105497e8f805c19bf061583867ff8423d1f20380ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20380ffff3cffa05b2a32d041aca86d4a4475e681b590116183c3fa73fae63d1c85a8301f580fac8080ff80808080ffffffa0b23e2dd48f03325b1d3fc53a735fd8a6e2afcce2648f3611711d0930073c6955ff8400b0585f80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585f80ffff3cffa0e9ee0e8386b299377b0dbd153da0a2167750246daa15bc7a2ed051c8020b048c8080ff80808080ffffffa0eaf96563b6d3f852c68b930ebd65c41cd7aa325d5a6038fa19e0f247aa987aa2ff8447a3e41180ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20980ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20880ffff3cffa099a985eca458ba105e603f6496894c3aa99d4c8bcb2c3afcc42fcd51e6205bab8080ff80808080ffffffa0306170a7665cd6421884204bbcd165b156c7efc1d007d74d94dc8cd71e6fd90dff8447a3e40c80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20580ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff3cffa0830360b8f7b8dff767ca54b49d670ee80da7c68cf520611cbd52ffe9061424868080ff80808080ffffffa0b38842223ad1ced65afeb05056256f6b898d0a919f782f670370eb03f3a50f82ff8447a3e40f80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20880ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff3cffa0152ddb465499d64f0ba87b6241af2e8c4d94dca4e26ca242953e09ad87e0fb118080ff80808080ffffffa06ab71bdd644a08b56cfa2d8ebfe5fc6d3e50fbc0cac94dba9a77160df6822f45ff8400b0585a80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585a80ffff3cffa0d2287797e1931a6ce4721e78868e68ca79cbe70286de812905f2f0387b9316cf8080ff80808080ffffffa0472f515262a03d0dccd15374d703cf969ae55f96cb1e30a2f3a26c8b49a4b2b5ff8400b0585e80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585e80ffff3cffa073eea14f075532c209d3e1490e3aea35495e371ab26dc444f176f5929017d7688080ff80808080ffffffa092e4fc9ce595d261794777da86350171159b9335214a517d941d052c30b9e863ff840160b0c380ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586280ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586180ffff3cffa07d9d89efd744fc6e4bf82281b61227d3b1dd4cbbf8f0a0d78302075a1fd4c3698080ff80808080ffffffa04f2dd6e9f0bf5635b2d1404f616074179f4dd4207645b8a19a9fce85cba087f0ff840160b0bd80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585f80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585e80ffff3cffa0c12da7be90586233a35984b643939b201257891d87f86150a5a90bc22dc1765c8080ff80808080ffffffa0a59480400b31d8c474cb334b5759c10ff68a8058a004d86202045a057285c972ff8423d1f20680ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20680ffff3cffa01a8fb0976b014b1df6efdb9717bddf34e8fa85cb52aa36052e80ec6916c836148080ff80808080ffffffa0091f41c928db813f538ccd83422da4c1e55b67195e3d9a155436a39a70e7f88dff8402c1617580ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0bb80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0ba80ffff3cffa08e8edf230c125b6d74ba24b9b6863968b3f4c1137b6a313fe9861bff8624629c8080ff80808080ffffffa0fc86114b97ee899a7680f47fe859b135c4de1f2a429d52d89a1127bd01f7085fff840160b0c780ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586480ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586380ffff3cffa00b5528554abf29e221c4d7158ac99da47384153719c6bd954c0efcf86c5eff618080ff80808080ffffffa04a7ea363673a2a3e4fe48bc069f865bdf049bb1f5c8519bbdb70f17af5d8bb98ff8423d1f20780ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20780ffff3cffa06e77ce65b8bf6aa239b328efaf3086e167c86fdce2d18531ffd20fb918fcd9648080ff80808080ffffffa09391cfc648b55ea69eb66705e6f45e0b0d6b1cb43b2d5a8e4f2b421cd9e96a99ff8400b0585a80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585a80ffff3cffa0950907476e73dfa0669cc63f597127b86a08660d247d9dc3ae66275d2f37ad558080ff80808080ffffffa000634c2ceba9a6dbbf1dbcd6242b6da3374a94adb8a7d8dcb33be20d0dff27b8ff8447a3e40980ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20580ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20480ffff3cffa0ad297e5bf89a1114ecf309a7c6cd24327d1551745c9ef1c85ce05b0154b96eae8080ff80808080ffffffa0e675e47c24c3a5be9cdaae4bca0d60fa548e3afb23e22f0763de13011983bc98ff8400b0585780ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585780ffff3cffa0e7cce28581f79553443ca0f6e9f6ba7b16b8b87649d92437e6568ea88c17fc898080ff80808080ffffffa077c08b76ad651d0ea084da5c246a913991efd743059d872588b7626616cda5f0ff8402c1616880ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b380ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b580ffff3cffa06cec42976ab62cf085db62c2d9714b0229f4103cfacc41fc93fd643cfcfd76d58080ff80808080ffffffa0755813ef36530c6e9cf4cdf31b8fc08e89102cd10c02153c85708c39a3327ef9ff8400b0585c80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585c80ffff3cffa070258d07fa5a3793c12f09f44c79b9564da6b71db389c5e1ac68a0121f56695d8080ff80808080ffffffa0c91ff165ba014a50b2fdd1042374369e3315a9fa687bc6c0b889082eb1da6e0cff8402c1617980ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0bd80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0bc80ffff3cffa04b567c4e00c886e163740aaecae16dede669404d9be90cac9d2fe77edabb32d78080ff80808080ffffffa026e623835062d7613ec1d0bd94482156eef72ed262cb835bc5282bd54dbf4a8eff8402c1616580ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b380ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b280ffff3cffa0e02243525f58a07f915b12794aee085aaa6f90e119616deaa8592c22980a3d0b8080ff80808080ffffffa0374553db85cbf45ce3fdaebc8ab6ddf3abe7838f6159f745ec92aae1aeb6fd5fff8400b0586080ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0586080ffff3cffa0a84b66b32b68f9a7bc7cfa7e8e8287c4dd88b0a85af76bf68db65a842aceb36c8080ff80808080ffffffa0220c153c6cb71a9e3ddef6664cde2dae4efd0d17b14ed414e4cd7b4681b3c60bff8400b0585880ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585880ffff3cffa0fa2cd6a842d75b7adb062487e9b1570fd9fc60db11c5b6ba11f1a492aa10c43d8080ff80808080ffffffa073414843519eebccaa6a903d0db13fdece1e2c446f615b356fe0ad2949e27cefff8402c1616780ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b480ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b380ffff3cffa02593c24c1d4ce39939651340f5f11784a183ae1ad65ef5f2b258a02d7586bc4d8080ff80808080ffffffa07001d37dc41e38204a526613b02e85a3ef2440142d40acca00c6135954e4747eff8447a3e40980ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20580ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20480ffff3cffa048bca216d31078fc0a400cc4b953f2952b832896dc030b31068a76af1cf665358080ff80808080ffffffa035c2ee668f0cc7eb1fda11f8d40eaf4c5afbd9e27b88389307667bc75e64869fff85008f47c81480ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40980ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40b80ffff3cffa0dd89fd16556c1c349dd510c350b0ee73728c9f557a9e3725af00ac94dc20ec038080ff80808080ffffffa04a3c4dd674e5392b2673addb00953a011b6faa54a686681ff3b7c459650ae904ff8423d1f20780ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20780ffff3cffa0202ebe66faffac5a2b51ba3c0253cfb56d1b7fbcb0f640998f551567dce6caa98080ff80808080ffffffa0aa11c16c12227263ee0b3a7388f7c446f587be0ba119d306f3a1e49c0297c06aff8400b0585980ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585980ffff3cffa028c3a39174bff5f46d904a591163674f88927cfbcc03b2a9061501cc8a4e1f8b8080ff80808080ffffffa0cb5bff71769a8f89859fff7a75adba96a3a897afd543cc13cdb0c08a2eaace43ff840160b0ca80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586480ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586680ffff3cffa0bb6619058be8016783d74c2a726f0f6afa4e794fdad489a0373ecff95b89fa848080ff80808080ffffffa0a6eae07f57a427d0b1fa42d5999a30309cf4e0128a5b5421d1117da27367e178ff85008f47c80c80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40580ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40780ffff3cffa098bfc7a958d4263d6ed297108ae7ffc9abe2ac8bea434d6a94877771bf1361fb8080ff80808080ffffffa01777c0d2cc0487d5490c182972b5387803e527c600daaaaa6a788d877b923a48ff8423d1f20280ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20280ffff3cffa016247068d01dd553c44b2e3ae69c56df10234280fe7d671daf4732274dc8725e8080ff80808080ffffffa04e1902db3126a138ce788847895350518fd9ed0e64dec37e58771f09e9a7cff8ff8400b0585e80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585e80ffff3cffa050e07ea539de2d3b717bd809b7361002a61809d61847ba84ace005aea01e98f28080ff80808080ffffffa0368baf048dc1762b320db51eb354b95750d0186ddf993aeb75dda1ca50a719a4ff840160b0b980ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585d80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585c80ffff3cffa03af24a5350d839250202fdb4a22a210e25f1aa333d615ffd754c3dfa577e7d2f8080ff80808080ffffffa0e479448ecc1fcafaeaf1054ca843a90cfd93e94f941eb18ff9ec46c5aae4b3f4ff85008f47c80d80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40780ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40680ffff3cffa0e51db193f7ff21469eedecf7defefcd72ea098d07f805ae4c10fb68a945c79878080ff80808080ffffffa087630bf119e545527bdd0b5a6a50dfce68a8383b6ef361c2fcc86d1fa420b7f2ff8423d1f20580ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20580ffff3cffa0574d5e27a51e2dac31fb5d6007f6228e25269cb482450990783b477c9914e71a8080ff80808080ffffffa02b6f1a89aa93971c0b43e6529ea33d4496ec669995b2aed5992bae15d35d93beff8447a3e41280ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20880ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20a80ffff3cffa0cf9ce6f33fba30282a61f32898c64678196cca9c99bd319d180d1d22beba89dc8080ff80808080ffffffa0e021c88d66259c1a4afbea99368fd1e9875180cbb53ae66aa4375cb836666f15ff8447a3e40880ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8447a3e40880ffff3cffa03c3821643fa448da544c7eb7414c0b9fde838827ad92278cab8650c133131ff18080ff80808080ffffffa0ff59c7ed374d56a928ab4381bb5b874dbbed7454acbb60dcc69983aad104fe65ff8447a3e40880ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20380ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20580ffff3cffa0e1ea1b90bfa3b19c085cab34ce5233f1e7bf14457f5708cc96ade7d0e6c707188080ff80808080ffffffa018912c28d04dd493a8c42e1de4a03ae18b06c73425639672cca992ffe2e25787ff8402c14e9680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a74a80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a74c80ffff3cffa0fe208e6e975a26d344f27f902864189e922c31ea98462235aa63e76f55ad47988080ff80808080ffffffa00705aa3071979f993633fca0a434d352db239d419d8a736518f7226544aae1d8ff85008f47c81180ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40980ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40880ffff3cffa073d4889f8bc7cc186e187efe0b33e3bac125257183062f35b7323fe57b4b6cea8080ff80808080ffffffa0310b54073486f56d6029695f082f844f64dc60ef57fd236cdcdaad692c32ed29ff8423d1f20680ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20680ffff3cffa0d9a1ea08047ce46047f48013dc66cf639826fdcf07d5515fe21d9479322feed38080ff80808080ffffffa00ce782ab0b98db845575fc4cbdaacf112bebadb9e994ba02c1a35767e372ec8cff8400b0585b80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585b80ffff3cffa096f36b29ce9407037885b2e37b3d20747e96114a1c2f18c84fcc3f9c011ee8ec8080ff80808080ffffffa0f1a08cac8c77c6831b63a22ae8b1c5233a130914621aa01fb2c0225cc3b159d1ff8447a3e41080ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20980ffff3cffa07a0a01844a3717f072afe60c717ce96dd775230e66ae40d912d22d81a0cbd3e98080ff80808080ffffffa0eb85b90b83ddd11f2e38e03d8d13d515bf96f148248ac0f046dc59d362687f7fff8402c1616380ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b280ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b180ffff3cffa037f1cdcf27388666cb29641b0975959f855d5ba307d228885bdcdff55741c1468080ff80808080ffffffa093c34c18377e8da4768b6ec1bcee8f2a2ae509052bb09d9860caf8b4ce8cdb8dff8400b0585e80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585e80ffff3cffa09a99fa1e340fae3cd3918fcee9250a920467deac56b458841084a6d76d74ff038080ff80808080ffffffa063ff41e3978599889274a4a75835009d7342f689da6d5a7d69c7a53a5aa5158aff8400b0585880ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585880ffff3cffa07c28f5aec8b9baedb82a30af0abf46cd8e20e17d3b6d8af82ab14e30b46ca6b48080ff80808080ffffffa0e774521ad0c9374d09022ced698d77259b2e00ce007595b3f2ec854ab7f59187ff840160b0b980ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585d80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585c80ffff3cffa0c42d9538e758380c8e2847d21bf048adf022e059b6773741aefcab7d28a8ebcd8080ff80808080ffffffa08f26784ac66b051f49f508426f1b39c752787ddb0c2e63686db65fac5f1e8fa5ff8447a3e41180ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20980ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20880ffff3cffa071e083852182bad1ae20db05bd69a2e69ebdcad36c02c6ca4d5a9477c287b61d8080ff80808080ffffffa0343610bcf643d411a74070e35319fd1cf9de23c4320b1b1407917916b84677ffff840160b0b580ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585b80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585a80ffff3cffa069820e1e7eaf49836b274339a6105cf2b77c7c93eb450d3295c1ef70836fa8b78080ff80808080ffffffa0288df15fd1729353d5ab22196ddf1bb1d5cdbbff5accbe09595f00e872571abfff8423d1f20280ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20280ffff3cffa0c3b849926999f7124505e5298d24ec7df8c852c2e30ae5b56262a20b71bd43568080ff80808080ffffffa042eb4571934422503657bdb60d9610e4ccc00168258b70f1b62c9b3db6f58dd1ff8400b0585e80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585e80ffff3cffa0296d1685ed08ff21bce278b410fcde79dbc326c4b9fe73519a55f7affabbf2928080ff80808080ffffffa077c08b76ad651d0ea084da5c246a913991efd743059d872588b7626616cda5f0ff8402c1616680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b280ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b480ffff3cffa06d64031e2f4ab6eb87536f0fe3d98cd82959340881a9cad2303833d371a07d508080ff80808080ffffffa00e5b4737ba7f952428b4a11750db8c20146d7e129ab263bbe6022062fa5421eeff840160b0be80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585e80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586080ffff3cffa015075ead7c29ba2768cb9fbfe0fbec044af7664be7ac8b68ce9e87405e20be4e8080ff80808080ffffffa014ae615f373fb87923bf43436d98355b142255974ab16ec8e51b7e33c893b4eaff8400b0585880ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585880ffff3cffa03695f356734b731b7a4420d2a287b85f374576b54c30cc66aa5ba997df14389a8080ff80808080ffffffa0f7f4fa4e7b3dd6516b8486a4b368573219de8f3adf8ef40c495352abbdb1d000ff840160b0b280ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585880ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585a80ffff3cffa05942a883b29f6f15b9bac721aa37e9b383336699d05474860daca8fe98d8679d8080ff80808080ffffffa0db4f0061b1b7583c3a09f4ef02fbdac586c7764f24dff784841687651ba36eefff8400b0585980ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585980ffff3cffa0ca0ecbabb3236c3816118122e6c9d098512a3c040fdd6602a8ff2e13fe7d630c8080ff80808080ffffffa0ecdf97db4e0900ec16436e04385690a4c0e629319575fec7ebe5695983687b83ff8402c14ea480ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a75180ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a75380ffff3cffa088b73f7480982ca845b3d69f0aae70e3a9f2df1619f66de4e818a40f650cc12d8080ff80808080ffffffa0eaf96563b6d3f852c68b930ebd65c41cd7aa325d5a6038fa19e0f247aa987aa2ff8447a3e41080ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20980ffff3cffa0c515ff1e291d4ecb3cea7dfb50631abd190413146d7389a5cdbfe6c9d4fd17698080ff80808080ffffffa0a1539583fce33bea0c61282958c4c6517c8443923d4677c917b23cfb3fd2252cff8447a3e40a80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8447a3e40a80ffff3cffa047b0acaac5561267e2def44c4e1be9e5f17c5462956ea2258331de5c5a59ff398080ff80808080ffffffa0a95a54f648643a40006deca8ed37dba68671e1883cfeb50879955349b713280eff840160b0c280ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586080ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586280ffff3cffa02517672f465fd06a92edbd50b79d5f55a77acf1e0348274223f7613cec3cd9d38080ff80808080ffffffa0171b6af073e30bffef3b46d4084ff1c937554d233c031016ea637693cbf177ecff8400b0585980ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585980ffff3cffa08da87f18886875284f059d6593c1a79131cfd456a6accdb8017af7fa745dba418080ff80808080ffffffa013e311405b030daff210a3fd0cf61641f9100e04e42d3b4ba4aa9b09f14408bcff8447a3e40880ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20380ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20580ffff3cffa00e7101d5280ae3f87aa2ba6b362fadfcca7ed1414430d14e5056d01b303885138080ff80808080ffffffa0e8fb5e592201b1c248ae909241296454b5d91f3e5c6954aecb2f2c071d321530ff840160b0bc80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585d80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585f80ffff3cffa0f7e5be1f403e422d87f1eaff0edbca17ac5ffea8bb712d8f740834bf6d33c8c48080ff80808080ffffffa094d299be40c2e9cb53555042977b819ae6432e54e04317f5e0c496001538ad90ff8400b0585e80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585e80ffff3cffa02ad0bf957e7428f065417162ba4e71292c7bc59a64aa624590c27e2e6ca9d99d8080ff80808080ffffffa0e185bfd8ee0f1081c95f167d05a5a717cdac71f6f6c65be9826b01248cf570b3ff840160b0bc80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff840160b0bc80ffff3cffa020b8d653d7520495c37a87d048e0721b06ac0646809aaea486542ff9ebebdae98080ff80808080ffffffa004edbdc93659ce82d53918397d19b31c076925235cfb34e7530e89f5ec2038f5ff840160b0bb80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585e80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585d80ffff3cffa0c11a22777604ce03ede32dd1df236c451c828edf10cd03b2db12c63476e703398080ff80808080ffffffa0686c13b1e03c41912c4ea59c4c3af9f548973ddbeb5430b77285bf87455b71f3ff840160b0c280ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586080ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586280ffff3cffa09af3c6a83378ac9bcda35ebad665b89f62846ace550296a77b6db3b3e37dab3c8080ff80808080ffffffa0b7d3014d4ee4ee9e73659fe99391e953822732d532ffc7658dd61fb821564c25ff8400b0585c80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585c80ffff3cffa0b3cf833ecae038d234fe2832f695b5d2a717883af54f21b73d6ea2201d2aeee18080ff80808080ffffffa0c264912fc063869af9db409d1d4fbba9e6367f13418b42ae28933c7ad47eb029ff840160b0ba80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585c80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585e80ffff3cffa046cc6f4db33693a7de7cadad5804840c2bcced3d292ffa886307100439f821138080ff80808080ffffffa0d910c89d46c5c487dc32c19acf8f6e9121028dbf75379239aa2ee1718f79d67fff8400b0585d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585d80ffff3cffa069963f05f77155dd2287d9a4ec55bb20e2dc56147e8e5daf926ca585f132a9038080ff80808080ffffffa025a6e1880ea066b6822b04e7bce11c8179e639aabe3387763a845bdf67e81d6cff840160b0bd80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585f80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585e80ffff3cffa080d6ef94d940ff30b370bc375981292190bb270c0b06f4299c9ada8f07d48d768080ff80808080ffffffa0e6c74155a4ca029c8abfe836e62574596052edf6966b22e66a1bf477ca6bd508ff8447a3e40680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20280ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20480ffff3cffa092ca355c098dc6be8496791dfc053a575844be19a5fe2451686760836012457b8080ff80808080ffffffa0b2feca201441c4ed9c36bd7e9490eb53ac3fe69d97b3fbdc4f23000c8307c44eff8400b0585a80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585a80ffff3cffa04dfa8c31e13b81a82615cb8d0121b252cc7e05c0502a2c219a2d6ba45bfee8678080ff80808080ffffffa0713b026ceff79a392c890184e432ef668c7be91d7e060b6ba51cc95fbdd82d15ff83582c2e80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff83582c2e80ffff3cffa0a4b99ca299db344c1d896caa2a3347b986493301e7a14061e0433ac9bbd808ed8080ff80808080ffffffa0cc36785cddf6a9b49b2f5a64b479d24c621934dd824c8fb2f553ad863beb626fff840160b0c880ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586380ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586580ffff3cffa09cce3216bcc8311dd63d631d901be65100687471e397d8e3c69041da3b7d8f338080ff80808080ffffffa0b07b348bfaaa6dd540fba22239867ff86dd45dcd1c38a9cd156b8988e221db53ff85008f47c81080ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40780ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40980ffff3cffa0b373e5607d45abbc331f30c16d3de0decb910c9f6dd353636ef4b800eb1397f88080ff80808080ffffffa0fcca60a7d3f3b6b95e90724e8df412c4ea26e94341b94980f791740e9b7c16aeff85008f47c81280ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40880ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40a80ffff3cffa05610fa63f79f3899561ce6fd0ef0fb5e844bd706ec8ce2142dd1a6a0bbdd6d7b8080ff80808080ffffffa01e2b0ff38327008da1b94e5a4c85c80cb4962229bd24ae0c996b89d0891c8cfbff8423d1f20380ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20380ffff3cffa0f5f56203a9bcbd3c4b0101a8bcfcec5bed8330986c4be3af3f37c55f6759d3dd8080ff80808080ffffffa0d6b377ee5058b9311ee176b7c7a12e9da1baafd1a0b0368f701cf58cea0a9ad0ff8400b0585e80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585e80ffff3cffa0b9065d43e5d781df82fb0a123338379a747b8496e0c1ed1a7936fb51e678a0518080ff80808080ffffffa0e6c74155a4ca029c8abfe836e62574596052edf6966b22e66a1bf477ca6bd508ff8447a3e40780ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20480ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20380ffff3cffa09d3071ef4caf9d6014b703c976e83aad18ebd517da2b405bd0c31337a1d8a45d8080ff80808080ffffffa0e034187cfdd793a7913d11ad92b75e778468244d6b858216252f28d9d2063ab4ff840160b0b480ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585980ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585b80ffff3cffa01e9ff724fb636855f0495c2a2641c69af9c1aef3aea01c8a847ddaaa8e42be8a8080ff80808080ffffffa08f79f57f4a3c0a9f7b2a5afb5ecd0d8e150e34127e8fe51fe9ac87d37b2f2573ff840160b0b580ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585b80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585a80ffff3cffa06dc3c26862d671774a488f0b5daa75aec31ad1260fa51bdadef25388929ee72c8080ff80808080ffffffa0328b724803200e39a318a9f2cf3060230975113a0eb9166ee63c0376c450e120ff8400b0585d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585d80ffff3cffa093901f3e5ca76590797d28971972cfb9eb56ba88300cc632917d2e15af5302398080ff80808080ffffffa0811b18174d57790099533377bfe85307da01d8e8cbed6be501f605dff67d154dff8400b0585980ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585980ffff3cffa0cd547f444be66ec8754891dbec23f579c2f20b7dac4bf2fa250b720a1284c6a98080ff80808080ffffffa00d79c561daa27c71cb8bcec80bba890e2234adf59530a9f66864c04905147578ff840160b0c680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586280ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586480ffff3cffa029068cee7c976054ca7f19e8b9fdf0eb7c4b8263e833f34034257de4727a9fd68080ff80808080ffffffa094a558c0406255a99c46dc582dde983ac9a5cc902a3363d4aa48ecdfe9e541b6ff840160b0c480ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586180ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586380ffff3cffa0caffd2f3fdeedb36ec80e5a00528d3d6854e8cb7ed7c59951580201bec204e2a8080ff80808080ffffffa074794f22b530cd241bb95e4912bfcd3f7b4a2a0b50b9cd4b357a6a136a50f7f4ff8400b0586080ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0586080ffff3cffa08972f5a64708e419717aea0ae47456a38a2e391f97bc6d3b1707424b30ecb2dd8080ff80808080ffffffa09697501e1ed74464058c7d7f19d5069c9dae60ae11938a813f73d4fab712cbd3ff8423d1f20380ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20380ffff3cffa00beccec0a7ba0b4da33707fd3ab6a623062242fdfb60eac169ee2132569099308080ff80808080ffffffa0a436cef9567905f9446e49a38516c63ce2bc8fe292d76277a77f7983c1f742bcff8402c1617280ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b880ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0ba80ffff3cffa0c1302cac4191b3f19ad45f082ba22c069058515eb50752eae66c5a8d17a3ea638080ff80808080ffffffa0f5c3e789b7fec3ae36f96b0789ed96e00a01fe261f3894ae825ab8e442e5dc72ff840160b0c980ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586580ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586480ffff3cffa0b7b475b79b221dbb7e26fee50861853b45a5de55a73c0076c4726018e42a18f18080ff80808080ffffffa04f2dd6e9f0bf5635b2d1404f616074179f4dd4207645b8a19a9fce85cba087f0ff840160b0bc80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585d80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585f80ffff3cffa08cbf574a4619f66778b458256db3365a77e0f30194f316ff1aeb5506e087407d8080ff80808080ffffffa027b74d6c39a795c00cabd0c14f83d266e7b7cba2ba15fd35e0068bbc21ca80c4ff8400b0585d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585d80ffff3cffa0e4256982b783149b4239f11cf61d05bcf1db576b549e230a13e0eed9057283bc8080ff80808080ffffffa02e8c50bb9e782b51c9a35de78a8072fe86104a5c4a13cb96c6a0d17efc7b28c4ff8400b0585c80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585c80ffff3cffa0488f71548430588e9ce0712e23013bab34e94da3cf8602c437a3eaaffae792c88080ff80808080ffffffa0b8d91dcede036960b85020fc3e02fa35aa49c628db8df8e5fa72be6df9964d5fff8447a3e40d80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff3cffa0e58d687c4a054d8048b9fe71b5f72597308afd21e44006abf6644c38cc7248f08080ff80808080ffffffa0cb5bff71769a8f89859fff7a75adba96a3a897afd543cc13cdb0c08a2eaace43ff840160b0c980ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586580ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586480ffff3cffa0bdf7fde5d7e054221e9bdc81606ed2c88348ae39991b37c6acfc2f2fb01458db8080ff80808080ffffffa080d0b30f28e8975fae454be9c52671278785be0125cb74b4884f045f8fb7a747ff8400b0585e80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585e80ffff3cffa0780e34027a99a1f93ae11af5c56efc19e4b0abdedebd0336b256eacfb535b3ca8080ff80808080ffffffa004caabecb1375febe89e593ddb25099c615e59543fc4d78b35bec2791ed891d7ff8423d1f20480ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20480ffff3cffa0849bb4064ff5eee9717a2837e7e992b32e3fa63e862fcb6a34e0777a689d661f8080ff80808080ffffffa069fa436d8c2bf61eff4de1d874271591df21ef64b5c058e827c56a6304d3d2ceff8402c1616880ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b380ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b580ffff3cffa0cff0d8c92386dbf4d4610f5d89d21cfd3656e80251e5ab438de1e2cd1587307b8080ff80808080ffffffa090148940d10bd6564518e37b3ebd8f2cc6e1919736e0fad653873ad5b1bf3d82ff8402c14ea880ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a75380ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a75580ffff3cffa02e106d57df7e568e94a1b9f37d501c3ad413690e1cd7b74e613fceaa780b7bbb8080ff80808080ffffffa0f7b9e4c6f508b969c0a984c4c064b95f7c9bac54d886bfefb46c6e42e07c18b2ff851d1a94a1ff80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff850e8d4a510080ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff850e8d4a50ff80ffff3cffa09e6f1421a64a8a783d750fad113daaaccdd396028cf1102e235b4a103460acfe8080ff80808080ffffffa045036d56600acb1eacd02f71b78264a53b290139c796d73ced92300facb912f1ff8400b0585980ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585980ffff3cffa050f73656301ba6514227d5b9ba48110c809c75b3b4073dd96688a9ce8db5a7358080ff80808080ffffffa0f65d0fd4b395a912bb572ad4065620ba4d3d377fcb6fcff1b02c0f4c2ec60da1ff840160b0bc80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff840160b0bc80ffff3cffa0bddbe2f578ca0ce3b007b135225d1ae0e265cc4c5596502ffc7022112b118ab98080ff80808080ffffffa01d8dddbb1f0966504e1bf562016f22f61db1658e728e59ef72335a2ed0a82d96ff85008f47c80f80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40880ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40780ffff3cffa0f38473e5c9694042c11853c899d35a51037ac3fb6bb7e57690372c1c434cee0a8080ff80808080ffffffa0c1973bfc8710e4930c45b45a01136110b68524067f62c554c22929ae66667916ff840160b0c480ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586180ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586380ffff3cffa0b6d483a89edf652d9a78903663fb54656bf9f691aa82a3da78d443b187dbec3e8080ff80808080ffffffa05955cd1b6c7b6ed4092faf0acc5ec431ee24c4116e08fd44cd1468c24c0d67e7ff8402c14e9c80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a74d80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a74f80ffff3cffa02bf2039d2f2bd2c3852178100f8a30b21e954c2de4184ec35417150e7f6c409c8080ff80808080ffffffa03eec429524bd39336def3318629e4f72851b5854758435153f4dfe3cdddbf560ff8400b0585e80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585e80ffff3cffa0c42c6db8a56c43dc24a1c39eebb3cbc23ad7669af958303b8ad874593ee198178080ff80808080ffffffa0fb5a0d6743ec30d6ac9a71e7020b85331bef80d0c905a8c10002e7b252af5ad8ff83582c2e80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff83582c2e80ffff3cffa0c00d4b99226c17efb177cb6f97dc80378107b5c26947d527b39246c460171d938080ff80808080ffffffa0b07b348bfaaa6dd540fba22239867ff86dd45dcd1c38a9cd156b8988e221db53ff85008f47c80f80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40880ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40780ffff3cffa0fa930d27d6774214b5f8e16439272814a953c8479f2bf00e43332bd8ab7502518080ff80808080ffffffa0abea892be3f96b22825a1eff7656931e69b981ea6ba01ec6b38647bd2c4310a2ff8447a3e40a80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20480ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff3cffa065f83a2a399c8749388887a39f03a033c8b3747a108908641e7917fa211a969c8080ff80808080ffffffa01b45ebdb5caf7ef51cfbc897019d634d4f71f0dfd57689d7aabe7328d83d80eeff8400b0585c80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585c80ffff3cffa0ed528decba65606edb2498d17f48a12d7ebf006a0fd942443b133b8ef1fe25318080ff80808080ffffffa072858c8439183a2da34e35d88444380ab07a3a7a8585a4a42d0883e17f86bd3dff840160b0bf80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586080ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585f80ffff3cffa0e0ca135b7eec1dde96972cf927997da933fc8aa52db9c5f6e501c04cabba99c48080ff80808080ffffffa0701082445dab6b13a83cae8739f395f8e20a6d036d9c7317617612b71d89b61cff8423d1f20280ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20280ffff3cffa0e9f86df487e48a5fc809302d77c1e63d59318a370bf1ad39ac178558035ede958080ff80808080ffffffa00f59c4013c59c7a189de5953a20bbde02967bf044b7a58ee559d5e113ccb6cc2ff8402c1616a80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b480ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b680ffff3cffa0093bb5e5449fac7e429e1156d2ca7d0f2f7aa613f55620368928ff35d1f8e54d8080ff80808080ffffffa096431fb64b9cbf358b157c77f744659c29b3b80e848e147abcf6062d0806e5bcff8402c1617580ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0bb80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0ba80ffff3cffa0ab17266550f9200b23773ac9e3cb3061e79b6630b68e90af50ebcedbfac2ede78080ff80808080ffffffa0dcc8fa156f8989d22a0fd22ac85ab820043c4a327ddd02978de73ea27f864d07ff8423d1f20480ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20480ffff3cffa00d53cf42edfb4a5bf14f78f89bdb4883ba9ffc35adee5fb67f376f83103531a18080ff80808080ffffffa0ecdf97db4e0900ec16436e04385690a4c0e629319575fec7ebe5695983687b83ff8402c14ea380ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a75280ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a75180ffff3cffa012b248aae2862d90abde03a16557f07523f22ab6e8ef94150b5cb59c1ac5d1668080ff80808080ffffffa060000c899f629a76d9277e09c88e5d247657832fcf93f262a7385fa8e4278862ff8400b0585980ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585980ffff3cffa08218a019e06721320b3521f66d11423159b5ff3045b34e9489e0ce23920c39bd8080ff80808080ffffffa0ed562ec1e8fb34d7e53d76d01108f51a61d62d0205d4ea9b44a0f8af603bad8bff8402c1616580ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b380ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b280ffff3cffa0fe50b72f3eec66823836eaeabcf51af3daf6c26a7a2417ef1e2b49ae84f69a5e8080ff80808080ffffffa0c929151f3e9c37efb5c5a7138952550f1c53c1b3d2eb295b4afd93df97eab840ff8402c1617280ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b880ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0ba80ffff3cffa0bf6769e8eaed460ae0923381f3f6267055e660e35aa33aa989930bcc7a411a378080ff80808080ffffffa07e6a8b13320fd7724a24ea0a5f151fc220b44fe458310e19013636ad4e6159b1ff8400b0585a80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585a80ffff3cffa0a24d3d4cd277f5a3f56307fcefc2d3c7cb800f11d652c93367b22ea87701f7628080ff80808080ffffffa0dfc409b290f2fad91334341f215006f7520c2264bbcb0911c39e1e246396d051ff83582c2d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff83582c2d80ffff3cffa0305dbb55da3b2949f8939cf87a9d7242b9af1f39e7ac250182d1adbc4e23185e8080ff80808080ffffffa0f9696f37b02165cbda3679cb90c6cab2e288327bbe0303f866f0d6556119e5d9ff85008f47c80b80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40580ffff3cffa0bd079e1ee8f4969ee9111de841c5817ec09bd92aaf80611a189fac1641cf8d1a8080ff80808080ffffffa0f6b30d35deef5ab9503d1a1bcb8f925ab1ab696c1b44b74136065bfa28ecb414ff840160b0c580ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586380ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586280ffff3cffa0f706128ab3f7c7b6e99604efaa1bc5020e80d4326dfc4531370d7e82c66b0de28080ff80808080ffffffa0d4f5edffd3d87bf6d422549ba6cfe1e5899cecb4ec4b4fff1c9d7e30062d1f12ff83582c2e80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff83582c2e80ffff3cffa054f5e652e955b8b3e574935ddb05f8d30d00a2a79d8c84a903c13139d859ea968080ff80808080ffffffa01be3b16b78bd104b7041e0b5b5dd8c78530a75e25c1e8203c27792a7ddaeb898ff8400b0585c80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585c80ffff3cffa07a4a0e1fb4e7aab302aaa8ab77189ce4d3b19541a57cc956f5171fbb4d81edf98080ff80808080ffffffa0ca133f82e1486028f4b0d009874a7f8b21d9406e919b7bb47a9da1f668a526deff8447a3e40680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20280ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20480ffff3cffa0447f9cadb29e315913e25fc18152165b0ea7893d19dcf3f309910917e15aee008080ff80808080ffffffa0ffbd848c0b66c50dbab2122f1b15d1e9771b7654b33d379345b194ac30478293ff8400b0585b80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585b80ffff3cffa0e6de55e71d6f3d12998c71194e3f67a612442af04c435b1443ca846400aa8e1d8080ff80808080ffffffa01231b679fca8b6099278fcb76e6abb40bc4bc02a141a4e339afda2e2cf367e09ff840160b0c980ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586580ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586480ffff3cffa01ba4b383434e121ce6da848d34aa7d10af1d218a8923a5823885975248bb13ba8080ff80808080ffffffa0a01dc2e6b59ceb221acaf0ce1f719acdbe8a1a34f9e1e7d35f03c51ca096fbd8ff850e8d4a510080ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff850746a5287f80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff850746a5288180ffff3cffa0596918f869055a61c70e39efbb3aba08c36c0bd24aa222f1933c2ca8d44952a78080ff80808080ffffffa01bc83e0c24619f0db2d7262964e28676e800a41b3169f07844b4539b8b36cfdaff840160b0b680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585a80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585c80ffff3cffa0da3a2120d276d345c94ef1dfb83bb73896c8315ed591fa9bf467e4888c403cd88080ff80808080ffffffa09e14b2a2df23d0ea06e65d52a7368a7b760f74119df0473154a704aac5d78bcbff8400b0585980ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585980ffff3cffa0a47934dfbf767c122decb6fe05bef5d756d3c6f65f62e8e6d60c73c30b47bbf78080ff80808080ffffffa0439f11e66c6d5be7f35b47a2d29916fbb621e54735b6da4c3238db2289c16ec7ff8447a3e40a80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20480ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff3cffa071a79d6350db438dfa9063ced51008fc6ad6f7effbb3be074a6c8b68655f99768080ff80808080ffffffa0b14f1786e14f3832df13ea13496a30f500fafd5e58634651f6c99120d08f9873ff8400b0585c80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585c80ffff3cffa0e890e6cc8f849254d8bf541393b083eebefe0a16813ed8d143bf84da0e842bf68080ff80808080ffffffa0e83094d4e20544cf848813ee1afe8d458d74485ccea2ad99522247a03097d415ff840160b0b980ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585d80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585c80ffff3cffa02c9ea15fc5012ff074eb271a911923ee3326a36d59a5da2518554011f2ad68778080ff80808080ffffffa08ec06aec6e484c71837571320f091925b321d9676952fc4b61e6b4e5ec07493aff8400b0585e80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585e80ffff3cffa0f76fb6c8764a0c28e7cdb729fc49d548d1a9f324894576f8ad616b9bffac65438080ff80808080ffffffa0a7cfdcaa046bdb370c91eb2e08f5d4ab298b1822bad738e73aeae0260a0c7350ff840160b0c680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586280ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586480ffff3cffa0c161de0e48f6cae3011c17813b6f120d5f952051c049c2bf94bbee1b84710a5b8080ff80808080ffffffa018912c28d04dd493a8c42e1de4a03ae18b06c73425639672cca992ffe2e25787ff8402c14e9880ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a74b80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a74d80ffff3cffa0fb3cd61d6c4bf6bde020cbbab5d466935167bfbc477b224d1407d890d31f404d8080ff80808080ffffffa0c400d4cd2a513bebbfeaeffe94acc6befa6ba917b0e61ce6990cfbeeae310cd6ff8447a3e40a80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20480ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff3cffa0787a7157acb97a27d4d7a1514eba0887eb688bab42608c73da6652563b5f8d6f8080ff80808080ffffffa0fed732e29cd0ee7c84d99d7a3cf87880fbd3dc43eb038b1e7060351cc4226cdcff8400b0585b80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585b80ffff3cffa0c6f0704147a501ead4d1abe957a6d624a54ef2c5aee0ceaf503f1c848c9ce98b8080ff80808080ffffffa0a8d262c23d4a033d920d8b4f3de8ca84e13f48d72b50e1ef1b037e7e83ca22abff8400b0585880ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585880ffff3cffa0b1e59f62e99d6012933ec60fca06cb7c41cdcc540f6836fbca8420834a6765158080ff80808080ffffffa08eb822d03720b59d5d8b9629e0f777038dec18dd16d67dff795a2239080da8a0ff8447a3e40c80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20580ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff3cffa0641fa3c5acab642131a56ec31f4abd9bdec30bb32dc65255a9c92dab937c3b268080ff80808080ffffffa0ff55447a95be9e6c20e51dc55f1c4e9f2983fde80c602ba9bdcd383e3d270a37ff85008f47c80b80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40580ffff3cffa03a015a455fbb8f6a9fe99db942e3414879487ce8f64aae467afe3e80356ba5d58080ff80808080ffffffa03365470197804e8b61d41d662e76823f1c1f3c0d784d9bb62f9f405ba81808a4ff8400b0585a80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585a80ffff3cffa0f913fcd1452fb5ad2fca86cf9dda384f9daf9f9cebe9b93be2b605e60e3d0d618080ff80808080ffffffa0bcf7ac9ce2aa1d995aa7018ff09c125b25ed8b7117dbcf4f1a2ef163bcfe6695ff8447a3e40e80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20880ffff3cffa069d678495cfa2597dee3074049e8591683980c7d03cbd20444aac155f41bfec28080ff80808080ffffffa09727a0d2dfd420e50aca68c8dc661b600e1a97fb61d89f1ae8f254edee7b2766ff8400b0586080ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0586080ffff3cffa039975e939e0ef9d55f0ce4670a73b9747c264badc1e5cc7c42fd69268ab3687d8080ff80808080ffffffa0304322cc7b535a72f08d2d1055f6ee554e6a329ff528802946de6b72d548adc3ff8447a3e40a80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20480ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff3cffa0b0a170fe20a74d78da62ede99c77e19f4bdd9e2bb455d144c6a1dbc3b0bdf6898080ff80808080ffffffa0be517dac7174b4586e73dfd368663911ee2ab28111dafad104a9ab908aa6e230ff8400b0585b80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585b80ffff3cffa052d6abf03300765bf89ac6fd4ed1a09d3f1ce65405dc432b9da7cff8ec9b11cc8080ff80808080ffffffa0e90de870990f9122523a9494e22faa266a1620a04636bfb543368415802b9028ff83582c2c80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff83582c2c80ffff3cffa0bfb401668a12f0bdfc409d4463ee7881c84e426a50b3c2edbebc45787159d4f88080ff80808080ffffffa0f6b30d35deef5ab9503d1a1bcb8f925ab1ab696c1b44b74136065bfa28ecb414ff840160b0c380ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586280ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586180ffff3cffa08600a6c840ef6500bf5c4a9afbe10ae1eb13c75b2ced23db352f96a9e82289c28080ff80808080ffffffa05a4c4df59f4573165f115f7c17a0176467d4a0b6ec3d5a28936ac5825703d767ff8402c1616f80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b880ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b780ffff3cffa00c3a1b58314cc0057f5558590a6cd2a95114ea3cdc4fe8fdf965ca3aad36e8e98080ff80808080ffffffa058cd547bf98be402e820acfa1ff795f2df6f35b7879d4002d560ccc654e89bc8ff8402c1617780ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0bc80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0bb80ffff3cffa07e4f22fa64f1602b0addefe5f6a216a189e4041005b7901e8ab373cd35bf14878080ff80808080ffffffa03e6252e765eff7c1fcbc60a95f25baad541e834965c06aac7800472e0ec69133ff8400b0585980ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585980ffff3cffa0c01a4a71408b009c9d0bc048b9857684f04f865b320668ae20b06344f7d65f868080ff80808080ffffffa04631132d2c6c6bdc36f84d07807a8b3689646b7f8756dd62abf90ae09de0806fff8400b0585c80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585c80ffff3cffa074f9e549698fdfa59936f89d827ba224c1e9d58835da795c3d58f84b0e242a3e8080ff80808080ffffffa04ded3078963282c2b017519c6bd1680f9ac404431bd38bac3905bf6116ddf284ff85008f47c80b80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40580ffff3cffa0c2dd8a87614402b29ec10cad9ee4742db67af6cd17c6b3e5fcdeabd7a862f2458080ff80808080ffffffa096431fb64b9cbf358b157c77f744659c29b3b80e848e147abcf6062d0806e5bcff8402c1617480ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b980ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0bb80ffff3cffa0b8661f671eaa8c8e939bc7ca31ea76ca429a220586d7738ec0dadcf1d71464b28080ff80808080ffffffa06e0ac61695600226a12c6d0a45bd4c55ecaf4b1e17195467b21c78600d8c4e7dff8400b0585e80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585e80ffff3cffa0190d18c52e64f910553a5062da4013aa903bc641509a86d21a8ee4ed0d2416ed8080ff80808080ffffffa0698863aeda4e5aa76a86c57ea2b24bb61b526549876447c5b7d7423be031481aff8402c1617180ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b980ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b880ffff3cffa015c0ef75f019c19c798b7191124c39c2d7760c258449138174f0757cf8d2d6f28080ff80808080ffffffa0d3aee2b0bb51b5ec746cced743a9d35343e8cc7d91fd5400ad6490cd95a668ecff83582c2d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff83582c2d80ffff3cffa0d4178daf452ea9c5de55fa6a6777de37787c22d777896bc69c8f16b10749471d8080ff80808080ffffffa079eafe56a9ffe9aec9e1c9a8cb2479d98dc6d64a2a51abdc96812dc4e1cea58cff8447a3e40c80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20580ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff3cffa01e6d668f513d5bc74b3048d27cbfaf8f4383a0c1187059a99bd781437cd842da8080ff80808080ffffffa0fe6a260aae06c22d2bbc48a7ea13ca4794e5948bed2db66887e1e6c19b4d8756ff8447a3e40c80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20580ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff3cffa0b97aebb5fa4c0aa7571956ae56bfbfa31dbc2d589b625b0feadb984c613e477a8080ff80808080ffffffa0f0e8cba1c5fe680a386c928473dbbdf898c0f80d8459e4c64bf38a3a7513fa78ff8400b0585d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585d80ffff3cffa0294249da887e19992871083d843002044cb1f089f67eb881298c1509d8d2f4378080ff80808080ffffffa0ba1ffa93e3ffbf11b0c0b3a4553c0eaa8fe8a7a4079896e0821ed00e490ac18fff8447a3e41180ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20980ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20880ffff3cffa0266dc7f210a336186cabe6d547d16982bdff514e30cff7b235ffe3af363b756a8080ff80808080ffffffa0aa710372b3ebdacb6957a816d4b68f78d3eac19473d0f501488140d0ba0a2e71ff8447a3e40980ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8447a3e40980ffff3cffa0a58e99b897e41b6f0a6e26f9c1f03a9d1184d002d9be2a053538d1307042765f8080ff80808080ffffffa08a51b1f077c57a6ec7c6151183fca41e4618b74c8b0922524395412236da39feff8447a3e40e80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20880ffff3cffa02a16584e4e464e4b93595f9e8adbf1f40bc27e08ef15ba521b18fa95b908fa178080ff80808080ffffffa070c49a93454a72dd1ae467b5cdc1b0dcaeeffb120e67c866489da2e58944a376ff840160b0bd80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585f80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585e80ffff3cffa054f5ae09003f141bd59525b9ef7fccf12d19ad010f57361d27674d7b99b193ae8080ff80808080ffffffa0f96e90c51faaf4d760948ef829adcdf9582859ed558932a106330f0375b883cfff8400b0585f80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585f80ffff3cffa08450e463e4822ea8647fa69df92370bcfe6dca62d4156e59646e8248692f9ebf8080ff80808080ffffffa088ab3d5709bca5de64e92392dc5e491caa8eb708e68b99e28a27ee41583a26aaff8423d1f20480ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20480ffff3cffa0467c76369105e2215895a6146b460d397a7c782fe735023eb5042f295d63e6828080ff80808080ffffffa0f880e075500dba69409eddfc251fa4ec4ddd025f326cbe14f9083882a7abdaa1ff8447a3e40480ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20180ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20380ffff3cffa0ed86b89cb7966299de397b2bb423366b0a99d29b7e666a78c5e7cd431b3ecbb68080ff80808080ffffffa072ceb8e2eb1811953798158c3d989d825f78b396daa08bed2981c28d6da2e0e2ff840160b0b780ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585c80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585b80ffff3cffa00336ed07d69a78092a99d7f729047580d5661ecb9c32c6155eb75aed2837ac408080ff80808080ffffffa069ef351bd8912e4822f9e0bafdf224778968e5901a97fd1b342f0c7f4018e900ff8400b0585b80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585b80ffff3cffa073ccf4e89352c1a01b15ffd23721822ee8886795c63f404905aabf14121d91988080ff80808080ffffffa0511c34a82b3df6458f3bbfbcc76554d32c17129964e16a085d1f4995caec430bff8423d1f20580ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20580ffff3cffa0147c6589da044dd4430c1911e70663a7c8f1db2f3de93975cc5eecfb905c26c48080ff80808080ffffffa01651d7460018e0b4c32dd1745b35ba80f5b8002bc21d3f39339d8c83412ab80fff83582c2f80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff83582c2f80ffff3cffa040c73a614e3655694427f8079397fb81253ebadf2b95e34557df225b0a7e2ed28080ff80808080ffffffa03b16c9e966ee02504a74a6f34a6445385343682ed79792fb3efaf11c033cca5eff8400b0585b80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585b80ffff3cffa04f5162fea15fb14e1839f7e01518c90185e80a4aa5d6bd6a6b740231000c901b8080ff80808080ffffffa0c53a246fee97129c653004ed22b38062dfe9d6e3ba6443a031124633b0fa66faff8400b0585980ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585980ffff3cffa0896563682be22f3b5928ee85713546f42af52f08f490641123519acc77ee92df8080ff80808080ffffffa02f51dd89503e7692a5b90bfa15fbff81bdb6a280f0dae4df1c11c5133e9b9ea3ff8400b0585d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585d80ffff3cffa04a7c480a72a7e924aa7d1fbe678d01588dae61a1e4e631c1c84e5c1a92490d988080ff80808080ffffffa0354f78f0a664cfe0b411af56ad0a14a6e701f3246f1a8d3f02a558fdc81fee36ff83582c2d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff83582c2d80ffff3cffa0ec84117cb6f6a4f9f685bbd65de6f57729673bab5815756463efa68ab3fa860d8080ff80808080ffffffa0aa8e2b75e24fd416f72ab330c392a49f02e770c4cf26f56695c992be76d49cdcff8400b0585d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585d80ffff3cffa0f591ef90ec65f2d9009c85ea1b216e18897ed4d28410bde179de836046324e5d8080ff80808080ffffffa0d4f9ac2cd2c8c6bfe36821df7cb888f1f5cbbeecbd991da5d9080ef86111597eff8400b0585980ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585980ffff3cffa0092d734f755fe961921241c4465a802ae0d3574fa32c2a68fe992f3b4cb36b888080ff80808080ffffffa04574c5b6015e07323c4a4f9c16d3c685ff0425a0d151550851836d532a0cc0bbff8400b0586080ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0586080ffff3cffa0638c2f2faaecd715e948d1d05554af3d357950cec8a937c1e7aa980a6d6ae0558080ff80808080ffffffa0e45a2947f03c62287b9d597019b2bac123a1c98d0a2ad91d5c68b6a184c9272fff8400b0585f80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585f80ffff3cffa0c4103af944705c169b2bcc450eae167ad4fb1f6093fe699ed6abb6ddccc68f8d8080ff80808080ffffffa0b3a2d8084a5eabec5719834f2a362c7c3a8ac0bbc8c70dac2be2e0e1b84e0910ff8400b0585c80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585c80ffff3cffa024b62842598d4c3b4b088dcfbf79650d8b3c9689cea85154e00af0babcb1515a8080ff80808080ffffffa0b1108346d500ed6249b1a63d71ebf6e78254532c2888b5889b7aa05019684442ff8400b0585d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585d80ffff3cffa0a2bd6d4ff8348fda1fed50d66466158ce85a2541487b3064f4a71c3fedf7bf3f8080ff80808080ffffffa0014bc10ac158d5816ff5c594d8fb0306e731d37123cfd2b9c3176928fe69af9cff8400b0585980ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585980ffff3cffa0fa7adffd3a8ec91ddc13e2a7a788c314715a12563e10765254dc7d2465a868a58080ff80808080ffffffa0a549330def5c7e88ec2102716b7fb5580c7903ed8672c0237401b753c3fd6eb4ff8400b0585b80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585b80ffff3cffa07b43353f495585cf90a7151fbb2132c015d4b932bece7e449b0f818f76a4a10d8080ff80808080ffffffa0f25ece79d5f732a761ede397e561e6158d813dec430ac8cccccd6c5c1f869edbff8400b0585e80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585e80ffff3cffa0a175565be7fa96f71f3b9d8290cfc67538354a6e1fac3aa99d428f1d4bfef7dc8080ff80808080ffffffa0bc7bcbb15da96f354b73f48a8800500219c865b7d9f9e4ac1c1bc9b0756a61faff8400b0585880ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585880ffff3cffa0b84486d2549db9a0c9acd36f70a45d63bf78fb80b5ab73683f835c1e1a6deea28080ff80808080ffffffa0428d291dcbea8cdd94853b1e24ee9918be2ae4f5e902b4c7ebd798c695f863b1ff8423d1f20580ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20580ffff3cffa0ed7913262e435119220a01414cf6a300b77c28568d22479f9e31851dd0255b9a8080ff80808080ffffffa0556706ab8113d62e80304be3b519e8c50b6908d4efbe7208b60c56f3fe412bcbff8400b0585c80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585c80ffff3cffa03d4fae32f2516af6c2c3d3f09308c74921a330be979fbf2375455a3e3ad285f38080ff80808080ffffffa0aed493fa152db15e3306f7a0c31c8a2c779e9181df6173d747001459db9469f4ff8400b0585b80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585b80ffff3cffa0c4f6f5ab53afb6207ec45c33e4c887872a3df51cfa9dacfc0438b561221ac82d8080ff80808080ffffffa0dd6b3a1c11142870d96a7cb33f78fca24c9b4834e9de22da05e7b7e5fdad0464ff8423d1f20580ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20580ffff3cffa01d49ebbf058715ffcdf69b04a82ba25b1c8b58e8f1a14697b15196725c49d64f8080ff80808080ffffffa0f0bf69f9a2435f08117b1eb05c1f763bce2adc1ae7e9f729ae8e21f9421f3decff8400b0585880ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585880ffff3cffa0eb788e2d138d23552e82532bb4e61782109d4d9189f5ffa3fc338d81e797c2f58080ff80808080ffffffa03435d4af1fd3df675cf897224b674722fa4ff8f6de1329ffecf70d4919184f00ff8400b0585b80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585b80ffff3cffa0ec72a58055b8f76b5fbc82ec70d0fd886d6644297f27ee5d91299f6bfdb70dc98080ff80808080ffffffa079a0da7fe8cd264e2869e2c6602728b0e5fe2312e590bb85a0b3056329d4382aff8400b0585980ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585980ffff3cffa05869276d52c244a07dc29a8dafd65d3eb8f3fe61edaab4c3bb95f33a73c157e18080ff80808080ffffffa0f1b000e5dacd2f11bbc32d28ad319f5b905b88ab43c8689fe3becc23512a4b81ff8400b0585c80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585c80ffff3cffa00dd097521a23424e7977dc7896b7016589a3fed67d0d7d48df7b1f0a99fa0dfd8080ff80808080ffffffa0635b4fb1c2646821ca4c44176db18c3be13f30d45b7b8f97975662c6d6432638ff83582c2d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff83582c2d80ffff3cffa01d7665c23a0a3773afdcda0463013b9f640893b007caa3fab19134c10265e1768080ff80808080ffffffa0c0c03161af9b1eb0ffc1b615aab56803d4238b719daa3bbc7c69d7337277129aff8423d1f20480ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20480ffff3cffa042270040eb9fe61fff747b753e3c9497c7248a1ab3f12224def3802fc6c2f2c58080ff80808080ffffffa073406ff9eccc0f6e1ce47212ea2fdb62a9155784fd757f4b5c804621c0076a1bff8400b0585f80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585f80ffff3cffa04a18cea46d1f60596d94e734efa18066f5c3b83c63867e48365d5d6466f6a1d08080ff80808080ffffffa0efbed0793e9bb2dd5e1b2ea74972d987615b468fbc47310cb3c7a09873cf3c1eff8423d1f20280ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20280ffff3cffa0d50341c6b01e84836402cae1f168b7d478e10ff332e380a74ef5b588ab2102678080ff80808080ffffffa01bdbfb38e623f6a6490c98e3a5549824ad9d8176a7cf0659db02598197a70bc1ff8400b0585f80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585f80ffff3cffa08e5e91ee485b51185a3b14ed4c1e70df19f6fac388ae2afbf8f3c1121d7c23728080ff80808080ffffffa057ceb15ba5355bb361404c8cc9d39f99ca3323eeac38cb955b53efbf3df06da1ff83582c2f80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff83582c2f80ffff3cffa06e668013f2f78f1dc4e0af7606ce7f9ffff346d4721e3b52d204ce846b163be58080ff80808080ffffffa0f315f3f7ee4d2d627d4d9ac002a59b2648074f8d9c1c680c3c6c3cb22f2d87d9ff83582c2f80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff83582c2f80ffff3cffa099ed622700dda213393d22cf5aef78e003fd2d08c3a841d5c41514d61d2f1fec8080ff80808080ffffffa080d40c34a51afe3553a3927f6f074fe58be29d8a6c8a8c3a56671c968ba0410eff8400b0585a80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585a80ffff3cffa06604ba0181fe1292954a5e974ea1bcbea92293b5ed8c6bf22de1c0673c45c4618080ff80808080ffffffa0b3f7ce079bb92c37163512fcf511b40319e0f03e0125a6a9a6723ff1dd0a39a4ff8400b0585980ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585980ffff3cffa006e5384df8c4e5dc6f0904019d8e75a4473dfd2efb10fcca534439ba6999dce18080ff80808080ffffffa057b08eda1ef67ab4cb61365564421be741c5a27af1f50019cfa5c992e2f27085ff8400b0585c80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585c80ffff3cffa06622342ca1690ee841e71e72b31f10bde52d1a6f6a326438bfaeb7df69ce85ac8080ff80808080ffffffa0917f98c2f876421014e8520d3a4304fcdb344e6dc02593c487f67671497b8336ff8400b0585b80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585b80ffff3cffa0b6f00404dfe46fd322b14792ccfa34934273b3a8ca5a43894991e7810021a17b8080ff80808080ffffffa05fc46097162c2fd340997ff97786e3be596db7c6928b01cf6f6407b493b6bdbbff8400b0586080ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0586080ffff3cffa0be02210752008d934b6bfff8d16477df8f87f19fa62fc40ae4f64a7d6c0392f68080ff80808080ffffffa087cb34ba5e62e28196ad8be49be6fc9b5787c5046c08cdd9b2179401e26c61bfff8400b0585c80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585c80ffff3cffa0cefbfcd8835de00a09b61ecda7f0d5aee3d294a2698fe5063d89e5c399e828f78080ff80808080ffffffa03118947b60deedf91fab9cc093f2ed6f10ca52a178318b8e1028bde1c42c339fff8400b0585a80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585a80ffff3cffa0af25d49cc0aa9b074e937b8d7333ab4e82cbed22a47ab928cec2cb4bce331bae8080ff80808080ffffffa0c2496c083038dbe6477addb05a7dd43a97158bd7adaa18f54375474b588c9009ff8400b0585f80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585f80ffff3cffa009ec8ae49e1a39bf0f3248aad24ac8d13df2a31ed86711f7308ba43feb88707b8080ff80808080ffffffa07b42ae908371b23fcbd469965e333fb3ca7d0bf6ccf218461aa36aa12d2091e0ff83582c2c80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff83582c2c80ffff3cffa0c2591edb3d1ceba2e6d18c1d85b45aff48baed24557f388c5b6044c9536bb70e8080ff80808080ffffffa08529131055a687b68626ddb2a092f97462354770148030c2045fea714d9290d2ff8423d1f20580ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20580ffff3cffa0648bbd7b4e963a8189fe9e20e4b97767d72c1dafe6739c38b1bdb723dd3dd7eb8080ff80808080ffffffa0ab6657daa1874674127bcdabedbc189a8d592076cc14d0611cd25fb48e59f53eff8400b0585d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585d80ffff3cffa0e05fee5dbfa85ec5ff3da0213919bc5bbf8979881905a70ea408b844197765c98080ff80808080ffffffa08aca10b0de27ef32ba9cfbadafff68f1a9df45511aa0b8a55118338324711c0aff8400b0585a80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585a80ffff3cffa09083a200824786117cd658495c675a6c94134a7db6f57baa1124d95654b7e6928080ff80808080ffffffa0e7e5d7b3812dde461b268cef74dcc82613cc5de8fa8b017123213c88e0fdbc6fff840160b0b780ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585c80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585b80ffff3cffa05eaf7016845a07f145eb497e190287c03eca894b633880203ae09b7d34e6c00a8080ff80808080ffffffa0cb90bdc48a6728b1275591f867de60eeafec0c139e5b57705f214f05abde8f57ff8402c1616c80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b580ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b780ffff3cffa04f356d1b3866bc98e8c645c8a5d4af7db6e37b4286e4695fb3ee267ed2efc1118080ff80808080ffffffa0fdabfa097e2e9a5462cc069dd762df669ffb89913f1edd95642a446f387d57a8ff8447a3e40680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20280ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20480ffff3cffa0db493296333c946c8f446c4481aa9894a25d2a198cb6f39162d9195dc1cf48938080ff80808080ffffffa0afeae06c828bdab74463d567ec58329dd547e450a70d1b24b72e468702f51f8cff8447a3e40e80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20880ffff3cffa0572a1fcd7e4e8da68964ca9f506f4a332edc6a79f3e143034c2ae61f0f238e348080ff80808080ffffffa0b9af218c9162fd1b9d37a662cc78f4b606a9a715d2f07591726a59b0a12168a0ff8400b0585b80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585b80ffff3cffa0acff85074c28fdc9047c3f15248cd4490cc36bc6426464080b267afe0fa02be68080ff80808080ffffffa0b16e0ee3ddb57ef3c79aa4dd1ced5c5a5db2050c20fbdc49b56a1a41871f0cccff840160b0bf80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586080ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585f80ffff3cffa00895dcb36d84df74a7e59b5958b9a5e0ca675f70331c1dac660c614e8b9479b38080ff80808080ffffffa0c4d58dff14e8ea000d16a95bf05b4c8cf0a3d424071f6528d1e6f9aee649bf27ff8400b0585b80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585b80ffff3cffa02524310a6de6f9974de5a68abd27df8f18495dbcb1ad50bc4a092b6a96b933f18080ff80808080ffffffa01d38d59793a8e6d3088bc72f7374c9d2530e1807f7966a51f7021e9a02db06b8ff840160b0b280ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585880ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585a80ffff3cffa09afc244bb8ed9c725a94269c611268d2bab8a8267cf84bbc4184207bcd2103768080ff80808080ffffffa042ae9de1892eb92c6ade4d58b3365bed2a25e3685a6cb110687bb36bb25c3963ff840160b0c580ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586380ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586280ffff3cffa0b0736d428d0fffaefb88e66d068c268513d1fa96e6a2ffd54de412f06ee84fab8080ff80808080ffffffa0b261b7c347dee6ec39f3873b12ea50c60f5a683999a052bc0aea380a895f8d14ff8447a3e40d80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff3cffa0523404cd598207bc4e41b2a0c649a4e6b951aa6b19215270f5423604476094138080ff80808080ffffffa05ddd6e29e2327bd9dfd14e83caf212ca058d0598faab82dce357f3cfecec3dd1ff8447a3e40c80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20580ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff3cffa09df7f4c92733a64000e602ff21f8ad7ff30891ea5d017ba895cbbabd9cc0ed0b8080ff80808080ffffffa0ab057e5708fed4502af0d4ccb66e2597db2d7147c0ebb5ef26d059674b5d0747ff8447a3e40d80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff3cffa0b181e325d434b2a0fb977a9053fe64e8a1fe06246bde74c22285ff2764ffdb128080ff80808080ffffffa073dcd49e0b459ebddef4bd3590fb6e0e9514482afe8ddc4988384bcc76ddc75eff8423d1f20380ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20380ffff3cffa0f67670ea53798168d76f4e3e1fe00dfb4ee5ad6c1bbe0981357f2645cfb2925c8080ff80808080ffffffa010d0d834d342a020831c7ad87a0fc4102927c237cd0b7fd20f540a149909e65aff840160b0b180ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585980ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585880ffff3cffa0feacf214efe5d89674159bdedf0059c0716eaf638535bfca7c6f6b4777e0664a8080ff80808080ffffffa0fc69fe96fbdf987048054f0218e78b6363c04eb46c7516f74f6cf19956f688d4ff8400b0585e80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585e80ffff3cffa0898b2e84605885194d43ac81dfe7a1a4b6b7c5ebb5812127fcd9bea7613be69e8080ff80808080ffffffa08a11466cfebb27b6757d97c0278d48f4739db02d391e8b5ebb1013159b778763ff8447a3e40780ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20480ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20380ffff3cffa015f714120e4343c04332523b7967ccadd6a4fe66c0f71e5d6c1c0c68b055f4128080ff80808080ffffffa03bffa17be6f964ef5fedab528833b35eb5d97bd199494993d5dd8bac827134a9ff8402c14e9680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a74a80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a74c80ffff3cffa07e84d7d5bcb960166390abdd8ad9848b6b3d999e4463b77cebb51480adba78a78080ff80808080ffffffa0ef5592b47c2718c5c8be7865b27fdc4be60925269cf6feec0924a2dddc318f9fff8402c14ea680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a75280ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a75480ffff3cffa0b4b66d5ff3c2d3023179b600ac07bfd645a42a90dcff6566a1f2eec0ad2d6cd58080ff80808080ffffffa002ec65b5ae0e3bde48c4f23c79ad4b214f9e6bd793a65c2625d857ff4ee7e230ff8402c1616b80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b580ffff3cffa020c0dd60d1527f2b78201ad10d351dab58f925b3397a75e790af64e5764011998080ff80808080ffffffa0cf7be53241a6df7154acb5ea699209b125eff3750940d43fd8194baec3e74db2ff8400b0585b80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585b80ffff3cffa07467fb103cfb4ae07589602fcea39349ea6863d346c9f3d9027c314ea87318c18080ff80808080ffffffa0e97a41789a748dd51f3370fe06b10b54b3b304f4877d794f1628f7ac4d3ec5adff840160b0c780ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586480ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586380ffff3cffa05bc86bc61d36afc81046776a973c88f7f39a04fdf2e7e04fb3c9ec7b770e5d1b8080ff80808080ffffffa047f37741c35cfa8cb54df75bdf69a22bd85b3f1ee3d2d250e2eb7e073e5790c8ff8400b0585f80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585f80ffff3cffa0920429e605d942138f7212d9646f8e53a543f79f28b762a70e98f80416df4eed8080ff80808080ffffffa0e1b9c8951e77246ba089a699afb6f1d0a3ca12669656b0b92335355900be4ac9ff8447a3e40880ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20380ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20580ffff3cffa06300476c967dc777a1bf90ed58f840960acd5c9092a3dae07208de4f9180d0d98080ff80808080ffffffa027dde671a3e38d01cf6bcc364182648c9a705b623b84b38d5ef81ebdeef1c5dcff8402c14ea480ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a75180ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a75380ffff3cffa00b36f5c1f08cbd967f7cdb4f28a2483b4d078f31867b7124272084f84e9b19058080ff80808080ffffffa049d4f3b8737625b0c326cd51fcf963d7206686557c5a0c3f249b73a8644e4137ff8402c1616280ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b080ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b280ffff3cffa0c3d3d625d13db0c6e5dd9a3102315582d5a3f290b3e8d007c8164a755ff5987f8080ff80808080ffffffa0cea1564ac2c1b13ba978bd666cfc0c4ddbe299457c03404316a9f33883f025e3ff8447a3e40c80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20580ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff3cffa0ce7c50de7405098624854b8ac9bffbd36d12bebe28e5492c5b260d1b737617668080ff80808080ffffffa0face3898ff3e472210b68a45c8f4c6cb8a8994b278fd3553d4b5c7e28639769aff8400b0585b80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585b80ffff3cffa0c3ee4a21615bb72679a97331693832313b3cc4dc38c4df229b2c28f2c784ed5b8080ff80808080ffffffa08f86f2b80cf1d7878aa90a0f9224bb2d98685393a0b334fa89d9b3e2b145ca08ff8402c14e9680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a74a80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a74c80ffff3cffa00221055f03a05dd26cbf4349524d85f39f99a69c1bfce8f00fa94245dda789a98080ff80808080ffffffa03f81886329b5c5a4f05175949ae2e1d5546d459c84fe67d59b934e840e7010d9ff8423d1f20480ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20480ffff3cffa0ea1b70eb145d97cf6fba7b3fcb54b23c2a953f068a11fcead67667d400a993458080ff80808080ffffffa0b0145538c69b306b5387348121692305596927c79504e95ca2bd68921ad7ced9ff8447a3e40880ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20380ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20580ffff3cffa01b913fcd1fa254f98a0400071c66374c00c9c7f1d2d4058705491376dc16cf8b8080ff80808080ffffffa0617a306607c8eff3a51d0e05955c04e15f4ca86221406e823abe1c360d729fd3ff8447a3e40d80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff3cffa003c4595744e4bc5bac3ab3ea80ea02d1a92ec021d12e976f64844e11778f0fba8080ff80808080ffffffa0843c12de1f94a7655848371b2abb46ad945078688bcb58158783adb125ad65c0ff840160b0be80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585e80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586080ffff3cffa0ed24d419a193a8c552dca67724f1e41dd4eb9c4f4c04bd97c80d27a785f162e38080ff80808080ffffffa00390ddf35088e6dbd9e0d4fcde634e21d4bee21c7cf79648d7c7e6b8cfb0094cff8400b0585b80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585b80ffff3cffa037eb20f4d097730eb6c2139793d2dff2689a3c42a30965fb97a68c8878b0b5768080ff80808080ffffffa0fef2bf04f111c5bb9c377b2e7c354f790e4eeed53aad522d3c527a4318a13512ff8400b0585d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585d80ffff3cffa059d1a78e27f18bb558a725b360fb5f930d68d29abd26604a2388d4c7ae6964da8080ff80808080ffffffa04e87d165d512a2ae389750ea8cf2e89d1835cac55a5a4e9bd65a07f7af098826ff8400b0585d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585d80ffff3cffa01cbc15b17c032b0af08894db3ba1dfc861ccedc86cfc8c676b3a1fa5f1e2a0728080ff80808080ffffffa06bc65c37ebbae68e61803510f6dbbb98e7d0c024d404fb8d01e587362e4d13f4ff83582c2e80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff83582c2e80ffff3cffa0537c00d7149faec649f9c1a854a4d761086d33657d96f5b2e6061d8f66624aed8080ff80808080ffffffa0c1baa8dd1c69b5f86699fc8c67c046236109e3587030d40b27d98318c2dd6668ff8400b0585c80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585c80ffff3cffa0e04c219f9c91ea4114c41e59b6b69692979fbc559dcb6d71bfa771da19a5c2748080ff80808080ffffffa0a937747054cfe3879585c0ab183134a0eb3436453733bd6ddb1fd785939ad189ff8423d1f20580ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20580ffff3cffa0a1bd5fed1e088235126ada9e646cc340a83bcc59cd2d14bbf80ebae4181b471f8080ff80808080ffffffa0eddd01b7d0f6a2be54a4e3019dd4fe5c881c589dc383ae7a1d81af97a84708adff8400b0585b80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585b80ffff3cffa05334a253bd986b12847d0924437be4e735459628a1b3e24cf3a4cd802847d6c68080ff80808080ffffffa03a395ff80de226285a9017f077548888b4eb9e6d5f40b16f57bc0a50bdb3d5a0ff8400b0585c80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585c80ffff3cffa06b563c6ed37479960e1a72099fc4846f0330a4a6fc88aaaf0ea951cf76b024ae8080ff80808080ffffffa0c986df2fff4b863690fd3a4d7ca14425c98278e2ffe5859e772f9671c669ee8fff8400b0585e80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585e80ffff3cffa041ed39e98d91d602a07d02be4881dc7e7b67c0cd359b8c1d7f193e0302a470aa8080ff80808080ffffffa0793688b32ce7449dab96add743fc4c222dbdd386b5445c2eb7dbeed5d92fa21fff8400b0585d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585d80ffff3cffa061b805cba34e53d3be323ce30f96c0f1107ecb135dea5481169e21e55b6963678080ff80808080ffffffa01bcb5130bbdab6aebfdb3ef2538f4883db00847f09d6ef403f4e2bdff74d1363ff8400b0585d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585d80ffff3cffa060603991b5a89a3178fcb86b6204964480d45158d8a3591634b0396ca6a0a7428080ff80808080ffffffa0c8de7b7013a04cd2aa5e1769e9211b8b91d9123694e83bc6e7d10a69e6ab0086ff8400b0585980ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585980ffff3cffa002ce3044fec740c213353877030cfcea1dae03c08d1634ad2afed1243b904a6d8080ff80808080ffffffa0588671a1a4ebea3e9e32ad37ca336c02425c5501d7a7273651c5e35c1bc7c920ff8400b0585c80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585c80ffff3cffa09cbca907237019e42d1c07776edcebf845fcff0ed13fb22719a70f90ff40fb3b8080ff80808080ffffffa0d84dc27bbd104a8f44f455e8049c55d728a714eff6c093ae1ccfc15207c3ab34ff8400b0585d80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585d80ffff3cffa087f799f2ac2bd0c58e72cc44916e5ac61eb0022b09348c95c4a966b59ccce6d98080ff80808080ffffffa07e609109aec65ed40f222493cecc3ae1a97129b8d7429d2b8a82b39f0da35270ff8400b0585e80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585e80ffff3cffa07997d690bc22b4cc7760694b1797d96d5e852222dac786907e49af608aca26578080ff80808080ffffffa0f2fbb14a965ecf31354dc1dc2d69b8c0032c5aadd7d9f7749c795a9ff6ebd317ff8400b0585a80ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585a80ffff3cffa01ef431ceb848923a0a953c7bc1f87a085528a4b0a40434d47130c9fdd56fe72f8080ff80808080ffffffa0b72a621f08463d7a653f9a0113d6a6a6384f9a9aa8598c9af1266a9199f801eaff8423d1f20780ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8423d1f20780ffff3cffa00e9dfcc339ee88da37bf062775eb37b9f54f79225734382654a4857af8f6dc0d8080ff80808080ffffffa0935ee64b5bc00c408f63f4c1699cb9fd4b104e4361072312e7662aa169326217ff8400b0585980ffffb1b0abb1669111f258ca82016afc5859ee264f4c65c3b6c8ddbbd1dcee5a33fed983e66c74e4e197b1207738cd7cbcaf51d5ffff80ffff01ffff33ffa062485c17f937c92d0b9080ec0b522946b383945378ebb09bde7bee2799460f81ff8400b0585980ffff3cffa0b5901975457178a38a6d040d7a84db5050aea3fe5c35e0d9ac8dd04f59d497b18080ff80808080ffffffa095268cb9ee12a078cc85e82d3cab2dacf4e04acbaafb2d77715043ba50dcfdcdff85008f47c80e80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40880ffff3cffa0dafbbb0eb72cc349cc338861c86efdc8132b7b9e2f8914a86ab192fdab7204268080ff80808080ffffffa09a3ffa764a6df19a8c1df8b2a85a8fb98f4ae31ff71b2381e60c77fdb603933bff840160b0ba80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585c80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585e80ffff3cffa03d44bc6a45311ed3d083154ec36a1a1b65efb098bc7942c0e42ffac8d32e27898080ff80808080ffffffa0bf1cfb2640ee95b1bb7793af7895b41d25ebcf26bd39e6a382eae442bc9238f3ff85008f47c80d80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40780ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40680ffff3cffa055ba57e4ccfaf25cf3fca173d29f31eab541c036eb03174c9332dc4efbba4fb68080ff80808080ffffffa046a094cefe5ff01226aebc3ca085d115a5cbcdd0f650d3d0dba5bd58cd17e947ff840160b0c780ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586480ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586380ffff3cffa08b183229353adf442a4a859ad53b28c45897311a7c98e473d97479c87a24fab18080ff80808080ffffffa03f60c4819d8f2764c1c02f29d5401f9886c04a5d3e29ecffaad9295899acdeecff850e8d4a50ff80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff850746a5288080ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff850746a5287f80ffff3cffa020736aef971c62b5f7388c5b65bfcc5b130b5a9944783f498d9e7fca050698198080ff80808080ffffffa0dbb36ba5fcbcfda2d97667d2fd4ec97ac6ccc98626d884a5b11cf8bf2d9a5b7bff8447a3e40d80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff3cffa0baab766d86f090bb885ca7f5df44801d32cdda43a86a7a5f69dc05dc3ffe3ed28080ff80808080ffffffa0b2a48246ef6bba198be956d1e485f32b7432f54901c85eb8b5dc9f94413a3cd0ff8447a3e40d80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff3cffa0084fddc1b5cc98d4a1d1c4f92f804cf99bc919a75c2c575202a08a6adc2300c78080ff80808080ffffffa0e05584c170fac6f42ec6e45609a5ced165a8b7b8993a9373f6ae629f1c94dec5ff8447a3e40680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20280ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20480ffff3cffa0f8b41ac20a3a13e18b1b59de1dd4792fad0298adb260716ce7c6715db31346de8080ff80808080ffffffa044c784e182fee49a01fdbd2e5c342a872ec24c189d8e8cd20ca7ccee55f205d5ff8447a3e40880ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20380ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20580ffff3cffa0e314a08b32347d4561b38d6a5d512ab62f390b845da388bac26dd4fd23e1e38d8080ff80808080ffffffa02ea606894cb6b1c07ec0f41295ccaba623914e3a76f7b7041e6ea909c5f83026ff8402c1616780ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b480ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b380ffff3cffa0de9dbf868733c749223a790a36cc994ec63ad2c00081f0f9ec2f9dbe37d82eea8080ff80808080ffffffa0d3770cd54c89ed9a6380a353c07bcc821b7f7ed159805c8c672cffab4100617aff8447a3e40680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20280ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20480ffff3cffa06af7ea7705863e4fe6dda9580d564b986e73b6b740d0b4f781b8392dc7c8f6978080ff80808080ffffffa001726e54508acc896c475ef4b73e32667a96c0f035a9d46e5b0aa8a3a5e4e220ff8402c14eab80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a75680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a75580ffff3cffa0ec527658759632aa294c76df2187f8cecf46ab8a21471f3fbaae74e64c95e2868080ff80808080ffffffa0447cc65d142ff42327a540bda45f384f9b15d22c3a77b917583f26fc7cc46277ff8447a3e40e80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20880ffff3cffa04070be27bcadf5949560ce33372f966fa021de07b94477d8df1d9824ce88bbbe8080ff80808080ffffffa02ea606894cb6b1c07ec0f41295ccaba623914e3a76f7b7041e6ea909c5f83026ff8402c1616980ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b580ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b480ffff3cffa0f6255499187555daa58242680b728ce444b11c671193695db147c64845596a4b8080ff80808080ffffffa04809ae72d2b84684e3f1f255af861d5e77e0a00f56df78b26b0d6618ea18d9a4ff8402c1617180ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b980ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b880ffff3cffa092680e31e27c8be6fcb9515bef032a4f640cafff0fb580d74af7bac5fca32ff28080ff80808080ffffffa04caf58c637f1954811c9e3ab7985af080e85c12947518c77f24f492df4843291ff8447a3e40580ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20380ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20280ffff3cffa048db2e872ce5f815780147fd286a61292c3bafe7153a708dfc2055062340c9e98080ff80808080ffffffa05ba21d0d6938dc35af0f9ed00cd2e69751150f75d9cb74ac126528559b5101c0ff8402c14eac80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a75580ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a75780ffff3cffa0bf6d807b3e44f6cc4db591acfdf062e177c8c31ccd6b13b59aa05b7b8450850b8080ff80808080ffffffa0eb892e69730c7ed7c507add9d7aee249c220035e379b2add4ed6257d1d61c1caff8402c1617480ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b980ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0bb80ffff3cffa02c48d33c8709f2f168fd76c896c5e0626e43f0289160dd75093f6a55893513c48080ff80808080ffffffa08113f4a31c22a5252e6ba52ad6deef53c950332ab72f3a0704eb8e5d001630dcff85008f47c81080ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40780ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40980ffff3cffa02eb74f10352a761081cfdff072aa7d0eff15e757c9897ba6f3dac3f0aebf52b68080ff80808080ffffffa0d066971ad9c5dd7bd521ef81e2691822f5f29cfa8ea6061da2574a665d7686a7ff8447a3e40d80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff3cffa0e1b1c218f3a322e3ad360b6ee5f88ca801000f16621609fede6c6a549810dc9b8080ff80808080ffffffa049206bb286d254cf50afbda4406b81182c48e26e24042b62c30185682539a3b7ff840160b0b680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585a80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585c80ffff3cffa08aa1d6d4cea580a72bc1936a4af82336a81236031d0393acc20f4f68edf41b108080ff80808080ffffffa0d516bf9ff83bbdb9ba76e73c1c9db2e088a83cfc425f58835da5d7e0336204bbff840160b0bd80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585f80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585e80ffff3cffa031e91abfbba4ada34f660482c7c7715697c712f478dbd4bdc42539af760c74078080ff80808080ffffffa065d18dde2cf98ed722af2b1ed34ce924cd39ed12c95cc4c1bfc75ceb29a41d1cff8447a3e40a80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20480ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff3cffa0dbd080a26c9f951631be0b9c0259894900f101e821f6deab50817810917d5e278080ff80808080ffffffa002068c5a319c64a72fb6e9ea22114e8bdc017a070aedead504030a2bdd1b406cff8402c1617a80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0bc80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0be80ffff3cffa007f009ec742ebf3756470c922601f1e6b5f4ae1900963cf36866c4fba0294dad8080ff80808080ffffffa0b5738f477b77463faef1c31747a3f528a40b55f48c0fa83ce91c5a153df074d3ff8402c1617380ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0ba80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b980ffff3cffa0525ff2eb716a5ba46f14629270bdabaae059d22c58e53858937c8145b9d915ab8080ff80808080ffffffa065b50b5081107892a2ef219460afc0c2ff0b6b3b4c20f54ac7a45719e0b17465ff8447a3e40a80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20480ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff3cffa02adc087e2edfc610b0df8aec87b632da5988067321ef938040767460725bd1828080ff80808080ffffffa045b2a3cc78a6de5da1d0ff0f1d2125023394a5890162776c63c59537955c8412ff85008f47c81580ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40b80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40a80ffff3cffa028ff50f1c1ddff3d8e829a22d087bfcf7da3128242614dd5b781edb0ccfebb038080ff80808080ffffffa0d2e95afda7ed6dc02a02d5263bb4626cb4e3321db7196a868161d8fafa8cdbf8ff85008f47c81580ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40b80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40a80ffff3cffa02f8ea8d5ab7d0c089e34cd3b3620331deaa314e0ae3a59c268f380f1f9a7521c8080ff80808080ffffffa0cb3e2efaa7950e020eb2055963e3538ef876310d0e5ff00fa35dd3584dc63ef3ff8447a3e40d80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff3cffa039560703ee0f425248bd4f670033c308d575e9f9772cef62d1ce038a4f63f0b78080ff80808080ffffffa07f1f56e3ee6a4cca18e7b674c44bae20d6c6151e94bda5be7761051e6c0b4d16ff8402c14ea880ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a75380ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160a75580ffff3cffa0db9764685fe12eb4e95b0e0ee15683c52cd1b4e742d4e653213bf717cc34b16f8080ff80808080ffffffa0fa0ae4627f657c913482a41651515316e2cd3edf7c0d5c4a330672e992b9f1c3ff8447a3e40580ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20380ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20280ffff3cffa0a090d0c0df1f6cac1a39e47157841b404f9750d38cb29110a160d41a8910009c8080ff80808080ffffffa061ea0d10cfa2b721007969b04c2ee443ee7f3753ecdf47c455e8af27b8d1fa4cff8402c1616a80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b480ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b680ffff3cffa0ddeb4889ebf686d64378553c76e79a3cd0773ed8f7730287ee366e977a704eb68080ff80808080ffffffa046d9b5ca6bc881380f17cd07f9a6c5588f343d8becc4344d6cb9df2303b230bfff840160b0c680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586280ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586480ffff3cffa0f8a92a0738fd5ff599ff57a3b3d469d2fc8490374a894cd1eae0e71e1b4b95218080ff80808080ffffffa02413d23aa213e0458cb28f860b8a8e607ac68e614aca36a12268f64b5207b2f0ff840160b0b480ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585980ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585b80ffff3cffa039a7674aaaf450861f91c6f0f81458873303fa13983817d9d1f70ba6922ca3e38080ff80808080ffffffa065fe6a64d143c70229ed6c47a58726afde162b0328af772bd2d938213414578aff840160b0be80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585e80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586080ffff3cffa016be5cdebb2f2a49530ca88078ef8aed10edfd9d79c7acec2f8c15f7d1d2da9f8080ff80808080ffffffa07bdd1d9c1552cabfb9c6af230f455c1b26a76104df52411b26eb0e26fc743c90ff840160b0b480ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585980ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585b80ffff3cffa06611fd26904da0b6fdfab7633b7fde452f024f1f64cc7bad5acb660bedf2d4348080ff80808080ffffffa0efdf951ca7a6af5e99b3c8a8708a7de62856cf72b11020f0573b814e3f80b5d7ff840160b0c280ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586080ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586280ffff3cffa05a98610406994dedf53f3d3d6340fd63a7393c4163b6022ce429dabbcb7879a38080ff80808080ffffffa0da502d791dfb0b5549487bf8cb16a1e31103122995505a38cb12faf42aaf1c86ff840160b0c680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586280ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586480ffff3cffa076d7e9fe08f26700e44fef4a0dd6d7c026499544a594b2e550afc22ca0350a448080ff80808080ffffffa0fc65f09b331191af9c1ce56afe9334c449c0fad5fe0f69e3f49f764a320100dfff8447a3e40b80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20580ffff3cffa02e12b5d53cc44e2277a18c346acbbd0be11ac9e1f2c9a7396a738cf5ca2f5ed78080ff80808080ffffffa0b261b7c347dee6ec39f3873b12ea50c60f5a683999a052bc0aea380a895f8d14ff8447a3e40e80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20880ffff3cffa0790303db735333947e6cfdc6d4d586282b108c4c6a4d41fa112accb280854b2c8080ff80808080ffffffa04ecab489faed3f8e2f7af2053bcc49452815a1e2732a74cbc2f6508c059b4ee1ff85008f47c80d80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40780ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40680ffff3cffa08bc7b7af9cad9225847119aad7958b60384c0cf16cd65d5c7d6cc262f4df00948080ff80808080ffffffa07b33fa770069faf0f4d42f22cc3c44121f4f297a5e406d20faaf96efc5de8d84ff85008f47c80b80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40580ffff3cffa08d268c2c814e480976b4a880eaafa4d85df1d45c90490f8c3fd636baf29cd2a58080ff80808080ffffffa0bf0dc20bc9b635895ab94b7083f6571f0fbc0bf4de683b2a4b430ca558750ef9ff8447a3e40b80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20580ffff3cffa0c4fea07e0dab44657f683823b76a61e1bd5521102698ff29da5d63e47cb9feeb8080ff80808080ffffffa02ec8d1901fe7b2335fb18fb59a625c1c023bd748e978596728e9fdceda3b9f3fff8447a3e40b80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20580ffff3cffa00bf3552d1870862ae7dc158a4cc5d67c76a078c268b5bd973a2df530894d5ff38080ff80808080ffffffa00926198872d32739e7baad86c8f4c36824fa5484df42b86b3f16c31bce37c917ff840160b0b180ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585980ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585880ffff3cffa00f7ee9164401d72d16ecb89f0e9638f586eb16c9425bc7001cc0b11f9888e0ba8080ff80808080ffffffa07bc905abc786185639090c6143197a7061ad5116a7ee93e484066f92d2f9087dff8447a3e41180ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20980ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20880ffff3cffa075bb52d833b8570d2ec3076f8052d3588389ffe581c9d8758dbf6eff430b0ea08080ff80808080ffffffa02779e8b7674600cadd7771aa033d2ae754dbf241c06c94eddfb2e188b5a6a43dff840160b0b180ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585980ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585880ffff3cffa00d8ddad8030240e5b651614f2aa6a6d5513e782289d95629e9c9a9b8c4b5819d8080ff80808080ffffffa099d8176abaf98f428308e2f76bd5d143f45d3554f5265c49586a07b5d1e7fc3cff8447a3e40880ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20380ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20580ffff3cffa03524d8c20c9506451a2c01d6d7b43ad084b9a2bb6d68c6994cdc37076909ac7c8080ff80808080ffffffa02a811bf4a1b311f8232914e0fa06399fbfe414a589b48752f14d7cefa0453171ff8402c1617a80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0bc80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0be80ffff3cffa0fa4408cc74d490f2e281df47066c0ca6a660dc16e442bbee36775b87ab3ee4248080ff80808080ffffffa002ec65b5ae0e3bde48c4f23c79ad4b214f9e6bd793a65c2625d857ff4ee7e230ff8402c1616d80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b780ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b680ffff3cffa086a1947dd0bac571053c5fe7c922eef5f3fc61bb210d711c3827bdf8bb4b88ac8080ff80808080ffffffa0b5a93c29b71ec8a5aefe46749e6856cbf2757822594fc9a1579168651e1f9859ff8447a3e40d80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff3cffa0cee7cab42a0a8440f8df2648c24f11dbfaf0ac90842c058251e2674c8bf935c38080ff80808080ffffffa0ed3eabe13c2223b3e972882fae00f238ac9b5a3193dde3a140e491196cdadfafff840160b0c980ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586580ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586480ffff3cffa09d4bbce41275ae2d8527ef8fa18c50bf16e1684077217c3d69d4afac27e6ad358080ff80808080ffffffa088be05b657b59ccb74347a814cdf80cc5e67bfd57c7731b38f0d563b3c4ed19dff840160b0be80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0585e80ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8400b0586080ffff3cffa0ef74eeb23c3bb5c60c9239ce176c2a850f28824882bf59f3a4e841a5b1ac23368080ff80808080ffffffa0ca5d13838f90ae7451c4cfecaada4425571a6e9e7387e28a449646ece360c6f4ff8447a3e41080ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20780ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20980ffff3cffa0a116f7c92bf696a1a2b733f04f745a74deb6f870db469a3a075ce80faa397cef8080ff80808080ffffffa0793b5738594febec98726a64be3f661fc4950e4e8d284673500603cecd64dbc8ff8402c1616680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b280ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff840160b0b480ffff3cffa094eeb15925c8d366cbd7c432b89e1f99e1a7a2a70c06636392af926cd25104278080ff80808080ffffffa066329556d1f491d31c88d4ee804fb8eea51a19bb7e25ce3ef5539bc7979f6436ff85008f47c81080ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40780ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40980ffff3cffa09a15a7209c9ecb59bb8f05b1c753f611051207c22c55971653429f6958ba04628080ff80808080ffffffa000ef0ac249ee02e676fb008a477b69af037c716bc143a4326ef769493ac9cb62ff8447a3e40680ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20280ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20480ffff3cffa03e932ccac4376d3717ad54a706ad8a06ba55a6338ae48cb2344e0ce9a2ebc6b68080ff80808080ffffffa08a7294218fc543b5969323691ef2a359edb8ec1811d4f32831e9cbe590bd6804ff8447a3e40e80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20880ffff3cffa058fd0547e7f373ee231117cfc98a53d6f2a9b712a19f33be5e19ced509ef07068080ff80808080ffffffa0171f6aade114e337ced78310c5c6ecacc7ff4b16a267b87b8ea7eee4c8b37435ff85008f47c81180ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40980ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8447a3e40880ffff3cffa0648cf31c8ee4c907e2bf9ac941e77890edf6bd535add695e40d571da47c230ef8080ff80808080ffffffa04cb723549fb46375953b3e281611b71ba6f6ecb155126b3701e1738204729596ff8447a3e40580ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20380ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20280ffff3cffa0356166fd8b2e384082ca55a36d903db4b65ab7549ea982da55798b49afa22da68080ff80808080ffffffa06a4ba801089f26ad4aba06ec1c176cc19c6032f8c9e293f424333e1d3d0c821aff8447a3e40a80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20480ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff3cffa0e7c96be4f60facfd0db6ad8e4e9a5a3f243f2c0bee1c1a671f7b1b84a191accb8080ff80808080ffffffa029b9134e49e42405bf72c8ff5b47f06ab1424dcf5bbee4a4d7baee0d9fbb4d4eff8447a3e40a80ffffb1b08b9b6e9c5d3b901b884cc519393527c2aea61a9827044dbd4e6471b75da42132f117a4ddbe848f5d77ee0bc9f4b5ff2cffff80ffff01ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20480ffff33ffa04d7048ed8c813a636dcb53c02079627f274218ab31f56c2ffacb35d4597d86d9ff8423d1f20680ffff3cffa00eadbdfa570b1d9106d86307c5095300070badc5db36e9cf54076481faa6d7a68080ff8080808080ff01808080808080", - "transactions_generator_ref_list": [ - 442734 - ], + "transactions_generator_ref_list": [442734], "transactions_info": { "aggregated_signature": "0xb9986f0921371e18f0da7aa295d7c710b74944918f624147c2e796ae7d92ef35dfbc5ecb4d7ed5cfab4757ffdf5979d5056a1eff28dc3787402e22722114d310fa863c6b76a7f40040910b44bb429ab91b6fa5cb19a18803cf9db32c1accd35a", "cost": 3912542704, diff --git a/tests/util/bip39_test_vectors.json b/tests/util/bip39_test_vectors.json index 646234007a82..5470b2fbb8d2 100644 --- a/tests/util/bip39_test_vectors.json +++ b/tests/util/bip39_test_vectors.json @@ -1,148 +1,148 @@ { - "english": [ - [ - "00000000000000000000000000000000", - "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about", - "5eb00bbddcf069084889a8ab9155568165f5c453ccb85e70811aaed6f6da5fc19a5ac40b389cd370d086206dec8aa6c43daea6690f20ad3d8d48b2d2ce9e38e4", - "aban aban aban aban aban aban aban aban aban aban aban abou" - ], - [ - "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", - "legal winner thank year wave sausage worth useful legal winner thank yellow", - "878386efb78845b3355bd15ea4d39ef97d179cb712b77d5c12b6be415fffeffe5f377ba02bf3f8544ab800b955e51fbff09828f682052a20faa6addbbddfb096", - "lega winn than year wave saus wort usef lega winn than yell" - ], - [ - "80808080808080808080808080808080", - "letter advice cage absurd amount doctor acoustic avoid letter advice cage above", - "77d6be9708c8218738934f84bbbb78a2e048ca007746cb764f0673e4b1812d176bbb173e1a291f31cf633f1d0bad7d3cf071c30e98cd0688b5bcce65ecaceb36", - "lett advi cage absu amou doct acou avoi lett advi cage abov" - ], - [ - "ffffffffffffffffffffffffffffffff", - "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong", - "b6a6d8921942dd9806607ebc2750416b289adea669198769f2e15ed926c3aa92bf88ece232317b4ea463e84b0fcd3b53577812ee449ccc448eb45e6f544e25b6", - "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wron" - ], - [ - "000000000000000000000000000000000000000000000000", - "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon agent", - "4975bb3d1faf5308c86a30893ee903a976296609db223fd717e227da5a813a34dc1428b71c84a787fc51f3b9f9dc28e9459f48c08bd9578e9d1b170f2d7ea506", - "aban aban aban aban aban aban aban aban aban aban aban aban aban aban aban aban aban agen" - ], - [ - "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", - "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will", - "b059400ce0f55498a5527667e77048bb482ff6daa16c37b4b9e8af70c85b3f4df588004f19812a1a027c9a51e5e94259a560268e91cd10e206451a129826e740", - "lega winn than year wave saus wort usef lega winn than year wave saus wort usef lega will" - ], - [ - "808080808080808080808080808080808080808080808080", - "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always", - "04d5f77103510c41d610f7f5fb3f0badc77c377090815cee808ea5d2f264fdfabf7c7ded4be6d4c6d7cdb021ba4c777b0b7e57ca8aa6de15aeb9905dba674d66", - "lett advi cage absu amou doct acou avoi lett advi cage absu amou doct acou avoi lett alwa" - ], - [ - "ffffffffffffffffffffffffffffffffffffffffffffffff", - "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo when", - "d2911131a6dda23ac4441d1b66e2113ec6324354523acfa20899a2dcb3087849264e91f8ec5d75355f0f617be15369ffa13c3d18c8156b97cd2618ac693f759f", - "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo when" - ], - [ - "0000000000000000000000000000000000000000000000000000000000000000", - "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art", - "408b285c123836004f4b8842c89324c1f01382450c0d439af345ba7fc49acf705489c6fc77dbd4e3dc1dd8cc6bc9f043db8ada1e243c4a0eafb290d399480840", - "aban aban aban aban aban aban aban aban aban aban aban aban aban aban aban aban aban aban aban aban aban aban aban art" - ], - [ - "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", - "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth title", - "761914478ebf6fe16185749372e91549361af22b386de46322cf8b1ba7e92e80c4af05196f742be1e63aab603899842ddadf4e7248d8e43870a4b6ff9bf16324", - "lega winn than year wave saus wort usef lega winn than year wave saus wort usef lega winn than year wave saus wort titl" - ], - [ - "8080808080808080808080808080808080808080808080808080808080808080", - "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic bless", - "848bbe19cad445e46f35fd3d1a89463583ac2b60b5eb4cfcf955731775a5d9e17a81a71613fed83f1ae27b408478fdec2bbc75b5161d1937aa7cdf4ad686ef5f", - "lett advi cage absu amou doct acou avoi lett advi cage absu amou doct acou avoi lett advi cage absu amou doct acou bles" - ], - [ - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo vote", - "e28a37058c7f5112ec9e16a3437cf363a2572d70b6ceb3b6965447623d620f14d06bb321a26b33ec15fcd84a3b5ddfd5520e230c924c87aaa0d559749e044fef", - "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo vote" - ], - [ - "9e885d952ad362caeb4efe34a8e91bd2", - "ozone drill grab fiber curtain grace pudding thank cruise elder eight picnic", - "e2f88a043776c828063d4c3c97173944d32cf847a925b6e40b0b8bd0b4bead3ba734bdda5250d4698b310a71c9934e1a48e562315ce22bf85f89459df0e73a6c", - "ozon dril grab fibe curt grac pudd than crui elde eigh picn" - ], - [ - "6610b25967cdcca9d59875f5cb50b0ea75433311869e930b", - "gravity machine north sort system female filter attitude volume fold club stay feature office ecology stable narrow fog", - "31736b4f31612ece84404c74a5d3b938a092480eb89c11b81491f1a3657eb2fe50024610fbe814df55913a87ef741020fcf076a75a29aea0aba638126ba4c8bb", - "grav mach nort sort syst fema filt atti volu fold club stay feat offi ecol stab narr fog" - ], - [ - "68a79eaca2324873eacc50cb9c6eca8cc68ea5d936f98787c60c7ebc74e6ce7c", - "hamster diagram private dutch cause delay private meat slide toddler razor book happy fancy gospel tennis maple dilemma loan word shrug inflict delay length", - "17e4b5661796eeff8904550f8572289317ece7c1cc1316469f8f4c986c1ffd7b9f4c3aeac3e1713ffc21fa33707d09d57a2ece358d72111ef7c7658e7b33f2d5", - "hams diag priv dutc caus dela priv meat slid todd razo book happ fanc gosp tenn mapl dile loan word shrug infl dela leng" - ], - [ - "c0ba5a8e914111210f2bd131f3d5e08d", - "scheme spot photo card baby mountain device kick cradle pact join borrow", - "00e1e39a39e23735adab690d0ffbefda6cacc063b4a5fcc605de060bd370adc54c94370d966b9a3fae5ed16bd58a02224cbefca4146a083951b70be2a2ce3dcc", - "sche spot phot card baby moun devi kick crad pact join borr" - ], - [ - "6d9be1ee6ebd27a258115aad99b7317b9c8d28b6d76431c3", - "horn tenant knee talent sponsor spell gate clip pulse soap slush warm silver nephew swap uncle crack brave", - "e893fc34fa2a78ceaaea78c246b69257ad283fa538d88f3c4520beb618a2062b8ec4920ed1793fff6ad443523ed18c03da433004d0a1e9497e194621607bc9e2", - "horn tena knee tale spon spel gate clip puls soap slus warm silv neph swap uncl crac brav" - ], - [ - "9f6a2878b2520799a44ef18bc7df394e7061a224d2c33cd015b157d746869863", - "panda eyebrow bullet gorilla call smoke muffin taste mesh discover soft ostrich alcohol speed nation flash devote level hobby quick inner drive ghost inside", - "3e066d7dee2dbf8fcd3fe240a3975658ca118a8f6f4ca81cf99104944604b05a5090a79d99e545704b914ca0397fedb82fd00fd6a72098703709c891a065ee49", - "pand eyeb bull gori call smok muff tast mesh disc soft ostr alco spee nati flas devo leve hobb quic inne driv ghos insi" - ], - [ - "23db8160a31d3e0dca3688ed941adbf3", - "cat swing flag economy stadium alone churn speed unique patch report train", - "7ea73b3a398f8a71f7dde589d972b0358d3fa8b9e91317ecc544e42752b1bb251a1926b1f4c69eec0a80c0396aa0f7df29f7d73411d3106eba539f3d584fcdf8", - "cat swin flag econ stad alon chur spee uniq patc repo trai" - ], - [ - "8197a4a47f0425faeaa69deebc05ca29c0a5b5cc76ceacc0", - "light rule cinnamon wrap drastic word pride squirrel upgrade then income fatal apart sustain crack supply proud access", - "d0ca8861283a7124515e825b7a06de8e0ad0dd5ac7888013efe6e3c300d4745bbd2c729f3355d769d23718579e7b735999a8f0b38e22b5bff45c9085af449056", - "ligh rule cinn wrap dras word prid squi upgr then inco fata apar sust crac supp prou acce" - ], - [ - "066dca1a2bb7e8a1db2832148ce9933eea0f3ac9548d793112d9a95c9407efad", - "all hour make first leader extend hole alien behind guard gospel lava path output census museum junior mass reopen famous sing advance salt reform", - "fc795be0c3f18c50dddb34e72179dc597d64055497ecc1e69e2e56a5409651bc139aae8070d4df0ea14d8d2a518a9a00bb1cc6e92e053fe34051f6821df9164c", - "all hour make firs lead exte hole alie behi guar gosp lava path outp cens muse juni mass reop famo sing adva salt refo" - ], - [ - "f30f8c1da665478f49b001d94c5fc452", - "vessel ladder alter error federal sibling chat ability sun glass valve picture", - "e2d7f9a462875c1325f44f321392edc8eaafebf1547c89d72d10b41b4ee23af3fb0ab010f39f5cbea3b3aa671161b58262b6a508bcbe2d34ee272a942534d45f", - "vess ladd alte erro fede sibl chat abil sun glas valv pict" - ], - [ - "c10ec20dc3cd9f652c7fac2f1230f7a3c828389a14392f05", - "scissors invite lock maple supreme raw rapid void congress muscle digital elegant little brisk hair mango congress clump", - "a555426999448df9022c3afc2ed0e4aebff3a0ac37d8a395f81412e14994efc960ed168d39a80478e0467a3d5cfc134fef2767c1d3a27f18e3afeb11bfc8e6ad", - "scis invi lock mapl supr raw rapi void cong musc digi eleg litt bris hair mang cong clum" - ], - [ - "f585c11aec520db57dd353c69554b21a89b20fb0650966fa0a9d6f74fd989d8f", - "void come effort suffer camp survey warrior heavy shoot primary clutch crush open amazing screen patrol group space point ten exist slush involve unfold", - "b873212f885ccffbf4692afcb84bc2e55886de2dfa07d90f5c3c239abc31c0a6ce047e30fd8bf6a281e71389aa82d73df74c7bbfb3b06b4639a5cee775cccd3c", - "void come effo suff camp surv warr heav shoo prim clut crus open amaz scre patr grou spac poin ten exis slus invo unfo" - ] + "english": [ + [ + "00000000000000000000000000000000", + "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about", + "5eb00bbddcf069084889a8ab9155568165f5c453ccb85e70811aaed6f6da5fc19a5ac40b389cd370d086206dec8aa6c43daea6690f20ad3d8d48b2d2ce9e38e4", + "aban aban aban aban aban aban aban aban aban aban aban abou" + ], + [ + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", + "legal winner thank year wave sausage worth useful legal winner thank yellow", + "878386efb78845b3355bd15ea4d39ef97d179cb712b77d5c12b6be415fffeffe5f377ba02bf3f8544ab800b955e51fbff09828f682052a20faa6addbbddfb096", + "lega winn than year wave saus wort usef lega winn than yell" + ], + [ + "80808080808080808080808080808080", + "letter advice cage absurd amount doctor acoustic avoid letter advice cage above", + "77d6be9708c8218738934f84bbbb78a2e048ca007746cb764f0673e4b1812d176bbb173e1a291f31cf633f1d0bad7d3cf071c30e98cd0688b5bcce65ecaceb36", + "lett advi cage absu amou doct acou avoi lett advi cage abov" + ], + [ + "ffffffffffffffffffffffffffffffff", + "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong", + "b6a6d8921942dd9806607ebc2750416b289adea669198769f2e15ed926c3aa92bf88ece232317b4ea463e84b0fcd3b53577812ee449ccc448eb45e6f544e25b6", + "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wron" + ], + [ + "000000000000000000000000000000000000000000000000", + "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon agent", + "4975bb3d1faf5308c86a30893ee903a976296609db223fd717e227da5a813a34dc1428b71c84a787fc51f3b9f9dc28e9459f48c08bd9578e9d1b170f2d7ea506", + "aban aban aban aban aban aban aban aban aban aban aban aban aban aban aban aban aban agen" + ], + [ + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", + "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will", + "b059400ce0f55498a5527667e77048bb482ff6daa16c37b4b9e8af70c85b3f4df588004f19812a1a027c9a51e5e94259a560268e91cd10e206451a129826e740", + "lega winn than year wave saus wort usef lega winn than year wave saus wort usef lega will" + ], + [ + "808080808080808080808080808080808080808080808080", + "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always", + "04d5f77103510c41d610f7f5fb3f0badc77c377090815cee808ea5d2f264fdfabf7c7ded4be6d4c6d7cdb021ba4c777b0b7e57ca8aa6de15aeb9905dba674d66", + "lett advi cage absu amou doct acou avoi lett advi cage absu amou doct acou avoi lett alwa" + ], + [ + "ffffffffffffffffffffffffffffffffffffffffffffffff", + "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo when", + "d2911131a6dda23ac4441d1b66e2113ec6324354523acfa20899a2dcb3087849264e91f8ec5d75355f0f617be15369ffa13c3d18c8156b97cd2618ac693f759f", + "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo when" + ], + [ + "0000000000000000000000000000000000000000000000000000000000000000", + "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art", + "408b285c123836004f4b8842c89324c1f01382450c0d439af345ba7fc49acf705489c6fc77dbd4e3dc1dd8cc6bc9f043db8ada1e243c4a0eafb290d399480840", + "aban aban aban aban aban aban aban aban aban aban aban aban aban aban aban aban aban aban aban aban aban aban aban art" + ], + [ + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", + "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth title", + "761914478ebf6fe16185749372e91549361af22b386de46322cf8b1ba7e92e80c4af05196f742be1e63aab603899842ddadf4e7248d8e43870a4b6ff9bf16324", + "lega winn than year wave saus wort usef lega winn than year wave saus wort usef lega winn than year wave saus wort titl" + ], + [ + "8080808080808080808080808080808080808080808080808080808080808080", + "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic bless", + "848bbe19cad445e46f35fd3d1a89463583ac2b60b5eb4cfcf955731775a5d9e17a81a71613fed83f1ae27b408478fdec2bbc75b5161d1937aa7cdf4ad686ef5f", + "lett advi cage absu amou doct acou avoi lett advi cage absu amou doct acou avoi lett advi cage absu amou doct acou bles" + ], + [ + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo vote", + "e28a37058c7f5112ec9e16a3437cf363a2572d70b6ceb3b6965447623d620f14d06bb321a26b33ec15fcd84a3b5ddfd5520e230c924c87aaa0d559749e044fef", + "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo vote" + ], + [ + "9e885d952ad362caeb4efe34a8e91bd2", + "ozone drill grab fiber curtain grace pudding thank cruise elder eight picnic", + "e2f88a043776c828063d4c3c97173944d32cf847a925b6e40b0b8bd0b4bead3ba734bdda5250d4698b310a71c9934e1a48e562315ce22bf85f89459df0e73a6c", + "ozon dril grab fibe curt grac pudd than crui elde eigh picn" + ], + [ + "6610b25967cdcca9d59875f5cb50b0ea75433311869e930b", + "gravity machine north sort system female filter attitude volume fold club stay feature office ecology stable narrow fog", + "31736b4f31612ece84404c74a5d3b938a092480eb89c11b81491f1a3657eb2fe50024610fbe814df55913a87ef741020fcf076a75a29aea0aba638126ba4c8bb", + "grav mach nort sort syst fema filt atti volu fold club stay feat offi ecol stab narr fog" + ], + [ + "68a79eaca2324873eacc50cb9c6eca8cc68ea5d936f98787c60c7ebc74e6ce7c", + "hamster diagram private dutch cause delay private meat slide toddler razor book happy fancy gospel tennis maple dilemma loan word shrug inflict delay length", + "17e4b5661796eeff8904550f8572289317ece7c1cc1316469f8f4c986c1ffd7b9f4c3aeac3e1713ffc21fa33707d09d57a2ece358d72111ef7c7658e7b33f2d5", + "hams diag priv dutc caus dela priv meat slid todd razo book happ fanc gosp tenn mapl dile loan word shrug infl dela leng" + ], + [ + "c0ba5a8e914111210f2bd131f3d5e08d", + "scheme spot photo card baby mountain device kick cradle pact join borrow", + "00e1e39a39e23735adab690d0ffbefda6cacc063b4a5fcc605de060bd370adc54c94370d966b9a3fae5ed16bd58a02224cbefca4146a083951b70be2a2ce3dcc", + "sche spot phot card baby moun devi kick crad pact join borr" + ], + [ + "6d9be1ee6ebd27a258115aad99b7317b9c8d28b6d76431c3", + "horn tenant knee talent sponsor spell gate clip pulse soap slush warm silver nephew swap uncle crack brave", + "e893fc34fa2a78ceaaea78c246b69257ad283fa538d88f3c4520beb618a2062b8ec4920ed1793fff6ad443523ed18c03da433004d0a1e9497e194621607bc9e2", + "horn tena knee tale spon spel gate clip puls soap slus warm silv neph swap uncl crac brav" + ], + [ + "9f6a2878b2520799a44ef18bc7df394e7061a224d2c33cd015b157d746869863", + "panda eyebrow bullet gorilla call smoke muffin taste mesh discover soft ostrich alcohol speed nation flash devote level hobby quick inner drive ghost inside", + "3e066d7dee2dbf8fcd3fe240a3975658ca118a8f6f4ca81cf99104944604b05a5090a79d99e545704b914ca0397fedb82fd00fd6a72098703709c891a065ee49", + "pand eyeb bull gori call smok muff tast mesh disc soft ostr alco spee nati flas devo leve hobb quic inne driv ghos insi" + ], + [ + "23db8160a31d3e0dca3688ed941adbf3", + "cat swing flag economy stadium alone churn speed unique patch report train", + "7ea73b3a398f8a71f7dde589d972b0358d3fa8b9e91317ecc544e42752b1bb251a1926b1f4c69eec0a80c0396aa0f7df29f7d73411d3106eba539f3d584fcdf8", + "cat swin flag econ stad alon chur spee uniq patc repo trai" + ], + [ + "8197a4a47f0425faeaa69deebc05ca29c0a5b5cc76ceacc0", + "light rule cinnamon wrap drastic word pride squirrel upgrade then income fatal apart sustain crack supply proud access", + "d0ca8861283a7124515e825b7a06de8e0ad0dd5ac7888013efe6e3c300d4745bbd2c729f3355d769d23718579e7b735999a8f0b38e22b5bff45c9085af449056", + "ligh rule cinn wrap dras word prid squi upgr then inco fata apar sust crac supp prou acce" + ], + [ + "066dca1a2bb7e8a1db2832148ce9933eea0f3ac9548d793112d9a95c9407efad", + "all hour make first leader extend hole alien behind guard gospel lava path output census museum junior mass reopen famous sing advance salt reform", + "fc795be0c3f18c50dddb34e72179dc597d64055497ecc1e69e2e56a5409651bc139aae8070d4df0ea14d8d2a518a9a00bb1cc6e92e053fe34051f6821df9164c", + "all hour make firs lead exte hole alie behi guar gosp lava path outp cens muse juni mass reop famo sing adva salt refo" + ], + [ + "f30f8c1da665478f49b001d94c5fc452", + "vessel ladder alter error federal sibling chat ability sun glass valve picture", + "e2d7f9a462875c1325f44f321392edc8eaafebf1547c89d72d10b41b4ee23af3fb0ab010f39f5cbea3b3aa671161b58262b6a508bcbe2d34ee272a942534d45f", + "vess ladd alte erro fede sibl chat abil sun glas valv pict" + ], + [ + "c10ec20dc3cd9f652c7fac2f1230f7a3c828389a14392f05", + "scissors invite lock maple supreme raw rapid void congress muscle digital elegant little brisk hair mango congress clump", + "a555426999448df9022c3afc2ed0e4aebff3a0ac37d8a395f81412e14994efc960ed168d39a80478e0467a3d5cfc134fef2767c1d3a27f18e3afeb11bfc8e6ad", + "scis invi lock mapl supr raw rapi void cong musc digi eleg litt bris hair mang cong clum" + ], + [ + "f585c11aec520db57dd353c69554b21a89b20fb0650966fa0a9d6f74fd989d8f", + "void come effort suffer camp survey warrior heavy shoot primary clutch crush open amazing screen patrol group space point ten exist slush involve unfold", + "b873212f885ccffbf4692afcb84bc2e55886de2dfa07d90f5c3c239abc31c0a6ce047e30fd8bf6a281e71389aa82d73df74c7bbfb3b06b4639a5cee775cccd3c", + "void come effo suff camp surv warr heav shoo prim clut crus open amaz scre patr grou spac poin ten exis slus invo unfo" ] + ] } From d6c6adb2e711843269cc08c286268b78f5fae5cf Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Wed, 13 Mar 2024 21:43:21 +0100 Subject: [PATCH 08/12] Speedup test_large_tx_record_query (#17695) Speedup test_large_tx_record_query. --- tests/wallet/test_transaction_store.py | 71 ++++++++++++++++++-------- 1 file changed, 49 insertions(+), 22 deletions(-) diff --git a/tests/wallet/test_transaction_store.py b/tests/wallet/test_transaction_store.py index f776aebb3938..685cde6b957a 100644 --- a/tests/wallet/test_transaction_store.py +++ b/tests/wallet/test_transaction_store.py @@ -887,28 +887,55 @@ async def test_valid_times_migration() -> None: async def test_large_tx_record_query() -> None: async with DBConnection(1) as db_wrapper: store = await WalletTransactionStore.create(db_wrapper) - - for _ in range(0, db_wrapper.host_parameter_limit + 1): - await store.add_transaction_record( - TransactionRecord( - confirmed_at_height=uint32(0), - created_at_time=uint64(1000000000), - to_puzzle_hash=bytes32([0] * 32), - amount=uint64(0), - fee_amount=uint64(0), - confirmed=False, - sent=uint32(10), - spend_bundle=None, - additions=[], - removals=[], - wallet_id=uint32(1), - sent_to=[], - trade_id=None, - type=uint32(TransactionType.INCOMING_TX.value), - name=bytes32.secret(), - memos=[], - valid_times=ConditionValidTimes(), + tx_records_to_insert = [] + for _ in range(db_wrapper.host_parameter_limit + 1): + name = bytes32.random() + record = TransactionRecordOld( + confirmed_at_height=uint32(0), + created_at_time=uint64(1000000000), + to_puzzle_hash=bytes32([0] * 32), + amount=uint64(0), + fee_amount=uint64(0), + confirmed=False, + sent=uint32(10), + spend_bundle=None, + additions=[], + removals=[], + wallet_id=uint32(1), + sent_to=[], + trade_id=None, + type=uint32(TransactionType.INCOMING_TX.value), + name=name, + memos=[], + ) + tx_records_to_insert.append( + ( + bytes(record), + record.name, + record.confirmed_at_height, + record.created_at_time, + record.to_puzzle_hash.hex(), + record.amount.stream_to_bytes(), + record.fee_amount.stream_to_bytes(), + int(record.confirmed), + record.sent, + record.wallet_id, + record.trade_id, + record.type, ) ) + async with db_wrapper.writer_maybe_transaction() as conn: + await conn.executemany( + "INSERT INTO transaction_record VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", tx_records_to_insert + ) + # Insert a specific tx_times item for the last transaction_record item + await conn.execute( + "INSERT INTO tx_times VALUES (?, ?)", (name, bytes(ConditionValidTimes(min_height=uint32(42)))) + ) - assert len(await store.get_all_transactions_for_wallet(1)) == db_wrapper.host_parameter_limit + 1 + all_transactions = await store.get_all_transactions_for_wallet(1) + assert len(all_transactions) == db_wrapper.host_parameter_limit + 1 + # Check that all transaction record items have correct valid times + empty_valid_times = ConditionValidTimes() + assert all(tx.valid_times == empty_valid_times for tx in all_transactions[:-1]) + assert all_transactions[-1].valid_times.min_height == uint32(42) From 774f5c0493731e330963597fcf78adddeda10840 Mon Sep 17 00:00:00 2001 From: Kyle Altendorf Date: Wed, 13 Mar 2024 19:40:26 -0400 Subject: [PATCH 09/12] flake8 ignore E226 (#17700) --- .flake8 | 2 +- chia/cmds/wallet_funcs.py | 2 +- chia/consensus/block_header_validation.py | 2 +- chia/full_node/full_node.py | 2 +- chia/simulator/block_tools.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.flake8 b/.flake8 index f3f45bca91b2..2a5c81582d5a 100644 --- a/.flake8 +++ b/.flake8 @@ -2,7 +2,7 @@ max-line-length = 120 exclude = ./typings/**/* ignore = E203,W503 -extend-ignore = E704,E701 +extend-ignore = E226,E704,E701 per-file-ignores = tests/util/build_network_protocol_files.py:F405 tests/util/test_network_protocol_files.py:F405 diff --git a/chia/cmds/wallet_funcs.py b/chia/cmds/wallet_funcs.py index 543a675314bd..29aa5aaf9010 100644 --- a/chia/cmds/wallet_funcs.py +++ b/chia/cmds/wallet_funcs.py @@ -1510,7 +1510,7 @@ async def get_vcs( print(f"Coin ID: {record.vc.coin.name().hex()}") print( f"Inner Address:" - f" {encode_puzzle_hash(record.vc.inner_puzzle_hash,selected_network_address_prefix(config))}" + f" {encode_puzzle_hash(record.vc.inner_puzzle_hash, selected_network_address_prefix(config))}" ) if record.vc.proof_hash is None: pass diff --git a/chia/consensus/block_header_validation.py b/chia/consensus/block_header_validation.py index c566a1e86bd5..6c488a3a1ee9 100644 --- a/chia/consensus/block_header_validation.py +++ b/chia/consensus/block_header_validation.py @@ -945,7 +945,7 @@ def validate_finished_header_block( number_of_iterations=ip_iters ): expected = cc_target_vdf_info.replace(number_of_iterations=ip_iters) - log.error(f"{header_block.reward_chain_block.challenge_chain_ip_vdf }. expected {expected}") + log.error(f"{header_block.reward_chain_block.challenge_chain_ip_vdf}. expected {expected}") log.error(f"Block: {header_block}") return None, ValidationError(Err.INVALID_CC_IP_VDF) if not header_block.challenge_chain_ip_proof.normalized_to_identity and not validate_vdf( diff --git a/chia/full_node/full_node.py b/chia/full_node/full_node.py index 3423d713d52a..22f5a922c799 100644 --- a/chia/full_node/full_node.py +++ b/chia/full_node/full_node.py @@ -1469,7 +1469,7 @@ async def peak_post_processing( f"difficulty: {difficulty}, " f"sub slot iters: {sub_slot_iters}, " f"Generator size: " - f"{len(bytes(block.transactions_generator)) if block.transactions_generator else 'No tx'}, " + f"{len(bytes(block.transactions_generator)) if block.transactions_generator else 'No tx'}, " f"Generator ref list size: " f"{len(block.transactions_generator_ref_list) if block.transactions_generator else 'No tx'}" ) diff --git a/chia/simulator/block_tools.py b/chia/simulator/block_tools.py index 27da48c32862..ec86190f94ed 100644 --- a/chia/simulator/block_tools.py +++ b/chia/simulator/block_tools.py @@ -1230,7 +1230,7 @@ def get_consecutive_blocks( previous_generator = compressor_arg blocks_added_this_sub_slot += 1 - self.log.info(f"Created block {block_record.height } ov=True, iters {block_record.total_iters}") + self.log.info(f"Created block {block_record.height} ov=True, iters {block_record.total_iters}") num_blocks -= 1 blocks[full_block.header_hash] = block_record From a5972b9b8bec5ca265e212ab3c0f7dc979840983 Mon Sep 17 00:00:00 2001 From: wjblanke Date: Wed, 13 Mar 2024 20:57:24 -0700 Subject: [PATCH 10/12] new_unfinished_block2 support in seeder (#17684) new_unfinished_block2 --- chia/seeder/crawler_api.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/chia/seeder/crawler_api.py b/chia/seeder/crawler_api.py index b87b7ff5195e..86ad9cc657de 100644 --- a/chia/seeder/crawler_api.py +++ b/chia/seeder/crawler_api.py @@ -60,6 +60,12 @@ async def new_unfinished_block( ) -> Optional[Message]: pass + @api_request() + async def new_unfinished_block2( + self, new_unfinished_block: full_node_protocol.NewUnfinishedBlock2 + ) -> Optional[Message]: + pass + @api_request(peer_required=True) async def new_compact_vdf( self, request: full_node_protocol.NewCompactVDF, peer: WSChiaConnection From a89222a428336f29bd7a1e6144f98547f1a76bd6 Mon Sep 17 00:00:00 2001 From: Kyle Altendorf Date: Thu, 14 Mar 2024 13:19:20 -0400 Subject: [PATCH 11/12] move tests (#17209) * prep * verify source and installed tests match * move * remove move script --- .coveragerc | 3 +- .flake8 | 8 +- .github/workflows/benchmarks.yml | 4 +- .github/workflows/test-single.yml | 13 +- .github/workflows/test.yml | 12 +- .github/workflows/upload-pypi-source.yml | 6 +- .pre-commit-config.yaml | 4 +- CONTRIBUTING.md | 2 +- benchmarks/block_store.py | 22 ++-- benchmarks/blockchains.py | 2 +- benchmarks/coin_store.py | 2 +- benchmarks/jsonify.py | 2 +- benchmarks/streamable.py | 2 +- {tests => chia/_tests}/README.md | 0 {tests => chia/_tests}/__init__.py | 0 {tests => chia/_tests}/blockchain/__init__.py | 0 .../blockchain/blockchain_test_utils.py | 0 {tests => chia/_tests}/blockchain/config.py | 0 .../_tests}/blockchain/test_blockchain.py | 18 +-- .../test_blockchain_transactions.py | 4 +- .../blockchain/test_lookup_fork_chain.py | 2 +- {tests => chia/_tests}/build-init-files.py | 4 +- {tests => chia/_tests}/build-job-matrix.py | 16 ++- .../_tests}/check_pytest_monitor_output.py | 0 .../_tests}/check_sql_statements.py | 0 {tests => chia/_tests}/chia-start-sim | 0 {tests => chia/_tests}/clvm/__init__.py | 0 .../_tests}/clvm/benchmark_costs.py | 0 {tests => chia/_tests}/clvm/coin_store.py | 0 .../clvm/test_chialisp_deserialization.py | 0 {tests => chia/_tests}/clvm/test_clvm_step.py | 0 .../_tests}/clvm/test_condition_codes.py | 0 .../_tests}/clvm/test_curry_and_treehash.py | 0 {tests => chia/_tests}/clvm/test_program.py | 0 .../_tests}/clvm/test_puzzle_compression.py | 0 .../_tests}/clvm/test_puzzle_drivers.py | 0 {tests => chia/_tests}/clvm/test_puzzles.py | 2 +- .../_tests}/clvm/test_singletons.py | 4 +- {tests => chia/_tests}/clvm/test_spend_sim.py | 0 {tests => chia/_tests}/cmds/__init__.py | 0 {tests => chia/_tests}/cmds/cmd_test_utils.py | 2 +- {tests => chia/_tests}/cmds/config.py | 0 {tests => chia/_tests}/cmds/conftest.py | 2 +- {tests => chia/_tests}/cmds/test_cmds_util.py | 2 +- {tests => chia/_tests}/cmds/test_farm_cmd.py | 2 +- {tests => chia/_tests}/cmds/test_show.py | 6 +- {tests => chia/_tests}/cmds/test_sim.py | 0 .../_tests}/cmds/test_timelock_args.py | 0 .../_tests}/cmds/test_tx_config_args.py | 0 .../_tests}/cmds/testing_classes.py | 0 .../_tests}/cmds/wallet/__init__.py | 0 .../_tests}/cmds/wallet/test_coins.py | 4 +- .../_tests}/cmds/wallet/test_consts.py | 0 .../_tests}/cmds/wallet/test_dao.py | 4 +- .../_tests}/cmds/wallet/test_did.py | 4 +- .../_tests}/cmds/wallet/test_nft.py | 4 +- .../_tests}/cmds/wallet/test_notifications.py | 4 +- .../_tests}/cmds/wallet/test_offer.toffer | 0 .../_tests}/cmds/wallet/test_vcs.py | 4 +- .../_tests}/cmds/wallet/test_wallet.py | 22 ++-- .../_tests}/cmds/wallet/test_wallet_check.py | 0 {tests => chia/_tests}/conftest.py | 54 ++++---- {tests => chia/_tests}/connection_utils.py | 2 +- {tests => chia/_tests}/core/__init__.py | 0 {tests => chia/_tests}/core/cmds/__init__.py | 0 {tests => chia/_tests}/core/cmds/test_beta.py | 0 {tests => chia/_tests}/core/cmds/test_keys.py | 0 .../_tests}/core/cmds/test_wallet.py | 0 {tests => chia/_tests}/core/config.py | 0 .../_tests}/core/consensus/__init__.py | 0 .../core/consensus/test_block_creation.py | 2 +- .../core/consensus/test_pot_iterations.py | 0 .../_tests}/core/custom_types/__init__.py | 0 .../_tests}/core/custom_types/test_coin.py | 0 .../core/custom_types/test_proof_of_space.py | 2 +- .../core/custom_types/test_spend_bundle.py | 0 .../_tests}/core/daemon/__init__.py | 0 {tests => chia/_tests}/core/daemon/config.py | 0 .../_tests}/core/daemon/test_daemon.py | 4 +- .../core/daemon/test_daemon_register.py | 0 .../core/daemon/test_keychain_proxy.py | 0 .../_tests}/core/data_layer/__init__.py | 0 .../_tests}/core/data_layer/config.py | 0 .../_tests}/core/data_layer/conftest.py | 10 +- .../_tests}/core/data_layer/test_data_cli.py | 2 +- .../core/data_layer/test_data_layer.py | 2 +- .../core/data_layer/test_data_layer_util.py | 2 +- .../_tests}/core/data_layer/test_data_rpc.py | 4 +- .../core/data_layer/test_data_store.py | 4 +- .../core/data_layer/test_data_store_schema.py | 2 +- .../_tests}/core/data_layer/util.py | 0 .../_tests}/core/farmer/__init__.py | 0 {tests => chia/_tests}/core/farmer/config.py | 0 .../_tests}/core/farmer/test_farmer_api.py | 11 +- .../_tests}/core/full_node/__init__.py | 0 .../_tests}/core/full_node/config.py | 0 .../_tests}/core/full_node/dos/__init__.py | 0 .../_tests}/core/full_node/dos/config.py | 0 .../core/full_node/full_sync/__init__.py | 0 .../core/full_node/full_sync/config.py | 0 .../full_node/full_sync/test_full_sync.py | 6 +- .../_tests}/core/full_node/ram_db.py | 0 .../_tests}/core/full_node/stores/__init__.py | 0 .../_tests}/core/full_node/stores/config.py | 0 .../core/full_node/stores/test_block_store.py | 4 +- .../core/full_node/stores/test_coin_store.py | 6 +- .../full_node/stores/test_full_node_store.py | 4 +- .../core/full_node/stores/test_hint_store.py | 2 +- .../core/full_node/stores/test_sync_store.py | 0 .../core/full_node/test_address_manager.py | 0 .../core/full_node/test_block_height_map.py | 2 +- .../_tests}/core/full_node/test_conditions.py | 2 +- .../_tests}/core/full_node/test_full_node.py | 18 +-- .../core/full_node/test_generator_tools.py | 0 .../core/full_node/test_hint_management.py | 2 +- .../_tests}/core/full_node/test_node_load.py | 6 +- .../core/full_node/test_performance.py | 10 +- .../core/full_node/test_subscriptions.py | 0 .../core/full_node/test_transactions.py | 2 +- .../full_node/test_tx_processing_queue.py | 0 {tests => chia/_tests}/core/large_block.py | 0 .../_tests}/core/make_block_generator.py | 0 .../_tests}/core/mempool/__init__.py | 0 {tests => chia/_tests}/core/mempool/config.py | 0 .../_tests}/core/mempool/test_mempool.py | 26 ++-- .../mempool/test_mempool_fee_estimator.py | 4 +- .../core/mempool/test_mempool_fee_protocol.py | 4 +- .../core/mempool/test_mempool_manager.py | 4 +- .../core/mempool/test_mempool_performance.py | 6 +- .../mempool/test_singleton_fast_forward.py | 22 ++-- {tests => chia/_tests}/core/node_height.py | 0 .../_tests}/core/server/__init__.py | 0 {tests => chia/_tests}/core/server/config.py | 0 {tests => chia/_tests}/core/server/flood.py | 2 +- {tests => chia/_tests}/core/server/serve.py | 2 +- .../_tests}/core/server/test_capabilities.py | 0 .../_tests}/core/server/test_dos.py | 2 +- .../_tests}/core/server/test_event_loop.py | 0 .../_tests}/core/server/test_loop.py | 13 +- .../core/server/test_node_discovery.py | 0 .../_tests}/core/server/test_rate_limits.py | 2 +- .../_tests}/core/server/test_server.py | 6 +- .../_tests}/core/server/test_upnp.py | 0 .../_tests}/core/services/__init__.py | 0 .../_tests}/core/services/config.py | 0 .../_tests}/core/services/test_services.py | 4 +- {tests => chia/_tests}/core/ssl/__init__.py | 0 {tests => chia/_tests}/core/ssl/config.py | 0 {tests => chia/_tests}/core/ssl/test_ssl.py | 0 {tests => chia/_tests}/core/test_coins.py | 2 +- .../_tests}/core/test_cost_calculation.py | 4 +- {tests => chia/_tests}/core/test_crawler.py | 4 +- .../_tests}/core/test_crawler_rpc.py | 0 .../_tests}/core/test_daemon_rpc.py | 0 .../_tests}/core/test_db_conversion.py | 2 +- .../_tests}/core/test_db_validation.py | 2 +- .../_tests}/core/test_farmer_harvester_rpc.py | 10 +- {tests => chia/_tests}/core/test_filter.py | 0 .../_tests}/core/test_full_node_rpc.py | 10 +- .../_tests}/core/test_merkle_set.py | 0 {tests => chia/_tests}/core/test_program.py | 0 {tests => chia/_tests}/core/test_rpc_util.py | 0 {tests => chia/_tests}/core/test_seeder.py | 2 +- .../_tests}/core/test_setproctitle.py | 0 {tests => chia/_tests}/core/util/__init__.py | 0 {tests => chia/_tests}/core/util/config.py | 0 .../_tests}/core/util/test_cached_bls.py | 0 .../_tests}/core/util/test_config.py | 0 .../util/test_file_keyring_synchronization.py | 2 +- .../_tests}/core/util/test_files.py | 0 .../_tests}/core/util/test_jsonify.py | 0 .../_tests}/core/util/test_keychain.py | 7 +- .../_tests}/core/util/test_keyring_wrapper.py | 0 .../_tests}/core/util/test_lockfile.py | 0 .../_tests}/core/util/test_log_exceptions.py | 0 .../_tests}/core/util/test_lru_cache.py | 0 .../core/util/test_significant_bits.py | 0 .../_tests}/core/util/test_streamable.py | 0 {tests => chia/_tests}/db/__init__.py | 0 {tests => chia/_tests}/db/test_db_wrapper.py | 2 +- .../_tests}/environments/__init__.py | 0 {tests => chia/_tests}/environments/common.py | 0 .../_tests}/environments/full_node.py | 2 +- {tests => chia/_tests}/environments/wallet.py | 2 +- {tests => chia/_tests}/ether.py | 4 +- .../_tests}/farmer_harvester/__init__.py | 0 .../_tests}/farmer_harvester/config.py | 0 .../_tests}/farmer_harvester/test_farmer.py | 4 +- .../farmer_harvester/test_farmer_harvester.py | 4 +- .../test_filter_prefix_bits.py | 8 +- .../test_third_party_harvesters.py | 2 +- .../test_third_party_harvesters_data.json | 0 .../_tests}/fee_estimation/__init__.py | 0 .../_tests}/fee_estimation/config.py | 0 .../test_fee_estimation_integration.py | 10 +- .../fee_estimation/test_fee_estimation_rpc.py | 0 .../test_fee_estimation_unit_tests.py | 0 .../test_mempoolitem_height_added.py | 0 {tests => chia/_tests}/generator/__init__.py | 0 .../_tests}/generator/puzzles/__init__.py | 0 .../puzzles/test_generator_deserialize.clsp | 0 .../test_generator_deserialize.clsp.hex | 0 ...st_multiple_generator_input_arguments.clsp | 0 ...ultiple_generator_input_arguments.clsp.hex | 0 .../_tests}/generator/test_compression.py | 10 +- .../_tests}/generator/test_generator_types.py | 0 {tests => chia/_tests}/generator/test_rom.py | 0 {tests => chia/_tests}/generator/test_scan.py | 0 {tests => chia/_tests}/plot_sync/__init__.py | 0 {tests => chia/_tests}/plot_sync/config.py | 0 .../_tests}/plot_sync/test_delta.py | 0 .../_tests}/plot_sync/test_plot_sync.py | 8 +- .../_tests}/plot_sync/test_receiver.py | 2 +- .../_tests}/plot_sync/test_sender.py | 2 +- .../_tests}/plot_sync/test_sync_simulated.py | 4 +- {tests => chia/_tests}/plot_sync/util.py | 2 +- {tests => chia/_tests}/plotting/__init__.py | 0 {tests => chia/_tests}/plotting/config.py | 0 .../_tests}/plotting/test_plot_manager.py | 4 +- {tests => chia/_tests}/plotting/util.py | 0 {tests => chia/_tests}/pools/__init__.py | 0 {tests => chia/_tests}/pools/config.py | 0 .../_tests}/pools/test_pool_cmdline.py | 0 .../_tests}/pools/test_pool_config.py | 0 .../pools/test_pool_puzzles_lifecycle.py | 6 +- {tests => chia/_tests}/pools/test_pool_rpc.py | 4 +- .../_tests}/pools/test_pool_wallet.py | 2 +- .../_tests}/pools/test_wallet_pool_store.py | 2 +- {tests => chia/_tests}/process_junit.py | 4 +- {tests => chia/_tests}/rpc/__init__.py | 0 {tests => chia/_tests}/rpc/test_rpc_client.py | 2 +- {tests => chia/_tests}/simulation/__init__.py | 0 {tests => chia/_tests}/simulation/config.py | 0 .../_tests}/simulation/test_simulation.py | 6 +- .../_tests}/simulation/test_simulator.py | 2 +- .../simulation/test_start_simulator.py | 2 +- {tests => chia/_tests}/testconfig.py | 0 {tests => chia/_tests}/timelord/__init__.py | 0 {tests => chia/_tests}/timelord/config.py | 0 .../_tests}/timelord/test_new_peak.py | 4 +- .../_tests}/timelord/test_timelord.py | 0 {tests => chia/_tests}/tools/1315537.json | 0 {tests => chia/_tests}/tools/1315544.json | 0 {tests => chia/_tests}/tools/1315630.json | 0 {tests => chia/_tests}/tools/300000.json | 0 {tests => chia/_tests}/tools/442734.json | 0 {tests => chia/_tests}/tools/466212.json | 0 {tests => chia/_tests}/tools/__init__.py | 0 {tests => chia/_tests}/tools/config.py | 0 .../_tests}/tools/test-blockchain-db.sqlite | Bin .../_tests}/tools/test_full_sync.py | 2 +- .../_tests}/tools/test_legacy_keyring.py | 0 .../_tests}/tools/test_run_block.py | 2 +- {tests => chia/_tests}/util/__init__.py | 0 {tests => chia/_tests}/util/benchmark_cost.py | 0 {tests => chia/_tests}/util/benchmarks.py | 0 .../_tests}/util/bip39_test_vectors.json | 0 {tests => chia/_tests}/util/blockchain.py | 0 .../util/build_network_protocol_files.py | 12 +- .../_tests}/util/clvm_generator.bin | Bin {tests => chia/_tests}/util/config.py | 0 {tests => chia/_tests}/util/constants.py | 0 {tests => chia/_tests}/util/db_connection.py | 0 {tests => chia/_tests}/util/full_sync.py | 2 +- {tests => chia/_tests}/util/gen_ssl_certs.py | 0 .../_tests}/util/generator_tools_testing.py | 0 {tests => chia/_tests}/util/key_tool.py | 2 +- {tests => chia/_tests}/util/misc.py | 10 +- .../_tests}/util/network_protocol_data.py | 0 .../_tests}/util/protocol_messages_bytes-v1.0 | Bin .../_tests}/util/protocol_messages_json.py | 0 {tests => chia/_tests}/util/rpc.py | 0 {tests => chia/_tests}/util/run_block.py | 0 {tests => chia/_tests}/util/setup_nodes.py | 4 +- {tests => chia/_tests}/util/temp_file.py | 0 .../_tests}/util/test_async_pool.py | 0 .../_tests}/util/test_build_job_matrix.py | 4 +- .../util/test_build_network_protocol_files.py | 2 +- .../_tests}/util/test_collection.py | 0 .../_tests}/util/test_condition_tools.py | 0 {tests => chia/_tests}/util/test_config.py | 2 +- .../_tests}/util/test_dump_keyring.py | 2 +- {tests => chia/_tests}/util/test_errors.py | 0 .../_tests}/util/test_full_block_utils.py | 2 +- {tests => chia/_tests}/util/test_installed.py | 0 .../_tests}/util/test_limited_semaphore.py | 0 .../_tests}/util/test_logging_filter.py | 0 {tests => chia/_tests}/util/test_misc.py | 2 +- {tests => chia/_tests}/util/test_network.py | 0 .../util/test_network_protocol_files.py | 6 +- .../util/test_network_protocol_json.py | 4 +- .../util/test_network_protocol_test.py | 0 {tests => chia/_tests}/util/test_paginator.py | 0 {tests => chia/_tests}/util/test_pprint.py | 0 .../_tests}/util/test_priority_mutex.py | 4 +- .../_tests}/util/test_recursive_replace.py | 0 {tests => chia/_tests}/util/test_ssl_check.py | 0 .../_tests}/util/test_struct_stream.py | 0 .../_tests}/util/test_testnet_overrides.py | 0 .../_tests}/util/test_tests_misc.py | 2 +- {tests => chia/_tests}/util/test_timing.py | 0 .../_tests}/util/test_trusted_peer.py | 0 .../_tests}/util/time_out_assert.py | 8 +- {tests => chia/_tests}/wallet/__init__.py | 0 .../_tests}/wallet/cat_wallet/__init__.py | 0 .../_tests}/wallet/cat_wallet/config.py | 0 .../wallet/cat_wallet/test_cat_lifecycle.py | 6 +- .../cat_wallet/test_cat_outer_puzzle.py | 0 .../wallet/cat_wallet/test_cat_wallet.py | 8 +- .../wallet/cat_wallet/test_offer_lifecycle.py | 0 .../_tests}/wallet/cat_wallet/test_trades.py | 8 +- .../_tests}/wallet/clawback/__init__.py | 0 .../_tests}/wallet/clawback/config.py | 0 .../clawback/test_clawback_decorator.py | 0 .../clawback/test_clawback_lifecycle.py | 8 +- .../wallet/clawback/test_clawback_metadata.py | 0 {tests => chia/_tests}/wallet/config.py | 0 {tests => chia/_tests}/wallet/conftest.py | 6 +- .../_tests}/wallet/dao_wallet/__init__.py | 0 .../_tests}/wallet/dao_wallet/config.py | 0 .../wallet/dao_wallet/test_dao_clvm.py | 0 .../wallet/dao_wallet/test_dao_wallets.py | 6 +- .../_tests}/wallet/db_wallet/__init__.py | 0 .../_tests}/wallet/db_wallet/config.py | 0 .../wallet/db_wallet/test_db_graftroot.py | 0 .../wallet/db_wallet/test_dl_offers.py | 4 +- .../wallet/db_wallet/test_dl_wallet.py | 6 +- .../_tests}/wallet/did_wallet/__init__.py | 0 .../_tests}/wallet/did_wallet/config.py | 0 .../_tests}/wallet/did_wallet/test_did.py | 6 +- .../_tests}/wallet/nft_wallet/__init__.py | 0 .../_tests}/wallet/nft_wallet/config.py | 0 .../wallet/nft_wallet/test_nft_1_offers.py | 4 +- .../wallet/nft_wallet/test_nft_bulk_mint.py | 4 +- .../wallet/nft_wallet/test_nft_lifecycle.py | 0 .../wallet/nft_wallet/test_nft_offers.py | 6 +- .../wallet/nft_wallet/test_nft_puzzles.py | 2 +- .../wallet/nft_wallet/test_nft_wallet.py | 8 +- .../nft_wallet/test_ownership_outer_puzzle.py | 0 {tests => chia/_tests}/wallet/rpc/__init__.py | 0 {tests => chia/_tests}/wallet/rpc/config.py | 0 .../_tests}/wallet/rpc/test_dl_wallet_rpc.py | 8 +- .../_tests}/wallet/rpc/test_wallet_rpc.py | 56 ++++---- .../_tests}/wallet/simple_sync/__init__.py | 0 .../_tests}/wallet/simple_sync/config.py | 0 .../simple_sync/test_simple_sync_protocol.py | 6 +- .../_tests}/wallet/sync/__init__.py | 0 {tests => chia/_tests}/wallet/sync/config.py | 0 .../_tests}/wallet/sync/test_wallet_sync.py | 10 +- .../_tests}/wallet/test_address_type.py | 0 {tests => chia/_tests}/wallet/test_bech32m.py | 0 .../_tests}/wallet/test_chialisp.py | 0 .../_tests}/wallet/test_coin_selection.py | 0 .../_tests}/wallet/test_conditions.py | 0 .../_tests}/wallet/test_debug_spend_bundle.py | 0 .../_tests}/wallet/test_nft_store.py | 2 +- .../_tests}/wallet/test_notifications.py | 2 +- .../wallet/test_offer_parsing_performance.py | 2 +- .../_tests}/wallet/test_puzzle_store.py | 2 +- .../_tests}/wallet/test_sign_coin_spends.py | 0 .../_tests}/wallet/test_singleton.py | 0 .../wallet/test_singleton_lifecycle_fast.py | 2 +- .../_tests}/wallet/test_singleton_store.py | 2 +- {tests => chia/_tests}/wallet/test_taproot.py | 2 +- .../_tests}/wallet/test_transaction_store.py | 2 +- {tests => chia/_tests}/wallet/test_util.py | 2 +- {tests => chia/_tests}/wallet/test_wallet.py | 4 +- .../_tests}/wallet/test_wallet_blockchain.py | 6 +- .../_tests}/wallet/test_wallet_coin_store.py | 2 +- .../wallet/test_wallet_interested_store.py | 2 +- .../wallet/test_wallet_key_val_store.py | 2 +- .../_tests}/wallet/test_wallet_node.py | 8 +- .../_tests}/wallet/test_wallet_retry.py | 2 +- .../wallet/test_wallet_state_manager.py | 2 +- .../wallet/test_wallet_test_framework.py | 4 +- .../_tests}/wallet/test_wallet_trade_store.py | 2 +- .../_tests}/wallet/test_wallet_user_store.py | 2 +- .../_tests}/wallet/test_wallet_utils.py | 0 .../_tests}/wallet/vc_wallet/__init__.py | 0 .../_tests}/wallet/vc_wallet/config.py | 0 .../wallet/vc_wallet/test_cr_outer_puzzle.py | 0 .../wallet/vc_wallet/test_vc_lifecycle.py | 0 .../wallet/vc_wallet/test_vc_wallet.py | 4 +- .../_tests}/wallet/wallet_block_tools.py | 0 .../_tests}/weight_proof/__init__.py | 0 {tests => chia/_tests}/weight_proof/config.py | 0 .../_tests}/weight_proof/test_weight_proof.py | 0 .../puzzles/deployed_puzzle_hashes.json | 2 + mypy-exclusions.txt | 124 +++++++++--------- mypy.ini.template | 2 +- pytest.ini | 2 +- setup.py | 4 + tools/generate_chain.py | 2 +- tools/run_block.py | 2 +- tools/test_full_sync.py | 2 +- 395 files changed, 528 insertions(+), 507 deletions(-) rename {tests => chia/_tests}/README.md (100%) rename {tests => chia/_tests}/__init__.py (100%) rename {tests => chia/_tests}/blockchain/__init__.py (100%) rename {tests => chia/_tests}/blockchain/blockchain_test_utils.py (100%) rename {tests => chia/_tests}/blockchain/config.py (100%) rename {tests => chia/_tests}/blockchain/test_blockchain.py (99%) rename {tests => chia/_tests}/blockchain/test_blockchain_transactions.py (99%) rename {tests => chia/_tests}/blockchain/test_lookup_fork_chain.py (99%) rename {tests => chia/_tests}/build-init-files.py (96%) rename {tests => chia/_tests}/build-job-matrix.py (91%) rename {tests => chia/_tests}/check_pytest_monitor_output.py (100%) rename {tests => chia/_tests}/check_sql_statements.py (100%) rename {tests => chia/_tests}/chia-start-sim (100%) rename {tests => chia/_tests}/clvm/__init__.py (100%) rename {tests => chia/_tests}/clvm/benchmark_costs.py (100%) rename {tests => chia/_tests}/clvm/coin_store.py (100%) rename {tests => chia/_tests}/clvm/test_chialisp_deserialization.py (100%) rename {tests => chia/_tests}/clvm/test_clvm_step.py (100%) rename {tests => chia/_tests}/clvm/test_condition_codes.py (100%) rename {tests => chia/_tests}/clvm/test_curry_and_treehash.py (100%) rename {tests => chia/_tests}/clvm/test_program.py (100%) rename {tests => chia/_tests}/clvm/test_puzzle_compression.py (100%) rename {tests => chia/_tests}/clvm/test_puzzle_drivers.py (100%) rename {tests => chia/_tests}/clvm/test_puzzles.py (99%) rename {tests => chia/_tests}/clvm/test_singletons.py (99%) rename {tests => chia/_tests}/clvm/test_spend_sim.py (100%) rename {tests => chia/_tests}/cmds/__init__.py (100%) rename {tests => chia/_tests}/cmds/cmd_test_utils.py (99%) rename {tests => chia/_tests}/cmds/config.py (100%) rename {tests => chia/_tests}/cmds/conftest.py (89%) rename {tests => chia/_tests}/cmds/test_cmds_util.py (98%) rename {tests => chia/_tests}/cmds/test_farm_cmd.py (97%) rename {tests => chia/_tests}/cmds/test_show.py (93%) rename {tests => chia/_tests}/cmds/test_sim.py (100%) rename {tests => chia/_tests}/cmds/test_timelock_args.py (100%) rename {tests => chia/_tests}/cmds/test_tx_config_args.py (100%) rename {tests => chia/_tests}/cmds/testing_classes.py (100%) rename {tests => chia/_tests}/cmds/wallet/__init__.py (100%) rename {tests => chia/_tests}/cmds/wallet/test_coins.py (97%) rename {tests => chia/_tests}/cmds/wallet/test_consts.py (100%) rename {tests => chia/_tests}/cmds/wallet/test_dao.py (99%) rename {tests => chia/_tests}/cmds/wallet/test_did.py (98%) rename {tests => chia/_tests}/cmds/wallet/test_nft.py (98%) rename {tests => chia/_tests}/cmds/wallet/test_notifications.py (95%) rename {tests => chia/_tests}/cmds/wallet/test_offer.toffer (100%) rename {tests => chia/_tests}/cmds/wallet/test_vcs.py (98%) rename {tests => chia/_tests}/cmds/wallet/test_wallet.py (99%) rename {tests => chia/_tests}/cmds/wallet/test_wallet_check.py (100%) rename {tests => chia/_tests}/conftest.py (97%) rename {tests => chia/_tests}/connection_utils.py (98%) rename {tests => chia/_tests}/core/__init__.py (100%) rename {tests => chia/_tests}/core/cmds/__init__.py (100%) rename {tests => chia/_tests}/core/cmds/test_beta.py (100%) rename {tests => chia/_tests}/core/cmds/test_keys.py (100%) rename {tests => chia/_tests}/core/cmds/test_wallet.py (100%) rename {tests => chia/_tests}/core/config.py (100%) rename {tests => chia/_tests}/core/consensus/__init__.py (100%) rename {tests => chia/_tests}/core/consensus/test_block_creation.py (96%) rename {tests => chia/_tests}/core/consensus/test_pot_iterations.py (100%) rename {tests => chia/_tests}/core/custom_types/__init__.py (100%) rename {tests => chia/_tests}/core/custom_types/test_coin.py (100%) rename {tests => chia/_tests}/core/custom_types/test_proof_of_space.py (99%) rename {tests => chia/_tests}/core/custom_types/test_spend_bundle.py (100%) rename {tests => chia/_tests}/core/daemon/__init__.py (100%) rename {tests => chia/_tests}/core/daemon/config.py (100%) rename {tests => chia/_tests}/core/daemon/test_daemon.py (99%) rename {tests => chia/_tests}/core/daemon/test_daemon_register.py (100%) rename {tests => chia/_tests}/core/daemon/test_keychain_proxy.py (100%) rename {tests => chia/_tests}/core/data_layer/__init__.py (100%) rename {tests => chia/_tests}/core/data_layer/config.py (100%) rename {tests => chia/_tests}/core/data_layer/conftest.py (97%) rename {tests => chia/_tests}/core/data_layer/test_data_cli.py (97%) rename {tests => chia/_tests}/core/data_layer/test_data_layer.py (97%) rename {tests => chia/_tests}/core/data_layer/test_data_layer_util.py (98%) rename {tests => chia/_tests}/core/data_layer/test_data_rpc.py (99%) rename {tests => chia/_tests}/core/data_layer/test_data_store.py (99%) rename {tests => chia/_tests}/core/data_layer/test_data_store_schema.py (99%) rename {tests => chia/_tests}/core/data_layer/util.py (100%) rename {tests => chia/_tests}/core/farmer/__init__.py (100%) rename {tests => chia/_tests}/core/farmer/config.py (100%) rename {tests => chia/_tests}/core/farmer/test_farmer_api.py (92%) rename {tests => chia/_tests}/core/full_node/__init__.py (100%) rename {tests => chia/_tests}/core/full_node/config.py (100%) rename {tests => chia/_tests}/core/full_node/dos/__init__.py (100%) rename {tests => chia/_tests}/core/full_node/dos/config.py (100%) rename {tests => chia/_tests}/core/full_node/full_sync/__init__.py (100%) rename {tests => chia/_tests}/core/full_node/full_sync/config.py (100%) rename {tests => chia/_tests}/core/full_node/full_sync/test_full_sync.py (99%) rename {tests => chia/_tests}/core/full_node/ram_db.py (100%) rename {tests => chia/_tests}/core/full_node/stores/__init__.py (100%) rename {tests => chia/_tests}/core/full_node/stores/config.py (100%) rename {tests => chia/_tests}/core/full_node/stores/test_block_store.py (99%) rename {tests => chia/_tests}/core/full_node/stores/test_coin_store.py (99%) rename {tests => chia/_tests}/core/full_node/stores/test_full_node_store.py (99%) rename {tests => chia/_tests}/core/full_node/stores/test_hint_store.py (99%) rename {tests => chia/_tests}/core/full_node/stores/test_sync_store.py (100%) rename {tests => chia/_tests}/core/full_node/test_address_manager.py (100%) rename {tests => chia/_tests}/core/full_node/test_block_height_map.py (99%) rename {tests => chia/_tests}/core/full_node/test_conditions.py (99%) rename {tests => chia/_tests}/core/full_node/test_full_node.py (99%) rename {tests => chia/_tests}/core/full_node/test_generator_tools.py (100%) rename {tests => chia/_tests}/core/full_node/test_hint_management.py (98%) rename {tests => chia/_tests}/core/full_node/test_node_load.py (87%) rename {tests => chia/_tests}/core/full_node/test_performance.py (95%) rename {tests => chia/_tests}/core/full_node/test_subscriptions.py (100%) rename {tests => chia/_tests}/core/full_node/test_transactions.py (99%) rename {tests => chia/_tests}/core/full_node/test_tx_processing_queue.py (100%) rename {tests => chia/_tests}/core/large_block.py (100%) rename {tests => chia/_tests}/core/make_block_generator.py (100%) rename {tests => chia/_tests}/core/mempool/__init__.py (100%) rename {tests => chia/_tests}/core/mempool/config.py (100%) rename {tests => chia/_tests}/core/mempool/test_mempool.py (99%) rename {tests => chia/_tests}/core/mempool/test_mempool_fee_estimator.py (96%) rename {tests => chia/_tests}/core/mempool/test_mempool_fee_protocol.py (94%) rename {tests => chia/_tests}/core/mempool/test_mempool_manager.py (99%) rename {tests => chia/_tests}/core/mempool/test_mempool_performance.py (92%) rename {tests => chia/_tests}/core/mempool/test_singleton_fast_forward.py (99%) rename {tests => chia/_tests}/core/node_height.py (100%) rename {tests => chia/_tests}/core/server/__init__.py (100%) rename {tests => chia/_tests}/core/server/config.py (100%) rename {tests => chia/_tests}/core/server/flood.py (98%) rename {tests => chia/_tests}/core/server/serve.py (98%) rename {tests => chia/_tests}/core/server/test_capabilities.py (100%) rename {tests => chia/_tests}/core/server/test_dos.py (99%) rename {tests => chia/_tests}/core/server/test_event_loop.py (100%) rename {tests => chia/_tests}/core/server/test_loop.py (96%) rename {tests => chia/_tests}/core/server/test_node_discovery.py (100%) rename {tests => chia/_tests}/core/server/test_rate_limits.py (99%) rename {tests => chia/_tests}/core/server/test_server.py (98%) rename {tests => chia/_tests}/core/server/test_upnp.py (100%) rename {tests => chia/_tests}/core/services/__init__.py (100%) rename {tests => chia/_tests}/core/services/config.py (100%) rename {tests => chia/_tests}/core/services/test_services.py (98%) rename {tests => chia/_tests}/core/ssl/__init__.py (100%) rename {tests => chia/_tests}/core/ssl/config.py (100%) rename {tests => chia/_tests}/core/ssl/test_ssl.py (100%) rename {tests => chia/_tests}/core/test_coins.py (94%) rename {tests => chia/_tests}/core/test_cost_calculation.py (99%) rename {tests => chia/_tests}/core/test_crawler.py (96%) rename {tests => chia/_tests}/core/test_crawler_rpc.py (100%) rename {tests => chia/_tests}/core/test_daemon_rpc.py (100%) rename {tests => chia/_tests}/core/test_db_conversion.py (99%) rename {tests => chia/_tests}/core/test_db_validation.py (99%) rename {tests => chia/_tests}/core/test_farmer_harvester_rpc.py (98%) rename {tests => chia/_tests}/core/test_filter.py (100%) rename {tests => chia/_tests}/core/test_full_node_rpc.py (99%) rename {tests => chia/_tests}/core/test_merkle_set.py (100%) rename {tests => chia/_tests}/core/test_program.py (100%) rename {tests => chia/_tests}/core/test_rpc_util.py (100%) rename {tests => chia/_tests}/core/test_seeder.py (99%) rename {tests => chia/_tests}/core/test_setproctitle.py (100%) rename {tests => chia/_tests}/core/util/__init__.py (100%) rename {tests => chia/_tests}/core/util/config.py (100%) rename {tests => chia/_tests}/core/util/test_cached_bls.py (100%) rename {tests => chia/_tests}/core/util/test_config.py (100%) rename {tests => chia/_tests}/core/util/test_file_keyring_synchronization.py (98%) rename {tests => chia/_tests}/core/util/test_files.py (100%) rename {tests => chia/_tests}/core/util/test_jsonify.py (100%) rename {tests => chia/_tests}/core/util/test_keychain.py (98%) rename {tests => chia/_tests}/core/util/test_keyring_wrapper.py (100%) rename {tests => chia/_tests}/core/util/test_lockfile.py (100%) rename {tests => chia/_tests}/core/util/test_log_exceptions.py (100%) rename {tests => chia/_tests}/core/util/test_lru_cache.py (100%) rename {tests => chia/_tests}/core/util/test_significant_bits.py (100%) rename {tests => chia/_tests}/core/util/test_streamable.py (100%) rename {tests => chia/_tests}/db/__init__.py (100%) rename {tests => chia/_tests}/db/test_db_wrapper.py (99%) rename {tests => chia/_tests}/environments/__init__.py (100%) rename {tests => chia/_tests}/environments/common.py (100%) rename {tests => chia/_tests}/environments/full_node.py (95%) rename {tests => chia/_tests}/environments/wallet.py (99%) rename {tests => chia/_tests}/ether.py (83%) rename {tests => chia/_tests}/farmer_harvester/__init__.py (100%) rename {tests => chia/_tests}/farmer_harvester/config.py (100%) rename {tests => chia/_tests}/farmer_harvester/test_farmer.py (99%) rename {tests => chia/_tests}/farmer_harvester/test_farmer_harvester.py (99%) rename {tests => chia/_tests}/farmer_harvester/test_filter_prefix_bits.py (95%) rename {tests => chia/_tests}/farmer_harvester/test_third_party_harvesters.py (99%) rename {tests => chia/_tests}/farmer_harvester/test_third_party_harvesters_data.json (100%) rename {tests => chia/_tests}/fee_estimation/__init__.py (100%) rename {tests => chia/_tests}/fee_estimation/config.py (100%) rename {tests => chia/_tests}/fee_estimation/test_fee_estimation_integration.py (99%) rename {tests => chia/_tests}/fee_estimation/test_fee_estimation_rpc.py (100%) rename {tests => chia/_tests}/fee_estimation/test_fee_estimation_unit_tests.py (100%) rename {tests => chia/_tests}/fee_estimation/test_mempoolitem_height_added.py (100%) rename {tests => chia/_tests}/generator/__init__.py (100%) rename {tests => chia/_tests}/generator/puzzles/__init__.py (100%) rename {tests => chia/_tests}/generator/puzzles/test_generator_deserialize.clsp (100%) rename {tests => chia/_tests}/generator/puzzles/test_generator_deserialize.clsp.hex (100%) rename {tests => chia/_tests}/generator/puzzles/test_multiple_generator_input_arguments.clsp (100%) rename {tests => chia/_tests}/generator/puzzles/test_multiple_generator_input_arguments.clsp.hex (100%) rename {tests => chia/_tests}/generator/test_compression.py (97%) rename {tests => chia/_tests}/generator/test_generator_types.py (100%) rename {tests => chia/_tests}/generator/test_rom.py (100%) rename {tests => chia/_tests}/generator/test_scan.py (100%) rename {tests => chia/_tests}/plot_sync/__init__.py (100%) rename {tests => chia/_tests}/plot_sync/config.py (100%) rename {tests => chia/_tests}/plot_sync/test_delta.py (100%) rename {tests => chia/_tests}/plot_sync/test_plot_sync.py (99%) rename {tests => chia/_tests}/plot_sync/test_receiver.py (99%) rename {tests => chia/_tests}/plot_sync/test_sender.py (98%) rename {tests => chia/_tests}/plot_sync/test_sync_simulated.py (99%) rename {tests => chia/_tests}/plot_sync/util.py (97%) rename {tests => chia/_tests}/plotting/__init__.py (100%) rename {tests => chia/_tests}/plotting/config.py (100%) rename {tests => chia/_tests}/plotting/test_plot_manager.py (99%) rename {tests => chia/_tests}/plotting/util.py (100%) rename {tests => chia/_tests}/pools/__init__.py (100%) rename {tests => chia/_tests}/pools/config.py (100%) rename {tests => chia/_tests}/pools/test_pool_cmdline.py (100%) rename {tests => chia/_tests}/pools/test_pool_config.py (100%) rename {tests => chia/_tests}/pools/test_pool_puzzles_lifecycle.py (98%) rename {tests => chia/_tests}/pools/test_pool_rpc.py (99%) rename {tests => chia/_tests}/pools/test_pool_wallet.py (99%) rename {tests => chia/_tests}/pools/test_wallet_pool_store.py (99%) rename {tests => chia/_tests}/process_junit.py (98%) rename {tests => chia/_tests}/rpc/__init__.py (100%) rename {tests => chia/_tests}/rpc/test_rpc_client.py (97%) rename {tests => chia/_tests}/simulation/__init__.py (100%) rename {tests => chia/_tests}/simulation/config.py (100%) rename {tests => chia/_tests}/simulation/test_simulation.py (99%) rename {tests => chia/_tests}/simulation/test_simulator.py (99%) rename {tests => chia/_tests}/simulation/test_start_simulator.py (98%) rename {tests => chia/_tests}/testconfig.py (100%) rename {tests => chia/_tests}/timelord/__init__.py (100%) rename {tests => chia/_tests}/timelord/config.py (100%) rename {tests => chia/_tests}/timelord/test_new_peak.py (98%) rename {tests => chia/_tests}/timelord/test_timelord.py (100%) rename {tests => chia/_tests}/tools/1315537.json (100%) rename {tests => chia/_tests}/tools/1315544.json (100%) rename {tests => chia/_tests}/tools/1315630.json (100%) rename {tests => chia/_tests}/tools/300000.json (100%) rename {tests => chia/_tests}/tools/442734.json (100%) rename {tests => chia/_tests}/tools/466212.json (100%) rename {tests => chia/_tests}/tools/__init__.py (100%) rename {tests => chia/_tests}/tools/config.py (100%) rename {tests => chia/_tests}/tools/test-blockchain-db.sqlite (100%) rename {tests => chia/_tests}/tools/test_full_sync.py (92%) rename {tests => chia/_tests}/tools/test_legacy_keyring.py (100%) rename {tests => chia/_tests}/tools/test_run_block.py (98%) rename {tests => chia/_tests}/util/__init__.py (100%) rename {tests => chia/_tests}/util/benchmark_cost.py (100%) rename {tests => chia/_tests}/util/benchmarks.py (100%) rename {tests => chia/_tests}/util/bip39_test_vectors.json (100%) rename {tests => chia/_tests}/util/blockchain.py (100%) rename {tests => chia/_tests}/util/build_network_protocol_files.py (95%) rename {tests => chia/_tests}/util/clvm_generator.bin (100%) rename {tests => chia/_tests}/util/config.py (100%) rename {tests => chia/_tests}/util/constants.py (100%) rename {tests => chia/_tests}/util/db_connection.py (100%) rename {tests => chia/_tests}/util/full_sync.py (99%) rename {tests => chia/_tests}/util/gen_ssl_certs.py (100%) rename {tests => chia/_tests}/util/generator_tools_testing.py (100%) rename {tests => chia/_tests}/util/key_tool.py (94%) rename {tests => chia/_tests}/util/misc.py (98%) rename {tests => chia/_tests}/util/network_protocol_data.py (100%) rename {tests => chia/_tests}/util/protocol_messages_bytes-v1.0 (100%) rename {tests => chia/_tests}/util/protocol_messages_json.py (100%) rename {tests => chia/_tests}/util/rpc.py (100%) rename {tests => chia/_tests}/util/run_block.py (100%) rename {tests => chia/_tests}/util/setup_nodes.py (99%) rename {tests => chia/_tests}/util/temp_file.py (100%) rename {tests => chia/_tests}/util/test_async_pool.py (100%) rename {tests => chia/_tests}/util/test_build_job_matrix.py (90%) rename {tests => chia/_tests}/util/test_build_network_protocol_files.py (60%) rename {tests => chia/_tests}/util/test_collection.py (100%) rename {tests => chia/_tests}/util/test_condition_tools.py (100%) rename {tests => chia/_tests}/util/test_config.py (99%) rename {tests => chia/_tests}/util/test_dump_keyring.py (96%) rename {tests => chia/_tests}/util/test_errors.py (100%) rename {tests => chia/_tests}/util/test_full_block_utils.py (98%) rename {tests => chia/_tests}/util/test_installed.py (100%) rename {tests => chia/_tests}/util/test_limited_semaphore.py (100%) rename {tests => chia/_tests}/util/test_logging_filter.py (100%) rename {tests => chia/_tests}/util/test_misc.py (99%) rename {tests => chia/_tests}/util/test_network.py (100%) rename {tests => chia/_tests}/util/test_network_protocol_files.py (99%) rename {tests => chia/_tests}/util/test_network_protocol_json.py (99%) rename {tests => chia/_tests}/util/test_network_protocol_test.py (100%) rename {tests => chia/_tests}/util/test_paginator.py (100%) rename {tests => chia/_tests}/util/test_pprint.py (100%) rename {tests => chia/_tests}/util/test_priority_mutex.py (99%) rename {tests => chia/_tests}/util/test_recursive_replace.py (100%) rename {tests => chia/_tests}/util/test_ssl_check.py (100%) rename {tests => chia/_tests}/util/test_struct_stream.py (100%) rename {tests => chia/_tests}/util/test_testnet_overrides.py (100%) rename {tests => chia/_tests}/util/test_tests_misc.py (92%) rename {tests => chia/_tests}/util/test_timing.py (100%) rename {tests => chia/_tests}/util/test_trusted_peer.py (100%) rename {tests => chia/_tests}/util/time_out_assert.py (96%) rename {tests => chia/_tests}/wallet/__init__.py (100%) rename {tests => chia/_tests}/wallet/cat_wallet/__init__.py (100%) rename {tests => chia/_tests}/wallet/cat_wallet/config.py (100%) rename {tests => chia/_tests}/wallet/cat_wallet/test_cat_lifecycle.py (99%) rename {tests => chia/_tests}/wallet/cat_wallet/test_cat_outer_puzzle.py (100%) rename {tests => chia/_tests}/wallet/cat_wallet/test_cat_wallet.py (99%) rename {tests => chia/_tests}/wallet/cat_wallet/test_offer_lifecycle.py (100%) rename {tests => chia/_tests}/wallet/cat_wallet/test_trades.py (99%) rename {tests => chia/_tests}/wallet/clawback/__init__.py (100%) rename {tests => chia/_tests}/wallet/clawback/config.py (100%) rename {tests => chia/_tests}/wallet/clawback/test_clawback_decorator.py (100%) rename {tests => chia/_tests}/wallet/clawback/test_clawback_lifecycle.py (97%) rename {tests => chia/_tests}/wallet/clawback/test_clawback_metadata.py (100%) rename {tests => chia/_tests}/wallet/config.py (100%) rename {tests => chia/_tests}/wallet/conftest.py (97%) rename {tests => chia/_tests}/wallet/dao_wallet/__init__.py (100%) rename {tests => chia/_tests}/wallet/dao_wallet/config.py (100%) rename {tests => chia/_tests}/wallet/dao_wallet/test_dao_clvm.py (100%) rename {tests => chia/_tests}/wallet/dao_wallet/test_dao_wallets.py (99%) rename {tests => chia/_tests}/wallet/db_wallet/__init__.py (100%) rename {tests => chia/_tests}/wallet/db_wallet/config.py (100%) rename {tests => chia/_tests}/wallet/db_wallet/test_db_graftroot.py (100%) rename {tests => chia/_tests}/wallet/db_wallet/test_dl_offers.py (99%) rename {tests => chia/_tests}/wallet/db_wallet/test_dl_wallet.py (99%) rename {tests => chia/_tests}/wallet/did_wallet/__init__.py (100%) rename {tests => chia/_tests}/wallet/did_wallet/config.py (100%) rename {tests => chia/_tests}/wallet/did_wallet/test_did.py (99%) rename {tests => chia/_tests}/wallet/nft_wallet/__init__.py (100%) rename {tests => chia/_tests}/wallet/nft_wallet/config.py (100%) rename {tests => chia/_tests}/wallet/nft_wallet/test_nft_1_offers.py (99%) rename {tests => chia/_tests}/wallet/nft_wallet/test_nft_bulk_mint.py (99%) rename {tests => chia/_tests}/wallet/nft_wallet/test_nft_lifecycle.py (100%) rename {tests => chia/_tests}/wallet/nft_wallet/test_nft_offers.py (99%) rename {tests => chia/_tests}/wallet/nft_wallet/test_nft_puzzles.py (99%) rename {tests => chia/_tests}/wallet/nft_wallet/test_nft_wallet.py (99%) rename {tests => chia/_tests}/wallet/nft_wallet/test_ownership_outer_puzzle.py (100%) rename {tests => chia/_tests}/wallet/rpc/__init__.py (100%) rename {tests => chia/_tests}/wallet/rpc/config.py (100%) rename {tests => chia/_tests}/wallet/rpc/test_dl_wallet_rpc.py (98%) rename {tests => chia/_tests}/wallet/rpc/test_wallet_rpc.py (99%) rename {tests => chia/_tests}/wallet/simple_sync/__init__.py (100%) rename {tests => chia/_tests}/wallet/simple_sync/config.py (100%) rename {tests => chia/_tests}/wallet/simple_sync/test_simple_sync_protocol.py (99%) rename {tests => chia/_tests}/wallet/sync/__init__.py (100%) rename {tests => chia/_tests}/wallet/sync/config.py (100%) rename {tests => chia/_tests}/wallet/sync/test_wallet_sync.py (99%) rename {tests => chia/_tests}/wallet/test_address_type.py (100%) rename {tests => chia/_tests}/wallet/test_bech32m.py (100%) rename {tests => chia/_tests}/wallet/test_chialisp.py (100%) rename {tests => chia/_tests}/wallet/test_coin_selection.py (100%) rename {tests => chia/_tests}/wallet/test_conditions.py (100%) rename {tests => chia/_tests}/wallet/test_debug_spend_bundle.py (100%) rename {tests => chia/_tests}/wallet/test_nft_store.py (99%) rename {tests => chia/_tests}/wallet/test_notifications.py (98%) rename {tests => chia/_tests}/wallet/test_offer_parsing_performance.py (99%) rename {tests => chia/_tests}/wallet/test_puzzle_store.py (99%) rename {tests => chia/_tests}/wallet/test_sign_coin_spends.py (100%) rename {tests => chia/_tests}/wallet/test_singleton.py (100%) rename {tests => chia/_tests}/wallet/test_singleton_lifecycle_fast.py (99%) rename {tests => chia/_tests}/wallet/test_singleton_store.py (99%) rename {tests => chia/_tests}/wallet/test_taproot.py (90%) rename {tests => chia/_tests}/wallet/test_transaction_store.py (99%) rename {tests => chia/_tests}/wallet/test_util.py (99%) rename {tests => chia/_tests}/wallet/test_wallet.py (99%) rename {tests => chia/_tests}/wallet/test_wallet_blockchain.py (96%) rename {tests => chia/_tests}/wallet/test_wallet_coin_store.py (99%) rename {tests => chia/_tests}/wallet/test_wallet_interested_store.py (97%) rename {tests => chia/_tests}/wallet/test_wallet_key_val_store.py (96%) rename {tests => chia/_tests}/wallet/test_wallet_node.py (99%) rename {tests => chia/_tests}/wallet/test_wallet_retry.py (97%) rename {tests => chia/_tests}/wallet/test_wallet_state_manager.py (98%) rename {tests => chia/_tests}/wallet/test_wallet_test_framework.py (99%) rename {tests => chia/_tests}/wallet/test_wallet_trade_store.py (99%) rename {tests => chia/_tests}/wallet/test_wallet_user_store.py (95%) rename {tests => chia/_tests}/wallet/test_wallet_utils.py (100%) rename {tests => chia/_tests}/wallet/vc_wallet/__init__.py (100%) rename {tests => chia/_tests}/wallet/vc_wallet/config.py (100%) rename {tests => chia/_tests}/wallet/vc_wallet/test_cr_outer_puzzle.py (100%) rename {tests => chia/_tests}/wallet/vc_wallet/test_vc_lifecycle.py (100%) rename {tests => chia/_tests}/wallet/vc_wallet/test_vc_wallet.py (99%) rename {tests => chia/_tests}/wallet/wallet_block_tools.py (100%) rename {tests => chia/_tests}/weight_proof/__init__.py (100%) rename {tests => chia/_tests}/weight_proof/config.py (100%) rename {tests => chia/_tests}/weight_proof/test_weight_proof.py (100%) diff --git a/.coveragerc b/.coveragerc index 444d45e91a26..ec4426c53cc4 100644 --- a/.coveragerc +++ b/.coveragerc @@ -5,9 +5,8 @@ disable_warnings= relative_files=True source_pkgs= chia - tests omit= - tests/**/config.py + chia/_tests/**/config.py concurrency=multiprocessing, thread parallel=True diff --git a/.flake8 b/.flake8 index 2a5c81582d5a..2319d942fb52 100644 --- a/.flake8 +++ b/.flake8 @@ -4,7 +4,7 @@ exclude = ./typings/**/* ignore = E203,W503 extend-ignore = E226,E704,E701 per-file-ignores = - tests/util/build_network_protocol_files.py:F405 - tests/util/test_network_protocol_files.py:F405 - tests/util/test_network_protocol_json.py:F405 - tests/util/protocol_messages_json.py:E501 + chia/_tests/util/build_network_protocol_files.py:F405 + chia/_tests/util/test_network_protocol_files.py:F405 + chia/_tests/util/test_network_protocol_json.py:F405 + chia/_tests/util/protocol_messages_json.py:E501 diff --git a/.github/workflows/benchmarks.yml b/.github/workflows/benchmarks.yml index c37cb697a3b7..7d9a36b2ae95 100644 --- a/.github/workflows/benchmarks.yml +++ b/.github/workflows/benchmarks.yml @@ -106,7 +106,7 @@ jobs: - name: pytest run: | - pytest -n 0 --capture no -m benchmark -o 'junit_suite_name=benchmarks' --junitxml=junit-data/benchmarks.raw.xml --benchmark-repeats ${{ needs.setup.outputs.repeats }} tests + pytest -n 0 --capture no -m benchmark -o 'junit_suite_name=benchmarks' --junitxml=junit-data/benchmarks.raw.xml --benchmark-repeats ${{ needs.setup.outputs.repeats }} chia/_tests/ - name: Format JUnit data and prepare results if: always() @@ -124,4 +124,4 @@ jobs: - name: Add benchmark results to workflow summary if: always() run: | - python -m tests.process_junit --type benchmark --xml junit-data/benchmarks.xml --markdown --link-prefix ${{ github.event.repository.html_url }}/blob/${{ github.sha }}/ --link-line-separator \#L >> "$GITHUB_STEP_SUMMARY" + python -m chia._tests.process_junit --type benchmark --xml junit-data/benchmarks.xml --markdown --link-prefix ${{ github.event.repository.html_url }}/blob/${{ github.sha }}/ --link-line-separator \#L >> "$GITHUB_STEP_SUMMARY" diff --git a/.github/workflows/test-single.yml b/.github/workflows/test-single.yml index 4347acc52756..13df06f10d1a 100644 --- a/.github/workflows/test-single.yml +++ b/.github/workflows/test-single.yml @@ -220,6 +220,15 @@ jobs: sh install-timelord.sh -n ./vdf_bench square_asm 400000 + - name: Verify source and installed tests match + run: | + echo '==== collecting source tests ====' + pytest --collect-only -qq --import-mode=prepend chia/_tests/ | sed -n 's;^\(chia/_tests/.*\);\1;p' | sort | tee source_tests + echo '==== collecting installed tests ====' + pytest --collect-only -qq --import-mode=append --pyargs chia._tests | sed -n 's;^venv/.*/\(chia/_tests/.*\);\1;p' | sort | tee installed_tests + echo '==== diffing collected tests ====' + diff --unified source_tests installed_tests + - name: Move chia/ so we test the installed code run: | mv chia/ notchia/ @@ -228,7 +237,7 @@ jobs: env: ENABLE_PYTEST_MONITOR: ${{ matrix.os.matrix == 'ubuntu' && matrix.configuration.enable_pytest_monitor || '' }} run: | - pytest --cov=chia --cov=tests --cov-config=.coveragerc --cov-report= -o 'junit_suite_name=${{ env.JOB_FILE_NAME }}' --junitxml='junit-data/junit.${{ env.JOB_FILE_NAME }}.xml' --durations=10 ${{ matrix.configuration.pytest_parallel_args[matrix.os.matrix] }} -m "not benchmark" ${{ env.ENABLE_PYTEST_MONITOR }} ${{ matrix.configuration.test_files }} + pytest --cov=chia --cov-config=.coveragerc --cov-report= -o 'junit_suite_name=${{ env.JOB_FILE_NAME }}' --junitxml='junit-data/junit.${{ env.JOB_FILE_NAME }}.xml' --durations=10 ${{ matrix.configuration.pytest_parallel_args[matrix.os.matrix] }} -m "not benchmark" ${{ env.ENABLE_PYTEST_MONITOR }} ${{ matrix.configuration.test_files }} - name: Move back to chia/ for coverage run: | @@ -260,4 +269,4 @@ jobs: if: matrix.os.matrix == 'ubuntu' && matrix.configuration.check_resource_usage run: | sqlite3 -readonly -separator " " .pymon "select item,cpu_usage,total_time,mem_usage from TEST_METRICS order by mem_usage desc;" >metrics.out - ./tests/check_pytest_monitor_output.py matrix.json + python chia/_tests/build-job-matrix.py --per directory --verbose > matrix.json cat matrix.json echo configuration=$(cat matrix.json) >> "$GITHUB_OUTPUT" echo matrix_mode=${{ ( github.event_name == 'schedule' ) && 'all' || ( github.event_name == 'workflow_dispatch' ) && 'all' || ( github.repository_owner == 'Chia-Network' && github.repository != 'Chia-Network/chia-blockchain' ) && 'limited' || ( github.repository_owner == 'Chia-Network' && github.repository == 'Chia-Network/chia-blockchain' && github.ref == 'refs/heads/main' ) && 'main' || ( github.repository_owner == 'Chia-Network' && github.repository == 'Chia-Network/chia-blockchain' && startsWith(github.ref, 'refs/heads/release/') ) && 'all' || ( github.repository_owner == 'Chia-Network' && github.repository == 'Chia-Network/chia-blockchain' && startsWith(github.base_ref, 'release/') ) && 'all' || 'main' }} >> "$GITHUB_OUTPUT" @@ -164,8 +164,8 @@ jobs: - name: Add time out assert results to workflow summary if: always() run: | - python -m tests.process_junit --limit 50 --type time_out_assert --xml junit-results/junit.xml --markdown --link-prefix ${{ github.event.repository.html_url }}/blob/${{ github.sha }}/ --link-line-separator \#L >> "$GITHUB_STEP_SUMMARY" - python -m tests.process_junit --type time_out_assert --xml junit-results/junit.xml --markdown --link-prefix ${{ github.event.repository.html_url }}/blob/${{ github.sha }}/ --link-line-separator \#L >> junit-results/time_out_assert.md + python -m chia._tests.process_junit --limit 50 --type time_out_assert --xml junit-results/junit.xml --markdown --link-prefix ${{ github.event.repository.html_url }}/blob/${{ github.sha }}/ --link-line-separator \#L >> "$GITHUB_STEP_SUMMARY" + python -m chia._tests.process_junit --type time_out_assert --xml junit-results/junit.xml --markdown --link-prefix ${{ github.event.repository.html_url }}/blob/${{ github.sha }}/ --link-line-separator \#L >> junit-results/time_out_assert.md - name: Publish JUnit results if: always() @@ -190,13 +190,13 @@ jobs: if: always() run: | set -o pipefail - coverage report --rcfile=.coveragerc --data-file=coverage-reports/.coverage --include='chia/**/*' --show-missing | tee coverage-reports/coverage-chia-stdout + coverage report --rcfile=.coveragerc --data-file=coverage-reports/.coverage --include='chia/**/*' --omit='chia/_tests/**/*' --show-missing | tee coverage-reports/coverage-chia-stdout - - name: Coverage report (tests/) + - name: Coverage report (chia/_tests/) if: always() run: | set -o pipefail - coverage report --rcfile=.coveragerc --data-file=coverage-reports/.coverage --include='tests/**/*' --show-missing | tee coverage-reports/coverage-tests-stdout + coverage report --rcfile=.coveragerc --data-file=coverage-reports/.coverage --include='chia/_tests/**/*' --show-missing | tee coverage-reports/coverage-tests-stdout - name: Coverage report (diff) if: (github.base_ref != '' || github.event.before != '') && always() diff --git a/.github/workflows/upload-pypi-source.yml b/.github/workflows/upload-pypi-source.yml index 196a5a4ea575..ad50de4a0e7b 100644 --- a/.github/workflows/upload-pypi-source.yml +++ b/.github/workflows/upload-pypi-source.yml @@ -128,12 +128,12 @@ jobs: - name: black command: black --check --diff . - name: flake8 - command: flake8 benchmarks build_scripts chia tests tools *.py + command: flake8 benchmarks build_scripts chia tools *.py - name: pylint - command: pylint benchmarks build_scripts chia tests tools *.py + command: pylint benchmarks build_scripts chia tools *.py - name: generated protocol tests command: | - python3 -m tests.util.build_network_protocol_files + python3 -m chia._tests.util.build_network_protocol_files git diff --exit-code steps: diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2b7edb35f27a..43a6446a5f07 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,14 +3,14 @@ repos: hooks: - id: check-sql name: Validate SQL statements - entry: ./activated.py python -m tests.check_sql_statements + entry: ./activated.py python -m chia._tests.check_sql_statements language: system pass_filenames: false - repo: local hooks: - id: init_py_files name: __init__.py files - entry: ./activated.py python tests/build-init-files.py -v --root . + entry: ./activated.py python chia/_tests/build-init-files.py -v --root . language: system pass_filenames: false - repo: local diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b565402327d0..5d6e871094f3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -87,7 +87,7 @@ provided configuration with `pre-commit install`. 4. Preferences > Settings > Python > Linting > flake8 enabled 5. Preferences > Settings > Python > Linting > mypy enabled 6. Preferences > Settings > Formatting > Python > Provider > black -7. Preferences > Settings > mypy > Targets: set to `./chia` and `./tests` +7. Preferences > Settings > mypy > Targets: set to `./chia` ## Configure Pycharm diff --git a/benchmarks/block_store.py b/benchmarks/block_store.py index 3bce4bef7266..b93d6252dda9 100644 --- a/benchmarks/block_store.py +++ b/benchmarks/block_store.py @@ -9,6 +9,17 @@ from typing import List from benchmarks.utils import setup_db +from chia._tests.util.benchmarks import ( + clvm_generator, + rand_bytes, + rand_class_group_element, + rand_g1, + rand_g2, + rand_hash, + rand_vdf, + rand_vdf_proof, + rewards, +) from chia.consensus.block_record import BlockRecord from chia.full_node.block_store import BlockStore from chia.types.blockchain_format.foliage import Foliage, FoliageBlockData, FoliageTransactionBlock, TransactionsInfo @@ -20,17 +31,6 @@ from chia.types.blockchain_format.sub_epoch_summary import SubEpochSummary from chia.types.full_block import FullBlock from chia.util.ints import uint8, uint32, uint64, uint128 -from tests.util.benchmarks import ( - clvm_generator, - rand_bytes, - rand_class_group_element, - rand_g1, - rand_g2, - rand_hash, - rand_vdf, - rand_vdf_proof, - rewards, -) # to run this benchmark: # python -m benchmarks.coin_store diff --git a/benchmarks/blockchains.py b/benchmarks/blockchains.py index 162399533eb1..6430d25b5077 100644 --- a/benchmarks/blockchains.py +++ b/benchmarks/blockchains.py @@ -7,10 +7,10 @@ from subprocess import check_call from typing import Iterator +from chia._tests.util.blockchain import persistent_blocks from chia.simulator.block_tools import create_block_tools_async, test_constants from chia.simulator.keyring import TempKeyring from chia.util.keyring_wrapper import KeyringWrapper -from tests.util.blockchain import persistent_blocks @contextmanager diff --git a/benchmarks/coin_store.py b/benchmarks/coin_store.py index 86e37f00d4db..5b31ff92feb0 100644 --- a/benchmarks/coin_store.py +++ b/benchmarks/coin_store.py @@ -9,11 +9,11 @@ from typing import List, Tuple from benchmarks.utils import setup_db +from chia._tests.util.benchmarks import rand_hash, rewards from chia.full_node.coin_store import CoinStore from chia.types.blockchain_format.coin import Coin from chia.types.blockchain_format.sized_bytes import bytes32 from chia.util.ints import uint32, uint64 -from tests.util.benchmarks import rand_hash, rewards # to run this benchmark: # python -m benchmarks.coin_store diff --git a/benchmarks/jsonify.py b/benchmarks/jsonify.py index a96244777e6e..5444e7fa42c9 100644 --- a/benchmarks/jsonify.py +++ b/benchmarks/jsonify.py @@ -3,7 +3,7 @@ import random from time import perf_counter -from tests.util.test_full_block_utils import get_full_blocks +from chia._tests.util.test_full_block_utils import get_full_blocks random.seed(123456789) diff --git a/benchmarks/streamable.py b/benchmarks/streamable.py index b46fa1812493..5af06d7fb4c7 100644 --- a/benchmarks/streamable.py +++ b/benchmarks/streamable.py @@ -11,11 +11,11 @@ import click from benchmarks.utils import EnumType, get_commit_hash +from chia._tests.util.benchmarks import rand_bytes, rand_full_block, rand_hash from chia.types.blockchain_format.sized_bytes import bytes32 from chia.types.full_block import FullBlock from chia.util.ints import uint8, uint64 from chia.util.streamable import Streamable, streamable -from tests.util.benchmarks import rand_bytes, rand_full_block, rand_hash # to run this benchmark: # python -m benchmarks.streamable diff --git a/tests/README.md b/chia/_tests/README.md similarity index 100% rename from tests/README.md rename to chia/_tests/README.md diff --git a/tests/__init__.py b/chia/_tests/__init__.py similarity index 100% rename from tests/__init__.py rename to chia/_tests/__init__.py diff --git a/tests/blockchain/__init__.py b/chia/_tests/blockchain/__init__.py similarity index 100% rename from tests/blockchain/__init__.py rename to chia/_tests/blockchain/__init__.py diff --git a/tests/blockchain/blockchain_test_utils.py b/chia/_tests/blockchain/blockchain_test_utils.py similarity index 100% rename from tests/blockchain/blockchain_test_utils.py rename to chia/_tests/blockchain/blockchain_test_utils.py diff --git a/tests/blockchain/config.py b/chia/_tests/blockchain/config.py similarity index 100% rename from tests/blockchain/config.py rename to chia/_tests/blockchain/config.py diff --git a/tests/blockchain/test_blockchain.py b/chia/_tests/blockchain/test_blockchain.py similarity index 99% rename from tests/blockchain/test_blockchain.py rename to chia/_tests/blockchain/test_blockchain.py index 0aa7f0315f33..4897a74b6234 100644 --- a/tests/blockchain/test_blockchain.py +++ b/chia/_tests/blockchain/test_blockchain.py @@ -12,6 +12,15 @@ from chia_rs import AugSchemeMPL, G2Element from clvm.casts import int_to_bytes +from chia._tests.blockchain.blockchain_test_utils import ( + _validate_and_add_block, + _validate_and_add_block_multi_error, + _validate_and_add_block_multi_result, + _validate_and_add_block_no_error, + check_block_store_invariant, +) +from chia._tests.conftest import ConsensusMode +from chia._tests.util.blockchain import create_blockchain from chia.consensus.block_body_validation import ForkInfo from chia.consensus.block_header_validation import validate_finished_header_block from chia.consensus.block_record import BlockRecord @@ -53,15 +62,6 @@ DEFAULT_HIDDEN_PUZZLE_HASH, calculate_synthetic_secret_key, ) -from tests.blockchain.blockchain_test_utils import ( - _validate_and_add_block, - _validate_and_add_block_multi_error, - _validate_and_add_block_multi_result, - _validate_and_add_block_no_error, - check_block_store_invariant, -) -from tests.conftest import ConsensusMode -from tests.util.blockchain import create_blockchain log = logging.getLogger(__name__) bad_element = ClassgroupElement.create(b"\x00") diff --git a/tests/blockchain/test_blockchain_transactions.py b/chia/_tests/blockchain/test_blockchain_transactions.py similarity index 99% rename from tests/blockchain/test_blockchain_transactions.py rename to chia/_tests/blockchain/test_blockchain_transactions.py index f941258aa661..9f4f31f18408 100644 --- a/tests/blockchain/test_blockchain_transactions.py +++ b/chia/_tests/blockchain/test_blockchain_transactions.py @@ -6,6 +6,8 @@ import pytest from clvm.casts import int_to_bytes +from chia._tests.blockchain.blockchain_test_utils import _validate_and_add_block +from chia._tests.util.generator_tools_testing import run_and_get_removals_and_additions from chia.full_node.full_node_api import FullNodeAPI from chia.protocols import wallet_protocol from chia.server.server import ChiaServer @@ -18,8 +20,6 @@ from chia.util.errors import ConsensusError, Err from chia.util.ints import uint32, uint64 from chia.wallet.conditions import AssertCoinAnnouncement, AssertPuzzleAnnouncement -from tests.blockchain.blockchain_test_utils import _validate_and_add_block -from tests.util.generator_tools_testing import run_and_get_removals_and_additions BURN_PUZZLE_HASH = bytes32(b"0" * 32) diff --git a/tests/blockchain/test_lookup_fork_chain.py b/chia/_tests/blockchain/test_lookup_fork_chain.py similarity index 99% rename from tests/blockchain/test_lookup_fork_chain.py rename to chia/_tests/blockchain/test_lookup_fork_chain.py index e5db927e8d8f..f20071c0ab1e 100644 --- a/tests/blockchain/test_lookup_fork_chain.py +++ b/chia/_tests/blockchain/test_lookup_fork_chain.py @@ -5,12 +5,12 @@ import pytest +from chia._tests.util.benchmarks import rand_hash from chia.consensus.block_record import BlockRecord from chia.consensus.blockchain_interface import BlockchainInterface from chia.consensus.find_fork_point import find_fork_point_in_chain, lookup_fork_chain from chia.types.blockchain_format.sized_bytes import bytes32 from chia.util.ints import uint32 -from tests.util.benchmarks import rand_hash class DummyChain: diff --git a/tests/build-init-files.py b/chia/_tests/build-init-files.py similarity index 96% rename from tests/build-init-files.py rename to chia/_tests/build-init-files.py index 27b93a5397a9..19bc08bc3103 100755 --- a/tests/build-init-files.py +++ b/chia/_tests/build-init-files.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 -# Create missing `__init__.py` files in the source code folders (in "chia/" and "tests/"). +# Create missing `__init__.py` files in the source code folders (in "chia/"). # # They are required by the python interpreter to properly identify modules/packages so that tools like `mypy` or an IDE # can work with their full capabilities. @@ -64,7 +64,7 @@ def command(verbose, root_str): stream_handler = logging.StreamHandler() logger.addHandler(stream_handler) - tree_roots = ["benchmarks", "build_scripts", "chia", "tests", "tools"] + tree_roots = ["benchmarks", "build_scripts", "chia", "tools"] failed = False root = pathlib.Path(root_str).resolve() directories = [ diff --git a/tests/build-job-matrix.py b/chia/_tests/build-job-matrix.py similarity index 91% rename from tests/build-job-matrix.py rename to chia/_tests/build-job-matrix.py index 13c1d368acbe..87348b7a838d 100644 --- a/tests/build-job-matrix.py +++ b/chia/_tests/build-job-matrix.py @@ -11,11 +11,11 @@ import testconfig root_path = Path(__file__).parent.absolute() -project_root_path = root_path.parent +project_root_path = root_path.parent.parent def skip(path: Path) -> bool: - return any(part.startswith(("_", ".")) for part in path.parts) + return any(part.startswith(("_", ".")) and part != "_tests" for part in path.parts) def subdirs(per: str) -> List[Path]: @@ -113,13 +113,19 @@ def update_config(parent: Dict[str, Any], child: Dict[str, Any]) -> Dict[str, An for path, index in test_paths_with_index: if path.is_dir(): test_files = sorted(path.glob("test_*.py")) - test_file_paths = [file.relative_to(project_root_path) for file in test_files] - paths_for_cli = " ".join(path.as_posix() for path in test_file_paths) + paths_for_cli_list = [file.relative_to(project_root_path) for file in test_files] config_path = path else: - paths_for_cli = path.relative_to(project_root_path).as_posix() + paths_for_cli_list = [path.relative_to(project_root_path)] config_path = path.parent + def mung_path(path: Path) -> str: + # TODO: shell escaping, but that's per platform... + return ".".join(path.with_suffix("").parts) + + paths_for_cli = " ".join(mung_path(path) for path in paths_for_cli_list) + paths_for_cli = f"--pyargs {paths_for_cli}" + try: conf = update_config(module_dict(testconfig), dir_config(config_path)) except SpecifiedDefaultsError as e: diff --git a/tests/check_pytest_monitor_output.py b/chia/_tests/check_pytest_monitor_output.py similarity index 100% rename from tests/check_pytest_monitor_output.py rename to chia/_tests/check_pytest_monitor_output.py diff --git a/tests/check_sql_statements.py b/chia/_tests/check_sql_statements.py similarity index 100% rename from tests/check_sql_statements.py rename to chia/_tests/check_sql_statements.py diff --git a/tests/chia-start-sim b/chia/_tests/chia-start-sim similarity index 100% rename from tests/chia-start-sim rename to chia/_tests/chia-start-sim diff --git a/tests/clvm/__init__.py b/chia/_tests/clvm/__init__.py similarity index 100% rename from tests/clvm/__init__.py rename to chia/_tests/clvm/__init__.py diff --git a/tests/clvm/benchmark_costs.py b/chia/_tests/clvm/benchmark_costs.py similarity index 100% rename from tests/clvm/benchmark_costs.py rename to chia/_tests/clvm/benchmark_costs.py diff --git a/tests/clvm/coin_store.py b/chia/_tests/clvm/coin_store.py similarity index 100% rename from tests/clvm/coin_store.py rename to chia/_tests/clvm/coin_store.py diff --git a/tests/clvm/test_chialisp_deserialization.py b/chia/_tests/clvm/test_chialisp_deserialization.py similarity index 100% rename from tests/clvm/test_chialisp_deserialization.py rename to chia/_tests/clvm/test_chialisp_deserialization.py diff --git a/tests/clvm/test_clvm_step.py b/chia/_tests/clvm/test_clvm_step.py similarity index 100% rename from tests/clvm/test_clvm_step.py rename to chia/_tests/clvm/test_clvm_step.py diff --git a/tests/clvm/test_condition_codes.py b/chia/_tests/clvm/test_condition_codes.py similarity index 100% rename from tests/clvm/test_condition_codes.py rename to chia/_tests/clvm/test_condition_codes.py diff --git a/tests/clvm/test_curry_and_treehash.py b/chia/_tests/clvm/test_curry_and_treehash.py similarity index 100% rename from tests/clvm/test_curry_and_treehash.py rename to chia/_tests/clvm/test_curry_and_treehash.py diff --git a/tests/clvm/test_program.py b/chia/_tests/clvm/test_program.py similarity index 100% rename from tests/clvm/test_program.py rename to chia/_tests/clvm/test_program.py diff --git a/tests/clvm/test_puzzle_compression.py b/chia/_tests/clvm/test_puzzle_compression.py similarity index 100% rename from tests/clvm/test_puzzle_compression.py rename to chia/_tests/clvm/test_puzzle_compression.py diff --git a/tests/clvm/test_puzzle_drivers.py b/chia/_tests/clvm/test_puzzle_drivers.py similarity index 100% rename from tests/clvm/test_puzzle_drivers.py rename to chia/_tests/clvm/test_puzzle_drivers.py diff --git a/tests/clvm/test_puzzles.py b/chia/_tests/clvm/test_puzzles.py similarity index 99% rename from tests/clvm/test_puzzles.py rename to chia/_tests/clvm/test_puzzles.py index 42404576777c..58a2ee93a64a 100644 --- a/tests/clvm/test_puzzles.py +++ b/chia/_tests/clvm/test_puzzles.py @@ -4,6 +4,7 @@ from chia_rs import AugSchemeMPL, G1Element, G2Element +from chia._tests.util.key_tool import KeyTool from chia.consensus.default_constants import DEFAULT_CONSTANTS from chia.types.blockchain_format.program import Program from chia.types.blockchain_format.sized_bytes import bytes32 @@ -20,7 +21,6 @@ p2_puzzle_hash, ) from chia.wallet.puzzles.puzzle_utils import make_create_coin_condition -from tests.util.key_tool import KeyTool from ..core.make_block_generator import int_to_public_key from .coin_store import CoinStore, CoinTimestamp diff --git a/tests/clvm/test_singletons.py b/chia/_tests/clvm/test_singletons.py similarity index 99% rename from tests/clvm/test_singletons.py rename to chia/_tests/clvm/test_singletons.py index 8222bf1ad0d8..08e823b3b570 100644 --- a/tests/clvm/test_singletons.py +++ b/chia/_tests/clvm/test_singletons.py @@ -5,6 +5,8 @@ import pytest from chia_rs import AugSchemeMPL, G1Element, G2Element, PrivateKey +from chia._tests.clvm.test_puzzles import public_key_for_index, secret_exponent_for_index +from chia._tests.util.key_tool import KeyTool from chia.clvm.spend_sim import CostLogger, SimClient, SpendSim, sim_and_client from chia.consensus.default_constants import DEFAULT_CONSTANTS from chia.types.blockchain_format.coin import Coin @@ -17,8 +19,6 @@ from chia.util.ints import uint64 from chia.wallet.lineage_proof import LineageProof from chia.wallet.puzzles import p2_conditions, p2_delegated_puzzle_or_hidden_puzzle -from tests.clvm.test_puzzles import public_key_for_index, secret_exponent_for_index -from tests.util.key_tool import KeyTool """ This test suite aims to test: diff --git a/tests/clvm/test_spend_sim.py b/chia/_tests/clvm/test_spend_sim.py similarity index 100% rename from tests/clvm/test_spend_sim.py rename to chia/_tests/clvm/test_spend_sim.py diff --git a/tests/cmds/__init__.py b/chia/_tests/cmds/__init__.py similarity index 100% rename from tests/cmds/__init__.py rename to chia/_tests/cmds/__init__.py diff --git a/tests/cmds/cmd_test_utils.py b/chia/_tests/cmds/cmd_test_utils.py similarity index 99% rename from tests/cmds/cmd_test_utils.py rename to chia/_tests/cmds/cmd_test_utils.py index f935f6534042..32e3211cce93 100644 --- a/tests/cmds/cmd_test_utils.py +++ b/chia/_tests/cmds/cmd_test_utils.py @@ -9,6 +9,7 @@ from chia_rs import Coin, G2Element import chia.cmds.wallet_funcs +from chia._tests.cmds.testing_classes import create_test_block_record from chia.cmds.chia import cli as chia_cli from chia.cmds.cmds_util import _T_RpcClient, node_config_section_names from chia.consensus.block_record import BlockRecord @@ -33,7 +34,6 @@ from chia.wallet.util.transaction_type import TransactionType from chia.wallet.util.tx_config import CoinSelectionConfig, TXConfig from chia.wallet.util.wallet_types import WalletType -from tests.cmds.testing_classes import create_test_block_record # Any functions that are the same for every command being tested should be below. # Functions that are specific to a command should be in the test file for that command. diff --git a/tests/cmds/config.py b/chia/_tests/cmds/config.py similarity index 100% rename from tests/cmds/config.py rename to chia/_tests/cmds/config.py diff --git a/tests/cmds/conftest.py b/chia/_tests/cmds/conftest.py similarity index 89% rename from tests/cmds/conftest.py rename to chia/_tests/cmds/conftest.py index 8378cd732611..881abcd85be8 100644 --- a/tests/cmds/conftest.py +++ b/chia/_tests/cmds/conftest.py @@ -6,8 +6,8 @@ import pytest +from chia._tests.cmds.cmd_test_utils import TestRpcClients, create_service_and_wallet_client_generators from chia.util.config import create_default_chia_config -from tests.cmds.cmd_test_utils import TestRpcClients, create_service_and_wallet_client_generators @pytest.fixture(scope="module") # every file has its own config generated, just to be safe diff --git a/tests/cmds/test_cmds_util.py b/chia/_tests/cmds/test_cmds_util.py similarity index 98% rename from tests/cmds/test_cmds_util.py rename to chia/_tests/cmds/test_cmds_util.py index 0b11e2b0f8af..114316e99ec9 100644 --- a/tests/cmds/test_cmds_util.py +++ b/chia/_tests/cmds/test_cmds_util.py @@ -5,9 +5,9 @@ import pytest +from chia._tests.util.misc import RecordingWebServer from chia.cmds.cmds_util import get_any_service_client from chia.rpc.rpc_client import ResponseFailureError, RpcClient -from tests.util.misc import RecordingWebServer @pytest.mark.anyio diff --git a/tests/cmds/test_farm_cmd.py b/chia/_tests/cmds/test_farm_cmd.py similarity index 97% rename from tests/cmds/test_farm_cmd.py rename to chia/_tests/cmds/test_farm_cmd.py index e0283525cbef..f81414d4f534 100644 --- a/tests/cmds/test_farm_cmd.py +++ b/chia/_tests/cmds/test_farm_cmd.py @@ -6,12 +6,12 @@ import pytest from _pytest.capture import CaptureFixture +from chia._tests.util.time_out_assert import time_out_assert from chia.cmds.farm_funcs import summary from chia.farmer.farmer import Farmer from chia.harvester.harvester import Harvester from chia.simulator.block_tools import BlockTools from chia.types.aliases import FarmerService, HarvesterService, SimulatorFullNodeService, WalletService -from tests.util.time_out_assert import time_out_assert @pytest.mark.anyio diff --git a/tests/cmds/test_show.py b/chia/_tests/cmds/test_show.py similarity index 93% rename from tests/cmds/test_show.py rename to chia/_tests/cmds/test_show.py index 54d1bdfc8f10..f5083bfb1731 100644 --- a/tests/cmds/test_show.py +++ b/chia/_tests/cmds/test_show.py @@ -4,14 +4,14 @@ from pathlib import Path from typing import Any, Dict, List, Optional, Tuple +from chia._tests.cmds.cmd_test_utils import TestFullNodeRpcClient, TestRpcClients, run_cli_command_and_assert +from chia._tests.cmds.testing_classes import hash_to_height, height_hash +from chia._tests.util.test_full_block_utils import get_foliage, get_reward_chain_block, get_transactions_info, vdf_proof from chia.types.blockchain_format.foliage import FoliageTransactionBlock from chia.types.blockchain_format.serialized_program import SerializedProgram from chia.types.blockchain_format.sized_bytes import bytes32 from chia.types.full_block import FullBlock from chia.util.ints import uint32, uint64 -from tests.cmds.cmd_test_utils import TestFullNodeRpcClient, TestRpcClients, run_cli_command_and_assert -from tests.cmds.testing_classes import hash_to_height, height_hash -from tests.util.test_full_block_utils import get_foliage, get_reward_chain_block, get_transactions_info, vdf_proof @dataclass diff --git a/tests/cmds/test_sim.py b/chia/_tests/cmds/test_sim.py similarity index 100% rename from tests/cmds/test_sim.py rename to chia/_tests/cmds/test_sim.py diff --git a/tests/cmds/test_timelock_args.py b/chia/_tests/cmds/test_timelock_args.py similarity index 100% rename from tests/cmds/test_timelock_args.py rename to chia/_tests/cmds/test_timelock_args.py diff --git a/tests/cmds/test_tx_config_args.py b/chia/_tests/cmds/test_tx_config_args.py similarity index 100% rename from tests/cmds/test_tx_config_args.py rename to chia/_tests/cmds/test_tx_config_args.py diff --git a/tests/cmds/testing_classes.py b/chia/_tests/cmds/testing_classes.py similarity index 100% rename from tests/cmds/testing_classes.py rename to chia/_tests/cmds/testing_classes.py diff --git a/tests/cmds/wallet/__init__.py b/chia/_tests/cmds/wallet/__init__.py similarity index 100% rename from tests/cmds/wallet/__init__.py rename to chia/_tests/cmds/wallet/__init__.py diff --git a/tests/cmds/wallet/test_coins.py b/chia/_tests/cmds/wallet/test_coins.py similarity index 97% rename from tests/cmds/wallet/test_coins.py rename to chia/_tests/cmds/wallet/test_coins.py index a765b492642c..ad2c1ae35ea7 100644 --- a/tests/cmds/wallet/test_coins.py +++ b/chia/_tests/cmds/wallet/test_coins.py @@ -5,12 +5,12 @@ from chia_rs import Coin +from chia._tests.cmds.cmd_test_utils import TestRpcClients, TestWalletRpcClient, logType, run_cli_command_and_assert +from chia._tests.cmds.wallet.test_consts import FINGERPRINT, FINGERPRINT_ARG, get_bytes32 from chia.types.blockchain_format.sized_bytes import bytes32 from chia.types.coin_record import CoinRecord from chia.util.ints import uint32, uint64 from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG, CoinSelectionConfig, TXConfig -from tests.cmds.cmd_test_utils import TestRpcClients, TestWalletRpcClient, logType, run_cli_command_and_assert -from tests.cmds.wallet.test_consts import FINGERPRINT, FINGERPRINT_ARG, get_bytes32 # Coin Commands diff --git a/tests/cmds/wallet/test_consts.py b/chia/_tests/cmds/wallet/test_consts.py similarity index 100% rename from tests/cmds/wallet/test_consts.py rename to chia/_tests/cmds/wallet/test_consts.py diff --git a/tests/cmds/wallet/test_dao.py b/chia/_tests/cmds/wallet/test_dao.py similarity index 99% rename from tests/cmds/wallet/test_dao.py rename to chia/_tests/cmds/wallet/test_dao.py index df2a27840efd..925d36592847 100644 --- a/tests/cmds/wallet/test_dao.py +++ b/chia/_tests/cmds/wallet/test_dao.py @@ -8,6 +8,8 @@ import pytest from typing_extensions import override +from chia._tests.cmds.cmd_test_utils import TestRpcClients, TestWalletRpcClient, run_cli_command_and_assert +from chia._tests.cmds.wallet.test_consts import FINGERPRINT_ARG from chia.types.blockchain_format.sized_bytes import bytes32 from chia.util.bech32m import encode_puzzle_hash from chia.util.ints import uint8, uint32, uint64 @@ -16,8 +18,6 @@ from chia.wallet.util.transaction_type import TransactionType from chia.wallet.util.tx_config import TXConfig from chia.wallet.util.wallet_types import WalletType -from tests.cmds.cmd_test_utils import TestRpcClients, TestWalletRpcClient, run_cli_command_and_assert -from tests.cmds.wallet.test_consts import FINGERPRINT_ARG # DAO Commands diff --git a/tests/cmds/wallet/test_did.py b/chia/_tests/cmds/wallet/test_did.py similarity index 98% rename from tests/cmds/wallet/test_did.py rename to chia/_tests/cmds/wallet/test_did.py index a4092bcb3b4b..28c89e426a76 100644 --- a/tests/cmds/wallet/test_did.py +++ b/chia/_tests/cmds/wallet/test_did.py @@ -3,13 +3,13 @@ from pathlib import Path from typing import Dict, List, Optional, Tuple, Union +from chia._tests.cmds.cmd_test_utils import TestRpcClients, TestWalletRpcClient, logType, run_cli_command_and_assert +from chia._tests.cmds.wallet.test_consts import FINGERPRINT_ARG, get_bytes32 from chia.types.blockchain_format.sized_bytes import bytes48 from chia.types.signing_mode import SigningMode from chia.util.bech32m import encode_puzzle_hash from chia.wallet.conditions import Condition, CreateCoinAnnouncement, CreatePuzzleAnnouncement from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG, TXConfig -from tests.cmds.cmd_test_utils import TestRpcClients, TestWalletRpcClient, logType, run_cli_command_and_assert -from tests.cmds.wallet.test_consts import FINGERPRINT_ARG, get_bytes32 # DID Commands diff --git a/tests/cmds/wallet/test_nft.py b/chia/_tests/cmds/wallet/test_nft.py similarity index 98% rename from tests/cmds/wallet/test_nft.py rename to chia/_tests/cmds/wallet/test_nft.py index 9544d124fa8b..1482dee3cbf3 100644 --- a/tests/cmds/wallet/test_nft.py +++ b/chia/_tests/cmds/wallet/test_nft.py @@ -3,14 +3,14 @@ from pathlib import Path from typing import Any, List, Optional, Tuple +from chia._tests.cmds.cmd_test_utils import TestRpcClients, TestWalletRpcClient, logType, run_cli_command_and_assert +from chia._tests.cmds.wallet.test_consts import FINGERPRINT, FINGERPRINT_ARG, get_bytes32 from chia.types.blockchain_format.sized_bytes import bytes32 from chia.types.signing_mode import SigningMode from chia.util.bech32m import encode_puzzle_hash from chia.util.ints import uint8, uint16, uint32, uint64 from chia.wallet.nft_wallet.nft_info import NFTInfo from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG, TXConfig -from tests.cmds.cmd_test_utils import TestRpcClients, TestWalletRpcClient, logType, run_cli_command_and_assert -from tests.cmds.wallet.test_consts import FINGERPRINT, FINGERPRINT_ARG, get_bytes32 # NFT Commands diff --git a/tests/cmds/wallet/test_notifications.py b/chia/_tests/cmds/wallet/test_notifications.py similarity index 95% rename from tests/cmds/wallet/test_notifications.py rename to chia/_tests/cmds/wallet/test_notifications.py index dd85047ee7f8..4e161357559a 100644 --- a/tests/cmds/wallet/test_notifications.py +++ b/chia/_tests/cmds/wallet/test_notifications.py @@ -3,14 +3,14 @@ from pathlib import Path from typing import List, Optional, Tuple, cast +from chia._tests.cmds.cmd_test_utils import TestRpcClients, TestWalletRpcClient, logType, run_cli_command_and_assert +from chia._tests.cmds.wallet.test_consts import FINGERPRINT, FINGERPRINT_ARG, get_bytes32 from chia.rpc.wallet_request_types import GetNotifications, GetNotificationsResponse from chia.types.blockchain_format.sized_bytes import bytes32 from chia.util.bech32m import encode_puzzle_hash from chia.util.ints import uint32, uint64 from chia.wallet.notification_store import Notification from chia.wallet.transaction_record import TransactionRecord -from tests.cmds.cmd_test_utils import TestRpcClients, TestWalletRpcClient, logType, run_cli_command_and_assert -from tests.cmds.wallet.test_consts import FINGERPRINT, FINGERPRINT_ARG, get_bytes32 # Notifications Commands diff --git a/tests/cmds/wallet/test_offer.toffer b/chia/_tests/cmds/wallet/test_offer.toffer similarity index 100% rename from tests/cmds/wallet/test_offer.toffer rename to chia/_tests/cmds/wallet/test_offer.toffer diff --git a/tests/cmds/wallet/test_vcs.py b/chia/_tests/cmds/wallet/test_vcs.py similarity index 98% rename from tests/cmds/wallet/test_vcs.py rename to chia/_tests/cmds/wallet/test_vcs.py index ef21c7bd81d8..85374addd26c 100644 --- a/tests/cmds/wallet/test_vcs.py +++ b/chia/_tests/cmds/wallet/test_vcs.py @@ -5,14 +5,14 @@ from chia_rs import Coin +from chia._tests.cmds.cmd_test_utils import TestRpcClients, TestWalletRpcClient, logType, run_cli_command_and_assert +from chia._tests.cmds.wallet.test_consts import FINGERPRINT_ARG, STD_TX, get_bytes32 from chia.types.blockchain_format.sized_bytes import bytes32 from chia.util.bech32m import encode_puzzle_hash from chia.util.ints import uint32, uint64 from chia.wallet.transaction_record import TransactionRecord from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG, TXConfig from chia.wallet.vc_wallet.vc_store import VCRecord -from tests.cmds.cmd_test_utils import TestRpcClients, TestWalletRpcClient, logType, run_cli_command_and_assert -from tests.cmds.wallet.test_consts import FINGERPRINT_ARG, STD_TX, get_bytes32 # VC Commands diff --git a/tests/cmds/wallet/test_wallet.py b/chia/_tests/cmds/wallet/test_wallet.py similarity index 99% rename from tests/cmds/wallet/test_wallet.py rename to chia/_tests/cmds/wallet/test_wallet.py index 08f9412263f2..043a32f65d12 100644 --- a/tests/cmds/wallet/test_wallet.py +++ b/chia/_tests/cmds/wallet/test_wallet.py @@ -7,6 +7,17 @@ import pytest from chia_rs import Coin, G2Element +from chia._tests.cmds.cmd_test_utils import TestRpcClients, TestWalletRpcClient, logType, run_cli_command_and_assert +from chia._tests.cmds.wallet.test_consts import ( + CAT_FINGERPRINT_ARG, + FINGERPRINT, + FINGERPRINT_ARG, + STD_TX, + WALLET_ID, + WALLET_ID_ARG, + bytes32_hexstr, + get_bytes32, +) from chia.server.outbound_message import NodeType from chia.types.blockchain_format.program import Program from chia.types.blockchain_format.sized_bytes import bytes32 @@ -25,17 +36,6 @@ from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG, TXConfig from chia.wallet.util.wallet_types import WalletType from chia.wallet.wallet_coin_store import GetCoinRecords -from tests.cmds.cmd_test_utils import TestRpcClients, TestWalletRpcClient, logType, run_cli_command_and_assert -from tests.cmds.wallet.test_consts import ( - CAT_FINGERPRINT_ARG, - FINGERPRINT, - FINGERPRINT_ARG, - STD_TX, - WALLET_ID, - WALLET_ID_ARG, - bytes32_hexstr, - get_bytes32, -) test_offer_file_path: Path = Path(pkg_resources.resource_filename(__name__, "test_offer.toffer")) test_offer_file_name: str = str(test_offer_file_path) diff --git a/tests/cmds/wallet/test_wallet_check.py b/chia/_tests/cmds/wallet/test_wallet_check.py similarity index 100% rename from tests/cmds/wallet/test_wallet_check.py rename to chia/_tests/cmds/wallet/test_wallet_check.py diff --git a/tests/conftest.py b/chia/_tests/conftest.py similarity index 97% rename from tests/conftest.py rename to chia/_tests/conftest.py index ae24e8bf1a09..abd259964ea6 100644 --- a/tests/conftest.py +++ b/chia/_tests/conftest.py @@ -24,7 +24,22 @@ from _pytest.fixtures import SubRequest from pytest import MonkeyPatch -import tests +import chia._tests +from chia._tests import ether +from chia._tests.core.data_layer.util import ChiaRoot +from chia._tests.core.node_height import node_height_at_least +from chia._tests.simulation.test_simulation import test_constants_modified +from chia._tests.util.misc import BenchmarkRunner, GcMode, RecordingWebServer, TestId, _AssertRuntime, measure_overhead +from chia._tests.util.setup_nodes import ( + OldSimulatorsAndWallets, + SimulatorsAndWallets, + setup_full_system, + setup_n_nodes, + setup_simulators_and_wallets, + setup_simulators_and_wallets_service, + setup_two_nodes, +) +from chia._tests.util.time_out_assert import time_out_assert from chia.clvm.spend_sim import CostLogger from chia.consensus.constants import ConsensusConstants from chia.full_node.full_node import FullNode @@ -70,30 +85,15 @@ from chia.util.task_timing import start_task_instrumentation, stop_task_instrumentation from chia.wallet.wallet_node import WalletNode from chia.wallet.wallet_node_api import WalletNodeAPI -from tests import ether -from tests.core.data_layer.util import ChiaRoot -from tests.core.node_height import node_height_at_least -from tests.simulation.test_simulation import test_constants_modified -from tests.util.misc import BenchmarkRunner, GcMode, RecordingWebServer, TestId, _AssertRuntime, measure_overhead -from tests.util.setup_nodes import ( - OldSimulatorsAndWallets, - SimulatorsAndWallets, - setup_full_system, - setup_n_nodes, - setup_simulators_and_wallets, - setup_simulators_and_wallets_service, - setup_two_nodes, -) -from tests.util.time_out_assert import time_out_assert multiprocessing.set_start_method("spawn") from pathlib import Path +from chia._tests.util.setup_nodes import setup_farmer_multi_harvester from chia.simulator.block_tools import BlockTools, create_block_tools_async, test_constants from chia.simulator.keyring import TempKeyring from chia.util.keyring_wrapper import KeyringWrapper -from tests.util.setup_nodes import setup_farmer_multi_harvester @pytest.fixture(name="ether_setup", autouse=True) @@ -244,7 +244,7 @@ async def empty_blockchain(latest_db_version, blockchain_constants): """ Provides a list of 10 valid blocks, as well as a blockchain with 9 blocks added to it. """ - from tests.util.blockchain import create_blockchain + from chia._tests.util.blockchain import create_blockchain async with create_blockchain(blockchain_constants, latest_db_version) as (bc1, db_wrapper): yield bc1 @@ -277,7 +277,7 @@ def default_400_blocks(bt, consensus_mode): if consensus_mode == ConsensusMode.HARD_FORK_2_0: version = "_hardfork" - from tests.util.blockchain import persistent_blocks + from chia._tests.util.blockchain import persistent_blocks return persistent_blocks(400, f"test_blocks_400_{saved_blocks_version}{version}.db", bt, seed=b"400") @@ -288,7 +288,7 @@ def default_1000_blocks(bt, consensus_mode): if consensus_mode == ConsensusMode.HARD_FORK_2_0: version = "_hardfork" - from tests.util.blockchain import persistent_blocks + from chia._tests.util.blockchain import persistent_blocks return persistent_blocks(1000, f"test_blocks_1000_{saved_blocks_version}{version}.db", bt, seed=b"1000") @@ -299,7 +299,7 @@ def pre_genesis_empty_slots_1000_blocks(bt, consensus_mode): if consensus_mode == ConsensusMode.HARD_FORK_2_0: version = "_hardfork" - from tests.util.blockchain import persistent_blocks + from chia._tests.util.blockchain import persistent_blocks return persistent_blocks( 1000, @@ -316,14 +316,14 @@ def default_1500_blocks(bt, consensus_mode): if consensus_mode == ConsensusMode.HARD_FORK_2_0: version = "_hardfork" - from tests.util.blockchain import persistent_blocks + from chia._tests.util.blockchain import persistent_blocks return persistent_blocks(1500, f"test_blocks_1500_{saved_blocks_version}{version}.db", bt, seed=b"1500") @pytest.fixture(scope="session") def default_10000_blocks(bt, consensus_mode): - from tests.util.blockchain import persistent_blocks + from chia._tests.util.blockchain import persistent_blocks version = "" if consensus_mode == ConsensusMode.HARD_FORK_2_0: @@ -346,7 +346,7 @@ def test_long_reorg_blocks(bt, consensus_mode, default_10000_blocks): if consensus_mode == ConsensusMode.HARD_FORK_2_0: version = "_hardfork" - from tests.util.blockchain import persistent_blocks + from chia._tests.util.blockchain import persistent_blocks return persistent_blocks( 4500, @@ -368,7 +368,7 @@ def test_long_reorg_blocks_light(bt, consensus_mode, default_10000_blocks): if consensus_mode == ConsensusMode.HARD_FORK_2_0: version = "_hardfork" - from tests.util.blockchain import persistent_blocks + from chia._tests.util.blockchain import persistent_blocks return persistent_blocks( 4500, @@ -387,7 +387,7 @@ def default_2000_blocks_compact(bt, consensus_mode): if consensus_mode == ConsensusMode.HARD_FORK_2_0: version = "_hardfork" - from tests.util.blockchain import persistent_blocks + from chia._tests.util.blockchain import persistent_blocks return persistent_blocks( 2000, @@ -403,7 +403,7 @@ def default_2000_blocks_compact(bt, consensus_mode): @pytest.fixture(scope="session") def default_10000_blocks_compact(bt, consensus_mode): - from tests.util.blockchain import persistent_blocks + from chia._tests.util.blockchain import persistent_blocks version = "" if consensus_mode == ConsensusMode.HARD_FORK_2_0: diff --git a/tests/connection_utils.py b/chia/_tests/connection_utils.py similarity index 98% rename from tests/connection_utils.py rename to chia/_tests/connection_utils.py index 7eafc8969c39..cf204aa2c58d 100644 --- a/tests/connection_utils.py +++ b/chia/_tests/connection_utils.py @@ -10,6 +10,7 @@ from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import hashes, serialization +from chia._tests.util.time_out_assert import time_out_assert from chia.protocols.shared_protocol import capabilities, protocol_version from chia.server.outbound_message import NodeType from chia.server.server import ChiaServer, ssl_context_for_client @@ -21,7 +22,6 @@ from chia.util.config import load_config from chia.util.ints import uint16 from chia.util.timing import adjusted_timeout -from tests.util.time_out_assert import time_out_assert log = logging.getLogger(__name__) diff --git a/tests/core/__init__.py b/chia/_tests/core/__init__.py similarity index 100% rename from tests/core/__init__.py rename to chia/_tests/core/__init__.py diff --git a/tests/core/cmds/__init__.py b/chia/_tests/core/cmds/__init__.py similarity index 100% rename from tests/core/cmds/__init__.py rename to chia/_tests/core/cmds/__init__.py diff --git a/tests/core/cmds/test_beta.py b/chia/_tests/core/cmds/test_beta.py similarity index 100% rename from tests/core/cmds/test_beta.py rename to chia/_tests/core/cmds/test_beta.py diff --git a/tests/core/cmds/test_keys.py b/chia/_tests/core/cmds/test_keys.py similarity index 100% rename from tests/core/cmds/test_keys.py rename to chia/_tests/core/cmds/test_keys.py diff --git a/tests/core/cmds/test_wallet.py b/chia/_tests/core/cmds/test_wallet.py similarity index 100% rename from tests/core/cmds/test_wallet.py rename to chia/_tests/core/cmds/test_wallet.py diff --git a/tests/core/config.py b/chia/_tests/core/config.py similarity index 100% rename from tests/core/config.py rename to chia/_tests/core/config.py diff --git a/tests/core/consensus/__init__.py b/chia/_tests/core/consensus/__init__.py similarity index 100% rename from tests/core/consensus/__init__.py rename to chia/_tests/core/consensus/__init__.py diff --git a/tests/core/consensus/test_block_creation.py b/chia/_tests/core/consensus/test_block_creation.py similarity index 96% rename from tests/core/consensus/test_block_creation.py rename to chia/_tests/core/consensus/test_block_creation.py index 7f3b69b24024..f59ab3dbdd36 100644 --- a/tests/core/consensus/test_block_creation.py +++ b/chia/_tests/core/consensus/test_block_creation.py @@ -4,13 +4,13 @@ import pytest +from chia._tests.core.make_block_generator import make_block_generator from chia.consensus.block_creation import compute_block_cost, compute_block_fee from chia.consensus.condition_costs import ConditionCost from chia.consensus.default_constants import DEFAULT_CONSTANTS from chia.types.blockchain_format.coin import Coin from chia.types.blockchain_format.sized_bytes import bytes32 from chia.util.ints import uint32, uint64 -from tests.core.make_block_generator import make_block_generator @pytest.mark.parametrize("add_amount", [[0], [1, 2, 3], []]) diff --git a/tests/core/consensus/test_pot_iterations.py b/chia/_tests/core/consensus/test_pot_iterations.py similarity index 100% rename from tests/core/consensus/test_pot_iterations.py rename to chia/_tests/core/consensus/test_pot_iterations.py diff --git a/tests/core/custom_types/__init__.py b/chia/_tests/core/custom_types/__init__.py similarity index 100% rename from tests/core/custom_types/__init__.py rename to chia/_tests/core/custom_types/__init__.py diff --git a/tests/core/custom_types/test_coin.py b/chia/_tests/core/custom_types/test_coin.py similarity index 100% rename from tests/core/custom_types/test_coin.py rename to chia/_tests/core/custom_types/test_coin.py diff --git a/tests/core/custom_types/test_proof_of_space.py b/chia/_tests/core/custom_types/test_proof_of_space.py similarity index 99% rename from tests/core/custom_types/test_proof_of_space.py rename to chia/_tests/core/custom_types/test_proof_of_space.py index df6cc1b38ea6..5df0871eae8f 100644 --- a/tests/core/custom_types/test_proof_of_space.py +++ b/chia/_tests/core/custom_types/test_proof_of_space.py @@ -7,11 +7,11 @@ import pytest from chia_rs import G1Element +from chia._tests.util.misc import Marks, datacases from chia.consensus.default_constants import DEFAULT_CONSTANTS from chia.types.blockchain_format.proof_of_space import ProofOfSpace, passes_plot_filter, verify_and_get_quality_string from chia.types.blockchain_format.sized_bytes import bytes32, bytes48 from chia.util.ints import uint8, uint32 -from tests.util.misc import Marks, datacases @dataclass diff --git a/tests/core/custom_types/test_spend_bundle.py b/chia/_tests/core/custom_types/test_spend_bundle.py similarity index 100% rename from tests/core/custom_types/test_spend_bundle.py rename to chia/_tests/core/custom_types/test_spend_bundle.py diff --git a/tests/core/daemon/__init__.py b/chia/_tests/core/daemon/__init__.py similarity index 100% rename from tests/core/daemon/__init__.py rename to chia/_tests/core/daemon/__init__.py diff --git a/tests/core/daemon/config.py b/chia/_tests/core/daemon/config.py similarity index 100% rename from tests/core/daemon/config.py rename to chia/_tests/core/daemon/config.py diff --git a/tests/core/daemon/test_daemon.py b/chia/_tests/core/daemon/test_daemon.py similarity index 99% rename from tests/core/daemon/test_daemon.py rename to chia/_tests/core/daemon/test_daemon.py index c9cf0a807755..c63aeacaec2b 100644 --- a/tests/core/daemon/test_daemon.py +++ b/chia/_tests/core/daemon/test_daemon.py @@ -11,6 +11,8 @@ from aiohttp.web_ws import WebSocketResponse from pytest_mock import MockerFixture +from chia._tests.util.misc import Marks, datacases +from chia._tests.util.time_out_assert import time_out_assert_not_none from chia.daemon.client import connect_to_daemon from chia.daemon.keychain_server import ( DeleteLabelRequest, @@ -32,8 +34,6 @@ from chia.util.keyring_wrapper import DEFAULT_PASSPHRASE_IF_NO_MASTER_PASSPHRASE, KeyringWrapper from chia.util.ws_message import create_payload, create_payload_dict from chia.wallet.derive_keys import master_sk_to_farmer_sk, master_sk_to_pool_sk -from tests.util.misc import Marks, datacases -from tests.util.time_out_assert import time_out_assert_not_none chiapos_version = pkg_resources.get_distribution("chiapos").version diff --git a/tests/core/daemon/test_daemon_register.py b/chia/_tests/core/daemon/test_daemon_register.py similarity index 100% rename from tests/core/daemon/test_daemon_register.py rename to chia/_tests/core/daemon/test_daemon_register.py diff --git a/tests/core/daemon/test_keychain_proxy.py b/chia/_tests/core/daemon/test_keychain_proxy.py similarity index 100% rename from tests/core/daemon/test_keychain_proxy.py rename to chia/_tests/core/daemon/test_keychain_proxy.py diff --git a/tests/core/data_layer/__init__.py b/chia/_tests/core/data_layer/__init__.py similarity index 100% rename from tests/core/data_layer/__init__.py rename to chia/_tests/core/data_layer/__init__.py diff --git a/tests/core/data_layer/config.py b/chia/_tests/core/data_layer/config.py similarity index 100% rename from tests/core/data_layer/config.py rename to chia/_tests/core/data_layer/config.py diff --git a/tests/core/data_layer/conftest.py b/chia/_tests/core/data_layer/conftest.py similarity index 97% rename from tests/core/data_layer/conftest.py rename to chia/_tests/core/data_layer/conftest.py index 1cddaff523f8..d8c814d1b465 100644 --- a/tests/core/data_layer/conftest.py +++ b/chia/_tests/core/data_layer/conftest.py @@ -11,17 +11,17 @@ # https://github.com/pytest-dev/pytest/issues/7469 from _pytest.fixtures import SubRequest -from chia.data_layer.data_layer_util import NodeType, Status -from chia.data_layer.data_store import DataStore -from chia.types.blockchain_format.sized_bytes import bytes32 -from tests.core.data_layer.util import ( +from chia._tests.core.data_layer.util import ( ChiaRoot, Example, add_0123_example, add_01234567_example, create_valid_node_values, ) -from tests.util.misc import closing_chia_root_popen +from chia._tests.util.misc import closing_chia_root_popen +from chia.data_layer.data_layer_util import NodeType, Status +from chia.data_layer.data_store import DataStore +from chia.types.blockchain_format.sized_bytes import bytes32 # TODO: These are more general than the data layer and should either move elsewhere or # be replaced with an existing common approach. For now they can at least be diff --git a/tests/core/data_layer/test_data_cli.py b/chia/_tests/core/data_layer/test_data_cli.py similarity index 97% rename from tests/core/data_layer/test_data_cli.py rename to chia/_tests/core/data_layer/test_data_cli.py index 51e13683d8da..3ee4d458e4cf 100644 --- a/tests/core/data_layer/test_data_cli.py +++ b/chia/_tests/core/data_layer/test_data_cli.py @@ -5,7 +5,7 @@ import pytest -from tests.core.data_layer.util import ChiaRoot +from chia._tests.core.data_layer.util import ChiaRoot pytestmark = pytest.mark.data_layer diff --git a/tests/core/data_layer/test_data_layer.py b/chia/_tests/core/data_layer/test_data_layer.py similarity index 97% rename from tests/core/data_layer/test_data_layer.py rename to chia/_tests/core/data_layer/test_data_layer.py index 9b803c86bfde..cf5919ce768e 100644 --- a/tests/core/data_layer/test_data_layer.py +++ b/chia/_tests/core/data_layer/test_data_layer.py @@ -5,11 +5,11 @@ import pytest +from chia._tests.util.misc import RecordingWebServer from chia.data_layer.data_layer import DataLayer from chia.data_layer.data_layer_util import PluginRemote from chia.rpc.wallet_rpc_client import WalletRpcClient from chia.types.blockchain_format.sized_bytes import bytes32 -from tests.util.misc import RecordingWebServer async def create_sufficient_wallet_rpc_client() -> WalletRpcClient: diff --git a/tests/core/data_layer/test_data_layer_util.py b/chia/_tests/core/data_layer/test_data_layer_util.py similarity index 98% rename from tests/core/data_layer/test_data_layer_util.py rename to chia/_tests/core/data_layer/test_data_layer_util.py index e48e54d5ab72..32fd1a870da1 100644 --- a/tests/core/data_layer/test_data_layer_util.py +++ b/chia/_tests/core/data_layer/test_data_layer_util.py @@ -8,6 +8,7 @@ # TODO: update after resolution in https://github.com/pytest-dev/pytest/issues/7469 from _pytest.fixtures import SubRequest +from chia._tests.util.misc import Marks, datacases from chia.data_layer.data_layer_util import ( ClearPendingRootsRequest, ClearPendingRootsResponse, @@ -19,7 +20,6 @@ ) from chia.rpc.data_layer_rpc_util import MarshallableProtocol from chia.types.blockchain_format.sized_bytes import bytes32 -from tests.util.misc import Marks, datacases pytestmark = pytest.mark.data_layer diff --git a/tests/core/data_layer/test_data_rpc.py b/chia/_tests/core/data_layer/test_data_rpc.py similarity index 99% rename from tests/core/data_layer/test_data_rpc.py rename to chia/_tests/core/data_layer/test_data_rpc.py index 023427fdc9ab..7bb2674cde5a 100644 --- a/tests/core/data_layer/test_data_rpc.py +++ b/chia/_tests/core/data_layer/test_data_rpc.py @@ -17,6 +17,8 @@ import anyio import pytest +from chia._tests.util.setup_nodes import SimulatorsAndWalletsServices +from chia._tests.util.time_out_assert import time_out_assert from chia.cmds.data_funcs import ( clear_pending_roots, get_keys_cmd, @@ -62,8 +64,6 @@ from chia.wallet.transaction_record import TransactionRecord from chia.wallet.wallet import Wallet from chia.wallet.wallet_node import WalletNode -from tests.util.setup_nodes import SimulatorsAndWalletsServices -from tests.util.time_out_assert import time_out_assert pytestmark = pytest.mark.data_layer nodes = Tuple[WalletNode, FullNodeSimulator] diff --git a/tests/core/data_layer/test_data_store.py b/chia/_tests/core/data_layer/test_data_store.py similarity index 99% rename from tests/core/data_layer/test_data_store.py rename to chia/_tests/core/data_layer/test_data_store.py index d7a3934662b2..9664d7d01cff 100644 --- a/tests/core/data_layer/test_data_store.py +++ b/chia/_tests/core/data_layer/test_data_store.py @@ -14,6 +14,8 @@ import aiosqlite import pytest +from chia._tests.core.data_layer.util import Example, add_0123_example, add_01234567_example +from chia._tests.util.misc import BenchmarkRunner, Marks, datacases from chia.data_layer.data_layer_errors import NodeHashError, TreeGenerationIncrementingError from chia.data_layer.data_layer_util import ( DiffData, @@ -44,8 +46,6 @@ from chia.types.blockchain_format.sized_bytes import bytes32 from chia.util.byte_types import hexstr_to_bytes from chia.util.db_wrapper import DBWrapper2, generate_in_memory_db_uri -from tests.core.data_layer.util import Example, add_0123_example, add_01234567_example -from tests.util.misc import BenchmarkRunner, Marks, datacases log = logging.getLogger(__name__) diff --git a/tests/core/data_layer/test_data_store_schema.py b/chia/_tests/core/data_layer/test_data_store_schema.py similarity index 99% rename from tests/core/data_layer/test_data_store_schema.py rename to chia/_tests/core/data_layer/test_data_store_schema.py index 8ad2561675a7..d0750b947716 100644 --- a/tests/core/data_layer/test_data_store_schema.py +++ b/chia/_tests/core/data_layer/test_data_store_schema.py @@ -5,10 +5,10 @@ import pytest +from chia._tests.core.data_layer.util import add_01234567_example, create_valid_node_values from chia.data_layer.data_layer_util import NodeType, Side, Status from chia.data_layer.data_store import DataStore from chia.types.blockchain_format.sized_bytes import bytes32 -from tests.core.data_layer.util import add_01234567_example, create_valid_node_values pytestmark = pytest.mark.data_layer diff --git a/tests/core/data_layer/util.py b/chia/_tests/core/data_layer/util.py similarity index 100% rename from tests/core/data_layer/util.py rename to chia/_tests/core/data_layer/util.py diff --git a/tests/core/farmer/__init__.py b/chia/_tests/core/farmer/__init__.py similarity index 100% rename from tests/core/farmer/__init__.py rename to chia/_tests/core/farmer/__init__.py diff --git a/tests/core/farmer/config.py b/chia/_tests/core/farmer/config.py similarity index 100% rename from tests/core/farmer/config.py rename to chia/_tests/core/farmer/config.py diff --git a/tests/core/farmer/test_farmer_api.py b/chia/_tests/core/farmer/test_farmer_api.py similarity index 92% rename from tests/core/farmer/test_farmer_api.py rename to chia/_tests/core/farmer/test_farmer_api.py index a979cbe7657a..2dc8b2186440 100644 --- a/tests/core/farmer/test_farmer_api.py +++ b/chia/_tests/core/farmer/test_farmer_api.py @@ -5,15 +5,20 @@ import pytest +from chia._tests.conftest import FarmerOneHarvester +from chia._tests.connection_utils import add_dummy_connection, add_dummy_connection_wsc +from chia._tests.util.network_protocol_data import ( + new_signage_point, + request_signed_values, + respond_signatures, + signed_values, +) from chia.farmer.farmer_api import FarmerAPI from chia.protocols import farmer_protocol from chia.protocols.protocol_message_types import ProtocolMessageTypes from chia.server.outbound_message import Message, NodeType from chia.util.hash import std_hash from chia.util.ints import uint8, uint32, uint64 -from tests.conftest import FarmerOneHarvester -from tests.connection_utils import add_dummy_connection, add_dummy_connection_wsc -from tests.util.network_protocol_data import new_signage_point, request_signed_values, respond_signatures, signed_values T = TypeVar("T") diff --git a/tests/core/full_node/__init__.py b/chia/_tests/core/full_node/__init__.py similarity index 100% rename from tests/core/full_node/__init__.py rename to chia/_tests/core/full_node/__init__.py diff --git a/tests/core/full_node/config.py b/chia/_tests/core/full_node/config.py similarity index 100% rename from tests/core/full_node/config.py rename to chia/_tests/core/full_node/config.py diff --git a/tests/core/full_node/dos/__init__.py b/chia/_tests/core/full_node/dos/__init__.py similarity index 100% rename from tests/core/full_node/dos/__init__.py rename to chia/_tests/core/full_node/dos/__init__.py diff --git a/tests/core/full_node/dos/config.py b/chia/_tests/core/full_node/dos/config.py similarity index 100% rename from tests/core/full_node/dos/config.py rename to chia/_tests/core/full_node/dos/config.py diff --git a/tests/core/full_node/full_sync/__init__.py b/chia/_tests/core/full_node/full_sync/__init__.py similarity index 100% rename from tests/core/full_node/full_sync/__init__.py rename to chia/_tests/core/full_node/full_sync/__init__.py diff --git a/tests/core/full_node/full_sync/config.py b/chia/_tests/core/full_node/full_sync/config.py similarity index 100% rename from tests/core/full_node/full_sync/config.py rename to chia/_tests/core/full_node/full_sync/config.py diff --git a/tests/core/full_node/full_sync/test_full_sync.py b/chia/_tests/core/full_node/full_sync/test_full_sync.py similarity index 99% rename from tests/core/full_node/full_sync/test_full_sync.py rename to chia/_tests/core/full_node/full_sync/test_full_sync.py index d3862a3ac76d..8b1ee2e97636 100644 --- a/tests/core/full_node/full_sync/test_full_sync.py +++ b/chia/_tests/core/full_node/full_sync/test_full_sync.py @@ -9,6 +9,9 @@ import pytest +from chia._tests.conftest import ConsensusMode +from chia._tests.core.node_height import node_height_between, node_height_exactly +from chia._tests.util.time_out_assert import time_out_assert from chia.full_node.full_node import FullNode from chia.full_node.full_node_api import FullNodeAPI from chia.protocols import full_node_protocol @@ -19,9 +22,6 @@ from chia.types.peer_info import PeerInfo from chia.util.hash import std_hash from chia.util.ints import uint16 -from tests.conftest import ConsensusMode -from tests.core.node_height import node_height_between, node_height_exactly -from tests.util.time_out_assert import time_out_assert log = logging.getLogger(__name__) diff --git a/tests/core/full_node/ram_db.py b/chia/_tests/core/full_node/ram_db.py similarity index 100% rename from tests/core/full_node/ram_db.py rename to chia/_tests/core/full_node/ram_db.py diff --git a/tests/core/full_node/stores/__init__.py b/chia/_tests/core/full_node/stores/__init__.py similarity index 100% rename from tests/core/full_node/stores/__init__.py rename to chia/_tests/core/full_node/stores/__init__.py diff --git a/tests/core/full_node/stores/config.py b/chia/_tests/core/full_node/stores/config.py similarity index 100% rename from tests/core/full_node/stores/config.py rename to chia/_tests/core/full_node/stores/config.py diff --git a/tests/core/full_node/stores/test_block_store.py b/chia/_tests/core/full_node/stores/test_block_store.py similarity index 99% rename from tests/core/full_node/stores/test_block_store.py rename to chia/_tests/core/full_node/stores/test_block_store.py index 367098566fab..8a2f96454ac4 100644 --- a/tests/core/full_node/stores/test_block_store.py +++ b/chia/_tests/core/full_node/stores/test_block_store.py @@ -13,6 +13,8 @@ from _pytest.fixtures import SubRequest from clvm.casts import int_to_bytes +from chia._tests.blockchain.blockchain_test_utils import _validate_and_add_block +from chia._tests.util.db_connection import DBConnection, PathDBConnection from chia.consensus.blockchain import Blockchain from chia.consensus.default_constants import DEFAULT_CONSTANTS from chia.consensus.full_block_to_block_record import header_block_to_sub_block_record @@ -28,8 +30,6 @@ from chia.util.db_wrapper import get_host_parameter_limit from chia.util.full_block_utils import GeneratorBlockInfo from chia.util.ints import uint8, uint32, uint64 -from tests.blockchain.blockchain_test_utils import _validate_and_add_block -from tests.util.db_connection import DBConnection, PathDBConnection log = logging.getLogger(__name__) diff --git a/tests/core/full_node/stores/test_coin_store.py b/chia/_tests/core/full_node/stores/test_coin_store.py similarity index 99% rename from tests/core/full_node/stores/test_coin_store.py rename to chia/_tests/core/full_node/stores/test_coin_store.py index 0dd3f936ed70..ea01a0fd5c65 100644 --- a/tests/core/full_node/stores/test_coin_store.py +++ b/chia/_tests/core/full_node/stores/test_coin_store.py @@ -8,6 +8,9 @@ import pytest from clvm.casts import int_to_bytes +from chia._tests.blockchain.blockchain_test_utils import _validate_and_add_block +from chia._tests.util.db_connection import DBConnection +from chia._tests.util.misc import Marks, datacases from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward from chia.consensus.blockchain import AddBlockResult, Blockchain from chia.consensus.coinbase import create_farmer_coin, create_pool_coin @@ -27,9 +30,6 @@ from chia.util.generator_tools import tx_removals_and_additions from chia.util.hash import std_hash from chia.util.ints import uint32, uint64 -from tests.blockchain.blockchain_test_utils import _validate_and_add_block -from tests.util.db_connection import DBConnection -from tests.util.misc import Marks, datacases constants = test_constants diff --git a/tests/core/full_node/stores/test_full_node_store.py b/chia/_tests/core/full_node/stores/test_full_node_store.py similarity index 99% rename from tests/core/full_node/stores/test_full_node_store.py rename to chia/_tests/core/full_node/stores/test_full_node_store.py index aa0256c8d3d3..b464aa58c3b1 100644 --- a/tests/core/full_node/stores/test_full_node_store.py +++ b/chia/_tests/core/full_node/stores/test_full_node_store.py @@ -7,6 +7,8 @@ import pytest +from chia._tests.blockchain.blockchain_test_utils import _validate_and_add_block, _validate_and_add_block_no_error +from chia._tests.util.blockchain import create_blockchain from chia.consensus.blockchain import AddBlockResult, Blockchain from chia.consensus.constants import ConsensusConstants from chia.consensus.default_constants import DEFAULT_CONSTANTS @@ -27,8 +29,6 @@ from chia.util.hash import std_hash from chia.util.ints import uint8, uint32, uint64, uint128 from chia.util.recursive_replace import recursive_replace -from tests.blockchain.blockchain_test_utils import _validate_and_add_block, _validate_and_add_block_no_error -from tests.util.blockchain import create_blockchain log = logging.getLogger(__name__) diff --git a/tests/core/full_node/stores/test_hint_store.py b/chia/_tests/core/full_node/stores/test_hint_store.py similarity index 99% rename from tests/core/full_node/stores/test_hint_store.py rename to chia/_tests/core/full_node/stores/test_hint_store.py index effb2b393341..a8e0080ed1ee 100644 --- a/tests/core/full_node/stores/test_hint_store.py +++ b/chia/_tests/core/full_node/stores/test_hint_store.py @@ -6,6 +6,7 @@ import pytest from clvm.casts import int_to_bytes +from chia._tests.util.db_connection import DBConnection from chia.full_node.hint_store import HintStore from chia.server.server import ChiaServer from chia.simulator.block_tools import BlockTools @@ -17,7 +18,6 @@ from chia.types.condition_with_args import ConditionWithArgs from chia.types.spend_bundle import SpendBundle from chia.util.ints import uint64 -from tests.util.db_connection import DBConnection log = logging.getLogger(__name__) diff --git a/tests/core/full_node/stores/test_sync_store.py b/chia/_tests/core/full_node/stores/test_sync_store.py similarity index 100% rename from tests/core/full_node/stores/test_sync_store.py rename to chia/_tests/core/full_node/stores/test_sync_store.py diff --git a/tests/core/full_node/test_address_manager.py b/chia/_tests/core/full_node/test_address_manager.py similarity index 100% rename from tests/core/full_node/test_address_manager.py rename to chia/_tests/core/full_node/test_address_manager.py diff --git a/tests/core/full_node/test_block_height_map.py b/chia/_tests/core/full_node/test_block_height_map.py similarity index 99% rename from tests/core/full_node/test_block_height_map.py rename to chia/_tests/core/full_node/test_block_height_map.py index 27510065041e..a776d11af0b7 100644 --- a/tests/core/full_node/test_block_height_map.py +++ b/chia/_tests/core/full_node/test_block_height_map.py @@ -7,13 +7,13 @@ import pytest +from chia._tests.util.db_connection import DBConnection from chia.full_node.block_height_map import BlockHeightMap, SesCache from chia.types.blockchain_format.sized_bytes import bytes32 from chia.types.blockchain_format.sub_epoch_summary import SubEpochSummary from chia.util.db_wrapper import DBWrapper2 from chia.util.files import write_file_async from chia.util.ints import uint8, uint32 -from tests.util.db_connection import DBConnection def gen_block_hash(height: int) -> bytes32: diff --git a/tests/core/full_node/test_conditions.py b/chia/_tests/core/full_node/test_conditions.py similarity index 99% rename from tests/core/full_node/test_conditions.py rename to chia/_tests/core/full_node/test_conditions.py index 0cfb097db575..6a1e30c74f1c 100644 --- a/tests/core/full_node/test_conditions.py +++ b/chia/_tests/core/full_node/test_conditions.py @@ -12,6 +12,7 @@ from chia_rs import G2Element from clvm_tools.binutils import assemble +from chia._tests.conftest import ConsensusMode from chia.simulator.block_tools import BlockTools from chia.simulator.keyring import TempKeyring from chia.types.blockchain_format.program import Program @@ -24,7 +25,6 @@ from chia.util.errors import Err from chia.util.ints import uint32, uint64 from chia.wallet.conditions import AssertCoinAnnouncement, AssertPuzzleAnnouncement -from tests.conftest import ConsensusMode from ...blockchain.blockchain_test_utils import _validate_and_add_block from .ram_db import create_ram_blockchain diff --git a/tests/core/full_node/test_full_node.py b/chia/_tests/core/full_node/test_full_node.py similarity index 99% rename from tests/core/full_node/test_full_node.py rename to chia/_tests/core/full_node/test_full_node.py index 9cc651e5bd4b..0f960d1bbfbb 100644 --- a/tests/core/full_node/test_full_node.py +++ b/chia/_tests/core/full_node/test_full_node.py @@ -13,6 +13,15 @@ from clvm.casts import int_to_bytes from packaging.version import Version +from chia._tests.blockchain.blockchain_test_utils import _validate_and_add_block, _validate_and_add_block_no_error +from chia._tests.conftest import ConsensusMode +from chia._tests.connection_utils import add_dummy_connection, connect_and_get_peer +from chia._tests.core.full_node.stores.test_coin_store import get_future_reward_coins +from chia._tests.core.make_block_generator import make_spend_bundle +from chia._tests.core.node_height import node_height_at_least +from chia._tests.util.misc import wallet_height_at_least +from chia._tests.util.setup_nodes import SimulatorsAndWalletsServices +from chia._tests.util.time_out_assert import time_out_assert, time_out_assert_custom_interval, time_out_messages from chia.consensus.block_body_validation import ForkInfo from chia.consensus.pot_iterations import is_overflow_block from chia.full_node.bundle_tools import detect_potential_template_generator @@ -59,15 +68,6 @@ from chia.util.recursive_replace import recursive_replace from chia.util.vdf_prover import get_vdf_info_and_proof from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG -from tests.blockchain.blockchain_test_utils import _validate_and_add_block, _validate_and_add_block_no_error -from tests.conftest import ConsensusMode -from tests.connection_utils import add_dummy_connection, connect_and_get_peer -from tests.core.full_node.stores.test_coin_store import get_future_reward_coins -from tests.core.make_block_generator import make_spend_bundle -from tests.core.node_height import node_height_at_least -from tests.util.misc import wallet_height_at_least -from tests.util.setup_nodes import SimulatorsAndWalletsServices -from tests.util.time_out_assert import time_out_assert, time_out_assert_custom_interval, time_out_messages async def new_transaction_not_requested(incoming, new_spend): diff --git a/tests/core/full_node/test_generator_tools.py b/chia/_tests/core/full_node/test_generator_tools.py similarity index 100% rename from tests/core/full_node/test_generator_tools.py rename to chia/_tests/core/full_node/test_generator_tools.py diff --git a/tests/core/full_node/test_hint_management.py b/chia/_tests/core/full_node/test_hint_management.py similarity index 98% rename from tests/core/full_node/test_hint_management.py rename to chia/_tests/core/full_node/test_hint_management.py index 43ea6a554aa3..343e31568111 100644 --- a/tests/core/full_node/test_hint_management.py +++ b/chia/_tests/core/full_node/test_hint_management.py @@ -4,6 +4,7 @@ import pytest +from chia._tests.blockchain.blockchain_test_utils import _validate_and_add_block from chia.consensus.block_record import BlockRecord from chia.consensus.blockchain import Blockchain, StateChangeSummary from chia.full_node.hint_management import get_hints_and_subscription_coin_ids @@ -12,7 +13,6 @@ from chia.types.blockchain_format.sized_bytes import bytes32 from chia.util.hash import std_hash from chia.util.ints import uint32, uint64 -from tests.blockchain.blockchain_test_utils import _validate_and_add_block coin_ids = [std_hash(i.to_bytes(4, "big")) for i in range(10)] parent_ids = [std_hash(i.to_bytes(4, "big")) for i in range(10)] diff --git a/tests/core/full_node/test_node_load.py b/chia/_tests/core/full_node/test_node_load.py similarity index 87% rename from tests/core/full_node/test_node_load.py rename to chia/_tests/core/full_node/test_node_load.py index c88dd461018f..8fb6ced95c31 100644 --- a/tests/core/full_node/test_node_load.py +++ b/chia/_tests/core/full_node/test_node_load.py @@ -2,10 +2,10 @@ import pytest +from chia._tests.connection_utils import connect_and_get_peer +from chia._tests.util.misc import BenchmarkRunner +from chia._tests.util.time_out_assert import time_out_assert from chia.types.peer_info import PeerInfo -from tests.connection_utils import connect_and_get_peer -from tests.util.misc import BenchmarkRunner -from tests.util.time_out_assert import time_out_assert class TestNodeLoad: diff --git a/tests/core/full_node/test_performance.py b/chia/_tests/core/full_node/test_performance.py similarity index 95% rename from tests/core/full_node/test_performance.py rename to chia/_tests/core/full_node/test_performance.py index 913cbaefd1f1..e3efee2f5bc0 100644 --- a/tests/core/full_node/test_performance.py +++ b/chia/_tests/core/full_node/test_performance.py @@ -9,6 +9,11 @@ import pytest from clvm.casts import int_to_bytes +from chia._tests.connection_utils import add_dummy_connection +from chia._tests.core.full_node.stores.test_coin_store import get_future_reward_coins +from chia._tests.core.node_height import node_height_at_least +from chia._tests.util.misc import BenchmarkRunner +from chia._tests.util.time_out_assert import time_out_assert from chia.consensus.block_record import BlockRecord from chia.consensus.pot_iterations import is_overflow_block from chia.full_node.full_node_api import FullNodeAPI @@ -17,11 +22,6 @@ from chia.types.condition_with_args import ConditionWithArgs from chia.types.unfinished_block import UnfinishedBlock from chia.util.ints import uint64 -from tests.connection_utils import add_dummy_connection -from tests.core.full_node.stores.test_coin_store import get_future_reward_coins -from tests.core.node_height import node_height_at_least -from tests.util.misc import BenchmarkRunner -from tests.util.time_out_assert import time_out_assert log = logging.getLogger(__name__) diff --git a/tests/core/full_node/test_subscriptions.py b/chia/_tests/core/full_node/test_subscriptions.py similarity index 100% rename from tests/core/full_node/test_subscriptions.py rename to chia/_tests/core/full_node/test_subscriptions.py diff --git a/tests/core/full_node/test_transactions.py b/chia/_tests/core/full_node/test_transactions.py similarity index 99% rename from tests/core/full_node/test_transactions.py rename to chia/_tests/core/full_node/test_transactions.py index ba1be456e64e..3aabba0b2e26 100644 --- a/tests/core/full_node/test_transactions.py +++ b/chia/_tests/core/full_node/test_transactions.py @@ -6,6 +6,7 @@ import pytest +from chia._tests.util.time_out_assert import time_out_assert from chia.consensus.block_record import BlockRecord from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward from chia.full_node.full_node_api import FullNodeAPI @@ -14,7 +15,6 @@ from chia.types.peer_info import PeerInfo from chia.util.ints import uint32 from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG -from tests.util.time_out_assert import time_out_assert class TestTransactions: diff --git a/tests/core/full_node/test_tx_processing_queue.py b/chia/_tests/core/full_node/test_tx_processing_queue.py similarity index 100% rename from tests/core/full_node/test_tx_processing_queue.py rename to chia/_tests/core/full_node/test_tx_processing_queue.py diff --git a/tests/core/large_block.py b/chia/_tests/core/large_block.py similarity index 100% rename from tests/core/large_block.py rename to chia/_tests/core/large_block.py diff --git a/tests/core/make_block_generator.py b/chia/_tests/core/make_block_generator.py similarity index 100% rename from tests/core/make_block_generator.py rename to chia/_tests/core/make_block_generator.py diff --git a/tests/core/mempool/__init__.py b/chia/_tests/core/mempool/__init__.py similarity index 100% rename from tests/core/mempool/__init__.py rename to chia/_tests/core/mempool/__init__.py diff --git a/tests/core/mempool/config.py b/chia/_tests/core/mempool/config.py similarity index 100% rename from tests/core/mempool/config.py rename to chia/_tests/core/mempool/config.py diff --git a/tests/core/mempool/test_mempool.py b/chia/_tests/core/mempool/test_mempool.py similarity index 99% rename from tests/core/mempool/test_mempool.py rename to chia/_tests/core/mempool/test_mempool.py index 2897d0c6ba68..154f6f62b5e1 100644 --- a/tests/core/mempool/test_mempool.py +++ b/chia/_tests/core/mempool/test_mempool.py @@ -10,6 +10,19 @@ from clvm.casts import int_to_bytes from clvm_tools import binutils +from chia._tests.blockchain.blockchain_test_utils import _validate_and_add_block +from chia._tests.connection_utils import add_dummy_connection, connect_and_get_peer +from chia._tests.core.mempool.test_mempool_manager import ( + IDENTITY_PUZZLE_HASH, + TEST_COIN, + make_test_coins, + mempool_item_from_spendbundle, + mk_item, + spend_bundle_from_conditions, +) +from chia._tests.core.node_height import node_height_at_least +from chia._tests.util.misc import BenchmarkRunner, invariant_check_mempool +from chia._tests.util.time_out_assert import time_out_assert from chia.consensus.condition_costs import ConditionCost from chia.consensus.cost_calculator import NPCResult from chia.full_node.bitcoin_fee_estimator import create_bitcoin_fee_estimator @@ -47,19 +60,6 @@ from chia.util.ints import uint32, uint64 from chia.util.recursive_replace import recursive_replace from chia.wallet.conditions import AssertCoinAnnouncement, AssertPuzzleAnnouncement -from tests.blockchain.blockchain_test_utils import _validate_and_add_block -from tests.connection_utils import add_dummy_connection, connect_and_get_peer -from tests.core.mempool.test_mempool_manager import ( - IDENTITY_PUZZLE_HASH, - TEST_COIN, - make_test_coins, - mempool_item_from_spendbundle, - mk_item, - spend_bundle_from_conditions, -) -from tests.core.node_height import node_height_at_least -from tests.util.misc import BenchmarkRunner, invariant_check_mempool -from tests.util.time_out_assert import time_out_assert BURN_PUZZLE_HASH = bytes32(b"0" * 32) BURN_PUZZLE_HASH_2 = bytes32(b"1" * 32) diff --git a/tests/core/mempool/test_mempool_fee_estimator.py b/chia/_tests/core/mempool/test_mempool_fee_estimator.py similarity index 96% rename from tests/core/mempool/test_mempool_fee_estimator.py rename to chia/_tests/core/mempool/test_mempool_fee_estimator.py index 86377d5b90e5..04fe103dd509 100644 --- a/tests/core/mempool/test_mempool_fee_estimator.py +++ b/chia/_tests/core/mempool/test_mempool_fee_estimator.py @@ -4,6 +4,8 @@ import pytest +from chia._tests.core.consensus.test_pot_iterations import test_constants +from chia._tests.util.db_connection import DBConnection from chia.full_node.bitcoin_fee_estimator import BitcoinFeeEstimator from chia.full_node.coin_store import CoinStore from chia.full_node.fee_estimate_store import FeeStore @@ -12,8 +14,6 @@ from chia.full_node.fee_tracker import FeeTracker from chia.full_node.mempool_manager import MempoolManager from chia.util.ints import uint32, uint64 -from tests.core.consensus.test_pot_iterations import test_constants -from tests.util.db_connection import DBConnection @pytest.mark.anyio diff --git a/tests/core/mempool/test_mempool_fee_protocol.py b/chia/_tests/core/mempool/test_mempool_fee_protocol.py similarity index 94% rename from tests/core/mempool/test_mempool_fee_protocol.py rename to chia/_tests/core/mempool/test_mempool_fee_protocol.py index 1c019030fc7b..5742699cb70c 100644 --- a/tests/core/mempool/test_mempool_fee_protocol.py +++ b/chia/_tests/core/mempool/test_mempool_fee_protocol.py @@ -5,6 +5,8 @@ import pytest +from chia._tests.core.node_height import node_height_at_least +from chia._tests.util.time_out_assert import time_out_assert from chia.full_node.full_node_api import FullNodeAPI from chia.protocols import wallet_protocol from chia.protocols.protocol_message_types import ProtocolMessageTypes @@ -14,8 +16,6 @@ from chia.simulator.full_node_simulator import FullNodeSimulator from chia.util.ints import uint64 from chia.wallet.wallet import Wallet -from tests.core.node_height import node_height_at_least -from tests.util.time_out_assert import time_out_assert @pytest.mark.anyio diff --git a/tests/core/mempool/test_mempool_manager.py b/chia/_tests/core/mempool/test_mempool_manager.py similarity index 99% rename from tests/core/mempool/test_mempool_manager.py rename to chia/_tests/core/mempool/test_mempool_manager.py index d148f2160ddd..28e8366eca00 100644 --- a/tests/core/mempool/test_mempool_manager.py +++ b/chia/_tests/core/mempool/test_mempool_manager.py @@ -8,6 +8,8 @@ from chia_rs import ELIGIBLE_FOR_DEDUP, ELIGIBLE_FOR_FF, G1Element, G2Element from chiabip158 import PyBIP158 +from chia._tests.util.misc import invariant_check_mempool +from chia._tests.util.setup_nodes import OldSimulatorsAndWallets from chia.consensus.constants import ConsensusConstants from chia.consensus.cost_calculator import NPCResult from chia.consensus.default_constants import DEFAULT_CONSTANTS @@ -54,8 +56,6 @@ from chia.wallet.wallet import Wallet from chia.wallet.wallet_coin_record import WalletCoinRecord from chia.wallet.wallet_node import WalletNode -from tests.util.misc import invariant_check_mempool -from tests.util.setup_nodes import OldSimulatorsAndWallets IDENTITY_PUZZLE = SerializedProgram.to(1) IDENTITY_PUZZLE_HASH = IDENTITY_PUZZLE.get_tree_hash() diff --git a/tests/core/mempool/test_mempool_performance.py b/chia/_tests/core/mempool/test_mempool_performance.py similarity index 92% rename from tests/core/mempool/test_mempool_performance.py rename to chia/_tests/core/mempool/test_mempool_performance.py index 80285e2b75ef..36d3313b929e 100644 --- a/tests/core/mempool/test_mempool_performance.py +++ b/chia/_tests/core/mempool/test_mempool_performance.py @@ -4,15 +4,15 @@ import pytest +from chia._tests.util.misc import BenchmarkRunner, wallet_height_at_least +from chia._tests.util.setup_nodes import OldSimulatorsAndWallets +from chia._tests.util.time_out_assert import time_out_assert from chia.types.full_block import FullBlock from chia.types.mempool_inclusion_status import MempoolInclusionStatus from chia.types.peer_info import PeerInfo from chia.util.ints import uint64, uint128 from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG from chia.wallet.wallet_node import WalletNode -from tests.util.misc import BenchmarkRunner, wallet_height_at_least -from tests.util.setup_nodes import OldSimulatorsAndWallets -from tests.util.time_out_assert import time_out_assert async def wallet_balance_at_least(wallet_node: WalletNode, balance: uint128) -> bool: diff --git a/tests/core/mempool/test_singleton_fast_forward.py b/chia/_tests/core/mempool/test_singleton_fast_forward.py similarity index 99% rename from tests/core/mempool/test_singleton_fast_forward.py rename to chia/_tests/core/mempool/test_singleton_fast_forward.py index df62c34cfe30..4a5ba4540af1 100644 --- a/tests/core/mempool/test_singleton_fast_forward.py +++ b/chia/_tests/core/mempool/test_singleton_fast_forward.py @@ -7,6 +7,17 @@ from chia_rs import AugSchemeMPL, G1Element, G2Element, PrivateKey from more_itertools import partition +from chia._tests.clvm.test_puzzles import public_key_for_index, secret_exponent_for_index +from chia._tests.core.mempool.test_mempool_manager import ( + IDENTITY_PUZZLE, + IDENTITY_PUZZLE_HASH, + TEST_COIN, + TEST_COIN_ID, + TEST_HEIGHT, + mempool_item_from_spendbundle, + spend_bundle_from_conditions, +) +from chia._tests.util.key_tool import KeyTool from chia.clvm.spend_sim import SimClient, SpendSim, sim_and_client from chia.consensus.default_constants import DEFAULT_CONSTANTS from chia.types.blockchain_format.coin import Coin @@ -24,17 +35,6 @@ from chia.util.ints import uint64 from chia.wallet.puzzles import p2_conditions, p2_delegated_puzzle_or_hidden_puzzle from chia.wallet.puzzles import singleton_top_layer_v1_1 as singleton_top_layer -from tests.clvm.test_puzzles import public_key_for_index, secret_exponent_for_index -from tests.core.mempool.test_mempool_manager import ( - IDENTITY_PUZZLE, - IDENTITY_PUZZLE_HASH, - TEST_COIN, - TEST_COIN_ID, - TEST_HEIGHT, - mempool_item_from_spendbundle, - spend_bundle_from_conditions, -) -from tests.util.key_tool import KeyTool @pytest.mark.anyio diff --git a/tests/core/node_height.py b/chia/_tests/core/node_height.py similarity index 100% rename from tests/core/node_height.py rename to chia/_tests/core/node_height.py diff --git a/tests/core/server/__init__.py b/chia/_tests/core/server/__init__.py similarity index 100% rename from tests/core/server/__init__.py rename to chia/_tests/core/server/__init__.py diff --git a/tests/core/server/config.py b/chia/_tests/core/server/config.py similarity index 100% rename from tests/core/server/config.py rename to chia/_tests/core/server/config.py diff --git a/tests/core/server/flood.py b/chia/_tests/core/server/flood.py similarity index 98% rename from tests/core/server/flood.py rename to chia/_tests/core/server/flood.py index 894885862d25..5e05f5286428 100644 --- a/tests/core/server/flood.py +++ b/chia/_tests/core/server/flood.py @@ -8,7 +8,7 @@ import sys import time -from tests.util.misc import create_logger +from chia._tests.util.misc import create_logger # TODO: CAMPid 0945094189459712842390t591 IP = "127.0.0.1" diff --git a/tests/core/server/serve.py b/chia/_tests/core/server/serve.py similarity index 98% rename from tests/core/server/serve.py rename to chia/_tests/core/server/serve.py index 8b96894d3ef3..533c03290aea 100644 --- a/tests/core/server/serve.py +++ b/chia/_tests/core/server/serve.py @@ -11,9 +11,9 @@ import threading from typing import List, Optional, final, overload +from chia._tests.util.misc import create_logger from chia.server.chia_policy import ChiaPolicy from chia.server.start_service import async_run -from tests.util.misc import create_logger if sys.platform == "win32": import _winapi diff --git a/tests/core/server/test_capabilities.py b/chia/_tests/core/server/test_capabilities.py similarity index 100% rename from tests/core/server/test_capabilities.py rename to chia/_tests/core/server/test_capabilities.py diff --git a/tests/core/server/test_dos.py b/chia/_tests/core/server/test_dos.py similarity index 99% rename from tests/core/server/test_dos.py rename to chia/_tests/core/server/test_dos.py index 5d8d11373742..bd07969b620c 100644 --- a/tests/core/server/test_dos.py +++ b/chia/_tests/core/server/test_dos.py @@ -7,6 +7,7 @@ import pytest from aiohttp import ClientSession, ClientTimeout, ServerDisconnectedError, WSCloseCode, WSMessage, WSMsgType +from chia._tests.util.time_out_assert import time_out_assert from chia.full_node.full_node_api import FullNodeAPI from chia.protocols import full_node_protocol from chia.protocols.protocol_message_types import ProtocolMessageTypes @@ -17,7 +18,6 @@ from chia.types.peer_info import PeerInfo from chia.util.errors import Err from chia.util.ints import uint64 -from tests.util.time_out_assert import time_out_assert log = logging.getLogger(__name__) diff --git a/tests/core/server/test_event_loop.py b/chia/_tests/core/server/test_event_loop.py similarity index 100% rename from tests/core/server/test_event_loop.py rename to chia/_tests/core/server/test_event_loop.py diff --git a/tests/core/server/test_loop.py b/chia/_tests/core/server/test_loop.py similarity index 96% rename from tests/core/server/test_loop.py rename to chia/_tests/core/server/test_loop.py index 6dcb6ef080ce..aad8d75f06a9 100644 --- a/tests/core/server/test_loop.py +++ b/chia/_tests/core/server/test_loop.py @@ -14,11 +14,10 @@ import anyio import pytest -import tests +from chia._tests.core.server import serve +from chia._tests.util.misc import create_logger from chia.server import chia_policy from chia.util.timing import adjusted_timeout -from tests.core.server import serve -from tests.util.misc import create_logger here = pathlib.Path(__file__).parent @@ -161,12 +160,9 @@ async def test_loop(tmp_path: pathlib.Path) -> None: flood_file = tmp_path.joinpath("flood") flood_file.touch() - env = {**os.environ, "PYTHONPATH": pathlib.Path(tests.__file__).parent.parent.as_posix()} - logger.info(" ==== launching serve.py") with subprocess.Popen( - [sys.executable, "-m", "tests.core.server.serve", os.fspath(serve_file)], - env=env, + [sys.executable, "-m", "chia._tests.core.server.serve", os.fspath(serve_file)], ): logger.info(" ==== serve.py running") @@ -174,8 +170,7 @@ async def test_loop(tmp_path: pathlib.Path) -> None: logger.info(" ==== launching flood.py") with subprocess.Popen( - [sys.executable, "-m", "tests.core.server.flood", os.fspath(flood_file)], - env=env, + [sys.executable, "-m", "chia._tests.core.server.flood", os.fspath(flood_file)], ): logger.info(" ==== flood.py running") diff --git a/tests/core/server/test_node_discovery.py b/chia/_tests/core/server/test_node_discovery.py similarity index 100% rename from tests/core/server/test_node_discovery.py rename to chia/_tests/core/server/test_node_discovery.py diff --git a/tests/core/server/test_rate_limits.py b/chia/_tests/core/server/test_rate_limits.py similarity index 99% rename from tests/core/server/test_rate_limits.py rename to chia/_tests/core/server/test_rate_limits.py index 488eed319b71..1d761b3d7243 100644 --- a/tests/core/server/test_rate_limits.py +++ b/chia/_tests/core/server/test_rate_limits.py @@ -5,6 +5,7 @@ import pytest +from chia._tests.conftest import node_with_params from chia.protocols.protocol_message_types import ProtocolMessageTypes from chia.protocols.shared_protocol import Capability from chia.server.outbound_message import make_msg @@ -14,7 +15,6 @@ from chia.server.server import ChiaServer from chia.server.ws_connection import WSChiaConnection from chia.types.peer_info import PeerInfo -from tests.conftest import node_with_params rl_v2 = [Capability.BASE, Capability.BLOCK_HEADERS, Capability.RATE_LIMITS_V2] rl_v1 = [Capability.BASE] diff --git a/tests/core/server/test_server.py b/chia/_tests/core/server/test_server.py similarity index 98% rename from tests/core/server/test_server.py rename to chia/_tests/core/server/test_server.py index f2fca59f9534..9e255327bce6 100644 --- a/tests/core/server/test_server.py +++ b/chia/_tests/core/server/test_server.py @@ -7,6 +7,9 @@ import pytest from packaging.version import Version +from chia._tests.connection_utils import connect_and_get_peer +from chia._tests.util.setup_nodes import SimulatorsAndWalletsServices +from chia._tests.util.time_out_assert import time_out_assert from chia.cmds.init_funcs import chia_full_version_str from chia.full_node.full_node_api import FullNodeAPI from chia.protocols.full_node_protocol import RejectBlock, RequestBlock, RequestTransaction @@ -24,9 +27,6 @@ from chia.util.api_decorators import api_request from chia.util.errors import ApiError, Err from chia.util.ints import int16, uint32 -from tests.connection_utils import connect_and_get_peer -from tests.util.setup_nodes import SimulatorsAndWalletsServices -from tests.util.time_out_assert import time_out_assert @dataclass diff --git a/tests/core/server/test_upnp.py b/chia/_tests/core/server/test_upnp.py similarity index 100% rename from tests/core/server/test_upnp.py rename to chia/_tests/core/server/test_upnp.py diff --git a/tests/core/services/__init__.py b/chia/_tests/core/services/__init__.py similarity index 100% rename from tests/core/services/__init__.py rename to chia/_tests/core/services/__init__.py diff --git a/tests/core/services/config.py b/chia/_tests/core/services/config.py similarity index 100% rename from tests/core/services/config.py rename to chia/_tests/core/services/config.py diff --git a/tests/core/services/test_services.py b/chia/_tests/core/services/test_services.py similarity index 98% rename from tests/core/services/test_services.py rename to chia/_tests/core/services/test_services.py index 061a8e931fee..790c8d690a9a 100644 --- a/tests/core/services/test_services.py +++ b/chia/_tests/core/services/test_services.py @@ -11,6 +11,8 @@ import pytest from typing_extensions import Protocol +from chia._tests.core.data_layer.util import ChiaRoot +from chia._tests.util.misc import closing_chia_root_popen from chia.daemon.client import DaemonProxy, connect_to_daemon_and_validate from chia.rpc.data_layer_rpc_client import DataLayerRpcClient from chia.rpc.farmer_rpc_client import FarmerRpcClient @@ -23,8 +25,6 @@ from chia.util.ints import uint16 from chia.util.misc import sendable_termination_signals from chia.util.timing import adjusted_timeout -from tests.core.data_layer.util import ChiaRoot -from tests.util.misc import closing_chia_root_popen class CreateServiceProtocol(Protocol): diff --git a/tests/core/ssl/__init__.py b/chia/_tests/core/ssl/__init__.py similarity index 100% rename from tests/core/ssl/__init__.py rename to chia/_tests/core/ssl/__init__.py diff --git a/tests/core/ssl/config.py b/chia/_tests/core/ssl/config.py similarity index 100% rename from tests/core/ssl/config.py rename to chia/_tests/core/ssl/config.py diff --git a/tests/core/ssl/test_ssl.py b/chia/_tests/core/ssl/test_ssl.py similarity index 100% rename from tests/core/ssl/test_ssl.py rename to chia/_tests/core/ssl/test_ssl.py diff --git a/tests/core/test_coins.py b/chia/_tests/core/test_coins.py similarity index 94% rename from tests/core/test_coins.py rename to chia/_tests/core/test_coins.py index f81fc1a08736..198c97529f6e 100644 --- a/tests/core/test_coins.py +++ b/chia/_tests/core/test_coins.py @@ -2,10 +2,10 @@ from itertools import permutations +from chia._tests.util.benchmarks import rand_hash from chia.types.blockchain_format.coin import hash_coin_ids from chia.types.blockchain_format.sized_bytes import bytes32 from chia.util.hash import std_hash -from tests.util.benchmarks import rand_hash def test_hash_coin_ids_empty() -> None: diff --git a/tests/core/test_cost_calculation.py b/chia/_tests/core/test_cost_calculation.py similarity index 99% rename from tests/core/test_cost_calculation.py rename to chia/_tests/core/test_cost_calculation.py index c7c180c3f964..5a0767f02a45 100644 --- a/tests/core/test_cost_calculation.py +++ b/chia/_tests/core/test_cost_calculation.py @@ -8,6 +8,7 @@ from chia_rs import G1Element from clvm_tools import binutils +from chia._tests.util.misc import BenchmarkRunner from chia.consensus.condition_costs import ConditionCost from chia.consensus.cost_calculator import NPCResult from chia.consensus.default_constants import DEFAULT_CONSTANTS @@ -21,7 +22,6 @@ from chia.types.generator_types import BlockGenerator from chia.util.ints import uint32, uint64 from chia.wallet.puzzles import p2_delegated_puzzle_or_hidden_puzzle -from tests.util.misc import BenchmarkRunner from .make_block_generator import make_block_generator @@ -283,8 +283,8 @@ async def test_standard_tx(benchmark_runner: BenchmarkRunner) -> None: @pytest.mark.anyio async def test_get_puzzle_and_solution_for_coin_performance(benchmark_runner: BenchmarkRunner) -> None: + from chia._tests.core.large_block import LARGE_BLOCK from chia.full_node.mempool_check_conditions import DESERIALIZE_MOD - from tests.core.large_block import LARGE_BLOCK assert LARGE_BLOCK.transactions_generator is not None # first, list all spent coins in the block diff --git a/tests/core/test_crawler.py b/chia/_tests/core/test_crawler.py similarity index 96% rename from tests/core/test_crawler.py rename to chia/_tests/core/test_crawler.py index e0b84b2af70f..0c5ad6452cb0 100644 --- a/tests/core/test_crawler.py +++ b/chia/_tests/core/test_crawler.py @@ -6,6 +6,8 @@ import pytest +from chia._tests.util.setup_nodes import SimulatorsAndWalletsServices +from chia._tests.util.time_out_assert import time_out_assert from chia.full_node.full_node_api import FullNodeAPI from chia.protocols.full_node_protocol import NewPeak from chia.protocols.protocol_message_types import ProtocolMessageTypes @@ -16,8 +18,6 @@ from chia.types.blockchain_format.sized_bytes import bytes32 from chia.types.peer_info import PeerInfo from chia.util.ints import uint32, uint64, uint128 -from tests.util.setup_nodes import SimulatorsAndWalletsServices -from tests.util.time_out_assert import time_out_assert @pytest.mark.anyio diff --git a/tests/core/test_crawler_rpc.py b/chia/_tests/core/test_crawler_rpc.py similarity index 100% rename from tests/core/test_crawler_rpc.py rename to chia/_tests/core/test_crawler_rpc.py diff --git a/tests/core/test_daemon_rpc.py b/chia/_tests/core/test_daemon_rpc.py similarity index 100% rename from tests/core/test_daemon_rpc.py rename to chia/_tests/core/test_daemon_rpc.py diff --git a/tests/core/test_db_conversion.py b/chia/_tests/core/test_db_conversion.py similarity index 99% rename from tests/core/test_db_conversion.py rename to chia/_tests/core/test_db_conversion.py index 1851d73aa6c8..03c79feeda51 100644 --- a/tests/core/test_db_conversion.py +++ b/chia/_tests/core/test_db_conversion.py @@ -6,6 +6,7 @@ import pytest +from chia._tests.util.temp_file import TempFile from chia.cmds.db_upgrade_func import convert_v1_to_v2 from chia.consensus.blockchain import Blockchain from chia.consensus.multiprocess_validation import PreValidationResult @@ -16,7 +17,6 @@ from chia.types.blockchain_format.sized_bytes import bytes32 from chia.util.db_wrapper import DBWrapper2 from chia.util.ints import uint32, uint64 -from tests.util.temp_file import TempFile def rand_bytes(num) -> bytes: diff --git a/tests/core/test_db_validation.py b/chia/_tests/core/test_db_validation.py similarity index 99% rename from tests/core/test_db_validation.py rename to chia/_tests/core/test_db_validation.py index 0ed607afc0bc..b3960c20504d 100644 --- a/tests/core/test_db_validation.py +++ b/chia/_tests/core/test_db_validation.py @@ -8,6 +8,7 @@ import pytest +from chia._tests.util.temp_file import TempFile from chia.cmds.db_validate_func import validate_v2 from chia.consensus.blockchain import Blockchain from chia.consensus.default_constants import DEFAULT_CONSTANTS @@ -19,7 +20,6 @@ from chia.types.full_block import FullBlock from chia.util.db_wrapper import DBWrapper2 from chia.util.ints import uint32, uint64 -from tests.util.temp_file import TempFile def rand_hash() -> bytes32: diff --git a/tests/core/test_farmer_harvester_rpc.py b/chia/_tests/core/test_farmer_harvester_rpc.py similarity index 98% rename from tests/core/test_farmer_harvester_rpc.py rename to chia/_tests/core/test_farmer_harvester_rpc.py index aa9ef8267e1f..6a5f36a46454 100644 --- a/tests/core/test_farmer_harvester_rpc.py +++ b/chia/_tests/core/test_farmer_harvester_rpc.py @@ -13,6 +13,11 @@ import pytest +from chia._tests.conftest import HarvesterFarmerEnvironment +from chia._tests.plot_sync.test_delta import dummy_plot +from chia._tests.util.misc import assert_rpc_error +from chia._tests.util.rpc import validate_get_routes +from chia._tests.util.time_out_assert import time_out_assert, time_out_assert_custom_interval from chia.consensus.coinbase import create_puzzlehash_for_pk from chia.farmer.farmer import Farmer from chia.plot_sync.receiver import Receiver @@ -35,11 +40,6 @@ from chia.util.ints import uint8, uint32, uint64 from chia.util.misc import get_list_or_len from chia.wallet.derive_keys import master_sk_to_wallet_sk, master_sk_to_wallet_sk_unhardened -from tests.conftest import HarvesterFarmerEnvironment -from tests.plot_sync.test_delta import dummy_plot -from tests.util.misc import assert_rpc_error -from tests.util.rpc import validate_get_routes -from tests.util.time_out_assert import time_out_assert, time_out_assert_custom_interval log = logging.getLogger(__name__) diff --git a/tests/core/test_filter.py b/chia/_tests/core/test_filter.py similarity index 100% rename from tests/core/test_filter.py rename to chia/_tests/core/test_filter.py diff --git a/tests/core/test_full_node_rpc.py b/chia/_tests/core/test_full_node_rpc.py similarity index 99% rename from tests/core/test_full_node_rpc.py rename to chia/_tests/core/test_full_node_rpc.py index 5c9b6a5eafca..8303c6506aea 100644 --- a/tests/core/test_full_node_rpc.py +++ b/chia/_tests/core/test_full_node_rpc.py @@ -7,6 +7,11 @@ from chia_rs import AugSchemeMPL from clvm.casts import int_to_bytes +from chia._tests.blockchain.blockchain_test_utils import _validate_and_add_block +from chia._tests.conftest import ConsensusMode +from chia._tests.connection_utils import connect_and_get_peer +from chia._tests.util.rpc import validate_get_routes +from chia._tests.util.time_out_assert import time_out_assert from chia.consensus.block_record import BlockRecord from chia.consensus.pot_iterations import is_overflow_block from chia.full_node.signage_point import SignagePoint @@ -28,11 +33,6 @@ from chia.types.unfinished_block import UnfinishedBlock from chia.util.hash import std_hash from chia.util.ints import uint8 -from tests.blockchain.blockchain_test_utils import _validate_and_add_block -from tests.conftest import ConsensusMode -from tests.connection_utils import connect_and_get_peer -from tests.util.rpc import validate_get_routes -from tests.util.time_out_assert import time_out_assert @pytest.mark.anyio diff --git a/tests/core/test_merkle_set.py b/chia/_tests/core/test_merkle_set.py similarity index 100% rename from tests/core/test_merkle_set.py rename to chia/_tests/core/test_merkle_set.py diff --git a/tests/core/test_program.py b/chia/_tests/core/test_program.py similarity index 100% rename from tests/core/test_program.py rename to chia/_tests/core/test_program.py diff --git a/tests/core/test_rpc_util.py b/chia/_tests/core/test_rpc_util.py similarity index 100% rename from tests/core/test_rpc_util.py rename to chia/_tests/core/test_rpc_util.py diff --git a/tests/core/test_seeder.py b/chia/_tests/core/test_seeder.py similarity index 99% rename from tests/core/test_seeder.py rename to chia/_tests/core/test_seeder.py index e355b7e6a7ba..a74d4a709e59 100644 --- a/tests/core/test_seeder.py +++ b/chia/_tests/core/test_seeder.py @@ -9,10 +9,10 @@ import dns import pytest +from chia._tests.util.time_out_assert import time_out_assert from chia.seeder.dns_server import DNSServer from chia.seeder.peer_record import PeerRecord, PeerReliability from chia.util.ints import uint32, uint64 -from tests.util.time_out_assert import time_out_assert timeout = 0.5 diff --git a/tests/core/test_setproctitle.py b/chia/_tests/core/test_setproctitle.py similarity index 100% rename from tests/core/test_setproctitle.py rename to chia/_tests/core/test_setproctitle.py diff --git a/tests/core/util/__init__.py b/chia/_tests/core/util/__init__.py similarity index 100% rename from tests/core/util/__init__.py rename to chia/_tests/core/util/__init__.py diff --git a/tests/core/util/config.py b/chia/_tests/core/util/config.py similarity index 100% rename from tests/core/util/config.py rename to chia/_tests/core/util/config.py diff --git a/tests/core/util/test_cached_bls.py b/chia/_tests/core/util/test_cached_bls.py similarity index 100% rename from tests/core/util/test_cached_bls.py rename to chia/_tests/core/util/test_cached_bls.py diff --git a/tests/core/util/test_config.py b/chia/_tests/core/util/test_config.py similarity index 100% rename from tests/core/util/test_config.py rename to chia/_tests/core/util/test_config.py diff --git a/tests/core/util/test_file_keyring_synchronization.py b/chia/_tests/core/util/test_file_keyring_synchronization.py similarity index 98% rename from tests/core/util/test_file_keyring_synchronization.py rename to chia/_tests/core/util/test_file_keyring_synchronization.py index 2efb89fe9c5d..610c41c14c8b 100644 --- a/tests/core/util/test_file_keyring_synchronization.py +++ b/chia/_tests/core/util/test_file_keyring_synchronization.py @@ -8,10 +8,10 @@ from sys import platform from time import sleep +from chia._tests.core.util.test_lockfile import wait_for_enough_files_in_directory from chia.simulator.keyring import TempKeyring from chia.util.keyring_wrapper import KeyringWrapper from chia.util.timing import adjusted_timeout -from tests.core.util.test_lockfile import wait_for_enough_files_in_directory log = logging.getLogger(__name__) diff --git a/tests/core/util/test_files.py b/chia/_tests/core/util/test_files.py similarity index 100% rename from tests/core/util/test_files.py rename to chia/_tests/core/util/test_files.py diff --git a/tests/core/util/test_jsonify.py b/chia/_tests/core/util/test_jsonify.py similarity index 100% rename from tests/core/util/test_jsonify.py rename to chia/_tests/core/util/test_jsonify.py diff --git a/tests/core/util/test_keychain.py b/chia/_tests/core/util/test_keychain.py similarity index 98% rename from tests/core/util/test_keychain.py rename to chia/_tests/core/util/test_keychain.py index b0bbc4d61d80..4299cecaa550 100644 --- a/tests/core/util/test_keychain.py +++ b/chia/_tests/core/util/test_keychain.py @@ -9,8 +9,7 @@ import pytest from chia_rs import AugSchemeMPL, G1Element, PrivateKey -import tests -import tests.util +import chia._tests.util from chia.simulator.keyring import TempKeyring from chia.types.blockchain_format.sized_bytes import bytes32 from chia.util.errors import ( @@ -157,7 +156,7 @@ def test_bip39_eip2333_test_vector(self, empty_temp_file_keyring: TempKeyring): assert child_sk == PrivateKey.from_bytes(tv_child_int.to_bytes(32, "big")) def test_bip39_test_vectors(self): - test_vectors_path = pkg_resources.resource_filename(tests.util.__name__, "bip39_test_vectors.json") + test_vectors_path = pkg_resources.resource_filename(chia._tests.util.__name__, "bip39_test_vectors.json") with open(test_vectors_path) as f: all_vectors = json.loads(f.read()) @@ -174,7 +173,7 @@ def test_bip39_test_vectors_short(self): """ Tests that the first 4 letters of each mnemonic phrase matches as if it were the full phrase """ - test_vectors_path = pkg_resources.resource_filename(tests.util.__name__, "bip39_test_vectors.json") + test_vectors_path = pkg_resources.resource_filename(chia._tests.util.__name__, "bip39_test_vectors.json") with open(test_vectors_path) as f: all_vectors = json.load(f) diff --git a/tests/core/util/test_keyring_wrapper.py b/chia/_tests/core/util/test_keyring_wrapper.py similarity index 100% rename from tests/core/util/test_keyring_wrapper.py rename to chia/_tests/core/util/test_keyring_wrapper.py diff --git a/tests/core/util/test_lockfile.py b/chia/_tests/core/util/test_lockfile.py similarity index 100% rename from tests/core/util/test_lockfile.py rename to chia/_tests/core/util/test_lockfile.py diff --git a/tests/core/util/test_log_exceptions.py b/chia/_tests/core/util/test_log_exceptions.py similarity index 100% rename from tests/core/util/test_log_exceptions.py rename to chia/_tests/core/util/test_log_exceptions.py diff --git a/tests/core/util/test_lru_cache.py b/chia/_tests/core/util/test_lru_cache.py similarity index 100% rename from tests/core/util/test_lru_cache.py rename to chia/_tests/core/util/test_lru_cache.py diff --git a/tests/core/util/test_significant_bits.py b/chia/_tests/core/util/test_significant_bits.py similarity index 100% rename from tests/core/util/test_significant_bits.py rename to chia/_tests/core/util/test_significant_bits.py diff --git a/tests/core/util/test_streamable.py b/chia/_tests/core/util/test_streamable.py similarity index 100% rename from tests/core/util/test_streamable.py rename to chia/_tests/core/util/test_streamable.py diff --git a/tests/db/__init__.py b/chia/_tests/db/__init__.py similarity index 100% rename from tests/db/__init__.py rename to chia/_tests/db/__init__.py diff --git a/tests/db/test_db_wrapper.py b/chia/_tests/db/test_db_wrapper.py similarity index 99% rename from tests/db/test_db_wrapper.py rename to chia/_tests/db/test_db_wrapper.py index 7b9a6526875b..5611b3779bb9 100644 --- a/tests/db/test_db_wrapper.py +++ b/chia/_tests/db/test_db_wrapper.py @@ -10,8 +10,8 @@ # TODO: update after resolution in https://github.com/pytest-dev/pytest/issues/7469 from _pytest.fixtures import SubRequest +from chia._tests.util.db_connection import DBConnection, PathDBConnection from chia.util.db_wrapper import DBWrapper2 -from tests.util.db_connection import DBConnection, PathDBConnection if TYPE_CHECKING: ConnectionContextManager = contextlib.AbstractAsyncContextManager[aiosqlite.core.Connection] diff --git a/tests/environments/__init__.py b/chia/_tests/environments/__init__.py similarity index 100% rename from tests/environments/__init__.py rename to chia/_tests/environments/__init__.py diff --git a/tests/environments/common.py b/chia/_tests/environments/common.py similarity index 100% rename from tests/environments/common.py rename to chia/_tests/environments/common.py diff --git a/tests/environments/full_node.py b/chia/_tests/environments/full_node.py similarity index 95% rename from tests/environments/full_node.py rename to chia/_tests/environments/full_node.py index e92f0c4e1f12..09a6960bd111 100644 --- a/tests/environments/full_node.py +++ b/chia/_tests/environments/full_node.py @@ -3,13 +3,13 @@ from dataclasses import dataclass from typing import TYPE_CHECKING, ClassVar, Tuple, cast +from chia._tests.environments.common import ServiceEnvironment from chia.full_node.full_node import FullNode from chia.rpc.rpc_server import RpcServer from chia.server.server import ChiaServer from chia.server.start_service import Service from chia.simulator.full_node_simulator import FullNodeSimulator from chia.simulator.simulator_full_node_rpc_api import SimulatorFullNodeRpcApi -from tests.environments.common import ServiceEnvironment @dataclass diff --git a/tests/environments/wallet.py b/chia/_tests/environments/wallet.py similarity index 99% rename from tests/environments/wallet.py rename to chia/_tests/environments/wallet.py index 8c1b9918c551..4d1bf9e1b9be 100644 --- a/tests/environments/wallet.py +++ b/chia/_tests/environments/wallet.py @@ -5,6 +5,7 @@ from dataclasses import asdict, dataclass, field from typing import TYPE_CHECKING, ClassVar, Dict, List, Optional, Tuple, Union, cast +from chia._tests.environments.common import ServiceEnvironment from chia.rpc.rpc_server import RpcServer from chia.rpc.wallet_rpc_api import WalletRpcApi from chia.rpc.wallet_rpc_client import WalletRpcClient @@ -19,7 +20,6 @@ from chia.wallet.wallet_node import Balance, WalletNode from chia.wallet.wallet_node_api import WalletNodeAPI from chia.wallet.wallet_state_manager import WalletStateManager -from tests.environments.common import ServiceEnvironment OPP_DICT = {"<": operator.lt, ">": operator.gt, "<=": operator.le, ">=": operator.ge} diff --git a/tests/ether.py b/chia/_tests/ether.py similarity index 83% rename from tests/ether.py rename to chia/_tests/ether.py index f1ecb3efb415..b97668be180d 100644 --- a/tests/ether.py +++ b/chia/_tests/ether.py @@ -3,7 +3,7 @@ from typing import TYPE_CHECKING, Callable, Optional if TYPE_CHECKING: - from tests.util.misc import TestId + from chia._tests.util.misc import TestId # NOTE: Do not just put any useful thing here. This is specifically for making # fixture values globally available during tests. In _most_ cases fixtures @@ -11,7 +11,7 @@ # be put here. # NOTE: When using this module do not import the attributes directly. Rather, import -# something like `from tests import ether`. Importing attributes directly will +# something like `from chia._tests import ether`. Importing attributes directly will # result in you likely getting the default `None` values since they are not # populated until tests are running. diff --git a/tests/farmer_harvester/__init__.py b/chia/_tests/farmer_harvester/__init__.py similarity index 100% rename from tests/farmer_harvester/__init__.py rename to chia/_tests/farmer_harvester/__init__.py diff --git a/tests/farmer_harvester/config.py b/chia/_tests/farmer_harvester/config.py similarity index 100% rename from tests/farmer_harvester/config.py rename to chia/_tests/farmer_harvester/config.py diff --git a/tests/farmer_harvester/test_farmer.py b/chia/_tests/farmer_harvester/test_farmer.py similarity index 99% rename from tests/farmer_harvester/test_farmer.py rename to chia/_tests/farmer_harvester/test_farmer.py index c44483fd39fc..fa0cd8b38ca4 100644 --- a/tests/farmer_harvester/test_farmer.py +++ b/chia/_tests/farmer_harvester/test_farmer.py @@ -13,6 +13,8 @@ from pytest_mock import MockerFixture from yarl import URL +from chia._tests.conftest import HarvesterFarmerEnvironment +from chia._tests.util.misc import DataCase, Marks, datacases from chia.consensus.default_constants import DEFAULT_CONSTANTS from chia.farmer.farmer import UPDATE_POOL_FARMER_INFO_INTERVAL, Farmer, increment_pool_stats, strip_old_entries from chia.pools.pool_config import PoolWalletConfig @@ -31,8 +33,6 @@ from chia.util.config import load_config, save_config from chia.util.hash import std_hash from chia.util.ints import uint8, uint16, uint32, uint64 -from tests.conftest import HarvesterFarmerEnvironment -from tests.util.misc import DataCase, Marks, datacases log = logging.getLogger(__name__) diff --git a/tests/farmer_harvester/test_farmer_harvester.py b/chia/_tests/farmer_harvester/test_farmer_harvester.py similarity index 99% rename from tests/farmer_harvester/test_farmer_harvester.py rename to chia/_tests/farmer_harvester/test_farmer_harvester.py index ceecd259ebe3..f3aa9f965d1a 100644 --- a/tests/farmer_harvester/test_farmer_harvester.py +++ b/chia/_tests/farmer_harvester/test_farmer_harvester.py @@ -8,6 +8,8 @@ import pytest from chia_rs import G1Element +from chia._tests.conftest import HarvesterFarmerEnvironment +from chia._tests.util.time_out_assert import time_out_assert from chia.cmds.cmds_util import get_any_service_client from chia.farmer.farmer import Farmer from chia.plotting.util import PlotsRefreshParameter @@ -24,8 +26,6 @@ from chia.util.ints import uint8, uint32, uint64 from chia.util.keychain import generate_mnemonic from chia.util.misc import split_async_manager -from tests.conftest import HarvesterFarmerEnvironment -from tests.util.time_out_assert import time_out_assert def farmer_is_started(farmer: Farmer) -> bool: diff --git a/tests/farmer_harvester/test_filter_prefix_bits.py b/chia/_tests/farmer_harvester/test_filter_prefix_bits.py similarity index 95% rename from tests/farmer_harvester/test_filter_prefix_bits.py rename to chia/_tests/farmer_harvester/test_filter_prefix_bits.py index c6a228bdffd5..e06f4e559ab7 100644 --- a/tests/farmer_harvester/test_filter_prefix_bits.py +++ b/chia/_tests/farmer_harvester/test_filter_prefix_bits.py @@ -6,6 +6,10 @@ import pytest +from chia._tests.conftest import ConsensusMode +from chia._tests.core.test_farmer_harvester_rpc import wait_for_plot_sync +from chia._tests.util.setup_nodes import setup_farmer_multi_harvester +from chia._tests.util.time_out_assert import time_out_assert from chia.farmer.farmer_api import FarmerAPI from chia.protocols import farmer_protocol from chia.rpc.farmer_rpc_client import FarmerRpcClient @@ -17,10 +21,6 @@ from chia.types.full_block import FullBlock from chia.util.ints import uint8, uint32, uint64 from chia.util.keychain import Keychain -from tests.conftest import ConsensusMode -from tests.core.test_farmer_harvester_rpc import wait_for_plot_sync -from tests.util.setup_nodes import setup_farmer_multi_harvester -from tests.util.time_out_assert import time_out_assert # these numbers are only valid for chains farmed with the fixed original plot diff --git a/tests/farmer_harvester/test_third_party_harvesters.py b/chia/_tests/farmer_harvester/test_third_party_harvesters.py similarity index 99% rename from tests/farmer_harvester/test_third_party_harvesters.py rename to chia/_tests/farmer_harvester/test_third_party_harvesters.py index 50374c49c98e..1bcf783b9ff0 100644 --- a/tests/farmer_harvester/test_third_party_harvesters.py +++ b/chia/_tests/farmer_harvester/test_third_party_harvesters.py @@ -12,6 +12,7 @@ from chia_rs import G1Element from pytest_mock import MockerFixture +from chia._tests.util.time_out_assert import time_out_assert from chia.consensus.blockchain import AddBlockResult from chia.consensus.multiprocess_validation import PreValidationResult from chia.farmer.farmer import Farmer, calculate_harvester_fee_quality @@ -39,7 +40,6 @@ from chia.util.bech32m import decode_puzzle_hash from chia.util.hash import std_hash from chia.util.ints import uint8, uint32, uint64 -from tests.util.time_out_assert import time_out_assert SPType = Union[timelord_protocol.NewEndOfSubSlotVDF, timelord_protocol.NewSignagePointVDF] SPList = List[SPType] diff --git a/tests/farmer_harvester/test_third_party_harvesters_data.json b/chia/_tests/farmer_harvester/test_third_party_harvesters_data.json similarity index 100% rename from tests/farmer_harvester/test_third_party_harvesters_data.json rename to chia/_tests/farmer_harvester/test_third_party_harvesters_data.json diff --git a/tests/fee_estimation/__init__.py b/chia/_tests/fee_estimation/__init__.py similarity index 100% rename from tests/fee_estimation/__init__.py rename to chia/_tests/fee_estimation/__init__.py diff --git a/tests/fee_estimation/config.py b/chia/_tests/fee_estimation/config.py similarity index 100% rename from tests/fee_estimation/config.py rename to chia/_tests/fee_estimation/config.py diff --git a/tests/fee_estimation/test_fee_estimation_integration.py b/chia/_tests/fee_estimation/test_fee_estimation_integration.py similarity index 99% rename from tests/fee_estimation/test_fee_estimation_integration.py rename to chia/_tests/fee_estimation/test_fee_estimation_integration.py index 4292d88ebb8d..3edd6054943e 100644 --- a/tests/fee_estimation/test_fee_estimation_integration.py +++ b/chia/_tests/fee_estimation/test_fee_estimation_integration.py @@ -6,6 +6,11 @@ import pytest from chia_rs import Coin +from chia._tests.core.mempool.test_mempool_manager import ( + create_test_block_record, + instantiate_mempool_manager, + zero_calls_get_coin_records, +) from chia.consensus.cost_calculator import NPCResult from chia.full_node.bitcoin_fee_estimator import create_bitcoin_fee_estimator from chia.full_node.fee_estimation import ( @@ -26,11 +31,6 @@ from chia.types.mempool_item import MempoolItem from chia.types.spend_bundle_conditions import Spend, SpendBundleConditions from chia.util.ints import uint32, uint64 -from tests.core.mempool.test_mempool_manager import ( - create_test_block_record, - instantiate_mempool_manager, - zero_calls_get_coin_records, -) def make_mempoolitem() -> MempoolItem: diff --git a/tests/fee_estimation/test_fee_estimation_rpc.py b/chia/_tests/fee_estimation/test_fee_estimation_rpc.py similarity index 100% rename from tests/fee_estimation/test_fee_estimation_rpc.py rename to chia/_tests/fee_estimation/test_fee_estimation_rpc.py diff --git a/tests/fee_estimation/test_fee_estimation_unit_tests.py b/chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py similarity index 100% rename from tests/fee_estimation/test_fee_estimation_unit_tests.py rename to chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py diff --git a/tests/fee_estimation/test_mempoolitem_height_added.py b/chia/_tests/fee_estimation/test_mempoolitem_height_added.py similarity index 100% rename from tests/fee_estimation/test_mempoolitem_height_added.py rename to chia/_tests/fee_estimation/test_mempoolitem_height_added.py diff --git a/tests/generator/__init__.py b/chia/_tests/generator/__init__.py similarity index 100% rename from tests/generator/__init__.py rename to chia/_tests/generator/__init__.py diff --git a/tests/generator/puzzles/__init__.py b/chia/_tests/generator/puzzles/__init__.py similarity index 100% rename from tests/generator/puzzles/__init__.py rename to chia/_tests/generator/puzzles/__init__.py diff --git a/tests/generator/puzzles/test_generator_deserialize.clsp b/chia/_tests/generator/puzzles/test_generator_deserialize.clsp similarity index 100% rename from tests/generator/puzzles/test_generator_deserialize.clsp rename to chia/_tests/generator/puzzles/test_generator_deserialize.clsp diff --git a/tests/generator/puzzles/test_generator_deserialize.clsp.hex b/chia/_tests/generator/puzzles/test_generator_deserialize.clsp.hex similarity index 100% rename from tests/generator/puzzles/test_generator_deserialize.clsp.hex rename to chia/_tests/generator/puzzles/test_generator_deserialize.clsp.hex diff --git a/tests/generator/puzzles/test_multiple_generator_input_arguments.clsp b/chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp similarity index 100% rename from tests/generator/puzzles/test_multiple_generator_input_arguments.clsp rename to chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp diff --git a/tests/generator/puzzles/test_multiple_generator_input_arguments.clsp.hex b/chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp.hex similarity index 100% rename from tests/generator/puzzles/test_multiple_generator_input_arguments.clsp.hex rename to chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp.hex diff --git a/tests/generator/test_compression.py b/chia/_tests/generator/test_compression.py similarity index 97% rename from tests/generator/test_compression.py rename to chia/_tests/generator/test_compression.py index 07b0aacd30fa..a6b0ba6449c0 100644 --- a/tests/generator/test_compression.py +++ b/chia/_tests/generator/test_compression.py @@ -11,6 +11,8 @@ from clvm.serialize import sexp_from_stream from clvm_tools import binutils +from chia._tests.core.make_block_generator import make_spend_bundle +from chia._tests.generator.test_rom import run_generator from chia.full_node.bundle_tools import ( bundle_suitable_for_compression, compressed_coin_spend_entry_list, @@ -28,10 +30,10 @@ from chia.util.byte_types import hexstr_to_bytes from chia.util.ints import uint32 from chia.wallet.puzzles.load_clvm import load_clvm -from tests.core.make_block_generator import make_spend_bundle -from tests.generator.test_rom import run_generator -TEST_GEN_DESERIALIZE = load_clvm("test_generator_deserialize.clsp", package_or_requirement="tests.generator.puzzles") +TEST_GEN_DESERIALIZE = load_clvm( + "test_generator_deserialize.clsp", package_or_requirement="chia._tests.generator.puzzles" +) DESERIALIZE_MOD = load_clvm("chialisp_deserialisation.clsp", package_or_requirement="chia.consensus.puzzles") DECOMPRESS_PUZZLE = load_clvm("decompress_puzzle.clsp", package_or_requirement="chia.full_node.puzzles") @@ -42,7 +44,7 @@ ) DECOMPRESS_BLOCK = load_clvm("block_program_zero.clsp", package_or_requirement="chia.full_node.puzzles") TEST_MULTIPLE = load_clvm( - "test_multiple_generator_input_arguments.clsp", package_or_requirement="tests.generator.puzzles" + "test_multiple_generator_input_arguments.clsp", package_or_requirement="chia._tests.generator.puzzles" ) Nil = Program.from_bytes(b"\x80") diff --git a/tests/generator/test_generator_types.py b/chia/_tests/generator/test_generator_types.py similarity index 100% rename from tests/generator/test_generator_types.py rename to chia/_tests/generator/test_generator_types.py diff --git a/tests/generator/test_rom.py b/chia/_tests/generator/test_rom.py similarity index 100% rename from tests/generator/test_rom.py rename to chia/_tests/generator/test_rom.py diff --git a/tests/generator/test_scan.py b/chia/_tests/generator/test_scan.py similarity index 100% rename from tests/generator/test_scan.py rename to chia/_tests/generator/test_scan.py diff --git a/tests/plot_sync/__init__.py b/chia/_tests/plot_sync/__init__.py similarity index 100% rename from tests/plot_sync/__init__.py rename to chia/_tests/plot_sync/__init__.py diff --git a/tests/plot_sync/config.py b/chia/_tests/plot_sync/config.py similarity index 100% rename from tests/plot_sync/config.py rename to chia/_tests/plot_sync/config.py diff --git a/tests/plot_sync/test_delta.py b/chia/_tests/plot_sync/test_delta.py similarity index 100% rename from tests/plot_sync/test_delta.py rename to chia/_tests/plot_sync/test_delta.py diff --git a/tests/plot_sync/test_plot_sync.py b/chia/_tests/plot_sync/test_plot_sync.py similarity index 99% rename from tests/plot_sync/test_plot_sync.py rename to chia/_tests/plot_sync/test_plot_sync.py index 6bc43fa668b6..abae83a2686d 100644 --- a/tests/plot_sync/test_plot_sync.py +++ b/chia/_tests/plot_sync/test_plot_sync.py @@ -11,6 +11,10 @@ import pytest from chia_rs import G1Element +from chia._tests.plot_sync.util import start_harvester_service +from chia._tests.plotting.test_plot_manager import Directory, MockPlotInfo +from chia._tests.plotting.util import get_test_plots +from chia._tests.util.time_out_assert import time_out_assert from chia.farmer.farmer import Farmer from chia.harvester.harvester import Harvester from chia.plot_sync.delta import Delta, PathListDelta, PlotListDelta @@ -28,10 +32,6 @@ from chia.util.ints import uint8, uint32, uint64 from chia.util.misc import SplitAsyncManager, split_async_manager from chia.util.streamable import _T_Streamable -from tests.plot_sync.util import start_harvester_service -from tests.plotting.test_plot_manager import Directory, MockPlotInfo -from tests.plotting.util import get_test_plots -from tests.util.time_out_assert import time_out_assert def synced(sender: Sender, receiver: Receiver, previous_last_sync_id: int) -> bool: diff --git a/tests/plot_sync/test_receiver.py b/chia/_tests/plot_sync/test_receiver.py similarity index 99% rename from tests/plot_sync/test_receiver.py rename to chia/_tests/plot_sync/test_receiver.py index f499b95e3d06..ef20b6c5d715 100644 --- a/tests/plot_sync/test_receiver.py +++ b/chia/_tests/plot_sync/test_receiver.py @@ -9,6 +9,7 @@ import pytest from chia_rs import G1Element +from chia._tests.plot_sync.util import get_dummy_connection from chia.consensus.pos_quality import UI_ACTUAL_SPACE_CONSTANT_FACTOR, _expected_plot_size from chia.plot_sync.delta import Delta from chia.plot_sync.receiver import Receiver, Sync @@ -28,7 +29,6 @@ from chia.util.ints import uint8, uint32, uint64 from chia.util.misc import get_list_or_len from chia.util.streamable import _T_Streamable -from tests.plot_sync.util import get_dummy_connection log = logging.getLogger(__name__) diff --git a/tests/plot_sync/test_sender.py b/chia/_tests/plot_sync/test_sender.py similarity index 98% rename from tests/plot_sync/test_sender.py rename to chia/_tests/plot_sync/test_sender.py index 4d069c24e39c..5d78be6393dc 100644 --- a/tests/plot_sync/test_sender.py +++ b/chia/_tests/plot_sync/test_sender.py @@ -4,6 +4,7 @@ import pytest +from chia._tests.plot_sync.util import get_dummy_connection, plot_sync_identifier from chia.plot_sync.exceptions import AlreadyStartedError, InvalidConnectionTypeError from chia.plot_sync.sender import ExpectedResponse, Sender from chia.plot_sync.util import Constants @@ -14,7 +15,6 @@ from chia.simulator.block_tools import BlockTools from chia.types.blockchain_format.sized_bytes import bytes32 from chia.util.ints import int16, uint64 -from tests.plot_sync.util import get_dummy_connection, plot_sync_identifier def test_default_values(bt: BlockTools) -> None: diff --git a/tests/plot_sync/test_sync_simulated.py b/chia/_tests/plot_sync/test_sync_simulated.py similarity index 99% rename from tests/plot_sync/test_sync_simulated.py rename to chia/_tests/plot_sync/test_sync_simulated.py index 5913ee78eb55..82b2c4cd9705 100644 --- a/tests/plot_sync/test_sync_simulated.py +++ b/chia/_tests/plot_sync/test_sync_simulated.py @@ -14,6 +14,8 @@ import pytest from chia_rs import G1Element +from chia._tests.plot_sync.util import start_harvester_service +from chia._tests.util.time_out_assert import time_out_assert from chia.farmer.farmer import Farmer from chia.harvester.harvester import Harvester from chia.plot_sync.receiver import Receiver @@ -30,8 +32,6 @@ from chia.types.blockchain_format.sized_bytes import bytes32 from chia.util.ints import int16, uint8, uint64 from chia.util.misc import to_batches -from tests.plot_sync.util import start_harvester_service -from tests.util.time_out_assert import time_out_assert log = logging.getLogger(__name__) diff --git a/tests/plot_sync/util.py b/chia/_tests/plot_sync/util.py similarity index 97% rename from tests/plot_sync/util.py rename to chia/_tests/plot_sync/util.py index 4c91f23b1b17..f88cdbc9fdbf 100644 --- a/tests/plot_sync/util.py +++ b/chia/_tests/plot_sync/util.py @@ -5,6 +5,7 @@ from dataclasses import dataclass from typing import AsyncIterator, Optional +from chia._tests.util.time_out_assert import time_out_assert from chia.harvester.harvester import Harvester from chia.plot_sync.sender import Sender from chia.protocols.harvester_protocol import PlotSyncIdentifier @@ -14,7 +15,6 @@ from chia.types.peer_info import PeerInfo, UnresolvedPeerInfo from chia.util.ints import uint16, uint64 from chia.util.misc import SplitAsyncManager, split_async_manager -from tests.util.time_out_assert import time_out_assert @dataclass diff --git a/tests/plotting/__init__.py b/chia/_tests/plotting/__init__.py similarity index 100% rename from tests/plotting/__init__.py rename to chia/_tests/plotting/__init__.py diff --git a/tests/plotting/config.py b/chia/_tests/plotting/config.py similarity index 100% rename from tests/plotting/config.py rename to chia/_tests/plotting/config.py diff --git a/tests/plotting/test_plot_manager.py b/chia/_tests/plotting/test_plot_manager.py similarity index 99% rename from tests/plotting/test_plot_manager.py rename to chia/_tests/plotting/test_plot_manager.py index d78e5c1bb069..db623536f469 100644 --- a/tests/plotting/test_plot_manager.py +++ b/chia/_tests/plotting/test_plot_manager.py @@ -12,6 +12,8 @@ import pytest from chia_rs import G1Element +from chia._tests.plotting.util import get_test_plots +from chia._tests.util.time_out_assert import time_out_assert from chia.plotting.cache import CURRENT_VERSION, CacheDataV1 from chia.plotting.manager import Cache, PlotManager from chia.plotting.util import ( @@ -27,8 +29,6 @@ from chia.util.config import create_default_chia_config, lock_and_load_config, save_config from chia.util.ints import uint16, uint32 from chia.util.misc import VersionedBlob -from tests.plotting.util import get_test_plots -from tests.util.time_out_assert import time_out_assert log = logging.getLogger(__name__) diff --git a/tests/plotting/util.py b/chia/_tests/plotting/util.py similarity index 100% rename from tests/plotting/util.py rename to chia/_tests/plotting/util.py diff --git a/tests/pools/__init__.py b/chia/_tests/pools/__init__.py similarity index 100% rename from tests/pools/__init__.py rename to chia/_tests/pools/__init__.py diff --git a/tests/pools/config.py b/chia/_tests/pools/config.py similarity index 100% rename from tests/pools/config.py rename to chia/_tests/pools/config.py diff --git a/tests/pools/test_pool_cmdline.py b/chia/_tests/pools/test_pool_cmdline.py similarity index 100% rename from tests/pools/test_pool_cmdline.py rename to chia/_tests/pools/test_pool_cmdline.py diff --git a/tests/pools/test_pool_config.py b/chia/_tests/pools/test_pool_config.py similarity index 100% rename from tests/pools/test_pool_config.py rename to chia/_tests/pools/test_pool_config.py diff --git a/tests/pools/test_pool_puzzles_lifecycle.py b/chia/_tests/pools/test_pool_puzzles_lifecycle.py similarity index 98% rename from tests/pools/test_pool_puzzles_lifecycle.py rename to chia/_tests/pools/test_pool_puzzles_lifecycle.py index e6df7c8f39a6..1c9f5d417017 100644 --- a/tests/pools/test_pool_puzzles_lifecycle.py +++ b/chia/_tests/pools/test_pool_puzzles_lifecycle.py @@ -7,6 +7,9 @@ import pytest from chia_rs import AugSchemeMPL, G1Element, G2Element, PrivateKey +from chia._tests.clvm.coin_store import BadSpendBundleError, CoinStore, CoinTimestamp +from chia._tests.clvm.test_puzzles import public_key_for_index, secret_exponent_for_index +from chia._tests.util.key_tool import KeyTool from chia.consensus.default_constants import DEFAULT_CONSTANTS from chia.pools.pool_puzzles import ( SINGLETON_MOD_HASH, @@ -39,9 +42,6 @@ solution_for_conditions, ) from chia.wallet.singleton import get_most_recent_singleton_coin_from_coin_spend -from tests.clvm.coin_store import BadSpendBundleError, CoinStore, CoinTimestamp -from tests.clvm.test_puzzles import public_key_for_index, secret_exponent_for_index -from tests.util.key_tool import KeyTool """ This test suite aims to test: diff --git a/tests/pools/test_pool_rpc.py b/chia/_tests/pools/test_pool_rpc.py similarity index 99% rename from tests/pools/test_pool_rpc.py rename to chia/_tests/pools/test_pool_rpc.py index 716918d798ce..c72d2c8d8916 100644 --- a/tests/pools/test_pool_rpc.py +++ b/chia/_tests/pools/test_pool_rpc.py @@ -15,6 +15,8 @@ from _pytest.fixtures import SubRequest from chia_rs import G1Element +from chia._tests.util.setup_nodes import setup_simulators_and_wallets_service +from chia._tests.util.time_out_assert import time_out_assert from chia.consensus.constants import ConsensusConstants from chia.pools.pool_puzzles import SINGLETON_LAUNCHER_HASH from chia.pools.pool_wallet_info import PoolSingletonState, PoolWalletInfo @@ -34,8 +36,6 @@ from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG from chia.wallet.util.wallet_types import WalletType from chia.wallet.wallet_node import WalletNode -from tests.util.setup_nodes import setup_simulators_and_wallets_service -from tests.util.time_out_assert import time_out_assert # TODO: Compare deducted fees in all tests against reported total_fee diff --git a/tests/pools/test_pool_wallet.py b/chia/_tests/pools/test_pool_wallet.py similarity index 99% rename from tests/pools/test_pool_wallet.py rename to chia/_tests/pools/test_pool_wallet.py index 252d889dec26..e2d45a9db7ed 100644 --- a/tests/pools/test_pool_wallet.py +++ b/chia/_tests/pools/test_pool_wallet.py @@ -8,9 +8,9 @@ import pytest from chia_rs import G1Element +from chia._tests.util.benchmarks import rand_g1, rand_hash from chia.pools.pool_wallet import PoolWallet from chia.types.blockchain_format.sized_bytes import bytes32 -from tests.util.benchmarks import rand_g1, rand_hash @dataclass diff --git a/tests/pools/test_wallet_pool_store.py b/chia/_tests/pools/test_wallet_pool_store.py similarity index 99% rename from tests/pools/test_wallet_pool_store.py rename to chia/_tests/pools/test_wallet_pool_store.py index 814c975e702b..88c971cb11cd 100644 --- a/tests/pools/test_wallet_pool_store.py +++ b/chia/_tests/pools/test_wallet_pool_store.py @@ -7,6 +7,7 @@ import pytest from clvm_tools import binutils +from chia._tests.util.db_connection import DBConnection from chia.types.blockchain_format.coin import Coin from chia.types.blockchain_format.program import Program from chia.types.blockchain_format.serialized_program import SerializedProgram @@ -14,7 +15,6 @@ from chia.types.coin_spend import CoinSpend, compute_additions, make_spend from chia.util.ints import uint32, uint64 from chia.wallet.wallet_pool_store import WalletPoolStore -from tests.util.db_connection import DBConnection def make_child_solution( diff --git a/tests/process_junit.py b/chia/_tests/process_junit.py similarity index 98% rename from tests/process_junit.py rename to chia/_tests/process_junit.py index 13b5fc6c558c..fb1388ba62a6 100644 --- a/tests/process_junit.py +++ b/chia/_tests/process_junit.py @@ -12,8 +12,8 @@ import click import lxml.etree -from tests.util.misc import BenchmarkData, DataTypeProtocol, TestId -from tests.util.time_out_assert import TimeOutAssertData +from chia._tests.util.misc import BenchmarkData, DataTypeProtocol, TestId +from chia._tests.util.time_out_assert import TimeOutAssertData supported_data_types: List[Type[DataTypeProtocol]] = [TimeOutAssertData, BenchmarkData] supported_data_types_by_tag: Dict[str, Type[DataTypeProtocol]] = {cls.tag: cls for cls in supported_data_types} diff --git a/tests/rpc/__init__.py b/chia/_tests/rpc/__init__.py similarity index 100% rename from tests/rpc/__init__.py rename to chia/_tests/rpc/__init__.py diff --git a/tests/rpc/test_rpc_client.py b/chia/_tests/rpc/test_rpc_client.py similarity index 97% rename from tests/rpc/test_rpc_client.py rename to chia/_tests/rpc/test_rpc_client.py index ade5d49c9b75..ad86a8da7646 100644 --- a/tests/rpc/test_rpc_client.py +++ b/chia/_tests/rpc/test_rpc_client.py @@ -6,9 +6,9 @@ import pytest +from chia._tests.util.misc import Marks, RecordingWebServer, datacases from chia.rpc.rpc_client import ResponseFailureError, RpcClient from chia.util.ints import uint16 -from tests.util.misc import Marks, RecordingWebServer, datacases @dataclass diff --git a/tests/simulation/__init__.py b/chia/_tests/simulation/__init__.py similarity index 100% rename from tests/simulation/__init__.py rename to chia/_tests/simulation/__init__.py diff --git a/tests/simulation/config.py b/chia/_tests/simulation/config.py similarity index 100% rename from tests/simulation/config.py rename to chia/_tests/simulation/config.py diff --git a/tests/simulation/test_simulation.py b/chia/_tests/simulation/test_simulation.py similarity index 99% rename from tests/simulation/test_simulation.py rename to chia/_tests/simulation/test_simulation.py index 6090b2502a2b..b40c11a48b71 100644 --- a/tests/simulation/test_simulation.py +++ b/chia/_tests/simulation/test_simulation.py @@ -8,6 +8,9 @@ import pkg_resources import pytest +from chia._tests.core.node_height import node_height_at_least +from chia._tests.util.setup_nodes import FullSystem, OldSimulatorsAndWallets +from chia._tests.util.time_out_assert import time_out_assert from chia.cmds.units import units from chia.consensus.block_record import BlockRecord from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward @@ -27,9 +30,6 @@ from chia.util.ws_message import create_payload from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG from chia.wallet.wallet_node import WalletNode -from tests.core.node_height import node_height_at_least -from tests.util.setup_nodes import FullSystem, OldSimulatorsAndWallets -from tests.util.time_out_assert import time_out_assert chiapos_version = pkg_resources.get_distribution("chiapos").version diff --git a/tests/simulation/test_simulator.py b/chia/_tests/simulation/test_simulator.py similarity index 99% rename from tests/simulation/test_simulator.py rename to chia/_tests/simulation/test_simulator.py index 79cb3669d8c7..c12913c55350 100644 --- a/tests/simulation/test_simulator.py +++ b/chia/_tests/simulation/test_simulator.py @@ -4,6 +4,7 @@ import pytest +from chia._tests.util.setup_nodes import OldSimulatorsAndWallets from chia.cmds.units import units from chia.server.server import ChiaServer from chia.simulator.block_tools import BlockTools @@ -12,7 +13,6 @@ from chia.util.ints import uint64 from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG from chia.wallet.wallet_node import WalletNode -from tests.util.setup_nodes import OldSimulatorsAndWallets @pytest.mark.anyio diff --git a/tests/simulation/test_start_simulator.py b/chia/_tests/simulation/test_start_simulator.py similarity index 98% rename from tests/simulation/test_start_simulator.py rename to chia/_tests/simulation/test_start_simulator.py index eb7a156466b3..f04782f95848 100644 --- a/tests/simulation/test_start_simulator.py +++ b/chia/_tests/simulation/test_start_simulator.py @@ -6,6 +6,7 @@ import pytest +from chia._tests.util.time_out_assert import time_out_assert from chia.simulator.full_node_simulator import FullNodeSimulator from chia.simulator.simulator_full_node_rpc_client import SimulatorFullNodeRpcClient from chia.simulator.simulator_test_tools import get_full_chia_simulator, get_puzzle_hash_from_key @@ -13,7 +14,6 @@ from chia.util.hash import std_hash from chia.util.ints import uint16 from chia.util.keychain import Keychain -from tests.util.time_out_assert import time_out_assert async def get_num_coins_for_ph(simulator_client: SimulatorFullNodeRpcClient, ph: bytes32) -> int: diff --git a/tests/testconfig.py b/chia/_tests/testconfig.py similarity index 100% rename from tests/testconfig.py rename to chia/_tests/testconfig.py diff --git a/tests/timelord/__init__.py b/chia/_tests/timelord/__init__.py similarity index 100% rename from tests/timelord/__init__.py rename to chia/_tests/timelord/__init__.py diff --git a/tests/timelord/config.py b/chia/_tests/timelord/config.py similarity index 100% rename from tests/timelord/config.py rename to chia/_tests/timelord/config.py diff --git a/tests/timelord/test_new_peak.py b/chia/_tests/timelord/test_new_peak.py similarity index 98% rename from tests/timelord/test_new_peak.py rename to chia/_tests/timelord/test_new_peak.py index b372285813eb..6409828ff1ce 100644 --- a/tests/timelord/test_new_peak.py +++ b/chia/_tests/timelord/test_new_peak.py @@ -4,6 +4,8 @@ import pytest +from chia._tests.blockchain.blockchain_test_utils import _validate_and_add_block +from chia._tests.util.blockchain import create_blockchain from chia.consensus.block_record import BlockRecord from chia.consensus.blockchain_interface import BlockchainInterface from chia.consensus.constants import ConsensusConstants @@ -17,8 +19,6 @@ from chia.types.blockchain_format.sub_epoch_summary import SubEpochSummary from chia.types.full_block import FullBlock from chia.util.ints import uint128 -from tests.blockchain.blockchain_test_utils import _validate_and_add_block -from tests.util.blockchain import create_blockchain class TestNewPeak: diff --git a/tests/timelord/test_timelord.py b/chia/_tests/timelord/test_timelord.py similarity index 100% rename from tests/timelord/test_timelord.py rename to chia/_tests/timelord/test_timelord.py diff --git a/tests/tools/1315537.json b/chia/_tests/tools/1315537.json similarity index 100% rename from tests/tools/1315537.json rename to chia/_tests/tools/1315537.json diff --git a/tests/tools/1315544.json b/chia/_tests/tools/1315544.json similarity index 100% rename from tests/tools/1315544.json rename to chia/_tests/tools/1315544.json diff --git a/tests/tools/1315630.json b/chia/_tests/tools/1315630.json similarity index 100% rename from tests/tools/1315630.json rename to chia/_tests/tools/1315630.json diff --git a/tests/tools/300000.json b/chia/_tests/tools/300000.json similarity index 100% rename from tests/tools/300000.json rename to chia/_tests/tools/300000.json diff --git a/tests/tools/442734.json b/chia/_tests/tools/442734.json similarity index 100% rename from tests/tools/442734.json rename to chia/_tests/tools/442734.json diff --git a/tests/tools/466212.json b/chia/_tests/tools/466212.json similarity index 100% rename from tests/tools/466212.json rename to chia/_tests/tools/466212.json diff --git a/tests/tools/__init__.py b/chia/_tests/tools/__init__.py similarity index 100% rename from tests/tools/__init__.py rename to chia/_tests/tools/__init__.py diff --git a/tests/tools/config.py b/chia/_tests/tools/config.py similarity index 100% rename from tests/tools/config.py rename to chia/_tests/tools/config.py diff --git a/tests/tools/test-blockchain-db.sqlite b/chia/_tests/tools/test-blockchain-db.sqlite similarity index 100% rename from tests/tools/test-blockchain-db.sqlite rename to chia/_tests/tools/test-blockchain-db.sqlite diff --git a/tests/tools/test_full_sync.py b/chia/_tests/tools/test_full_sync.py similarity index 92% rename from tests/tools/test_full_sync.py rename to chia/_tests/tools/test_full_sync.py index a48ce9fe4e32..db2e57b076f9 100644 --- a/tests/tools/test_full_sync.py +++ b/chia/_tests/tools/test_full_sync.py @@ -8,7 +8,7 @@ import pytest -from tests.util.full_sync import run_sync_test +from chia._tests.util.full_sync import run_sync_test @pytest.mark.parametrize("keep_up", [True, False]) diff --git a/tests/tools/test_legacy_keyring.py b/chia/_tests/tools/test_legacy_keyring.py similarity index 100% rename from tests/tools/test_legacy_keyring.py rename to chia/_tests/tools/test_legacy_keyring.py diff --git a/tests/tools/test_run_block.py b/chia/_tests/tools/test_run_block.py similarity index 98% rename from tests/tools/test_run_block.py rename to chia/_tests/tools/test_run_block.py index ab4b63928f22..7c0bde86d80f 100644 --- a/tests/tools/test_run_block.py +++ b/chia/_tests/tools/test_run_block.py @@ -5,12 +5,12 @@ from pathlib import Path from typing import List +from chia._tests.util.run_block import run_json_block from chia.consensus.default_constants import DEFAULT_CONSTANTS from chia.types.blockchain_format.sized_bytes import bytes32 from chia.types.condition_opcodes import ConditionOpcode from chia.types.condition_with_args import ConditionWithArgs from chia.util.ints import uint32, uint64, uint128 -from tests.util.run_block import run_json_block constants = dataclasses.replace( DEFAULT_CONSTANTS, diff --git a/tests/util/__init__.py b/chia/_tests/util/__init__.py similarity index 100% rename from tests/util/__init__.py rename to chia/_tests/util/__init__.py diff --git a/tests/util/benchmark_cost.py b/chia/_tests/util/benchmark_cost.py similarity index 100% rename from tests/util/benchmark_cost.py rename to chia/_tests/util/benchmark_cost.py diff --git a/tests/util/benchmarks.py b/chia/_tests/util/benchmarks.py similarity index 100% rename from tests/util/benchmarks.py rename to chia/_tests/util/benchmarks.py diff --git a/tests/util/bip39_test_vectors.json b/chia/_tests/util/bip39_test_vectors.json similarity index 100% rename from tests/util/bip39_test_vectors.json rename to chia/_tests/util/bip39_test_vectors.json diff --git a/tests/util/blockchain.py b/chia/_tests/util/blockchain.py similarity index 100% rename from tests/util/blockchain.py rename to chia/_tests/util/blockchain.py diff --git a/tests/util/build_network_protocol_files.py b/chia/_tests/util/build_network_protocol_files.py similarity index 95% rename from tests/util/build_network_protocol_files.py rename to chia/_tests/util/build_network_protocol_files.py index 4fff6b5e6b15..559c2052e58f 100644 --- a/tests/util/build_network_protocol_files.py +++ b/chia/_tests/util/build_network_protocol_files.py @@ -6,8 +6,8 @@ from pathlib import Path from typing import Any, Callable +from chia._tests.util.network_protocol_data import * # noqa: F403 from chia.util.ints import uint32 -from tests.util.network_protocol_data import * # noqa: F403 version = "1.0" @@ -177,9 +177,9 @@ def build_protocol_test() -> str: from pathlib import Path from typing import Tuple -from tests.util.build_network_protocol_files import get_network_protocol_filename -from tests.util.network_protocol_data import * # noqa: F403 -from tests.util.protocol_messages_json import * # noqa: F403 +from chia._tests.util.build_network_protocol_files import get_network_protocol_filename +from chia._tests.util.network_protocol_data import * # noqa: F403 +from chia._tests.util.protocol_messages_json import * # noqa: F403 def parse_blob(input_bytes: bytes) -> Tuple[bytes, bytes]: @@ -243,8 +243,8 @@ def build_json_test() -> str: from __future__ import annotations -from tests.util.network_protocol_data import * # noqa: F403 -from tests.util.protocol_messages_json import * # noqa: F403 +from chia._tests.util.network_protocol_data import * # noqa: F403 +from chia._tests.util.protocol_messages_json import * # noqa: F403 def test_protocol_json() -> None: diff --git a/tests/util/clvm_generator.bin b/chia/_tests/util/clvm_generator.bin similarity index 100% rename from tests/util/clvm_generator.bin rename to chia/_tests/util/clvm_generator.bin diff --git a/tests/util/config.py b/chia/_tests/util/config.py similarity index 100% rename from tests/util/config.py rename to chia/_tests/util/config.py diff --git a/tests/util/constants.py b/chia/_tests/util/constants.py similarity index 100% rename from tests/util/constants.py rename to chia/_tests/util/constants.py diff --git a/tests/util/db_connection.py b/chia/_tests/util/db_connection.py similarity index 100% rename from tests/util/db_connection.py rename to chia/_tests/util/db_connection.py diff --git a/tests/util/full_sync.py b/chia/_tests/util/full_sync.py similarity index 99% rename from tests/util/full_sync.py rename to chia/_tests/util/full_sync.py index 48a038522905..cce56ff1594b 100644 --- a/tests/util/full_sync.py +++ b/chia/_tests/util/full_sync.py @@ -12,6 +12,7 @@ import aiosqlite import zstd +from chia._tests.util.constants import test_constants as TEST_CONSTANTS from chia.cmds.init_funcs import chia_init from chia.consensus.default_constants import DEFAULT_CONSTANTS from chia.full_node.full_node import FullNode @@ -24,7 +25,6 @@ from chia.types.peer_info import PeerInfo from chia.util.config import load_config from chia.util.ints import uint16 -from tests.util.constants import test_constants as TEST_CONSTANTS class ExitOnError(logging.Handler): diff --git a/tests/util/gen_ssl_certs.py b/chia/_tests/util/gen_ssl_certs.py similarity index 100% rename from tests/util/gen_ssl_certs.py rename to chia/_tests/util/gen_ssl_certs.py diff --git a/tests/util/generator_tools_testing.py b/chia/_tests/util/generator_tools_testing.py similarity index 100% rename from tests/util/generator_tools_testing.py rename to chia/_tests/util/generator_tools_testing.py diff --git a/tests/util/key_tool.py b/chia/_tests/util/key_tool.py similarity index 94% rename from tests/util/key_tool.py rename to chia/_tests/util/key_tool.py index e407ccf9702c..f916914ad116 100644 --- a/tests/util/key_tool.py +++ b/chia/_tests/util/key_tool.py @@ -5,10 +5,10 @@ from chia_rs import AugSchemeMPL, G2Element, PrivateKey +from chia._tests.core.make_block_generator import GROUP_ORDER, int_to_public_key from chia.simulator.block_tools import test_constants from chia.types.coin_spend import CoinSpend from chia.util.condition_tools import conditions_dict_for_solution, pkm_pairs_for_conditions_dict -from tests.core.make_block_generator import GROUP_ORDER, int_to_public_key @dataclass diff --git a/tests/util/misc.py b/chia/_tests/util/misc.py similarity index 98% rename from tests/util/misc.py rename to chia/_tests/util/misc.py index f6876360a2b6..42526e6125b9 100644 --- a/tests/util/misc.py +++ b/chia/_tests/util/misc.py @@ -49,7 +49,9 @@ from chia_rs import Coin import chia -import tests +import chia._tests +from chia._tests import ether +from chia._tests.core.data_layer.util import ChiaRoot from chia.full_node.mempool import Mempool from chia.types.blockchain_format.sized_bytes import bytes32 from chia.types.condition_opcodes import ConditionOpcode @@ -59,8 +61,6 @@ from chia.util.network import WebServer from chia.wallet.util.compute_hints import HintedCoin from chia.wallet.wallet_node import WalletNode -from tests import ether -from tests.core.data_layer.util import ChiaRoot class GcMode(enum.Enum): @@ -203,7 +203,7 @@ def measure_runtime( entry_file, entry_line = caller_file_and_line( relative_to=( pathlib.Path(chia.__file__).parent.parent, - pathlib.Path(tests.__file__).parent.parent, + pathlib.Path(chia._tests.__file__).parent.parent, ) ) @@ -315,7 +315,7 @@ def __enter__(self) -> Future[AssertRuntimeResults]: self.entry_file, self.entry_line = caller_file_and_line( relative_to=( pathlib.Path(chia.__file__).parent.parent, - pathlib.Path(tests.__file__).parent.parent, + pathlib.Path(chia._tests.__file__).parent.parent, ) ) diff --git a/tests/util/network_protocol_data.py b/chia/_tests/util/network_protocol_data.py similarity index 100% rename from tests/util/network_protocol_data.py rename to chia/_tests/util/network_protocol_data.py diff --git a/tests/util/protocol_messages_bytes-v1.0 b/chia/_tests/util/protocol_messages_bytes-v1.0 similarity index 100% rename from tests/util/protocol_messages_bytes-v1.0 rename to chia/_tests/util/protocol_messages_bytes-v1.0 diff --git a/tests/util/protocol_messages_json.py b/chia/_tests/util/protocol_messages_json.py similarity index 100% rename from tests/util/protocol_messages_json.py rename to chia/_tests/util/protocol_messages_json.py diff --git a/tests/util/rpc.py b/chia/_tests/util/rpc.py similarity index 100% rename from tests/util/rpc.py rename to chia/_tests/util/rpc.py diff --git a/tests/util/run_block.py b/chia/_tests/util/run_block.py similarity index 100% rename from tests/util/run_block.py rename to chia/_tests/util/run_block.py diff --git a/tests/util/setup_nodes.py b/chia/_tests/util/setup_nodes.py similarity index 99% rename from tests/util/setup_nodes.py rename to chia/_tests/util/setup_nodes.py index 2d40a701a060..de008c61a688 100644 --- a/tests/util/setup_nodes.py +++ b/chia/_tests/util/setup_nodes.py @@ -10,6 +10,8 @@ import anyio +from chia._tests.environments.full_node import FullNodeEnvironment +from chia._tests.environments.wallet import WalletEnvironment from chia.consensus.constants import ConsensusConstants from chia.daemon.server import WebSocketServer from chia.farmer.farmer import Farmer @@ -49,8 +51,6 @@ from chia.util.keychain import Keychain from chia.util.timing import adjusted_timeout, backoff_times from chia.wallet.wallet_node import WalletNode -from tests.environments.full_node import FullNodeEnvironment -from tests.environments.wallet import WalletEnvironment OldSimulatorsAndWallets = Tuple[List[FullNodeSimulator], List[Tuple[WalletNode, ChiaServer]], BlockTools] SimulatorsAndWalletsServices = Tuple[List[SimulatorFullNodeService], List[WalletService], BlockTools] diff --git a/tests/util/temp_file.py b/chia/_tests/util/temp_file.py similarity index 100% rename from tests/util/temp_file.py rename to chia/_tests/util/temp_file.py diff --git a/tests/util/test_async_pool.py b/chia/_tests/util/test_async_pool.py similarity index 100% rename from tests/util/test_async_pool.py rename to chia/_tests/util/test_async_pool.py diff --git a/tests/util/test_build_job_matrix.py b/chia/_tests/util/test_build_job_matrix.py similarity index 90% rename from tests/util/test_build_job_matrix.py rename to chia/_tests/util/test_build_job_matrix.py index f90edb982275..cc2e14d43f60 100644 --- a/tests/util/test_build_job_matrix.py +++ b/chia/_tests/util/test_build_job_matrix.py @@ -6,9 +6,9 @@ import sys from typing import Dict, List -import tests +import chia._tests -build_job_matrix_path = pathlib.Path(tests.__file__).with_name("build-job-matrix.py") +build_job_matrix_path = pathlib.Path(chia._tests.__file__).with_name("build-job-matrix.py") def run(args: List[str]) -> str: diff --git a/tests/util/test_build_network_protocol_files.py b/chia/_tests/util/test_build_network_protocol_files.py similarity index 60% rename from tests/util/test_build_network_protocol_files.py rename to chia/_tests/util/test_build_network_protocol_files.py index c22c89073b4b..fed31b83bdd0 100644 --- a/tests/util/test_build_network_protocol_files.py +++ b/chia/_tests/util/test_build_network_protocol_files.py @@ -1,6 +1,6 @@ from __future__ import annotations -from tests.util.build_network_protocol_files import main +from chia._tests.util.build_network_protocol_files import main def test_build_network_protocol_files() -> None: diff --git a/tests/util/test_collection.py b/chia/_tests/util/test_collection.py similarity index 100% rename from tests/util/test_collection.py rename to chia/_tests/util/test_collection.py diff --git a/tests/util/test_condition_tools.py b/chia/_tests/util/test_condition_tools.py similarity index 100% rename from tests/util/test_condition_tools.py rename to chia/_tests/util/test_condition_tools.py diff --git a/tests/util/test_config.py b/chia/_tests/util/test_config.py similarity index 99% rename from tests/util/test_config.py rename to chia/_tests/util/test_config.py index e9491f3c5c74..fe54c1e5d922 100644 --- a/tests/util/test_config.py +++ b/chia/_tests/util/test_config.py @@ -3,11 +3,11 @@ from dataclasses import dataclass from typing import Any, Dict, Optional, Set +from chia._tests.util.misc import DataCase, Marks, datacases from chia.server.outbound_message import NodeType from chia.types.peer_info import UnresolvedPeerInfo from chia.util.config import get_unresolved_peer_infos, set_peer_info from chia.util.ints import uint16 -from tests.util.misc import DataCase, Marks, datacases @dataclass diff --git a/tests/util/test_dump_keyring.py b/chia/_tests/util/test_dump_keyring.py similarity index 96% rename from tests/util/test_dump_keyring.py rename to chia/_tests/util/test_dump_keyring.py index f250816c4b39..f439fa7a645b 100644 --- a/tests/util/test_dump_keyring.py +++ b/chia/_tests/util/test_dump_keyring.py @@ -7,9 +7,9 @@ from click.testing import CliRunner +from chia._tests.util.misc import Marks, datacases from chia.util.dump_keyring import dump from chia.util.keychain import Keychain -from tests.util.misc import Marks, datacases output_prefix = """Attempting to dump contents of keyring file: {path} diff --git a/tests/util/test_errors.py b/chia/_tests/util/test_errors.py similarity index 100% rename from tests/util/test_errors.py rename to chia/_tests/util/test_errors.py diff --git a/tests/util/test_full_block_utils.py b/chia/_tests/util/test_full_block_utils.py similarity index 98% rename from tests/util/test_full_block_utils.py rename to chia/_tests/util/test_full_block_utils.py index 61a19a7c15f4..a7242ac45275 100644 --- a/tests/util/test_full_block_utils.py +++ b/chia/_tests/util/test_full_block_utils.py @@ -6,6 +6,7 @@ import pytest from chia_rs import G1Element, G2Element +from chia._tests.util.benchmarks import rand_bytes, rand_g1, rand_g2, rand_hash, rand_vdf, rand_vdf_proof, rewards from chia.types.blockchain_format.foliage import Foliage, FoliageBlockData, FoliageTransactionBlock, TransactionsInfo from chia.types.blockchain_format.pool_target import PoolTarget from chia.types.blockchain_format.proof_of_space import ProofOfSpace @@ -25,7 +26,6 @@ from chia.util.full_block_utils import block_info_from_block, generator_from_block, header_block_from_block from chia.util.generator_tools import get_block_header from chia.util.ints import uint8, uint32, uint64, uint128 -from tests.util.benchmarks import rand_bytes, rand_g1, rand_g2, rand_hash, rand_vdf, rand_vdf_proof, rewards test_g2s: List[G2Element] = [rand_g2() for _ in range(10)] test_g1s: List[G1Element] = [rand_g1() for _ in range(10)] diff --git a/tests/util/test_installed.py b/chia/_tests/util/test_installed.py similarity index 100% rename from tests/util/test_installed.py rename to chia/_tests/util/test_installed.py diff --git a/tests/util/test_limited_semaphore.py b/chia/_tests/util/test_limited_semaphore.py similarity index 100% rename from tests/util/test_limited_semaphore.py rename to chia/_tests/util/test_limited_semaphore.py diff --git a/tests/util/test_logging_filter.py b/chia/_tests/util/test_logging_filter.py similarity index 100% rename from tests/util/test_logging_filter.py rename to chia/_tests/util/test_logging_filter.py diff --git a/tests/util/test_misc.py b/chia/_tests/util/test_misc.py similarity index 99% rename from tests/util/test_misc.py rename to chia/_tests/util/test_misc.py index 9fb1b30f2d81..3c4125598871 100644 --- a/tests/util/test_misc.py +++ b/chia/_tests/util/test_misc.py @@ -7,6 +7,7 @@ import anyio import pytest +from chia._tests.util.misc import RecordingWebServer from chia.types.blockchain_format.program import Program from chia.util.errors import InvalidPathError from chia.util.ints import uint64 @@ -23,7 +24,6 @@ validate_directory_writable, ) from chia.util.timing import adjusted_timeout, backoff_times -from tests.util.misc import RecordingWebServer T = TypeVar("T") diff --git a/tests/util/test_network.py b/chia/_tests/util/test_network.py similarity index 100% rename from tests/util/test_network.py rename to chia/_tests/util/test_network.py diff --git a/tests/util/test_network_protocol_files.py b/chia/_tests/util/test_network_protocol_files.py similarity index 99% rename from tests/util/test_network_protocol_files.py rename to chia/_tests/util/test_network_protocol_files.py index 8eb30656a1c1..258fbb85bf90 100644 --- a/tests/util/test_network_protocol_files.py +++ b/chia/_tests/util/test_network_protocol_files.py @@ -5,9 +5,9 @@ from pathlib import Path from typing import Tuple -from tests.util.build_network_protocol_files import get_network_protocol_filename -from tests.util.network_protocol_data import * # noqa: F403 -from tests.util.protocol_messages_json import * # noqa: F403 +from chia._tests.util.build_network_protocol_files import get_network_protocol_filename +from chia._tests.util.network_protocol_data import * # noqa: F403 +from chia._tests.util.protocol_messages_json import * # noqa: F403 def parse_blob(input_bytes: bytes) -> Tuple[bytes, bytes]: diff --git a/tests/util/test_network_protocol_json.py b/chia/_tests/util/test_network_protocol_json.py similarity index 99% rename from tests/util/test_network_protocol_json.py rename to chia/_tests/util/test_network_protocol_json.py index 4362223765f2..905c5b7a9298 100644 --- a/tests/util/test_network_protocol_json.py +++ b/chia/_tests/util/test_network_protocol_json.py @@ -2,8 +2,8 @@ from __future__ import annotations -from tests.util.network_protocol_data import * # noqa: F403 -from tests.util.protocol_messages_json import * # noqa: F403 +from chia._tests.util.network_protocol_data import * # noqa: F403 +from chia._tests.util.protocol_messages_json import * # noqa: F403 def test_protocol_json() -> None: diff --git a/tests/util/test_network_protocol_test.py b/chia/_tests/util/test_network_protocol_test.py similarity index 100% rename from tests/util/test_network_protocol_test.py rename to chia/_tests/util/test_network_protocol_test.py diff --git a/tests/util/test_paginator.py b/chia/_tests/util/test_paginator.py similarity index 100% rename from tests/util/test_paginator.py rename to chia/_tests/util/test_paginator.py diff --git a/tests/util/test_pprint.py b/chia/_tests/util/test_pprint.py similarity index 100% rename from tests/util/test_pprint.py rename to chia/_tests/util/test_pprint.py diff --git a/tests/util/test_priority_mutex.py b/chia/_tests/util/test_priority_mutex.py similarity index 99% rename from tests/util/test_priority_mutex.py rename to chia/_tests/util/test_priority_mutex.py index e615ab0725f5..d93ecb44f6f6 100644 --- a/tests/util/test_priority_mutex.py +++ b/chia/_tests/util/test_priority_mutex.py @@ -13,10 +13,10 @@ import anyio import pytest +from chia._tests.util.misc import Marks, datacases +from chia._tests.util.time_out_assert import time_out_assert_custom_interval from chia.util.priority_mutex import NestedLockUnsupportedError, PriorityMutex from chia.util.timing import adjusted_timeout -from tests.util.misc import Marks, datacases -from tests.util.time_out_assert import time_out_assert_custom_interval log = logging.getLogger(__name__) diff --git a/tests/util/test_recursive_replace.py b/chia/_tests/util/test_recursive_replace.py similarity index 100% rename from tests/util/test_recursive_replace.py rename to chia/_tests/util/test_recursive_replace.py diff --git a/tests/util/test_ssl_check.py b/chia/_tests/util/test_ssl_check.py similarity index 100% rename from tests/util/test_ssl_check.py rename to chia/_tests/util/test_ssl_check.py diff --git a/tests/util/test_struct_stream.py b/chia/_tests/util/test_struct_stream.py similarity index 100% rename from tests/util/test_struct_stream.py rename to chia/_tests/util/test_struct_stream.py diff --git a/tests/util/test_testnet_overrides.py b/chia/_tests/util/test_testnet_overrides.py similarity index 100% rename from tests/util/test_testnet_overrides.py rename to chia/_tests/util/test_testnet_overrides.py diff --git a/tests/util/test_tests_misc.py b/chia/_tests/util/test_tests_misc.py similarity index 92% rename from tests/util/test_tests_misc.py rename to chia/_tests/util/test_tests_misc.py index 01836b3549ab..e6ee26b5010c 100644 --- a/tests/util/test_tests_misc.py +++ b/chia/_tests/util/test_tests_misc.py @@ -4,7 +4,7 @@ import pytest -from tests.util.misc import Marks, datacases, named_datacases +from chia._tests.util.misc import Marks, datacases, named_datacases @dataclass diff --git a/tests/util/test_timing.py b/chia/_tests/util/test_timing.py similarity index 100% rename from tests/util/test_timing.py rename to chia/_tests/util/test_timing.py diff --git a/tests/util/test_trusted_peer.py b/chia/_tests/util/test_trusted_peer.py similarity index 100% rename from tests/util/test_trusted_peer.py rename to chia/_tests/util/test_trusted_peer.py diff --git a/tests/util/time_out_assert.py b/chia/_tests/util/time_out_assert.py similarity index 96% rename from tests/util/time_out_assert.py rename to chia/_tests/util/time_out_assert.py index 4252d35756fc..7cdce5696dc6 100644 --- a/tests/util/time_out_assert.py +++ b/chia/_tests/util/time_out_assert.py @@ -9,12 +9,12 @@ from typing import TYPE_CHECKING, Any, Callable, ClassVar, Dict, Tuple, cast, final import chia -import tests +import chia._tests +from chia._tests import ether +from chia._tests.util.misc import DataTypeProtocol from chia.protocols.protocol_message_types import ProtocolMessageTypes from chia.util.misc import caller_file_and_line from chia.util.timing import adjusted_timeout -from tests import ether -from tests.util.misc import DataTypeProtocol log = logging.getLogger(__name__) @@ -66,7 +66,7 @@ async def time_out_assert_custom_interval( distance=stack_distance + 1, relative_to=( pathlib.Path(chia.__file__).parent.parent, - pathlib.Path(tests.__file__).parent.parent, + pathlib.Path(chia._tests.__file__).parent.parent, ), ) diff --git a/tests/wallet/__init__.py b/chia/_tests/wallet/__init__.py similarity index 100% rename from tests/wallet/__init__.py rename to chia/_tests/wallet/__init__.py diff --git a/tests/wallet/cat_wallet/__init__.py b/chia/_tests/wallet/cat_wallet/__init__.py similarity index 100% rename from tests/wallet/cat_wallet/__init__.py rename to chia/_tests/wallet/cat_wallet/__init__.py diff --git a/tests/wallet/cat_wallet/config.py b/chia/_tests/wallet/cat_wallet/config.py similarity index 100% rename from tests/wallet/cat_wallet/config.py rename to chia/_tests/wallet/cat_wallet/config.py diff --git a/tests/wallet/cat_wallet/test_cat_lifecycle.py b/chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py similarity index 99% rename from tests/wallet/cat_wallet/test_cat_lifecycle.py rename to chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py index cf9c743e914a..fa66bb241c60 100644 --- a/tests/wallet/cat_wallet/test_cat_lifecycle.py +++ b/chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py @@ -6,6 +6,9 @@ from chia_rs import AugSchemeMPL, G2Element, PrivateKey from clvm.casts import int_to_bytes +from chia._tests.clvm.benchmark_costs import cost_of_spend_bundle +from chia._tests.clvm.test_puzzles import secret_exponent_for_index +from chia._tests.conftest import ConsensusMode from chia.clvm.spend_sim import CostLogger, SimClient, SpendSim, sim_and_client from chia.types.blockchain_format.coin import Coin from chia.types.blockchain_format.program import Program @@ -22,9 +25,6 @@ ) from chia.wallet.lineage_proof import LineageProof from chia.wallet.puzzles.tails import DelegatedLimitations, EverythingWithSig, GenesisById, GenesisByPuzhash -from tests.clvm.benchmark_costs import cost_of_spend_bundle -from tests.clvm.test_puzzles import secret_exponent_for_index -from tests.conftest import ConsensusMode acs = Program.to(1) acs_ph = acs.get_tree_hash() diff --git a/tests/wallet/cat_wallet/test_cat_outer_puzzle.py b/chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py similarity index 100% rename from tests/wallet/cat_wallet/test_cat_outer_puzzle.py rename to chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py diff --git a/tests/wallet/cat_wallet/test_cat_wallet.py b/chia/_tests/wallet/cat_wallet/test_cat_wallet.py similarity index 99% rename from tests/wallet/cat_wallet/test_cat_wallet.py rename to chia/_tests/wallet/cat_wallet/test_cat_wallet.py index e2dd28fe82c2..113930571899 100644 --- a/tests/wallet/cat_wallet/test_cat_wallet.py +++ b/chia/_tests/wallet/cat_wallet/test_cat_wallet.py @@ -6,6 +6,10 @@ import pytest +from chia._tests.conftest import ConsensusMode +from chia._tests.environments.wallet import WalletEnvironment, WalletStateTransition, WalletTestFramework +from chia._tests.util.setup_nodes import OldSimulatorsAndWallets, SimulatorsAndWalletsServices +from chia._tests.util.time_out_assert import time_out_assert, time_out_assert_not_none from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward from chia.protocols.wallet_protocol import CoinState from chia.rpc.wallet_rpc_client import WalletRpcClient @@ -32,10 +36,6 @@ from chia.wallet.wallet_interested_store import WalletInterestedStore from chia.wallet.wallet_node import WalletNode from chia.wallet.wallet_state_manager import WalletStateManager -from tests.conftest import ConsensusMode -from tests.environments.wallet import WalletEnvironment, WalletStateTransition, WalletTestFramework -from tests.util.setup_nodes import OldSimulatorsAndWallets, SimulatorsAndWalletsServices -from tests.util.time_out_assert import time_out_assert, time_out_assert_not_none def check_wallets(node: WalletNode) -> int: diff --git a/tests/wallet/cat_wallet/test_offer_lifecycle.py b/chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py similarity index 100% rename from tests/wallet/cat_wallet/test_offer_lifecycle.py rename to chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py diff --git a/tests/wallet/cat_wallet/test_trades.py b/chia/_tests/wallet/cat_wallet/test_trades.py similarity index 99% rename from tests/wallet/cat_wallet/test_trades.py rename to chia/_tests/wallet/cat_wallet/test_trades.py index aacafd900571..98400750f0c8 100644 --- a/tests/wallet/cat_wallet/test_trades.py +++ b/chia/_tests/wallet/cat_wallet/test_trades.py @@ -6,6 +6,10 @@ import pytest from chia_rs import G2Element +from chia._tests.conftest import SOFTFORK_HEIGHTS, ConsensusMode +from chia._tests.environments.wallet import WalletEnvironment, WalletStateTransition, WalletTestFramework +from chia._tests.util.time_out_assert import time_out_assert +from chia._tests.wallet.vc_wallet.test_vc_wallet import mint_cr_cat from chia.consensus.cost_calculator import NPCResult from chia.consensus.default_constants import DEFAULT_CONSTANTS from chia.full_node.bundle_tools import simple_solution_generator @@ -27,10 +31,6 @@ from chia.wallet.vc_wallet.cr_cat_drivers import ProofsChecker from chia.wallet.vc_wallet.cr_cat_wallet import CRCATWallet from chia.wallet.vc_wallet.vc_store import VCProofs -from tests.conftest import SOFTFORK_HEIGHTS, ConsensusMode -from tests.environments.wallet import WalletEnvironment, WalletStateTransition, WalletTestFramework -from tests.util.time_out_assert import time_out_assert -from tests.wallet.vc_wallet.test_vc_wallet import mint_cr_cat async def get_trade_and_status(trade_manager: TradeManager, trade: TradeRecord) -> TradeStatus: diff --git a/tests/wallet/clawback/__init__.py b/chia/_tests/wallet/clawback/__init__.py similarity index 100% rename from tests/wallet/clawback/__init__.py rename to chia/_tests/wallet/clawback/__init__.py diff --git a/tests/wallet/clawback/config.py b/chia/_tests/wallet/clawback/config.py similarity index 100% rename from tests/wallet/clawback/config.py rename to chia/_tests/wallet/clawback/config.py diff --git a/tests/wallet/clawback/test_clawback_decorator.py b/chia/_tests/wallet/clawback/test_clawback_decorator.py similarity index 100% rename from tests/wallet/clawback/test_clawback_decorator.py rename to chia/_tests/wallet/clawback/test_clawback_decorator.py diff --git a/tests/wallet/clawback/test_clawback_lifecycle.py b/chia/_tests/wallet/clawback/test_clawback_lifecycle.py similarity index 97% rename from tests/wallet/clawback/test_clawback_lifecycle.py rename to chia/_tests/wallet/clawback/test_clawback_lifecycle.py index 171e050ce1a8..7227e4af350f 100644 --- a/tests/wallet/clawback/test_clawback_lifecycle.py +++ b/chia/_tests/wallet/clawback/test_clawback_lifecycle.py @@ -5,6 +5,10 @@ import pytest from chia_rs import AugSchemeMPL, G1Element, G2Element, PrivateKey +from chia._tests.clvm.benchmark_costs import cost_of_spend_bundle +from chia._tests.clvm.test_puzzles import public_key_for_index, secret_exponent_for_index +from chia._tests.util.key_tool import KeyTool +from chia._tests.util.time_out_assert import time_out_assert from chia.clvm.spend_sim import CostLogger, SimClient, SpendSim, sim_and_client from chia.consensus.default_constants import DEFAULT_CONSTANTS from chia.types.blockchain_format.program import INFINITE_COST, Program @@ -35,10 +39,6 @@ from chia.wallet.uncurried_puzzle import uncurry_puzzle from chia.wallet.util.merkle_utils import check_merkle_proof from chia.wallet.util.wallet_types import RemarkDataType -from tests.clvm.benchmark_costs import cost_of_spend_bundle -from tests.clvm.test_puzzles import public_key_for_index, secret_exponent_for_index -from tests.util.key_tool import KeyTool -from tests.util.time_out_assert import time_out_assert ACS = Program.to(1) ACS_PH = ACS.get_tree_hash() diff --git a/tests/wallet/clawback/test_clawback_metadata.py b/chia/_tests/wallet/clawback/test_clawback_metadata.py similarity index 100% rename from tests/wallet/clawback/test_clawback_metadata.py rename to chia/_tests/wallet/clawback/test_clawback_metadata.py diff --git a/tests/wallet/config.py b/chia/_tests/wallet/config.py similarity index 100% rename from tests/wallet/config.py rename to chia/_tests/wallet/config.py diff --git a/tests/wallet/conftest.py b/chia/_tests/wallet/conftest.py similarity index 97% rename from tests/wallet/conftest.py rename to chia/_tests/wallet/conftest.py index 8d756bdee5ea..a59ec5462e93 100644 --- a/tests/wallet/conftest.py +++ b/chia/_tests/wallet/conftest.py @@ -6,6 +6,9 @@ import pytest +from chia._tests.environments.wallet import WalletEnvironment, WalletState, WalletTestFramework +from chia._tests.util.setup_nodes import setup_simulators_and_wallets_service +from chia._tests.wallet.wallet_block_tools import WalletBlockTools from chia.consensus.constants import ConsensusConstants from chia.consensus.cost_calculator import NPCResult from chia.full_node.full_node import FullNode @@ -16,9 +19,6 @@ from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG, TXConfig from chia.wallet.wallet_node import Balance from chia.wallet.wallet_state_manager import WalletStateManager -from tests.environments.wallet import WalletEnvironment, WalletState, WalletTestFramework -from tests.util.setup_nodes import setup_simulators_and_wallets_service -from tests.wallet.wallet_block_tools import WalletBlockTools @pytest.fixture(scope="function", autouse=True) diff --git a/tests/wallet/dao_wallet/__init__.py b/chia/_tests/wallet/dao_wallet/__init__.py similarity index 100% rename from tests/wallet/dao_wallet/__init__.py rename to chia/_tests/wallet/dao_wallet/__init__.py diff --git a/tests/wallet/dao_wallet/config.py b/chia/_tests/wallet/dao_wallet/config.py similarity index 100% rename from tests/wallet/dao_wallet/config.py rename to chia/_tests/wallet/dao_wallet/config.py diff --git a/tests/wallet/dao_wallet/test_dao_clvm.py b/chia/_tests/wallet/dao_wallet/test_dao_clvm.py similarity index 100% rename from tests/wallet/dao_wallet/test_dao_clvm.py rename to chia/_tests/wallet/dao_wallet/test_dao_clvm.py diff --git a/tests/wallet/dao_wallet/test_dao_wallets.py b/chia/_tests/wallet/dao_wallet/test_dao_wallets.py similarity index 99% rename from tests/wallet/dao_wallet/test_dao_wallets.py rename to chia/_tests/wallet/dao_wallet/test_dao_wallets.py index 4c36a9a3203a..76a552e4702d 100644 --- a/tests/wallet/dao_wallet/test_dao_wallets.py +++ b/chia/_tests/wallet/dao_wallet/test_dao_wallets.py @@ -6,6 +6,9 @@ import pytest +from chia._tests.util.rpc import validate_get_routes +from chia._tests.util.setup_nodes import OldSimulatorsAndWallets, SimulatorsAndWalletsServices +from chia._tests.util.time_out_assert import time_out_assert, time_out_assert_not_none from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward from chia.rpc.wallet_rpc_api import WalletRpcApi from chia.rpc.wallet_rpc_client import WalletRpcClient @@ -28,9 +31,6 @@ from chia.wallet.dao_wallet.dao_wallet import DAOWallet from chia.wallet.transaction_record import TransactionRecord from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG -from tests.util.rpc import validate_get_routes -from tests.util.setup_nodes import OldSimulatorsAndWallets, SimulatorsAndWalletsServices -from tests.util.time_out_assert import time_out_assert, time_out_assert_not_none async def get_proposal_state(wallet: DAOWallet, index: int) -> Tuple[Optional[bool], Optional[bool]]: diff --git a/tests/wallet/db_wallet/__init__.py b/chia/_tests/wallet/db_wallet/__init__.py similarity index 100% rename from tests/wallet/db_wallet/__init__.py rename to chia/_tests/wallet/db_wallet/__init__.py diff --git a/tests/wallet/db_wallet/config.py b/chia/_tests/wallet/db_wallet/config.py similarity index 100% rename from tests/wallet/db_wallet/config.py rename to chia/_tests/wallet/db_wallet/config.py diff --git a/tests/wallet/db_wallet/test_db_graftroot.py b/chia/_tests/wallet/db_wallet/test_db_graftroot.py similarity index 100% rename from tests/wallet/db_wallet/test_db_graftroot.py rename to chia/_tests/wallet/db_wallet/test_db_graftroot.py diff --git a/tests/wallet/db_wallet/test_dl_offers.py b/chia/_tests/wallet/db_wallet/test_dl_offers.py similarity index 99% rename from tests/wallet/db_wallet/test_dl_offers.py rename to chia/_tests/wallet/db_wallet/test_dl_offers.py index c35bf4f33d4e..115cdbcdd358 100644 --- a/tests/wallet/db_wallet/test_dl_offers.py +++ b/chia/_tests/wallet/db_wallet/test_dl_offers.py @@ -4,6 +4,8 @@ import pytest +from chia._tests.conftest import ConsensusMode +from chia._tests.util.time_out_assert import time_out_assert from chia.data_layer.data_layer_wallet import DataLayerWallet from chia.types.blockchain_format.sized_bytes import bytes32 from chia.util.ints import uint64 @@ -13,8 +15,6 @@ from chia.wallet.trading.trade_status import TradeStatus from chia.wallet.util.merkle_utils import build_merkle_tree, simplify_merkle_proof from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG -from tests.conftest import ConsensusMode -from tests.util.time_out_assert import time_out_assert async def is_singleton_confirmed_and_root(dl_wallet: DataLayerWallet, lid: bytes32, root: bytes32) -> bool: diff --git a/tests/wallet/db_wallet/test_dl_wallet.py b/chia/_tests/wallet/db_wallet/test_dl_wallet.py similarity index 99% rename from tests/wallet/db_wallet/test_dl_wallet.py rename to chia/_tests/wallet/db_wallet/test_dl_wallet.py index 3571e759d2d1..2326e5624540 100644 --- a/tests/wallet/db_wallet/test_dl_wallet.py +++ b/chia/_tests/wallet/db_wallet/test_dl_wallet.py @@ -6,6 +6,9 @@ import pytest +from chia._tests.conftest import ConsensusMode +from chia._tests.util.setup_nodes import OldSimulatorsAndWallets +from chia._tests.util.time_out_assert import time_out_assert from chia.data_layer.data_layer_errors import LauncherCoinNotFoundError from chia.data_layer.data_layer_wallet import DataLayerWallet, Mirror from chia.simulator.simulator_protocol import FarmNewBlockProtocol @@ -18,9 +21,6 @@ from chia.wallet.db_wallet.db_wallet_puzzles import create_mirror_puzzle from chia.wallet.util.merkle_tree import MerkleTree from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG -from tests.conftest import ConsensusMode -from tests.util.setup_nodes import OldSimulatorsAndWallets -from tests.util.time_out_assert import time_out_assert pytestmark = pytest.mark.data_layer diff --git a/tests/wallet/did_wallet/__init__.py b/chia/_tests/wallet/did_wallet/__init__.py similarity index 100% rename from tests/wallet/did_wallet/__init__.py rename to chia/_tests/wallet/did_wallet/__init__.py diff --git a/tests/wallet/did_wallet/config.py b/chia/_tests/wallet/did_wallet/config.py similarity index 100% rename from tests/wallet/did_wallet/config.py rename to chia/_tests/wallet/did_wallet/config.py diff --git a/tests/wallet/did_wallet/test_did.py b/chia/_tests/wallet/did_wallet/test_did.py similarity index 99% rename from tests/wallet/did_wallet/test_did.py rename to chia/_tests/wallet/did_wallet/test_did.py index 344bef381b44..183d784d05c4 100644 --- a/tests/wallet/did_wallet/test_did.py +++ b/chia/_tests/wallet/did_wallet/test_did.py @@ -7,6 +7,9 @@ import pytest from chia_rs import AugSchemeMPL, G1Element, G2Element +from chia._tests.environments.wallet import WalletStateTransition, WalletTestFramework +from chia._tests.util.setup_nodes import OldSimulatorsAndWallets +from chia._tests.util.time_out_assert import time_out_assert, time_out_assert_not_none from chia.rpc.wallet_rpc_api import WalletRpcApi from chia.simulator.simulator_protocol import FarmNewBlockProtocol from chia.types.blockchain_format.program import Program @@ -23,9 +26,6 @@ from chia.wallet.util.address_type import AddressType from chia.wallet.util.tx_config import DEFAULT_COIN_SELECTION_CONFIG, DEFAULT_TX_CONFIG from chia.wallet.util.wallet_types import WalletType -from tests.environments.wallet import WalletStateTransition, WalletTestFramework -from tests.util.setup_nodes import OldSimulatorsAndWallets -from tests.util.time_out_assert import time_out_assert, time_out_assert_not_none async def get_wallet_num(wallet_manager): diff --git a/tests/wallet/nft_wallet/__init__.py b/chia/_tests/wallet/nft_wallet/__init__.py similarity index 100% rename from tests/wallet/nft_wallet/__init__.py rename to chia/_tests/wallet/nft_wallet/__init__.py diff --git a/tests/wallet/nft_wallet/config.py b/chia/_tests/wallet/nft_wallet/config.py similarity index 100% rename from tests/wallet/nft_wallet/config.py rename to chia/_tests/wallet/nft_wallet/config.py diff --git a/tests/wallet/nft_wallet/test_nft_1_offers.py b/chia/_tests/wallet/nft_wallet/test_nft_1_offers.py similarity index 99% rename from tests/wallet/nft_wallet/test_nft_1_offers.py rename to chia/_tests/wallet/nft_wallet/test_nft_1_offers.py index 2d99ba4c0ad9..efda9806f53f 100644 --- a/tests/wallet/nft_wallet/test_nft_1_offers.py +++ b/chia/_tests/wallet/nft_wallet/test_nft_1_offers.py @@ -7,6 +7,8 @@ import pytest +from chia._tests.conftest import ConsensusMode +from chia._tests.util.time_out_assert import time_out_assert, time_out_assert_not_none from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward from chia.simulator.full_node_simulator import FullNodeSimulator from chia.simulator.simulator_protocol import FarmNewBlockProtocol @@ -25,8 +27,6 @@ from chia.wallet.util.compute_memos import compute_memos from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG from chia.wallet.wallet_node import WalletNode -from tests.conftest import ConsensusMode -from tests.util.time_out_assert import time_out_assert, time_out_assert_not_none # from clvm_tools.binutils import disassemble diff --git a/tests/wallet/nft_wallet/test_nft_bulk_mint.py b/chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py similarity index 99% rename from tests/wallet/nft_wallet/test_nft_bulk_mint.py rename to chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py index 520bd29fe2bc..dbe2d8623764 100644 --- a/tests/wallet/nft_wallet/test_nft_bulk_mint.py +++ b/chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py @@ -5,6 +5,8 @@ import pytest +from chia._tests.util.setup_nodes import SimulatorsAndWalletsServices +from chia._tests.util.time_out_assert import time_out_assert, time_out_assert_not_none from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward from chia.rpc.full_node_rpc_client import FullNodeRpcClient from chia.rpc.wallet_rpc_api import WalletRpcApi @@ -22,8 +24,6 @@ from chia.wallet.nft_wallet.uncurry_nft import UncurriedNFT from chia.wallet.util.address_type import AddressType from chia.wallet.util.tx_config import DEFAULT_COIN_SELECTION_CONFIG, DEFAULT_TX_CONFIG -from tests.util.setup_nodes import SimulatorsAndWalletsServices -from tests.util.time_out_assert import time_out_assert, time_out_assert_not_none async def nft_count(wallet: NFTWallet) -> int: diff --git a/tests/wallet/nft_wallet/test_nft_lifecycle.py b/chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py similarity index 100% rename from tests/wallet/nft_wallet/test_nft_lifecycle.py rename to chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py diff --git a/tests/wallet/nft_wallet/test_nft_offers.py b/chia/_tests/wallet/nft_wallet/test_nft_offers.py similarity index 99% rename from tests/wallet/nft_wallet/test_nft_offers.py rename to chia/_tests/wallet/nft_wallet/test_nft_offers.py index 316235cf56da..3da8addc45d9 100644 --- a/tests/wallet/nft_wallet/test_nft_offers.py +++ b/chia/_tests/wallet/nft_wallet/test_nft_offers.py @@ -5,6 +5,9 @@ import pytest +from chia._tests.conftest import ConsensusMode +from chia._tests.util.time_out_assert import time_out_assert, time_out_assert_not_none +from chia._tests.wallet.nft_wallet.test_nft_1_offers import mempool_not_empty from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward from chia.simulator.full_node_simulator import FullNodeSimulator from chia.simulator.simulator_protocol import FarmNewBlockProtocol @@ -21,9 +24,6 @@ from chia.wallet.uncurried_puzzle import uncurry_puzzle from chia.wallet.util.debug_spend_bundle import disassemble from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG -from tests.conftest import ConsensusMode -from tests.util.time_out_assert import time_out_assert, time_out_assert_not_none -from tests.wallet.nft_wallet.test_nft_1_offers import mempool_not_empty async def get_trade_and_status(trade_manager, trade) -> TradeStatus: # type: ignore diff --git a/tests/wallet/nft_wallet/test_nft_puzzles.py b/chia/_tests/wallet/nft_wallet/test_nft_puzzles.py similarity index 99% rename from tests/wallet/nft_wallet/test_nft_puzzles.py rename to chia/_tests/wallet/nft_wallet/test_nft_puzzles.py index a79b3cbb9fcb..602e733dad56 100644 --- a/tests/wallet/nft_wallet/test_nft_puzzles.py +++ b/chia/_tests/wallet/nft_wallet/test_nft_puzzles.py @@ -3,6 +3,7 @@ import random from typing import Tuple +from chia._tests.core.make_block_generator import int_to_public_key from chia.types.blockchain_format.program import Program from chia.types.blockchain_format.sized_bytes import bytes32 from chia.wallet.nft_wallet import uncurry_nft @@ -16,7 +17,6 @@ from chia.wallet.puzzles.load_clvm import load_clvm from chia.wallet.puzzles.p2_delegated_puzzle_or_hidden_puzzle import puzzle_for_pk, solution_for_conditions from chia.wallet.uncurried_puzzle import uncurry_puzzle -from tests.core.make_block_generator import int_to_public_key SINGLETON_MOD = load_clvm("singleton_top_layer_v1_1.clsp") LAUNCHER_PUZZLE = load_clvm("singleton_launcher.clsp") diff --git a/tests/wallet/nft_wallet/test_nft_wallet.py b/chia/_tests/wallet/nft_wallet/test_nft_wallet.py similarity index 99% rename from tests/wallet/nft_wallet/test_nft_wallet.py rename to chia/_tests/wallet/nft_wallet/test_nft_wallet.py index d0d943cfec89..a8dbf6d732fb 100644 --- a/tests/wallet/nft_wallet/test_nft_wallet.py +++ b/chia/_tests/wallet/nft_wallet/test_nft_wallet.py @@ -8,6 +8,10 @@ from chia_rs import AugSchemeMPL, G1Element, G2Element from clvm_tools.binutils import disassemble +from chia._tests.conftest import ConsensusMode +from chia._tests.environments.wallet import WalletStateTransition, WalletTestFramework +from chia._tests.util.setup_nodes import OldSimulatorsAndWallets +from chia._tests.util.time_out_assert import time_out_assert, time_out_assert_not_none from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward from chia.rpc.wallet_rpc_api import WalletRpcApi from chia.simulator.full_node_simulator import FullNodeSimulator @@ -31,10 +35,6 @@ from chia.wallet.util.wallet_types import WalletType from chia.wallet.wallet_node import WalletNode from chia.wallet.wallet_state_manager import WalletStateManager -from tests.conftest import ConsensusMode -from tests.environments.wallet import WalletStateTransition, WalletTestFramework -from tests.util.setup_nodes import OldSimulatorsAndWallets -from tests.util.time_out_assert import time_out_assert, time_out_assert_not_none async def get_nft_count(wallet: NFTWallet) -> int: diff --git a/tests/wallet/nft_wallet/test_ownership_outer_puzzle.py b/chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py similarity index 100% rename from tests/wallet/nft_wallet/test_ownership_outer_puzzle.py rename to chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py diff --git a/tests/wallet/rpc/__init__.py b/chia/_tests/wallet/rpc/__init__.py similarity index 100% rename from tests/wallet/rpc/__init__.py rename to chia/_tests/wallet/rpc/__init__.py diff --git a/tests/wallet/rpc/config.py b/chia/_tests/wallet/rpc/config.py similarity index 100% rename from tests/wallet/rpc/config.py rename to chia/_tests/wallet/rpc/config.py diff --git a/tests/wallet/rpc/test_dl_wallet_rpc.py b/chia/_tests/wallet/rpc/test_dl_wallet_rpc.py similarity index 98% rename from tests/wallet/rpc/test_dl_wallet_rpc.py rename to chia/_tests/wallet/rpc/test_dl_wallet_rpc.py index 7dac81557a2f..b9e15b4b69ce 100644 --- a/tests/wallet/rpc/test_dl_wallet_rpc.py +++ b/chia/_tests/wallet/rpc/test_dl_wallet_rpc.py @@ -5,6 +5,10 @@ import pytest +from chia._tests.conftest import ConsensusMode +from chia._tests.util.rpc import validate_get_routes +from chia._tests.util.setup_nodes import SimulatorsAndWalletsServices +from chia._tests.util.time_out_assert import time_out_assert from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward from chia.data_layer.data_layer_util import DLProof, HashOnlyProof, ProofLayer, StoreProofsHashes from chia.data_layer.data_layer_wallet import Mirror @@ -14,10 +18,6 @@ from chia.types.peer_info import PeerInfo from chia.util.ints import uint8, uint32, uint64 from chia.wallet.db_wallet.db_wallet_puzzles import create_mirror_puzzle -from tests.conftest import ConsensusMode -from tests.util.rpc import validate_get_routes -from tests.util.setup_nodes import SimulatorsAndWalletsServices -from tests.util.time_out_assert import time_out_assert log = logging.getLogger(__name__) diff --git a/tests/wallet/rpc/test_wallet_rpc.py b/chia/_tests/wallet/rpc/test_wallet_rpc.py similarity index 99% rename from tests/wallet/rpc/test_wallet_rpc.py rename to chia/_tests/wallet/rpc/test_wallet_rpc.py index 1b8db0a9ad5d..064484c9aa2b 100644 --- a/tests/wallet/rpc/test_wallet_rpc.py +++ b/chia/_tests/wallet/rpc/test_wallet_rpc.py @@ -12,6 +12,34 @@ import pytest from chia_rs import G2Element +from chia._tests.conftest import ConsensusMode +from chia._tests.util.time_out_assert import time_out_assert, time_out_assert_not_none +from chia._tests.wallet.test_wallet_coin_store import ( + get_coin_records_amount_filter_tests, + get_coin_records_amount_range_tests, + get_coin_records_coin_id_filter_tests, + get_coin_records_coin_type_tests, + get_coin_records_confirmed_range_tests, + get_coin_records_include_total_count_tests, + get_coin_records_mixed_tests, + get_coin_records_offset_limit_tests, + get_coin_records_order_tests, + get_coin_records_parent_coin_id_filter_tests, + get_coin_records_puzzle_hash_filter_tests, + get_coin_records_reverse_tests, + get_coin_records_spent_range_tests, + get_coin_records_wallet_id_tests, + get_coin_records_wallet_type_tests, + record_1, + record_2, + record_3, + record_4, + record_5, + record_6, + record_7, + record_8, + record_9, +) from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward from chia.consensus.coinbase import create_puzzlehash_for_pk from chia.rpc.full_node_rpc_client import FullNodeRpcClient @@ -59,34 +87,6 @@ from chia.wallet.wallet_coin_store import GetCoinRecords from chia.wallet.wallet_node import WalletNode from chia.wallet.wallet_protocol import WalletProtocol -from tests.conftest import ConsensusMode -from tests.util.time_out_assert import time_out_assert, time_out_assert_not_none -from tests.wallet.test_wallet_coin_store import ( - get_coin_records_amount_filter_tests, - get_coin_records_amount_range_tests, - get_coin_records_coin_id_filter_tests, - get_coin_records_coin_type_tests, - get_coin_records_confirmed_range_tests, - get_coin_records_include_total_count_tests, - get_coin_records_mixed_tests, - get_coin_records_offset_limit_tests, - get_coin_records_order_tests, - get_coin_records_parent_coin_id_filter_tests, - get_coin_records_puzzle_hash_filter_tests, - get_coin_records_reverse_tests, - get_coin_records_spent_range_tests, - get_coin_records_wallet_id_tests, - get_coin_records_wallet_type_tests, - record_1, - record_2, - record_3, - record_4, - record_5, - record_6, - record_7, - record_8, - record_9, -) log = logging.getLogger(__name__) diff --git a/tests/wallet/simple_sync/__init__.py b/chia/_tests/wallet/simple_sync/__init__.py similarity index 100% rename from tests/wallet/simple_sync/__init__.py rename to chia/_tests/wallet/simple_sync/__init__.py diff --git a/tests/wallet/simple_sync/config.py b/chia/_tests/wallet/simple_sync/config.py similarity index 100% rename from tests/wallet/simple_sync/config.py rename to chia/_tests/wallet/simple_sync/config.py diff --git a/tests/wallet/simple_sync/test_simple_sync_protocol.py b/chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py similarity index 99% rename from tests/wallet/simple_sync/test_simple_sync_protocol.py rename to chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py index f1b77b2f0871..da3cffde0bce 100644 --- a/tests/wallet/simple_sync/test_simple_sync_protocol.py +++ b/chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py @@ -7,6 +7,9 @@ from clvm.casts import int_to_bytes from colorlog import getLogger +from chia._tests.connection_utils import add_dummy_connection +from chia._tests.util.setup_nodes import OldSimulatorsAndWallets +from chia._tests.util.time_out_assert import time_out_assert from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward from chia.protocols import wallet_protocol from chia.protocols.full_node_protocol import RespondTransaction @@ -22,9 +25,6 @@ from chia.util.ints import uint32, uint64 from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG from chia.wallet.wallet import Wallet -from tests.connection_utils import add_dummy_connection -from tests.util.setup_nodes import OldSimulatorsAndWallets -from tests.util.time_out_assert import time_out_assert log = getLogger(__name__) diff --git a/tests/wallet/sync/__init__.py b/chia/_tests/wallet/sync/__init__.py similarity index 100% rename from tests/wallet/sync/__init__.py rename to chia/_tests/wallet/sync/__init__.py diff --git a/tests/wallet/sync/config.py b/chia/_tests/wallet/sync/config.py similarity index 100% rename from tests/wallet/sync/config.py rename to chia/_tests/wallet/sync/config.py diff --git a/tests/wallet/sync/test_wallet_sync.py b/chia/_tests/wallet/sync/test_wallet_sync.py similarity index 99% rename from tests/wallet/sync/test_wallet_sync.py rename to chia/_tests/wallet/sync/test_wallet_sync.py index aa33fd1c5b83..4245ede7f02e 100644 --- a/tests/wallet/sync/test_wallet_sync.py +++ b/chia/_tests/wallet/sync/test_wallet_sync.py @@ -11,6 +11,11 @@ from aiosqlite import Error as AIOSqliteError from colorlog import getLogger +from chia._tests.connection_utils import disconnect_all, disconnect_all_and_reconnect +from chia._tests.util.misc import wallet_height_at_least +from chia._tests.util.setup_nodes import OldSimulatorsAndWallets +from chia._tests.util.time_out_assert import time_out_assert, time_out_assert_not_none +from chia._tests.weight_proof.test_weight_proof import load_blocks_dont_validate from chia.consensus.block_record import BlockRecord from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward from chia.consensus.constants import ConsensusConstants @@ -44,11 +49,6 @@ from chia.wallet.util.wallet_types import WalletIdentifier from chia.wallet.wallet_state_manager import WalletStateManager from chia.wallet.wallet_weight_proof_handler import get_wp_fork_point -from tests.connection_utils import disconnect_all, disconnect_all_and_reconnect -from tests.util.misc import wallet_height_at_least -from tests.util.setup_nodes import OldSimulatorsAndWallets -from tests.util.time_out_assert import time_out_assert, time_out_assert_not_none -from tests.weight_proof.test_weight_proof import load_blocks_dont_validate async def get_tx_count(wsm: WalletStateManager, wallet_id: int) -> int: diff --git a/tests/wallet/test_address_type.py b/chia/_tests/wallet/test_address_type.py similarity index 100% rename from tests/wallet/test_address_type.py rename to chia/_tests/wallet/test_address_type.py diff --git a/tests/wallet/test_bech32m.py b/chia/_tests/wallet/test_bech32m.py similarity index 100% rename from tests/wallet/test_bech32m.py rename to chia/_tests/wallet/test_bech32m.py diff --git a/tests/wallet/test_chialisp.py b/chia/_tests/wallet/test_chialisp.py similarity index 100% rename from tests/wallet/test_chialisp.py rename to chia/_tests/wallet/test_chialisp.py diff --git a/tests/wallet/test_coin_selection.py b/chia/_tests/wallet/test_coin_selection.py similarity index 100% rename from tests/wallet/test_coin_selection.py rename to chia/_tests/wallet/test_coin_selection.py diff --git a/tests/wallet/test_conditions.py b/chia/_tests/wallet/test_conditions.py similarity index 100% rename from tests/wallet/test_conditions.py rename to chia/_tests/wallet/test_conditions.py diff --git a/tests/wallet/test_debug_spend_bundle.py b/chia/_tests/wallet/test_debug_spend_bundle.py similarity index 100% rename from tests/wallet/test_debug_spend_bundle.py rename to chia/_tests/wallet/test_debug_spend_bundle.py diff --git a/tests/wallet/test_nft_store.py b/chia/_tests/wallet/test_nft_store.py similarity index 99% rename from tests/wallet/test_nft_store.py rename to chia/_tests/wallet/test_nft_store.py index 723fac038fd6..be2fa7bcfc1e 100644 --- a/tests/wallet/test_nft_store.py +++ b/chia/_tests/wallet/test_nft_store.py @@ -6,6 +6,7 @@ import pytest +from chia._tests.util.db_connection import DBConnection from chia.types.blockchain_format.coin import Coin from chia.types.blockchain_format.program import Program from chia.types.blockchain_format.sized_bytes import bytes32 @@ -13,7 +14,6 @@ from chia.wallet.lineage_proof import LineageProof from chia.wallet.nft_wallet.nft_info import NFTCoinInfo from chia.wallet.wallet_nft_store import WalletNftStore -from tests.util.db_connection import DBConnection def get_dummy_nft(random_: random.Random) -> NFTCoinInfo: diff --git a/tests/wallet/test_notifications.py b/chia/_tests/wallet/test_notifications.py similarity index 98% rename from tests/wallet/test_notifications.py rename to chia/_tests/wallet/test_notifications.py index 6749a929f043..5cf020b01295 100644 --- a/tests/wallet/test_notifications.py +++ b/chia/_tests/wallet/test_notifications.py @@ -7,6 +7,7 @@ import pytest +from chia._tests.util.time_out_assert import time_out_assert, time_out_assert_not_none from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward from chia.simulator.full_node_simulator import FullNodeSimulator from chia.simulator.simulator_protocol import FarmNewBlockProtocol @@ -16,7 +17,6 @@ from chia.util.ints import uint32, uint64 from chia.wallet.notification_store import NotificationStore from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG -from tests.util.time_out_assert import time_out_assert, time_out_assert_not_none # For testing backwards compatibility with a DB change to add height diff --git a/tests/wallet/test_offer_parsing_performance.py b/chia/_tests/wallet/test_offer_parsing_performance.py similarity index 99% rename from tests/wallet/test_offer_parsing_performance.py rename to chia/_tests/wallet/test_offer_parsing_performance.py index d65a9a4c8fbb..1322f790fab2 100644 --- a/tests/wallet/test_offer_parsing_performance.py +++ b/chia/_tests/wallet/test_offer_parsing_performance.py @@ -4,8 +4,8 @@ from contextlib import contextmanager from typing import Iterator +from chia._tests.util.misc import BenchmarkRunner from chia.wallet.trading.offer import Offer -from tests.util.misc import BenchmarkRunner with_profile = False diff --git a/tests/wallet/test_puzzle_store.py b/chia/_tests/wallet/test_puzzle_store.py similarity index 99% rename from tests/wallet/test_puzzle_store.py rename to chia/_tests/wallet/test_puzzle_store.py index 04f56953a8a8..5e862289ade2 100644 --- a/tests/wallet/test_puzzle_store.py +++ b/chia/_tests/wallet/test_puzzle_store.py @@ -7,12 +7,12 @@ import pytest from chia_rs import AugSchemeMPL +from chia._tests.util.db_connection import DBConnection from chia.types.blockchain_format.sized_bytes import bytes32 from chia.util.ints import uint32 from chia.wallet.derivation_record import DerivationRecord from chia.wallet.util.wallet_types import WalletIdentifier, WalletType from chia.wallet.wallet_puzzle_store import WalletPuzzleStore -from tests.util.db_connection import DBConnection def get_dummy_record(index: int, wallet_id: int, seeded_random: random.Random) -> DerivationRecord: diff --git a/tests/wallet/test_sign_coin_spends.py b/chia/_tests/wallet/test_sign_coin_spends.py similarity index 100% rename from tests/wallet/test_sign_coin_spends.py rename to chia/_tests/wallet/test_sign_coin_spends.py diff --git a/tests/wallet/test_singleton.py b/chia/_tests/wallet/test_singleton.py similarity index 100% rename from tests/wallet/test_singleton.py rename to chia/_tests/wallet/test_singleton.py diff --git a/tests/wallet/test_singleton_lifecycle_fast.py b/chia/_tests/wallet/test_singleton_lifecycle_fast.py similarity index 99% rename from tests/wallet/test_singleton_lifecycle_fast.py rename to chia/_tests/wallet/test_singleton_lifecycle_fast.py index 14df1cbf2786..0b0b8dbcd8c0 100644 --- a/tests/wallet/test_singleton_lifecycle_fast.py +++ b/chia/_tests/wallet/test_singleton_lifecycle_fast.py @@ -6,6 +6,7 @@ from chia_rs import G1Element, G2Element from clvm_tools import binutils +from chia._tests.clvm.coin_store import BadSpendBundleError, CoinStore, CoinTimestamp from chia.consensus.default_constants import DEFAULT_CONSTANTS from chia.types.blockchain_format.coin import Coin from chia.types.blockchain_format.program import Program @@ -19,7 +20,6 @@ from chia.wallet.conditions import AssertCoinAnnouncement from chia.wallet.puzzles.load_clvm import load_clvm from chia.wallet.util.debug_spend_bundle import debug_spend_bundle -from tests.clvm.coin_store import BadSpendBundleError, CoinStore, CoinTimestamp SINGLETON_MOD = load_clvm("singleton_top_layer.clsp") LAUNCHER_PUZZLE = load_clvm("singleton_launcher.clsp") diff --git a/tests/wallet/test_singleton_store.py b/chia/_tests/wallet/test_singleton_store.py similarity index 99% rename from tests/wallet/test_singleton_store.py rename to chia/_tests/wallet/test_singleton_store.py index fbacc5ff74cb..6b88fd334375 100644 --- a/tests/wallet/test_singleton_store.py +++ b/chia/_tests/wallet/test_singleton_store.py @@ -5,6 +5,7 @@ import pytest +from chia._tests.util.db_connection import DBConnection from chia.types.blockchain_format.coin import Coin from chia.types.blockchain_format.program import Program from chia.types.blockchain_format.sized_bytes import bytes32 @@ -16,7 +17,6 @@ from chia.wallet.singleton import create_singleton_puzzle from chia.wallet.singleton_record import SingletonRecord from chia.wallet.wallet_singleton_store import WalletSingletonStore -from tests.util.db_connection import DBConnection def get_record(wallet_id: uint32 = uint32(2)) -> SingletonRecord: diff --git a/tests/wallet/test_taproot.py b/chia/_tests/wallet/test_taproot.py similarity index 90% rename from tests/wallet/test_taproot.py rename to chia/_tests/wallet/test_taproot.py index 59213059bb2a..ad1fe257a6a6 100644 --- a/tests/wallet/test_taproot.py +++ b/chia/_tests/wallet/test_taproot.py @@ -1,11 +1,11 @@ from __future__ import annotations +from chia._tests.core.make_block_generator import int_to_public_key from chia.wallet.puzzles.p2_delegated_puzzle_or_hidden_puzzle import ( DEFAULT_HIDDEN_PUZZLE, calculate_synthetic_offset, calculate_synthetic_public_key, ) -from tests.core.make_block_generator import int_to_public_key def test_1(): diff --git a/tests/wallet/test_transaction_store.py b/chia/_tests/wallet/test_transaction_store.py similarity index 99% rename from tests/wallet/test_transaction_store.py rename to chia/_tests/wallet/test_transaction_store.py index 685cde6b957a..f62d96c597a1 100644 --- a/tests/wallet/test_transaction_store.py +++ b/chia/_tests/wallet/test_transaction_store.py @@ -6,6 +6,7 @@ import pytest +from chia._tests.util.db_connection import DBConnection from chia.types.blockchain_format.coin import Coin from chia.types.blockchain_format.sized_bytes import bytes32 from chia.types.mempool_inclusion_status import MempoolInclusionStatus @@ -16,7 +17,6 @@ from chia.wallet.util.query_filter import TransactionTypeFilter from chia.wallet.util.transaction_type import TransactionType from chia.wallet.wallet_transaction_store import WalletTransactionStore, filter_ok_mempool_status -from tests.util.db_connection import DBConnection module_seeded_random = random.Random() module_seeded_random.seed(a=0, version=2) diff --git a/tests/wallet/test_util.py b/chia/_tests/wallet/test_util.py similarity index 99% rename from tests/wallet/test_util.py rename to chia/_tests/wallet/test_util.py index 17887a5c7993..1b4a1c559a50 100644 --- a/tests/wallet/test_util.py +++ b/chia/_tests/wallet/test_util.py @@ -4,6 +4,7 @@ import pytest +from chia._tests.util.misc import CoinGenerator, coin_creation_args from chia.consensus.default_constants import DEFAULT_CONSTANTS from chia.types.blockchain_format.coin import Coin from chia.types.blockchain_format.program import Program @@ -20,7 +21,6 @@ CoinSelectionConfigLoader, TXConfigLoader, ) -from tests.util.misc import CoinGenerator, coin_creation_args def test_compute_spend_hints_and_additions() -> None: diff --git a/tests/wallet/test_wallet.py b/chia/_tests/wallet/test_wallet.py similarity index 99% rename from tests/wallet/test_wallet.py rename to chia/_tests/wallet/test_wallet.py index 852234fa4e07..6bee2cf085a8 100644 --- a/tests/wallet/test_wallet.py +++ b/chia/_tests/wallet/test_wallet.py @@ -10,6 +10,8 @@ import pytest from chia_rs import AugSchemeMPL, G1Element, G2Element +from chia._tests.conftest import ConsensusMode +from chia._tests.util.time_out_assert import time_out_assert, time_out_assert_not_none from chia.rpc.wallet_rpc_api import WalletRpcApi from chia.server.server import ChiaServer from chia.simulator.block_tools import BlockTools @@ -34,8 +36,6 @@ from chia.wallet.util.wallet_types import CoinType from chia.wallet.wallet_node import WalletNode, get_wallet_db_path from chia.wallet.wallet_state_manager import WalletStateManager -from tests.conftest import ConsensusMode -from tests.util.time_out_assert import time_out_assert, time_out_assert_not_none class TestWalletSimulator: diff --git a/tests/wallet/test_wallet_blockchain.py b/chia/_tests/wallet/test_wallet_blockchain.py similarity index 96% rename from tests/wallet/test_wallet_blockchain.py rename to chia/_tests/wallet/test_wallet_blockchain.py index 6775fcda3997..17b6bafb8af3 100644 --- a/tests/wallet/test_wallet_blockchain.py +++ b/chia/_tests/wallet/test_wallet_blockchain.py @@ -5,6 +5,9 @@ import pytest +from chia._tests.conftest import ConsensusMode +from chia._tests.util.db_connection import DBConnection +from chia._tests.util.setup_nodes import OldSimulatorsAndWallets from chia.consensus.blockchain import AddBlockResult from chia.protocols import full_node_protocol from chia.types.blockchain_format.vdf import VDFProof @@ -16,9 +19,6 @@ from chia.util.misc import to_batches from chia.wallet.key_val_store import KeyValStore from chia.wallet.wallet_blockchain import WalletBlockchain -from tests.conftest import ConsensusMode -from tests.util.db_connection import DBConnection -from tests.util.setup_nodes import OldSimulatorsAndWallets @pytest.mark.limit_consensus_modes(allowed=[ConsensusMode.PLAIN, ConsensusMode.HARD_FORK_2_0], reason="save time") diff --git a/tests/wallet/test_wallet_coin_store.py b/chia/_tests/wallet/test_wallet_coin_store.py similarity index 99% rename from tests/wallet/test_wallet_coin_store.py rename to chia/_tests/wallet/test_wallet_coin_store.py index 0082466eb6f5..c2c3ee1ecfd8 100644 --- a/tests/wallet/test_wallet_coin_store.py +++ b/chia/_tests/wallet/test_wallet_coin_store.py @@ -6,6 +6,7 @@ import pytest +from chia._tests.util.db_connection import DBConnection from chia.types.blockchain_format.coin import Coin from chia.types.blockchain_format.sized_bytes import bytes32 from chia.util.ints import uint8, uint16, uint32, uint64 @@ -16,7 +17,6 @@ from chia.wallet.util.wallet_types import CoinType, WalletType from chia.wallet.wallet_coin_record import WalletCoinRecord from chia.wallet.wallet_coin_store import CoinRecordOrder, GetCoinRecords, GetCoinRecordsResult, WalletCoinStore -from tests.util.db_connection import DBConnection clawback_metadata = ClawbackMetadata(uint64(0), bytes32(b"1" * 32), bytes32(b"2" * 32)) diff --git a/tests/wallet/test_wallet_interested_store.py b/chia/_tests/wallet/test_wallet_interested_store.py similarity index 97% rename from tests/wallet/test_wallet_interested_store.py rename to chia/_tests/wallet/test_wallet_interested_store.py index 71caad376abd..15a1da9f5ed1 100644 --- a/tests/wallet/test_wallet_interested_store.py +++ b/chia/_tests/wallet/test_wallet_interested_store.py @@ -4,11 +4,11 @@ import pytest +from chia._tests.util.db_connection import DBConnection from chia.types.blockchain_format.coin import Coin from chia.types.blockchain_format.sized_bytes import bytes32 from chia.util.ints import uint64 from chia.wallet.wallet_interested_store import WalletInterestedStore -from tests.util.db_connection import DBConnection class TestWalletInterestedStore: diff --git a/tests/wallet/test_wallet_key_val_store.py b/chia/_tests/wallet/test_wallet_key_val_store.py similarity index 96% rename from tests/wallet/test_wallet_key_val_store.py rename to chia/_tests/wallet/test_wallet_key_val_store.py index 60ad78e9709b..511e438e5b19 100644 --- a/tests/wallet/test_wallet_key_val_store.py +++ b/chia/_tests/wallet/test_wallet_key_val_store.py @@ -2,10 +2,10 @@ import pytest +from chia._tests.util.db_connection import DBConnection from chia.types.full_block import FullBlock from chia.types.header_block import HeaderBlock from chia.wallet.key_val_store import KeyValStore -from tests.util.db_connection import DBConnection class TestWalletKeyValStore: diff --git a/tests/wallet/test_wallet_node.py b/chia/_tests/wallet/test_wallet_node.py similarity index 99% rename from tests/wallet/test_wallet_node.py rename to chia/_tests/wallet/test_wallet_node.py index 92c0c234ce79..1c58dfd79873 100644 --- a/tests/wallet/test_wallet_node.py +++ b/chia/_tests/wallet/test_wallet_node.py @@ -10,6 +10,10 @@ import pytest +from chia._tests.conftest import ConsensusMode +from chia._tests.util.misc import CoinGenerator +from chia._tests.util.setup_nodes import OldSimulatorsAndWallets +from chia._tests.util.time_out_assert import time_out_assert from chia.protocols import wallet_protocol from chia.protocols.protocol_message_types import ProtocolMessageTypes from chia.protocols.wallet_protocol import CoinState @@ -27,10 +31,6 @@ from chia.util.misc import to_batches from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG from chia.wallet.wallet_node import Balance, WalletNode -from tests.conftest import ConsensusMode -from tests.util.misc import CoinGenerator -from tests.util.setup_nodes import OldSimulatorsAndWallets -from tests.util.time_out_assert import time_out_assert @pytest.mark.anyio diff --git a/tests/wallet/test_wallet_retry.py b/chia/_tests/wallet/test_wallet_retry.py similarity index 97% rename from tests/wallet/test_wallet_retry.py rename to chia/_tests/wallet/test_wallet_retry.py index ba08f1c0a873..7c1a18c77145 100644 --- a/tests/wallet/test_wallet_retry.py +++ b/chia/_tests/wallet/test_wallet_retry.py @@ -5,6 +5,7 @@ import pytest +from chia._tests.util.time_out_assert import time_out_assert, time_out_assert_custom_interval from chia.full_node.full_node_api import FullNodeAPI from chia.full_node.mempool import MempoolRemoveReason from chia.simulator.block_tools import BlockTools @@ -17,7 +18,6 @@ from chia.wallet.transaction_record import TransactionRecord from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG from chia.wallet.wallet_node import WalletNode -from tests.util.time_out_assert import time_out_assert, time_out_assert_custom_interval async def farm_blocks(full_node_api: FullNodeSimulator, ph: bytes32, num_blocks: int) -> int: diff --git a/tests/wallet/test_wallet_state_manager.py b/chia/_tests/wallet/test_wallet_state_manager.py similarity index 98% rename from tests/wallet/test_wallet_state_manager.py rename to chia/_tests/wallet/test_wallet_state_manager.py index 125aed0a0310..23a7031eb739 100644 --- a/tests/wallet/test_wallet_state_manager.py +++ b/chia/_tests/wallet/test_wallet_state_manager.py @@ -5,6 +5,7 @@ import pytest +from chia._tests.util.setup_nodes import OldSimulatorsAndWallets from chia.protocols.wallet_protocol import CoinState from chia.server.outbound_message import NodeType from chia.types.blockchain_format.coin import Coin @@ -15,7 +16,6 @@ from chia.wallet.derive_keys import master_sk_to_wallet_sk, master_sk_to_wallet_sk_unhardened from chia.wallet.util.wallet_types import WalletType from chia.wallet.wallet_state_manager import WalletStateManager -from tests.util.setup_nodes import OldSimulatorsAndWallets @asynccontextmanager diff --git a/tests/wallet/test_wallet_test_framework.py b/chia/_tests/wallet/test_wallet_test_framework.py similarity index 99% rename from tests/wallet/test_wallet_test_framework.py rename to chia/_tests/wallet/test_wallet_test_framework.py index 4cc1984cf7ba..e7cb7ad731af 100644 --- a/tests/wallet/test_wallet_test_framework.py +++ b/chia/_tests/wallet/test_wallet_test_framework.py @@ -2,13 +2,13 @@ import pytest -from chia.wallet.cat_wallet.cat_wallet import CATWallet -from tests.environments.wallet import ( +from chia._tests.environments.wallet import ( BalanceCheckingError, WalletEnvironment, WalletStateTransition, WalletTestFramework, ) +from chia.wallet.cat_wallet.cat_wallet import CATWallet @pytest.mark.parametrize( diff --git a/tests/wallet/test_wallet_trade_store.py b/chia/_tests/wallet/test_wallet_trade_store.py similarity index 99% rename from tests/wallet/test_wallet_trade_store.py rename to chia/_tests/wallet/test_wallet_trade_store.py index 6bc3a7285f81..1c8cca94e138 100644 --- a/tests/wallet/test_wallet_trade_store.py +++ b/chia/_tests/wallet/test_wallet_trade_store.py @@ -6,6 +6,7 @@ import pytest from chia_rs import G2Element +from chia._tests.util.db_connection import DBConnection from chia.types.blockchain_format.coin import Coin from chia.types.blockchain_format.sized_bytes import bytes32 from chia.types.spend_bundle import SpendBundle @@ -18,7 +19,6 @@ from chia.wallet.util.wallet_types import WalletType from chia.wallet.wallet_coin_record import WalletCoinRecord from chia.wallet.wallet_coin_store import WalletCoinStore -from tests.util.db_connection import DBConnection module_seeded_random = random.Random() module_seeded_random.seed(a=0, version=2) diff --git a/tests/wallet/test_wallet_user_store.py b/chia/_tests/wallet/test_wallet_user_store.py similarity index 95% rename from tests/wallet/test_wallet_user_store.py rename to chia/_tests/wallet/test_wallet_user_store.py index abd8e11f5dda..e0fdd6237803 100644 --- a/tests/wallet/test_wallet_user_store.py +++ b/chia/_tests/wallet/test_wallet_user_store.py @@ -2,9 +2,9 @@ import pytest +from chia._tests.util.db_connection import DBConnection from chia.wallet.util.wallet_types import WalletType from chia.wallet.wallet_user_store import WalletUserStore -from tests.util.db_connection import DBConnection @pytest.mark.anyio diff --git a/tests/wallet/test_wallet_utils.py b/chia/_tests/wallet/test_wallet_utils.py similarity index 100% rename from tests/wallet/test_wallet_utils.py rename to chia/_tests/wallet/test_wallet_utils.py diff --git a/tests/wallet/vc_wallet/__init__.py b/chia/_tests/wallet/vc_wallet/__init__.py similarity index 100% rename from tests/wallet/vc_wallet/__init__.py rename to chia/_tests/wallet/vc_wallet/__init__.py diff --git a/tests/wallet/vc_wallet/config.py b/chia/_tests/wallet/vc_wallet/config.py similarity index 100% rename from tests/wallet/vc_wallet/config.py rename to chia/_tests/wallet/vc_wallet/config.py diff --git a/tests/wallet/vc_wallet/test_cr_outer_puzzle.py b/chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py similarity index 100% rename from tests/wallet/vc_wallet/test_cr_outer_puzzle.py rename to chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py diff --git a/tests/wallet/vc_wallet/test_vc_lifecycle.py b/chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py similarity index 100% rename from tests/wallet/vc_wallet/test_vc_lifecycle.py rename to chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py diff --git a/tests/wallet/vc_wallet/test_vc_wallet.py b/chia/_tests/wallet/vc_wallet/test_vc_wallet.py similarity index 99% rename from tests/wallet/vc_wallet/test_vc_wallet.py rename to chia/_tests/wallet/vc_wallet/test_vc_wallet.py index 82a875d0c24b..6059e1c9100f 100644 --- a/tests/wallet/vc_wallet/test_vc_wallet.py +++ b/chia/_tests/wallet/vc_wallet/test_vc_wallet.py @@ -7,6 +7,8 @@ from chia_rs import G2Element from typing_extensions import Literal +from chia._tests.environments.wallet import WalletEnvironment, WalletStateTransition, WalletTestFramework +from chia._tests.util.time_out_assert import time_out_assert_not_none from chia.rpc.wallet_rpc_client import WalletRpcClient from chia.simulator.full_node_simulator import FullNodeSimulator from chia.types.blockchain_format.coin import coin_as_list @@ -29,8 +31,6 @@ from chia.wallet.vc_wallet.vc_store import VCProofs, VCRecord from chia.wallet.wallet import Wallet from chia.wallet.wallet_node import WalletNode -from tests.environments.wallet import WalletEnvironment, WalletStateTransition, WalletTestFramework -from tests.util.time_out_assert import time_out_assert_not_none async def mint_cr_cat( diff --git a/tests/wallet/wallet_block_tools.py b/chia/_tests/wallet/wallet_block_tools.py similarity index 100% rename from tests/wallet/wallet_block_tools.py rename to chia/_tests/wallet/wallet_block_tools.py diff --git a/tests/weight_proof/__init__.py b/chia/_tests/weight_proof/__init__.py similarity index 100% rename from tests/weight_proof/__init__.py rename to chia/_tests/weight_proof/__init__.py diff --git a/tests/weight_proof/config.py b/chia/_tests/weight_proof/config.py similarity index 100% rename from tests/weight_proof/config.py rename to chia/_tests/weight_proof/config.py diff --git a/tests/weight_proof/test_weight_proof.py b/chia/_tests/weight_proof/test_weight_proof.py similarity index 100% rename from tests/weight_proof/test_weight_proof.py rename to chia/_tests/weight_proof/test_weight_proof.py diff --git a/chia/wallet/puzzles/deployed_puzzle_hashes.json b/chia/wallet/puzzles/deployed_puzzle_hashes.json index a137f8c9d6ab..80d3ef4450d9 100644 --- a/chia/wallet/puzzles/deployed_puzzle_hashes.json +++ b/chia/wallet/puzzles/deployed_puzzle_hashes.json @@ -61,5 +61,7 @@ "singleton_top_layer_v1_1": "7faa3253bfddd1e0decb0906b2dc6247bbc4cf608f58345d173adb63e8b47c9f", "standard_vc_backdoor_puzzle": "fbce76408ebaf9b3d0b8cd90cc68607755eeca67cd7432d5eea85f3f498cc002", "std_parent_morpher": "8c3f1dc2e46c0d7ec4c2cbd007e23c0368ff8f80c5bc0101647a5c27626ebce6", + "test_generator_deserialize": "52add794fc76e89512e4a063c383418bda084c8a78c74055abe80179e4a7832c", + "test_multiple_generator_input_arguments": "156dafbddc3e1d3bfe1f2a84e48e5e46b287b8358bf65c3c091c93e855fbfc5b", "viral_backdoor": "00848115554ea674131f89f311707a959ad3f4647482648f3fe91ba289131f51" } diff --git a/mypy-exclusions.txt b/mypy-exclusions.txt index 5a1e5274f918..73e58239384e 100644 --- a/mypy-exclusions.txt +++ b/mypy-exclusions.txt @@ -40,67 +40,67 @@ chia.wallet.wallet_puzzle_store chia.wallet.wallet_transaction_store chia.wallet.wallet_user_store installhelper -tests.blockchain.blockchain_test_utils -tests.blockchain.test_blockchain -tests.build-init-files -tests.clvm.coin_store -tests.clvm.test_chialisp_deserialization -tests.clvm.test_program -tests.clvm.test_puzzle_compression -tests.clvm.test_puzzles -tests.clvm.test_singletons -tests.clvm.test_spend_sim -tests.conftest -tests.connection_utils -tests.core.cmds.test_keys -tests.core.consensus.test_pot_iterations -tests.core.custom_types.test_coin -tests.core.custom_types.test_spend_bundle -tests.core.daemon.test_daemon -tests.core.full_node.full_sync.test_full_sync -tests.core.full_node.stores.test_sync_store -tests.core.full_node.test_address_manager -tests.core.full_node.test_full_node -tests.core.full_node.test_node_load -tests.core.full_node.test_performance -tests.core.full_node.test_transactions -tests.core.mempool.test_mempool -tests.core.server.test_dos -tests.core.server.test_rate_limits -tests.core.ssl.test_ssl -tests.core.test_crawler_rpc -tests.core.test_daemon_rpc -tests.core.test_db_conversion -tests.core.test_filter -tests.core.test_full_node_rpc -tests.core.util.test_cached_bls -tests.core.util.test_config -tests.core.util.test_file_keyring_synchronization -tests.core.util.test_files -tests.core.util.test_keychain -tests.core.util.test_keyring_wrapper -tests.core.util.test_lru_cache -tests.core.util.test_significant_bits -tests.generator.test_scan -tests.plotting.test_plot_manager -tests.pools.test_pool_cmdline -tests.pools.test_pool_config -tests.pools.test_pool_puzzles_lifecycle -tests.pools.test_wallet_pool_store -tests.simulation.test_simulation -tests.tools.test_run_block -tests.util.benchmark_cost -tests.util.generator_tools_testing -tests.util.test_full_block_utils -tests.util.test_misc -tests.util.test_network -tests.util.time_out_assert -tests.wallet.cat_wallet.test_trades -tests.wallet.did_wallet.test_did -tests.wallet.rpc.test_wallet_rpc -tests.wallet.test_chialisp -tests.wallet.test_taproot -tests.wallet.test_wallet_interested_store -tests.wallet.test_wallet_key_val_store +chia._tests.blockchain.blockchain_test_utils +chia._tests.blockchain.test_blockchain +chia._tests.build-init-files +chia._tests.clvm.coin_store +chia._tests.clvm.test_chialisp_deserialization +chia._tests.clvm.test_program +chia._tests.clvm.test_puzzle_compression +chia._tests.clvm.test_puzzles +chia._tests.clvm.test_singletons +chia._tests.clvm.test_spend_sim +chia._tests.conftest +chia._tests.connection_utils +chia._tests.core.cmds.test_keys +chia._tests.core.consensus.test_pot_iterations +chia._tests.core.custom_types.test_coin +chia._tests.core.custom_types.test_spend_bundle +chia._tests.core.daemon.test_daemon +chia._tests.core.full_node.full_sync.test_full_sync +chia._tests.core.full_node.stores.test_sync_store +chia._tests.core.full_node.test_address_manager +chia._tests.core.full_node.test_full_node +chia._tests.core.full_node.test_node_load +chia._tests.core.full_node.test_performance +chia._tests.core.full_node.test_transactions +chia._tests.core.mempool.test_mempool +chia._tests.core.server.test_dos +chia._tests.core.server.test_rate_limits +chia._tests.core.ssl.test_ssl +chia._tests.core.test_crawler_rpc +chia._tests.core.test_daemon_rpc +chia._tests.core.test_db_conversion +chia._tests.core.test_filter +chia._tests.core.test_full_node_rpc +chia._tests.core.util.test_cached_bls +chia._tests.core.util.test_config +chia._tests.core.util.test_file_keyring_synchronization +chia._tests.core.util.test_files +chia._tests.core.util.test_keychain +chia._tests.core.util.test_keyring_wrapper +chia._tests.core.util.test_lru_cache +chia._tests.core.util.test_significant_bits +chia._tests.generator.test_scan +chia._tests.plotting.test_plot_manager +chia._tests.pools.test_pool_cmdline +chia._tests.pools.test_pool_config +chia._tests.pools.test_pool_puzzles_lifecycle +chia._tests.pools.test_wallet_pool_store +chia._tests.simulation.test_simulation +chia._tests.tools.test_run_block +chia._tests.util.benchmark_cost +chia._tests.util.generator_tools_testing +chia._tests.util.test_full_block_utils +chia._tests.util.test_misc +chia._tests.util.test_network +chia._tests.util.time_out_assert +chia._tests.wallet.cat_wallet.test_trades +chia._tests.wallet.did_wallet.test_did +chia._tests.wallet.rpc.test_wallet_rpc +chia._tests.wallet.test_chialisp +chia._tests.wallet.test_taproot +chia._tests.wallet.test_wallet_interested_store +chia._tests.wallet.test_wallet_key_val_store tools.analyze-chain tools.run_block diff --git a/mypy.ini.template b/mypy.ini.template index 69f04397cc6c..e0c9afa7d7c3 100644 --- a/mypy.ini.template +++ b/mypy.ini.template @@ -1,5 +1,5 @@ [mypy] -files = benchmarks,build_scripts,chia,tests,tools,*.py +files = benchmarks,build_scripts,chia,tools,*.py ignore_missing_imports = True show_error_codes = True warn_unused_ignores = True diff --git a/pytest.ini b/pytest.ini index da4c129c45c7..39916b64e4bb 100644 --- a/pytest.ini +++ b/pytest.ini @@ -13,7 +13,7 @@ markers = test_mark_a2: used in testing test utilities test_mark_b1: used in testing test utilities test_mark_b2: used in testing test utilities -testpaths = tests +testpaths = chia/_tests/ filterwarnings = error ignore:JSON contains both `coin_solutions` and `coin_spends`, just use `coin_spends` diff --git a/setup.py b/setup.py index 33c40070ab31..e98e0bf7e13e 100644 --- a/setup.py +++ b/setup.py @@ -110,6 +110,10 @@ }, package_data={ "": ["*.clsp", "*.clsp.hex", "*.clvm", "*.clib", "py.typed"], + "chia._tests.cmds.wallet": ["test_offer.toffer"], + "chia._tests.farmer_harvester": ["*.json"], + "chia._tests.tools": ["*.json", "test-blockchain-db.sqlite"], + "chia._tests.util": ["bip39_test_vectors.json", "clvm_generator.bin", "protocol_messages_bytes-v*"], "chia.util": ["initial-*.yaml", "english.txt"], "chia.ssl": ["chia_ca.crt", "chia_ca.key", "dst_root_ca.pem"], "mozilla-ca": ["cacert.pem"], diff --git a/tools/generate_chain.py b/tools/generate_chain.py index 591fd671c77f..985158b9d39f 100644 --- a/tools/generate_chain.py +++ b/tools/generate_chain.py @@ -12,13 +12,13 @@ import click import zstd +from chia._tests.util.constants import test_constants from chia.simulator.block_tools import create_block_tools from chia.simulator.keyring import TempKeyring from chia.types.blockchain_format.coin import Coin from chia.types.spend_bundle import SpendBundle from chia.util.chia_logging import initialize_logging from chia.util.ints import uint32, uint64 -from tests.util.constants import test_constants @contextmanager diff --git a/tools/run_block.py b/tools/run_block.py index 01fa3c8bcc8f..5abdc09013b7 100644 --- a/tools/run_block.py +++ b/tools/run_block.py @@ -42,10 +42,10 @@ import click +from chia._tests.util.run_block import run_json_block from chia.consensus.default_constants import DEFAULT_CONSTANTS from chia.util.config import load_config from chia.util.default_root import DEFAULT_ROOT_PATH -from tests.util.run_block import run_json_block @click.command() diff --git a/tools/test_full_sync.py b/tools/test_full_sync.py index 8bba162b6d5c..f79d02460578 100755 --- a/tools/test_full_sync.py +++ b/tools/test_full_sync.py @@ -11,13 +11,13 @@ import click import zstd +from chia._tests.util.full_sync import FakePeer, FakeServer, run_sync_test from chia.cmds.init_funcs import chia_init from chia.consensus.default_constants import DEFAULT_CONSTANTS from chia.full_node.full_node import FullNode from chia.server.ws_connection import WSChiaConnection from chia.types.full_block import FullBlock from chia.util.config import load_config -from tests.util.full_sync import FakePeer, FakeServer, run_sync_test @click.group() From e7c233d81a9763048303929340e0ca00c088adaa Mon Sep 17 00:00:00 2001 From: Kyle Altendorf Date: Thu, 14 Mar 2024 13:59:02 -0400 Subject: [PATCH 12/12] update black target versions (#17699) --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 92a8988d0b4d..7f0da13cf5aa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,7 @@ local_scheme = "no-local-version" [tool.black] line-length = 120 -target-version = ['py37', 'py38', 'py39', 'py310', 'py311'] +target-version = ['py38', 'py39', 'py310', 'py311', 'py312'] include = ''' ^/( [^/]*.py