From e89d909a65583ac2d10211305ab44f18fad09f2a Mon Sep 17 00:00:00 2001 From: keating Date: Tue, 18 Jun 2024 09:59:11 -0400 Subject: [PATCH 01/18] WIP --- .gitmodules | 3 --- lib/hats-module | 1 - test/MultiClaimsHatter.t.sol | 5 +++-- 3 files changed, 3 insertions(+), 6 deletions(-) delete mode 160000 lib/hats-module diff --git a/.gitmodules b/.gitmodules index b1c329e..0f07815 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,9 +1,6 @@ [submodule "lib/forge-std"] path = lib/forge-std url = https://github.com/foundry-rs/forge-std -[submodule "lib/hats-module"] - path = lib/hats-module - url = https://github.com/hats-protocol/hats-module [submodule "lib/solady"] path = lib/solady url = https://github.com/vectorized/solady diff --git a/lib/hats-module b/lib/hats-module deleted file mode 160000 index e83bd72..0000000 --- a/lib/hats-module +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e83bd72cb3eebdbeadabcb63e3c6f69ab61a5562 diff --git a/test/MultiClaimsHatter.t.sol b/test/MultiClaimsHatter.t.sol index 2ab9d09..50b5fc8 100644 --- a/test/MultiClaimsHatter.t.sol +++ b/test/MultiClaimsHatter.t.sol @@ -9,7 +9,8 @@ import { MultiClaimsHatter_NotAdminOfHat, MultiClaimsHatter_NotExplicitlyEligible } from "../src/MultiClaimsHatter.sol"; -import { IHats, HatsModuleFactory, deployModuleInstance } from "hats-module/utils/DeployFunctions.sol"; +// import { IHats, HatsModuleFactory, deployModuleInstance } from "hats-module/utils/DeployFunctions.sol"; +import {IHats} from "hats-module/interfaces/IHatsModule.sol"; import { DeployImplementation } from "../script/MultiClaimsHatter.s.sol"; import { TestEligibilityAlwaysEligible, TestEligibilityAlwaysNotEligible } from "./utils/TestModules.sol"; @@ -18,7 +19,7 @@ contract Setup is DeployImplementation, Test { // the block number where hats module factory was deployed on Sepolia uint256 public constant BLOCK_NUMBER = 5_516_083; IHats public constant HATS = IHats(0x3bc1A0Ad72417f2d411118085256fC53CBdDd137); // v1.hatsprotocol.eth - HatsModuleFactory public constant FACTORY = HatsModuleFactory(0x0a3f85fa597B6a967271286aA0724811acDF5CD9); + // HatsModuleFactory public constant FACTORY = HatsModuleFactory(0x0a3f85fa597B6a967271286aA0724811acDF5CD9); MultiClaimsHatter public instance; uint256 public tophat_x; From 05fd9491d629d18f22f7395da7fdf3d30c020828 Mon Sep 17 00:00:00 2001 From: keating Date: Tue, 18 Jun 2024 09:59:56 -0400 Subject: [PATCH 02/18] WIP --- .gitmodules | 3 +++ lib/hats-module | 1 + 2 files changed, 4 insertions(+) create mode 160000 lib/hats-module diff --git a/.gitmodules b/.gitmodules index 0f07815..3beba4d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "lib/solady"] path = lib/solady url = https://github.com/vectorized/solady +[submodule "lib/hats-module"] + path = lib/hats-module + url = https://github.com/alexkeating/hats-module diff --git a/lib/hats-module b/lib/hats-module new file mode 160000 index 0000000..9a0a7b6 --- /dev/null +++ b/lib/hats-module @@ -0,0 +1 @@ +Subproject commit 9a0a7b61b34091578d282ee5b7dbd7aa1218ba54 From 277f754040290f0fa9731308e0ec6814f19b8058 Mon Sep 17 00:00:00 2001 From: keating Date: Tue, 18 Jun 2024 16:36:50 -0400 Subject: [PATCH 03/18] Working tests --- .gitmodules | 3 + foundry.toml | 106 +-- lib/ERC1155/ERC1155.sol | 261 ++++++ lib/hats-module | 2 +- lib/hats-protocol | 1 + remappings.txt | 7 +- script/MultiClaimsHatter.s.sol | 20 +- src/MultiClaimsHatter.sol | 96 +-- src/MultiClaimsHatterFactory.sol | 43 + test/MultiClaimsHatter.t.sol | 1346 +++++++++++++++--------------- test/utils/TestModules.sol | 4 +- 11 files changed, 1103 insertions(+), 786 deletions(-) create mode 100644 lib/ERC1155/ERC1155.sol create mode 160000 lib/hats-protocol create mode 100644 src/MultiClaimsHatterFactory.sol diff --git a/.gitmodules b/.gitmodules index 3beba4d..2434793 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,6 @@ [submodule "lib/hats-module"] path = lib/hats-module url = https://github.com/alexkeating/hats-module +[submodule "lib/hats-protocol"] + path = lib/hats-protocol + url = https://github.com/Hats-Protocol/hats-protocol diff --git a/foundry.toml b/foundry.toml index 73b6eb6..3b39f50 100644 --- a/foundry.toml +++ b/foundry.toml @@ -1,71 +1,71 @@ [profile.default] -src = 'src' -out = 'out' -libs = ['lib'] -optimizer_runs = 1_000_000 -# the following setting ensures that deterministically deployed contracts will always be to the same address -bytecode_hash = "none" -gas_reports = ["MultiClaimsHatter"] -auto_detect_solc = false -solc = "0.8.19" -remappings = [ - "ds-test/=lib/forge-std/lib/ds-test/src/", - "forge-std/=lib/forge-std/src/", - "hats-module/=lib/hats-module/src/", -] -# Enable tests to read ir-optimized bytecode precompiled by profile.optimized -fs_permissions = [{ access = "read", path = "./optimized-out" }] + libs = ['lib'] + optimizer_runs = 1_000_000 + out = 'out' + src = 'src' + # the following setting ensures that deterministically deployed contracts will always be to the same address + auto_detect_solc = false + bytecode_hash = "none" + gas_reports = ["MultiClaimsHatter"] + remappings = [ + "ds-test/=lib/forge-std/lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hats-module/=lib/hats-module/src/", + ] + solc = "0.8.19" + # Enable tests to read ir-optimized bytecode precompiled by profile.optimized + fs_permissions = [{ access = "read", path = "./optimized-out" }] # for pre-compiling ir-optimized bytecode that will be later deployed by tests [profile.optimized] -via_ir = true -out = "optimized-out" -script = "src" -bytecode_hash = "none" -sizes = true -# no need to compile tests with via-ir since they load optimized bytecode directly by default -test = "src" + bytecode_hash = "none" + out = "optimized-out" + script = "src" + sizes = true + via_ir = true + # no need to compile tests with via-ir since they load optimized bytecode directly by default + test = "src" # for running tests against pre-compiled ir-optimized deployments [profile.test] -src = "test" + src = "test" [profile.ci] -fuzz = { runs = 5000 } -invariant = { runs = 1000 } + fuzz = { runs = 5000 } + invariant = { runs = 1000 } [profile.lite] -fuzz = { runs = 32 } -invariant = { runs = 10 } -# Speed up compilation and tests during development. -optimizer = false + fuzz = { runs = 32 } + invariant = { runs = 10 } + # Speed up compilation and tests during development. + optimizer = false [fmt] -bracket_spacing = true -int_types = "long" -line_length = 120 -multiline_func_header = "attributes_first" -number_underscore = "thousands" -quote_style = "double" -tab_width = 2 -wrap_comments = true + bracket_spacing = true + int_types = "long" + line_length = 120 + multiline_func_header = "attributes_first" + number_underscore = "thousands" + quote_style = "double" + tab_width = 2 + wrap_comments = true [rpc_endpoints] -arbitrum = "https://arbitrum-mainnet.infura.io/v3/${INFURA_KEY}" -celo = "https://forno.celo.org" -gnosis = "${GC_RPC}" -local = "http://localhost:8545" -mainnet = "https://mainnet.infura.io/v3/${INFURA_KEY}" -optimism = "https://optimism-mainnet.infura.io/v3/${INFURA_KEY}" -polygon = "${POLYGON_RPC}" -sepolia = "https://sepolia.infura.io/v3/${INFURA_KEY}" + arbitrum = "https://arbitrum-mainnet.infura.io/v3/${INFURA_KEY}" + celo = "https://forno.celo.org" + gnosis = "${GC_RPC}" + local = "http://localhost:8545" + mainnet = "https://mainnet.infura.io/v3/${INFURA_KEY}" + optimism = "https://optimism-mainnet.infura.io/v3/${INFURA_KEY}" + polygon = "${POLYGON_RPC}" + sepolia = "https://sepolia.infura.io/v3/${INFURA_KEY}" [etherscan] -arbitrum = { key = "${ARBISCAN_KEY}", url = "https://api.arbiscan.io/api" } -gnosis = { key = "${GNOSISSCAN_KEY}", url = "https://api.gnosisscan.io/api" } -mainnet = { key = "${ETHERSCAN_KEY}", url = "https://api.etherscan.io/api" } -optimism = { key = "${OPTIMISM_KEY}", url = "https://api-optimistic.etherscan.io/api" } -sepolia = { key = "${ETHERSCAN_KEY}", url = "https://api-sepolia.etherscan.io/api" } -polygon = { key = "${POLYGONSCAN_KEY}", url = "https://api.polygonscan.com/api" } + arbitrum = { key = "${ARBISCAN_KEY}", url = "https://api.arbiscan.io/api" } + gnosis = { key = "${GNOSISSCAN_KEY}", url = "https://api.gnosisscan.io/api" } + mainnet = { key = "${ETHERSCAN_KEY}", url = "https://api.etherscan.io/api" } + optimism = { key = "${OPTIMISM_KEY}", url = "https://api-optimistic.etherscan.io/api" } + polygon = { key = "${POLYGONSCAN_KEY}", url = "https://api.polygonscan.com/api" } + sepolia = { key = "${ETHERSCAN_KEY}", url = "https://api-sepolia.etherscan.io/api" } -# See more config options https://github.com/foundry-rs/foundry/tree/master/config + # See more config options https://github.com/foundry-rs/foundry/tree/master/config diff --git a/lib/ERC1155/ERC1155.sol b/lib/ERC1155/ERC1155.sol new file mode 100644 index 0000000..a590021 --- /dev/null +++ b/lib/ERC1155/ERC1155.sol @@ -0,0 +1,261 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity >=0.8.0; + +/// @notice Minimalist and gas efficient standard ERC1155 implementation. +/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC1155.sol) +abstract contract ERC1155 { + /*////////////////////////////////////////////////////////////// + EVENTS + //////////////////////////////////////////////////////////////*/ + + event TransferSingle( + address indexed operator, + address indexed from, + address indexed to, + uint256 id, + uint256 amount + ); + + event TransferBatch( + address indexed operator, + address indexed from, + address indexed to, + uint256[] ids, + uint256[] amounts + ); + + event ApprovalForAll(address indexed owner, address indexed operator, bool approved); + + event URI(string value, uint256 indexed id); + + /*////////////////////////////////////////////////////////////// + ERC1155 STORAGE + //////////////////////////////////////////////////////////////*/ + + mapping(address => mapping(uint256 => uint256)) internal _balanceOf; + + mapping(address => mapping(address => bool)) public isApprovedForAll; + + /*////////////////////////////////////////////////////////////// + METADATA LOGIC + //////////////////////////////////////////////////////////////*/ + + function uri(uint256 id) public view virtual returns (string memory); + + /*////////////////////////////////////////////////////////////// + ERC1155 LOGIC + //////////////////////////////////////////////////////////////*/ + + function setApprovalForAll(address operator, bool approved) public virtual { + isApprovedForAll[msg.sender][operator] = approved; + + emit ApprovalForAll(msg.sender, operator, approved); + } + + function safeTransferFrom( + address from, + address to, + uint256 id, + uint256 amount, + bytes calldata data + ) public virtual { + require(msg.sender == from || isApprovedForAll[from][msg.sender], "NOT_AUTHORIZED"); + + _balanceOf[from][id] -= amount; + _balanceOf[to][id] += amount; + + emit TransferSingle(msg.sender, from, to, id, amount); + + require( + to.code.length == 0 + ? to != address(0) + : ERC1155TokenReceiver(to).onERC1155Received(msg.sender, from, id, amount, data) == + ERC1155TokenReceiver.onERC1155Received.selector, + "UNSAFE_RECIPIENT" + ); + } + + function safeBatchTransferFrom( + address from, + address to, + uint256[] calldata ids, + uint256[] calldata amounts, + bytes calldata data + ) public virtual { + require(ids.length == amounts.length, "LENGTH_MISMATCH"); + + require(msg.sender == from || isApprovedForAll[from][msg.sender], "NOT_AUTHORIZED"); + + // Storing these outside the loop saves ~15 gas per iteration. + uint256 id; + uint256 amount; + + for (uint256 i = 0; i < ids.length; ) { + id = ids[i]; + amount = amounts[i]; + + _balanceOf[from][id] -= amount; + _balanceOf[to][id] += amount; + + // An array can't have a total length + // larger than the max uint256 value. + unchecked { + ++i; + } + } + + emit TransferBatch(msg.sender, from, to, ids, amounts); + + require( + to.code.length == 0 + ? to != address(0) + : ERC1155TokenReceiver(to).onERC1155BatchReceived(msg.sender, from, ids, amounts, data) == + ERC1155TokenReceiver.onERC1155BatchReceived.selector, + "UNSAFE_RECIPIENT" + ); + } + + function balanceOf(address owner, uint256 id) public view virtual returns (uint256 balance) { + balance = _balanceOf[owner][id]; + } + + function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) + public + view + virtual + returns (uint256[] memory balances) + { + require(owners.length == ids.length, "LENGTH_MISMATCH"); + + balances = new uint256[](owners.length); + + // Unchecked because the only math done is incrementing + // the array index counter which cannot possibly overflow. + unchecked { + for (uint256 i = 0; i < owners.length; ++i) { + balances[i] = _balanceOf[owners[i]][ids[i]]; + } + } + } + + /*////////////////////////////////////////////////////////////// + ERC165 LOGIC + //////////////////////////////////////////////////////////////*/ + + function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { + return + interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165 + interfaceId == 0xd9b67a26 || // ERC165 Interface ID for ERC1155 + interfaceId == 0x0e89341c; // ERC165 Interface ID for ERC1155MetadataURI + } + + /*////////////////////////////////////////////////////////////// + INTERNAL MINT/BURN LOGIC + //////////////////////////////////////////////////////////////*/ + + function _mint( + address to, + uint256 id, + uint256 amount, + bytes memory data + ) internal virtual { + _balanceOf[to][id] += amount; + + emit TransferSingle(msg.sender, address(0), to, id, amount); + + require( + to.code.length == 0 + ? to != address(0) + : ERC1155TokenReceiver(to).onERC1155Received(msg.sender, address(0), id, amount, data) == + ERC1155TokenReceiver.onERC1155Received.selector, + "UNSAFE_RECIPIENT" + ); + } + + function _batchMint( + address to, + uint256[] memory ids, + uint256[] memory amounts, + bytes memory data + ) internal virtual { + uint256 idsLength = ids.length; // Saves MLOADs. + + require(idsLength == amounts.length, "LENGTH_MISMATCH"); + + for (uint256 i = 0; i < idsLength; ) { + _balanceOf[to][ids[i]] += amounts[i]; + + // An array can't have a total length + // larger than the max uint256 value. + unchecked { + ++i; + } + } + + emit TransferBatch(msg.sender, address(0), to, ids, amounts); + + require( + to.code.length == 0 + ? to != address(0) + : ERC1155TokenReceiver(to).onERC1155BatchReceived(msg.sender, address(0), ids, amounts, data) == + ERC1155TokenReceiver.onERC1155BatchReceived.selector, + "UNSAFE_RECIPIENT" + ); + } + + function _batchBurn( + address from, + uint256[] memory ids, + uint256[] memory amounts + ) internal virtual { + uint256 idsLength = ids.length; // Saves MLOADs. + + require(idsLength == amounts.length, "LENGTH_MISMATCH"); + + for (uint256 i = 0; i < idsLength; ) { + _balanceOf[from][ids[i]] -= amounts[i]; + + // An array can't have a total length + // larger than the max uint256 value. + unchecked { + ++i; + } + } + + emit TransferBatch(msg.sender, from, address(0), ids, amounts); + } + + function _burn( + address from, + uint256 id, + uint256 amount + ) internal virtual { + _balanceOf[from][id] -= amount; + + emit TransferSingle(msg.sender, from, address(0), id, amount); + } +} + +/// @notice A generic interface for a contract which properly accepts ERC1155 tokens. +/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC1155.sol) +abstract contract ERC1155TokenReceiver { + function onERC1155Received( + address, + address, + uint256, + uint256, + bytes calldata + ) external virtual returns (bytes4) { + return ERC1155TokenReceiver.onERC1155Received.selector; + } + + function onERC1155BatchReceived( + address, + address, + uint256[] calldata, + uint256[] calldata, + bytes calldata + ) external virtual returns (bytes4) { + return ERC1155TokenReceiver.onERC1155BatchReceived.selector; + } +} diff --git a/lib/hats-module b/lib/hats-module index 9a0a7b6..6dc8aad 160000 --- a/lib/hats-module +++ b/lib/hats-module @@ -1 +1 @@ -Subproject commit 9a0a7b61b34091578d282ee5b7dbd7aa1218ba54 +Subproject commit 6dc8aadc8aafa271eac240e345ed4d89c4ada4eb diff --git a/lib/hats-protocol b/lib/hats-protocol new file mode 160000 index 0000000..cccb71a --- /dev/null +++ b/lib/hats-protocol @@ -0,0 +1 @@ +Subproject commit cccb71a061cdb9095af7d11dfdb47026993d8c4e diff --git a/remappings.txt b/remappings.txt index a1579e1..828c61d 100644 --- a/remappings.txt +++ b/remappings.txt @@ -2,10 +2,9 @@ ds-test/=lib/forge-std/lib/ds-test/src/ forge-std/=lib/forge-std/src/ hats-module/=lib/hats-module/src/ @openzeppelin-contracts/=lib/hats-module/lib/openzeppelin-contracts/ -ERC1155/=lib/hats-module/lib/hats-protocol/lib/ERC1155/ -hats-protocol/=lib/hats-module/lib/hats-protocol/src +hats-protocol/=lib/hats-protocol/src openzeppelin-contracts/=lib/hats-module/lib/openzeppelin-contracts/ solady/=lib/hats-module/lib/solady/src/ -solbase/=lib/hats-module/lib/hats-protocol/lib/solbase/src/ +solbase/=lib/hats-protocol/lib/solbase/src/ solmate/=lib/hats-module/lib/solady/lib/solmate/src/ -utils/=lib/hats-module/lib/hats-protocol/lib/utils/ +utils/=lib/hats-protocol/lib/utils/ diff --git a/script/MultiClaimsHatter.s.sol b/script/MultiClaimsHatter.s.sol index f5907dc..04c0af9 100644 --- a/script/MultiClaimsHatter.s.sol +++ b/script/MultiClaimsHatter.s.sol @@ -3,12 +3,12 @@ pragma solidity ^0.8.19; import { Script, console2 } from "forge-std/Script.sol"; import { MultiClaimsHatter } from "../src/MultiClaimsHatter.sol"; -import { HatsModuleFactory } from "hats-module/HatsModuleFactory.sol"; +// import { HatsModuleFactory } from "hats-module/HatsModuleFactory.sol"; contract DeployInstance is Script { address public implementation = 0xB985eA1be961f7c4A4C45504444C02c88c4fdEF9; address public instance; - HatsModuleFactory public factory = HatsModuleFactory(0xfE661c01891172046feE16D3a57c3Cf456729efA); + // HatsModuleFactory public factory = HatsModuleFactory(0xfE661c01891172046feE16D3a57c3Cf456729efA); bytes32 public SALT = bytes32(abi.encode(0x4a75)); uint256 public SALT_NONCE = 1; @@ -36,13 +36,13 @@ contract DeployInstance is Script { function run() public virtual { vm.startBroadcast(deployer()); - instance = factory.createHatsModule( - implementation, - 26_960_769_425_706_402_133_074_773_335_446_698_772_097_302_206_575_744_715_499_319_066_624, - abi.encodePacked(), - createInitData(), - SALT_NONCE - ); + // instance = factory.createHatsModule( + // implementation, + // 26_960_769_425_706_402_133_074_773_335_446_698_772_097_302_206_575_744_715_499_319_066_624, + // abi.encodePacked(), + // createInitData(), + // SALT_NONCE + // ); vm.stopBroadcast(); @@ -89,7 +89,7 @@ contract DeployImplementation is Script { * never differs regardless of where its being compiled * 2. The provided salt, `SALT` */ - implementation = new MultiClaimsHatter{ salt: SALT }(_version /* insert constructor args here */ ); + // implementation = new MultiClaimsHatter{ salt: SALT }(_version /* insert constructor args here */ ); vm.stopBroadcast(); diff --git a/src/MultiClaimsHatter.sol b/src/MultiClaimsHatter.sol index 7f63e40..1a1e075 100644 --- a/src/MultiClaimsHatter.sol +++ b/src/MultiClaimsHatter.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.19; // import { console2 } from "forge-std/Test.sol"; // remove before deploy import { HatsModule } from "hats-module/HatsModule.sol"; -import { HatsModuleFactory } from "hats-module/HatsModuleFactory.sol"; +// import { HatsModuleFactory } from "hats-module/HatsModuleFactory.sol"; /*////////////////////////////////////////////////////////////// CUSTOM ERRORS @@ -84,7 +84,7 @@ contract MultiClaimsHatter is HatsModule { /// @notice Deploy the implementation contract and set its version /// @dev This is only used to deploy the implementation contract, and should not be used to deploy clones - constructor(string memory _version) HatsModule(_version) { } + constructor(string memory _version, address _hats, uint256 _hatId) HatsModule(_version, _hats, _hatId) { } /*////////////////////////////////////////////////////////////// INITIALIZOR @@ -153,24 +153,24 @@ contract MultiClaimsHatter is HatsModule { * @param _claimType New claimability type for the hat * @return _instance The address of the deployed HatsModule instance */ - function setHatClaimabilityAndCreateModule( - HatsModuleFactory _factory, - address _implementation, - uint256 _moduleHatId, - bytes calldata _otherImmutableArgs, - bytes calldata _initData, - uint256 _saltNonce, - uint256 _hatId, - ClaimType _claimType - ) public returns (address _instance) { - if (!HATS().isAdminOfHat(msg.sender, _hatId)) revert MultiClaimsHatter_NotAdminOfHat(msg.sender, _hatId); + // function setHatClaimabilityAndCreateModule( + // HatsModuleFactory _factory, + // address _implementation, + // uint256 _moduleHatId, + // bytes calldata _otherImmutableArgs, + // bytes calldata _initData, + // uint256 _saltNonce, + // uint256 _hatId, + // ClaimType _claimType + // ) public returns (address _instance) { + // if (!HATS().isAdminOfHat(msg.sender, _hatId)) revert MultiClaimsHatter_NotAdminOfHat(msg.sender, _hatId); - hatToClaimType[_hatId] = _claimType; + // hatToClaimType[_hatId] = _claimType; - _instance = _factory.createHatsModule(_implementation, _moduleHatId, _otherImmutableArgs, _initData, _saltNonce); + // _instance = _factory.createHatsModule(_implementation, _moduleHatId, _otherImmutableArgs, _initData, _saltNonce); - emit HatClaimabilitySet(_hatId, _claimType); - } + // emit HatClaimabilitySet(_hatId, _claimType); + // } /** * @notice Wrapper around a HatsModuleFactory. Deploys new HatsModule instances and sets the claimability type of @@ -185,37 +185,37 @@ contract MultiClaimsHatter is HatsModule { * @param _claimTypes New claimability types for each hat * @return success True if all modules were successfully created and the claimability types were set */ - function setHatsClaimabilityAndCreateModules( - HatsModuleFactory _factory, - address[] calldata _implementations, - uint256[] calldata _moduleHatIds, - bytes[] calldata _otherImmutableArgsArray, - bytes[] calldata _initDataArray, - uint256[] memory _saltNonces, - uint256[] memory _hatIds, - ClaimType[] memory _claimTypes - ) public returns (bool success) { - uint256 length = _hatIds.length; - if (_claimTypes.length != length) { - revert MultiClaimsHatter_ArrayLengthMismatch(); - } - - uint256 hatId; - for (uint256 i; i < length;) { - hatId = _hatIds[i]; - if (!HATS().isAdminOfHat(msg.sender, hatId)) revert MultiClaimsHatter_NotAdminOfHat(msg.sender, hatId); - hatToClaimType[hatId] = _claimTypes[i]; - unchecked { - ++i; - } - } - - success = _factory.batchCreateHatsModule( - _implementations, _moduleHatIds, _otherImmutableArgsArray, _initDataArray, _saltNonces - ); - - emit HatsClaimabilitySet(_hatIds, _claimTypes); - } + // function setHatsClaimabilityAndCreateModules( + // HatsModuleFactory _factory, + // address[] calldata _implementations, + // uint256[] calldata _moduleHatIds, + // bytes[] calldata _otherImmutableArgsArray, + // bytes[] calldata _initDataArray, + // uint256[] memory _saltNonces, + // uint256[] memory _hatIds, + // ClaimType[] memory _claimTypes + // ) public returns (bool success) { + // uint256 length = _hatIds.length; + // if (_claimTypes.length != length) { + // revert MultiClaimsHatter_ArrayLengthMismatch(); + // } + + // uint256 hatId; + // for (uint256 i; i < length;) { + // hatId = _hatIds[i]; + // if (!HATS().isAdminOfHat(msg.sender, hatId)) revert MultiClaimsHatter_NotAdminOfHat(msg.sender, hatId); + // hatToClaimType[hatId] = _claimTypes[i]; + // unchecked { + // ++i; + // } + // } + + // success = _factory.batchCreateHatsModule( + // _implementations, _moduleHatIds, _otherImmutableArgsArray, _initDataArray, _saltNonces + // ); + + // emit HatsClaimabilitySet(_hatIds, _claimTypes); + // } /*////////////////////////////////////////////////////////////// CLAIMING FUNCTIONS diff --git a/src/MultiClaimsHatterFactory.sol b/src/MultiClaimsHatterFactory.sol new file mode 100644 index 0000000..1a85d47 --- /dev/null +++ b/src/MultiClaimsHatterFactory.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import { MultiClaimsHatter } from "src/MultiClaimsHatter.sol"; + +contract MultiClaimsHatterFactory { + // should the version be higher here + string public constant VERSION = "0.6.0"; + + event HatsModuleFactory_ModuleDeployed( + address implementation, address instance, uint256 hatId, bytes otherImmutableArgs, bytes initData, uint256 saltNonce + ); + + function deployMultiClaimsHatter(uint256 _hatId, address _hat, bytes calldata _initData, uint256 _saltNonce) external returns (address) { + bytes memory args = abi.encodePacked(_hatId, _hat, _initData); + bytes32 salt = _calculateSalt(args, _saltNonce); + // If exists throw error + // emit event + // TODO: Add method to send create2 address + MultiClaimsHatter instance = new MultiClaimsHatter{ salt: salt }(VERSION, _hat, _hatId); + instance.setUp(_initData); + emit HatsModuleFactory_ModuleDeployed( + address(instance), address(instance), _hatId, abi.encodePacked(_hat, _initData), _initData, _saltNonce + ); + return address(instance); + } + + function _calculateSalt(bytes memory _args, uint256 _saltNonce) internal view returns (bytes32) { + return keccak256(abi.encodePacked(_args, block.chainid, _saltNonce)); + } + + function _getAddress(uint256 _hatId, address _hat, bytes calldata _initData, uint256 _saltNonce) + internal + returns (address addr) + { + bytes memory args = abi.encodePacked(_hatId, _hat, _initData); + bytes32 salt = _calculateSalt(args, _saltNonce); + bytes memory bytecode = type(MultiClaimsHatter).creationCode; + assembly { + addr := create2(0, add(bytecode, 32), mload(bytecode), salt) + } + } +} diff --git a/test/MultiClaimsHatter.t.sol b/test/MultiClaimsHatter.t.sol index 50b5fc8..18bb379 100644 --- a/test/MultiClaimsHatter.t.sol +++ b/test/MultiClaimsHatter.t.sol @@ -11,14 +11,19 @@ import { } from "../src/MultiClaimsHatter.sol"; // import { IHats, HatsModuleFactory, deployModuleInstance } from "hats-module/utils/DeployFunctions.sol"; import {IHats} from "hats-module/interfaces/IHatsModule.sol"; +import {Hats} from "hats-protocol/Hats.sol"; import { DeployImplementation } from "../script/MultiClaimsHatter.s.sol"; import { TestEligibilityAlwaysEligible, TestEligibilityAlwaysNotEligible } from "./utils/TestModules.sol"; +import { MultiClaimsHatterFactory} from "src/MultiClaimsHatterFactory.sol"; contract Setup is DeployImplementation, Test { uint256 public fork; // the block number where hats module factory was deployed on Sepolia uint256 public constant BLOCK_NUMBER = 5_516_083; - IHats public constant HATS = IHats(0x3bc1A0Ad72417f2d411118085256fC53CBdDd137); // v1.hatsprotocol.eth + // Deploy hats + string internal constant x = "Hats Protocol v1"; + string internal constant y = ""; + IHats public HATS = new Hats{salt: bytes32(abi.encode(0x4a75))}(x, y); // v1.hatsprotocol.eth // HatsModuleFactory public constant FACTORY = HatsModuleFactory(0x0a3f85fa597B6a967271286aA0724811acDF5CD9); MultiClaimsHatter public instance; @@ -53,18 +58,14 @@ contract Setup is DeployImplementation, Test { event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 amount); function deployInstance(bytes memory initData) public returns (MultiClaimsHatter) { + MultiClaimsHatterFactory factory = new MultiClaimsHatterFactory(); // deploy the instance vm.prank(dao); - return MultiClaimsHatter(deployModuleInstance(FACTORY, address(implementation), 0, "", initData, saltNonce)); + return MultiClaimsHatter(factory.deployMultiClaimsHatter(0, address(HATS), initData, saltNonce)); } function setUp() public virtual { // create and activate a fork, at BLOCK_NUMBER - fork = vm.createSelectFork(vm.rpcUrl("sepolia"), BLOCK_NUMBER); - - // deploy via the script - DeployImplementation.prepare(false, "test"); - DeployImplementation.run(); // set up hats tophat_x = HATS.mintTopHat(dao, "tophat", "dao.eth/tophat"); @@ -86,8 +87,8 @@ contract DeployInstance_WithoutInitialHats is Setup { function setUp() public virtual override { super.setUp(); - address alwaysEligibleModule = address(new TestEligibilityAlwaysEligible("test")); - address alwaysNotEligibleModule = address(new TestEligibilityAlwaysNotEligible("test")); + address alwaysEligibleModule = address(new TestEligibilityAlwaysEligible("test", address(0), 0)); + address alwaysNotEligibleModule = address(new TestEligibilityAlwaysNotEligible("test", address(0), 0)); vm.startPrank(dao); HATS.changeHatEligibility(hat_x_1_1, alwaysEligibleModule); @@ -340,662 +341,671 @@ contract TestClaimHat_WithoutInitialHats is ClaimHat_WithoutInitialHats { Scenario 2 - Delpoy Claims Hatter with initial hats //////////////////////////////////////////////////////////////*/ -contract DeployInstance_WithInitialHats is Setup { - function setUp() public virtual override { - super.setUp(); - - address alwaysEligibleModule = address(new TestEligibilityAlwaysEligible("test")); - address alwaysNotEligibleModule = address(new TestEligibilityAlwaysNotEligible("test")); - - vm.startPrank(dao); - HATS.changeHatEligibility(hat_x_1_1, alwaysEligibleModule); - HATS.changeHatEligibility(hat_x_1_1_1, alwaysEligibleModule); - HATS.changeHatEligibility(hat_x_1_1_1_1, alwaysNotEligibleModule); - HATS.changeHatEligibility(hat_x_2, alwaysEligibleModule); - vm.stopPrank(); - - uint256[] memory initialHats = new uint256[](3); - MultiClaimsHatter.ClaimType[] memory initialClaimTypes = new MultiClaimsHatter.ClaimType[](3); - initialHats[0] = hat_x_1_1; - initialHats[1] = hat_x_1_1_1; - initialHats[2] = hat_x_1_1_1_1; - initialClaimTypes[0] = MultiClaimsHatter.ClaimType.Claimable; - initialClaimTypes[1] = MultiClaimsHatter.ClaimType.ClaimableFor; - initialClaimTypes[2] = MultiClaimsHatter.ClaimType.Claimable; - bytes memory initData = abi.encode(initialHats, initialClaimTypes); - - vm.expectEmit(); - emit HatsClaimabilitySet(initialHats, initialClaimTypes); - instance = MultiClaimsHatter(deployInstance(initData)); - vm.prank(dao); - HATS.mintHat(hat_x_1, address(instance)); - } -} - -contract TestDeployInstance_WithInitialHats is DeployInstance_WithInitialHats { - function test_hatExistsFunction() public { - assertEq(instance.hatExists(hat_x_1_1), true); - assertEq(instance.hatExists(hat_x_1_1_1), true); - assertEq(instance.hatExists(hat_x_1_1_1_1), true); - assertEq(instance.hatExists(hat_x_2), true); - assertEq(instance.hatExists(HATS.getNextId(hat_x_2)), false); - } - - function test_wearsAdmin() public { - assertEq(instance.wearsAdmin(hat_x_1_1), true); - assertEq(instance.wearsAdmin(hat_x_1_1_1), true); - assertEq(instance.wearsAdmin(hat_x_1_1_1_1), true); - assertEq(instance.wearsAdmin(hat_x_2), false); - assertEq(instance.wearsAdmin(HATS.getNextId(hat_x_2)), false); - } - - function test_reverts_initialization() public { - vm.expectRevert("Initializable: contract is already initialized"); - instance.setUp(""); - } - - function test_reverts_claimHatFor() public { - vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimableFor.selector, hat_x_1_1)); - vm.prank(wearer); - instance.claimHatFor(hat_x_1_1, wearer); - } - - function test_reverts_claimHatsFor() public { - vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimableFor.selector, hat_x_1_1)); - - inputHats = [hat_x_1_1]; - inputWearers = [wearer]; - vm.prank(wearer); - instance.claimHatsFor(inputHats, inputWearers); - } - - function test_reverts_setHatClaimabilityNotAdmin() public { - vm.expectRevert(); - - vm.prank(wearer); - instance.setHatClaimability(hat_x_2, MultiClaimsHatter.ClaimType.Claimable); - } - - function test_isClaimableFor() public { - assertEq(instance.isClaimableFor(hat_x_1_1), false); - assertEq(instance.isClaimableFor(hat_x_1_1_1), true); - assertEq(instance.isClaimableFor(hat_x_1_1_1_1), false); - assertEq(instance.isClaimableFor(hat_x_2), false); - assertEq(instance.isClaimableFor(HATS.getNextId(hat_x_2)), false); - } - - function test_isClaimableBy() public { - assertEq(instance.isClaimableBy(hat_x_1_1), true); - assertEq(instance.isClaimableBy(hat_x_1_1_1), true); - assertEq(instance.isClaimableBy(hat_x_1_1_1_1), true); - assertEq(instance.isClaimableBy(hat_x_2), false); - assertEq(instance.isClaimableBy(HATS.getNextId(hat_x_2)), false); - } - - function test_accountCanClaim() public { - assertEq(instance.accountCanClaim(wearer, hat_x_1_1), true); - assertEq(instance.accountCanClaim(wearer, hat_x_1_1_1), true); - assertEq(instance.accountCanClaim(wearer, hat_x_1_1_1_1), false); - assertEq(instance.accountCanClaim(wearer, hat_x_2), false); - assertEq(instance.accountCanClaim(wearer, HATS.getNextId(hat_x_2)), false); - } - - function test_canClaimForAccount() public { - assertEq(instance.canClaimForAccount(wearer, hat_x_1_1), false); - assertEq(instance.canClaimForAccount(wearer, hat_x_1_1_1), true); - assertEq(instance.canClaimForAccount(wearer, hat_x_1_1_1_1), false); - assertEq(instance.canClaimForAccount(wearer, hat_x_2), false); - assertEq(instance.canClaimForAccount(wearer, HATS.getNextId(hat_x_2)), false); - } - - function test_reverts_claimHat() public { - vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimable.selector, hat_x_2)); - vm.prank(wearer); - instance.claimHat(hat_x_2); - } - - function test_reverts_claimHats() public { - vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimable.selector, hat_x_2)); - - inputHats = [hat_x_2]; - vm.prank(wearer); - instance.claimHats(inputHats); - } -} - -contract ClaimHat_WithInitialHats is DeployInstance_WithInitialHats { - function setUp() public virtual override { - super.setUp(); - - vm.prank(wearer); - instance.claimHat(hat_x_1_1); - vm.prank(bot); - instance.claimHatFor(hat_x_1_1_1, wearer); - } -} - -contract TestClaimHat_WithInitialHats is ClaimHat_WithInitialHats { - function test_hatsClaimed() public { - assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1), true); - assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1), true); - } - - function test_reverts_claimHatNotEligible() public { - vm.expectRevert( - abi.encodePacked(MultiClaimsHatter_NotExplicitlyEligible.selector, uint256(uint160(wearer)), hat_x_1_1_1_1) - ); - vm.prank(wearer); - instance.claimHat(hat_x_1_1_1_1); - } - - function test_reverts_claimHatsNotEligible() public { - vm.expectRevert( - abi.encodePacked(MultiClaimsHatter_NotExplicitlyEligible.selector, uint256(uint160(wearer)), hat_x_1_1_1_1) - ); - - inputHats = [hat_x_1_1_1_1]; - vm.prank(wearer); - instance.claimHats(inputHats); - } -} - -/*////////////////////////////////////////////////////////////////////////////// - Scenario 3 - Single Batch eligibility creation and hats registration - ////////////////////////////////////////////////////////////////////////////*/ - -contract DeployInstance_BatchModuleCreationAndRegistration is Setup { - function setUp() public virtual override { - super.setUp(); - - instance = MultiClaimsHatter(deployInstance("")); - vm.prank(dao); - HATS.mintHat(hat_x_1, address(instance)); - - address alwaysEligibleModule = address(new TestEligibilityAlwaysEligible("test")); - address alwaysNotEligibleModule = address(new TestEligibilityAlwaysNotEligible("test")); - - vm.startPrank(dao); - address predictedNewInatance1 = FACTORY.getHatsModuleAddress(alwaysEligibleModule, 0, "", saltNonce); - vm.expectEmit(); - emit HatsModuleFactory_ModuleDeployed(alwaysEligibleModule, predictedNewInatance1, 0, "", "", saltNonce); - vm.expectEmit(); - emit HatClaimabilitySet(hat_x_1_1, MultiClaimsHatter.ClaimType.Claimable); - address module1 = instance.setHatClaimabilityAndCreateModule( - FACTORY, alwaysEligibleModule, 0, "", "", saltNonce, hat_x_1_1, MultiClaimsHatter.ClaimType.Claimable - ); - - address predictedNewInatance2 = FACTORY.getHatsModuleAddress(alwaysEligibleModule, 1, "", saltNonce); - vm.expectEmit(); - emit HatsModuleFactory_ModuleDeployed(alwaysEligibleModule, predictedNewInatance2, 1, "", "", saltNonce); - vm.expectEmit(); - emit HatClaimabilitySet(hat_x_1_1_1, MultiClaimsHatter.ClaimType.ClaimableFor); - address module2 = instance.setHatClaimabilityAndCreateModule( - FACTORY, alwaysEligibleModule, 1, "", "", saltNonce, hat_x_1_1_1, MultiClaimsHatter.ClaimType.ClaimableFor - ); - - address predictedNewInatance3 = FACTORY.getHatsModuleAddress(alwaysNotEligibleModule, 2, "", saltNonce); - vm.expectEmit(); - emit HatsModuleFactory_ModuleDeployed(alwaysNotEligibleModule, predictedNewInatance3, 2, "", "", saltNonce); - vm.expectEmit(); - emit HatClaimabilitySet(hat_x_1_1_1_1, MultiClaimsHatter.ClaimType.Claimable); - address module3 = instance.setHatClaimabilityAndCreateModule( - FACTORY, alwaysNotEligibleModule, 2, "", "", saltNonce, hat_x_1_1_1_1, MultiClaimsHatter.ClaimType.Claimable - ); - vm.stopPrank(); - - vm.startPrank(dao); - HATS.changeHatEligibility(hat_x_1_1, module1); - HATS.changeHatEligibility(hat_x_1_1_1, module2); - HATS.changeHatEligibility(hat_x_1_1_1_1, module3); - HATS.changeHatEligibility(hat_x_2, module1); - vm.stopPrank(); - } -} - -contract TestDeployInstance_BatchModuleCreationAndRegistration is DeployInstance_BatchModuleCreationAndRegistration { - function test_hatExistsFunction() public { - assertEq(instance.hatExists(hat_x_1_1), true); - assertEq(instance.hatExists(hat_x_1_1_1), true); - assertEq(instance.hatExists(hat_x_1_1_1_1), true); - assertEq(instance.hatExists(hat_x_2), true); - assertEq(instance.hatExists(HATS.getNextId(hat_x_2)), false); - } - - function test_wearsAdmin() public { - assertEq(instance.wearsAdmin(hat_x_1_1), true); - assertEq(instance.wearsAdmin(hat_x_1_1_1), true); - assertEq(instance.wearsAdmin(hat_x_1_1_1_1), true); - assertEq(instance.wearsAdmin(hat_x_2), false); - assertEq(instance.wearsAdmin(HATS.getNextId(hat_x_2)), false); - } - - function test_isClaimableFor() public { - assertEq(instance.isClaimableFor(hat_x_1_1), false); - assertEq(instance.isClaimableFor(hat_x_1_1_1), true); - assertEq(instance.isClaimableFor(hat_x_1_1_1_1), false); - assertEq(instance.isClaimableFor(hat_x_2), false); - assertEq(instance.isClaimableFor(HATS.getNextId(hat_x_2)), false); - } - - function test_isClaimableBy() public { - assertEq(instance.isClaimableBy(hat_x_1_1), true); - assertEq(instance.isClaimableBy(hat_x_1_1_1), true); - assertEq(instance.isClaimableBy(hat_x_1_1_1_1), true); - assertEq(instance.isClaimableBy(hat_x_2), false); - assertEq(instance.isClaimableBy(HATS.getNextId(hat_x_2)), false); - } - - function test_accountCanClaim() public { - assertEq(instance.accountCanClaim(wearer, hat_x_1_1), true); - assertEq(instance.accountCanClaim(wearer, hat_x_1_1_1), true); - assertEq(instance.accountCanClaim(wearer, hat_x_1_1_1_1), false); - assertEq(instance.accountCanClaim(wearer, hat_x_2), false); - assertEq(instance.accountCanClaim(wearer, HATS.getNextId(hat_x_2)), false); - } - - function test_canClaimForAccount() public { - assertEq(instance.canClaimForAccount(wearer, hat_x_1_1), false); - assertEq(instance.canClaimForAccount(wearer, hat_x_1_1_1), true); - assertEq(instance.canClaimForAccount(wearer, hat_x_1_1_1_1), false); - assertEq(instance.canClaimForAccount(wearer, hat_x_2), false); - assertEq(instance.canClaimForAccount(wearer, HATS.getNextId(hat_x_2)), false); - } - - function test_reverts_claimHat() public { - vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimable.selector, hat_x_2)); - vm.prank(wearer); - instance.claimHat(hat_x_2); - } - - function test_reverts_claimHatFor() public { - vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimableFor.selector, hat_x_1_1)); - vm.prank(wearer); - instance.claimHatFor(hat_x_1_1, wearer); - } - - function test_reverts_claimHats() public { - vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimable.selector, hat_x_2)); - - inputHats = [hat_x_2]; - vm.prank(wearer); - instance.claimHats(inputHats); - } - - function test_reverts_claimHatsFor() public { - vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimableFor.selector, hat_x_1_1)); - - inputHats = [hat_x_1_1]; - inputWearers = [wearer]; - vm.prank(wearer); - instance.claimHatsFor(inputHats, inputWearers); - } -} - -contract ClaimHat_BatchModuleCreationAndRegistration is DeployInstance_BatchModuleCreationAndRegistration { - function setUp() public virtual override { - super.setUp(); - - vm.prank(wearer); - instance.claimHat(hat_x_1_1); - vm.prank(bot); - instance.claimHatFor(hat_x_1_1_1, wearer); - } -} - -contract TestClaimHat_BatchModuleCreationAndRegistration is ClaimHat_BatchModuleCreationAndRegistration { - function test_hatsClaimed() public { - assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1), true); - assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1), true); - } - - function test_reverts_claimHatNotEligible() public { - vm.expectRevert( - abi.encodePacked(MultiClaimsHatter_NotExplicitlyEligible.selector, uint256(uint160(wearer)), hat_x_1_1_1_1) - ); - vm.prank(wearer); - instance.claimHat(hat_x_1_1_1_1); - } - - function test_reverts_claimHatsNotEligible() public { - vm.expectRevert( - abi.encodePacked(MultiClaimsHatter_NotExplicitlyEligible.selector, uint256(uint160(wearer)), hat_x_1_1_1_1) - ); - - inputHats = [hat_x_1_1_1_1]; - vm.prank(wearer); - instance.claimHats(inputHats); - } -} - -/*////////////////////////////////////////////////////////////////////////////// - Scenario 4 - Multi Batch eligibility creation and hats registration - ////////////////////////////////////////////////////////////////////////////*/ - -contract DeployInstance_BatchMultiModuleCreationAndRegistration is Setup { - function setUp() public virtual override { - super.setUp(); - - instance = MultiClaimsHatter(deployInstance("")); - vm.prank(dao); - HATS.mintHat(hat_x_1, address(instance)); - - address alwaysEligibleModule = address(new TestEligibilityAlwaysEligible("test")); - address alwaysNotEligibleModule = address(new TestEligibilityAlwaysNotEligible("test")); - - // Batch multi modules creation and hats registration - vm.startPrank(dao); - address[] memory _implementations = new address[](3); - _implementations[0] = alwaysEligibleModule; - _implementations[1] = alwaysEligibleModule; - _implementations[2] = alwaysNotEligibleModule; - uint256[] memory _moduleHatIds = new uint256[](3); - _moduleHatIds[0] = 0; - _moduleHatIds[1] = 1; - _moduleHatIds[2] = 2; - bytes[] memory _otherImmutableArgsArray = new bytes[](3); - _otherImmutableArgsArray[0] = ""; - _otherImmutableArgsArray[1] = ""; - _otherImmutableArgsArray[2] = ""; - bytes[] memory _initDataArray = new bytes[](3); - _initDataArray[0] = ""; - _initDataArray[1] = ""; - _initDataArray[2] = ""; - uint256[] memory _hatIds = new uint256[](3); - _hatIds[0] = hat_x_1_1; - _hatIds[1] = hat_x_1_1_1; - _hatIds[2] = hat_x_1_1_1_1; - MultiClaimsHatter.ClaimType[] memory _claimTypes = new MultiClaimsHatter.ClaimType[](3); - _claimTypes[0] = MultiClaimsHatter.ClaimType.Claimable; - _claimTypes[1] = MultiClaimsHatter.ClaimType.ClaimableFor; - _claimTypes[2] = MultiClaimsHatter.ClaimType.Claimable; - - // expected module factory events - address predictedNewInatance1 = FACTORY.getHatsModuleAddress(alwaysEligibleModule, 0, "", saltNonces[0]); - vm.expectEmit(); - emit HatsModuleFactory_ModuleDeployed(alwaysEligibleModule, predictedNewInatance1, 0, "", "", saltNonces[0]); - address predictedNewInatance2 = FACTORY.getHatsModuleAddress(alwaysEligibleModule, 1, "", saltNonces[1]); - vm.expectEmit(); - emit HatsModuleFactory_ModuleDeployed(alwaysEligibleModule, predictedNewInatance2, 1, "", "", saltNonces[1]); - address predictedNewInatance3 = FACTORY.getHatsModuleAddress(alwaysNotEligibleModule, 2, "", saltNonces[2]); - vm.expectEmit(); - emit HatsModuleFactory_ModuleDeployed(alwaysNotEligibleModule, predictedNewInatance3, 2, "", "", saltNonces[2]); - - // expected claims hatter event - vm.expectEmit(); - emit HatsClaimabilitySet(_hatIds, _claimTypes); - vm.recordLogs(); - vm.getRecordedLogs(); - instance.setHatsClaimabilityAndCreateModules( - FACTORY, - _implementations, - _moduleHatIds, - _otherImmutableArgsArray, - _initDataArray, - saltNonces, - _hatIds, - _claimTypes - ); - // get created modules addresses - Vm.Log[] memory entries = vm.getRecordedLogs(); - (, address module1,,,,) = abi.decode(entries[1].data, (address, address, uint256, bytes, bytes, uint256)); - (, address module2,,,,) = abi.decode(entries[3].data, (address, address, uint256, bytes, bytes, uint256)); - (, address module3,,,,) = abi.decode(entries[5].data, (address, address, uint256, bytes, bytes, uint256)); - - HATS.changeHatEligibility(hat_x_1_1, module1); - HATS.changeHatEligibility(hat_x_1_1_1, module2); - HATS.changeHatEligibility(hat_x_1_1_1_1, module3); - HATS.changeHatEligibility(hat_x_2, module1); - vm.stopPrank(); - } -} - -contract TestDeployInstance_BatchMultiModuleCreationAndRegistration is - DeployInstance_BatchMultiModuleCreationAndRegistration -{ - function test_hatExistsFunction() public { - assertEq(instance.hatExists(hat_x_1_1), true); - assertEq(instance.hatExists(hat_x_1_1_1), true); - assertEq(instance.hatExists(hat_x_1_1_1_1), true); - assertEq(instance.hatExists(hat_x_2), true); - assertEq(instance.hatExists(HATS.getNextId(hat_x_2)), false); - } - - function test_wearsAdmin() public { - assertEq(instance.wearsAdmin(hat_x_1_1), true); - assertEq(instance.wearsAdmin(hat_x_1_1_1), true); - assertEq(instance.wearsAdmin(hat_x_1_1_1_1), true); - assertEq(instance.wearsAdmin(hat_x_2), false); - assertEq(instance.wearsAdmin(HATS.getNextId(hat_x_2)), false); - } - - function test_isClaimableFor() public { - assertEq(instance.isClaimableFor(hat_x_1_1), false); - assertEq(instance.isClaimableFor(hat_x_1_1_1), true); - assertEq(instance.isClaimableFor(hat_x_1_1_1_1), false); - assertEq(instance.isClaimableFor(hat_x_2), false); - assertEq(instance.isClaimableFor(HATS.getNextId(hat_x_2)), false); - } - - function test_isClaimableBy() public { - assertEq(instance.isClaimableBy(hat_x_1_1), true); - assertEq(instance.isClaimableBy(hat_x_1_1_1), true); - assertEq(instance.isClaimableBy(hat_x_1_1_1_1), true); - assertEq(instance.isClaimableBy(hat_x_2), false); - assertEq(instance.isClaimableBy(HATS.getNextId(hat_x_2)), false); - } - - function test_accountCanClaim() public { - assertEq(instance.accountCanClaim(wearer, hat_x_1_1), true); - assertEq(instance.accountCanClaim(wearer, hat_x_1_1_1), true); - assertEq(instance.accountCanClaim(wearer, hat_x_1_1_1_1), false); - assertEq(instance.accountCanClaim(wearer, hat_x_2), false); - assertEq(instance.accountCanClaim(wearer, HATS.getNextId(hat_x_2)), false); - } - - function test_canClaimForAccount() public { - assertEq(instance.canClaimForAccount(wearer, hat_x_1_1), false); - assertEq(instance.canClaimForAccount(wearer, hat_x_1_1_1), true); - assertEq(instance.canClaimForAccount(wearer, hat_x_1_1_1_1), false); - assertEq(instance.canClaimForAccount(wearer, hat_x_2), false); - assertEq(instance.canClaimForAccount(wearer, HATS.getNextId(hat_x_2)), false); - } - - function test_reverts_claimHat() public { - vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimable.selector, hat_x_2)); - vm.prank(wearer); - instance.claimHat(hat_x_2); - } - - function test_reverts_claimHatFor() public { - vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimableFor.selector, hat_x_1_1)); - vm.prank(wearer); - instance.claimHatFor(hat_x_1_1, wearer); - } - - function test_reverts_claimHats() public { - vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimable.selector, hat_x_2)); - - inputHats = [hat_x_2]; - vm.prank(wearer); - instance.claimHats(inputHats); - } - - function test_reverts_claimHatsFor() public { - vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimableFor.selector, hat_x_1_1)); - - inputHats = [hat_x_1_1]; - inputWearers = [wearer]; - vm.prank(wearer); - instance.claimHatsFor(inputHats, inputWearers); - } -} - -contract ClaimHat_BatchMultiModuleCreationAndRegistration is DeployInstance_BatchMultiModuleCreationAndRegistration { - function setUp() public virtual override { - super.setUp(); - - vm.prank(wearer); - instance.claimHat(hat_x_1_1); - vm.prank(bot); - instance.claimHatFor(hat_x_1_1_1, wearer); - } -} - -contract TestClaimHat_BatchMultiModuleCreationAndRegistration is ClaimHat_BatchMultiModuleCreationAndRegistration { - function test_hatsClaimed() public { - assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1), true); - assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1), true); - } - - function test_reverts_claimHatNotEligible() public { - vm.expectRevert( - abi.encodePacked(MultiClaimsHatter_NotExplicitlyEligible.selector, uint256(uint160(wearer)), hat_x_1_1_1_1) - ); - vm.prank(wearer); - instance.claimHat(hat_x_1_1_1_1); - } - - function test_reverts_claimHatsNotEligible() public { - vm.expectRevert( - abi.encodePacked(MultiClaimsHatter_NotExplicitlyEligible.selector, uint256(uint160(wearer)), hat_x_1_1_1_1) - ); - - inputHats = [hat_x_1_1_1_1]; - vm.prank(wearer); - instance.claimHats(inputHats); - } -} - -/*////////////////////////////////////////////////////////////// - Scenario 5 - Multi claiming test - //////////////////////////////////////////////////////////////*/ - -contract DeployInstance_BatchClaimHatsSetup is Setup { - function setUp() public virtual override { - super.setUp(); - - address alwaysEligibleModule = address(new TestEligibilityAlwaysEligible("test")); - - vm.startPrank(dao); - HATS.changeHatEligibility(hat_x_1_1, alwaysEligibleModule); - HATS.changeHatEligibility(hat_x_1_1_1, alwaysEligibleModule); - HATS.changeHatEligibility(hat_x_1_1_1_1, alwaysEligibleModule); - vm.stopPrank(); - - uint256[] memory initialHats = new uint256[](3); - MultiClaimsHatter.ClaimType[] memory initialClaimTypes = new MultiClaimsHatter.ClaimType[](3); - initialHats[0] = hat_x_1_1; - initialHats[1] = hat_x_1_1_1; - initialHats[2] = hat_x_1_1_1_1; - initialClaimTypes[0] = MultiClaimsHatter.ClaimType.Claimable; - initialClaimTypes[1] = MultiClaimsHatter.ClaimType.Claimable; - initialClaimTypes[2] = MultiClaimsHatter.ClaimType.Claimable; - bytes memory initData = abi.encode(initialHats, initialClaimTypes); - - vm.expectEmit(); - emit HatsClaimabilitySet(initialHats, initialClaimTypes); - instance = MultiClaimsHatter(deployInstance(initData)); - vm.prank(dao); - HATS.mintHat(hat_x_1, address(instance)); - } -} - -contract ClaimHats_BatchClaimHatsSetup is DeployInstance_BatchClaimHatsSetup { - function setUp() public virtual override { - super.setUp(); - - // prepare hats to claims array - uint256[] memory hatsToClaim = new uint256[](3); - hatsToClaim[0] = hat_x_1_1; - hatsToClaim[1] = hat_x_1_1_1; - hatsToClaim[2] = hat_x_1_1_1_1; - - // claim all hats - vm.startPrank(wearer); - vm.expectEmit(); - emit TransferSingle(address(instance), address(0), wearer, hat_x_1_1, 1); - vm.expectEmit(); - emit TransferSingle(address(instance), address(0), wearer, hat_x_1_1_1, 1); - vm.expectEmit(); - emit TransferSingle(address(instance), address(0), wearer, hat_x_1_1_1_1, 1); - instance.claimHats(hatsToClaim); - vm.stopPrank(); - } -} - -contract TestClaimHat_BatchClaimHatsSetup is ClaimHats_BatchClaimHatsSetup { - function test_hatsClaimed() public { - assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1), true); - assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1), true); - assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1_1), true); - } -} - -/*////////////////////////////////////////////////////////////// - Scenario 6 - Multi claiming for test - //////////////////////////////////////////////////////////////*/ - -contract DeployInstance_BatchClaimHatsForSetup is Setup { - function setUp() public virtual override { - super.setUp(); - - address alwaysEligibleModule = address(new TestEligibilityAlwaysEligible("test")); - - vm.startPrank(dao); - HATS.changeHatEligibility(hat_x_1_1, alwaysEligibleModule); - HATS.changeHatEligibility(hat_x_1_1_1, alwaysEligibleModule); - HATS.changeHatEligibility(hat_x_1_1_1_1, alwaysEligibleModule); - vm.stopPrank(); - - uint256[] memory initialHats = new uint256[](3); - MultiClaimsHatter.ClaimType[] memory initialClaimTypes = new MultiClaimsHatter.ClaimType[](3); - initialHats[0] = hat_x_1_1; - initialHats[1] = hat_x_1_1_1; - initialHats[2] = hat_x_1_1_1_1; - initialClaimTypes[0] = MultiClaimsHatter.ClaimType.ClaimableFor; - initialClaimTypes[1] = MultiClaimsHatter.ClaimType.ClaimableFor; - initialClaimTypes[2] = MultiClaimsHatter.ClaimType.ClaimableFor; - bytes memory initData = abi.encode(initialHats, initialClaimTypes); - - vm.expectEmit(); - emit HatsClaimabilitySet(initialHats, initialClaimTypes); - instance = MultiClaimsHatter(deployInstance(initData)); - vm.prank(dao); - HATS.mintHat(hat_x_1, address(instance)); - } -} - -contract ClaimHats_BatchClaimHatsForSetup is DeployInstance_BatchClaimHatsForSetup { - function setUp() public virtual override { - super.setUp(); - - // prepare hats and accounts arrays - uint256[] memory hatsToClaim = new uint256[](3); - hatsToClaim[0] = hat_x_1_1; - hatsToClaim[1] = hat_x_1_1_1; - hatsToClaim[2] = hat_x_1_1_1_1; - address[] memory accountsToClaimFor = new address[](3); - accountsToClaimFor[0] = wearer; - accountsToClaimFor[1] = wearer; - accountsToClaimFor[2] = wearer; - - // claim all hats - vm.startPrank(bot); - vm.expectEmit(); - emit TransferSingle(address(instance), address(0), wearer, hat_x_1_1, 1); - vm.expectEmit(); - emit TransferSingle(address(instance), address(0), wearer, hat_x_1_1_1, 1); - vm.expectEmit(); - emit TransferSingle(address(instance), address(0), wearer, hat_x_1_1_1_1, 1); - instance.claimHatsFor(hatsToClaim, accountsToClaimFor); - vm.stopPrank(); - } -} - -contract TestClaimHat_BatchClaimHatsForSetup is ClaimHats_BatchClaimHatsForSetup { - function test_hatsClaimed() public { - assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1), true); - assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1), true); - assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1_1), true); - } -} +// contract DeployInstance_WithInitialHats is Setup { +// function setUp() public virtual override { +// super.setUp(); +// +// address alwaysEligibleModule = address(new TestEligibilityAlwaysEligible("test")); +// address alwaysNotEligibleModule = address(new TestEligibilityAlwaysNotEligible("test")); +// +// vm.startPrank(dao); +// HATS.changeHatEligibility(hat_x_1_1, alwaysEligibleModule); +// HATS.changeHatEligibility(hat_x_1_1_1, alwaysEligibleModule); +// HATS.changeHatEligibility(hat_x_1_1_1_1, alwaysNotEligibleModule); +// HATS.changeHatEligibility(hat_x_2, alwaysEligibleModule); +// vm.stopPrank(); +// +// uint256[] memory initialHats = new uint256[](3); +// MultiClaimsHatter.ClaimType[] memory initialClaimTypes = new MultiClaimsHatter.ClaimType[](3); +// initialHats[0] = hat_x_1_1; +// initialHats[1] = hat_x_1_1_1; +// initialHats[2] = hat_x_1_1_1_1; +// initialClaimTypes[0] = MultiClaimsHatter.ClaimType.Claimable; +// initialClaimTypes[1] = MultiClaimsHatter.ClaimType.ClaimableFor; +// initialClaimTypes[2] = MultiClaimsHatter.ClaimType.Claimable; +// bytes memory initData = abi.encode(initialHats, initialClaimTypes); +// +// vm.expectEmit(); +// emit HatsClaimabilitySet(initialHats, initialClaimTypes); +// instance = MultiClaimsHatter(deployInstance(initData)); +// vm.prank(dao); +// HATS.mintHat(hat_x_1, address(instance)); +// } +// } +// +// contract TestDeployInstance_WithInitialHats is DeployInstance_WithInitialHats { +// function test_hatExistsFunction() public { +// assertEq(instance.hatExists(hat_x_1_1), true); +// assertEq(instance.hatExists(hat_x_1_1_1), true); +// assertEq(instance.hatExists(hat_x_1_1_1_1), true); +// assertEq(instance.hatExists(hat_x_2), true); +// assertEq(instance.hatExists(HATS.getNextId(hat_x_2)), false); +// } +// +// function test_wearsAdmin() public { +// assertEq(instance.wearsAdmin(hat_x_1_1), true); +// assertEq(instance.wearsAdmin(hat_x_1_1_1), true); +// assertEq(instance.wearsAdmin(hat_x_1_1_1_1), true); +// assertEq(instance.wearsAdmin(hat_x_2), false); +// assertEq(instance.wearsAdmin(HATS.getNextId(hat_x_2)), false); +// } +// +// function test_reverts_initialization() public { +// vm.expectRevert("Initializable: contract is already initialized"); +// instance.setUp(""); +// } +// +// function test_reverts_claimHatFor() public { +// vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimableFor.selector, hat_x_1_1)); +// vm.prank(wearer); +// instance.claimHatFor(hat_x_1_1, wearer); +// } +// +// function test_reverts_claimHatsFor() public { +// vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimableFor.selector, hat_x_1_1)); +// +// inputHats = [hat_x_1_1]; +// inputWearers = [wearer]; +// vm.prank(wearer); +// instance.claimHatsFor(inputHats, inputWearers); +// } +// +// function test_reverts_setHatClaimabilityNotAdmin() public { +// vm.expectRevert(); +// +// vm.prank(wearer); +// instance.setHatClaimability(hat_x_2, MultiClaimsHatter.ClaimType.Claimable); +// } +// +// function test_isClaimableFor() public { +// assertEq(instance.isClaimableFor(hat_x_1_1), false); +// assertEq(instance.isClaimableFor(hat_x_1_1_1), true); +// assertEq(instance.isClaimableFor(hat_x_1_1_1_1), false); +// assertEq(instance.isClaimableFor(hat_x_2), false); +// assertEq(instance.isClaimableFor(HATS.getNextId(hat_x_2)), false); +// } +// +// function test_isClaimableBy() public { +// assertEq(instance.isClaimableBy(hat_x_1_1), true); +// assertEq(instance.isClaimableBy(hat_x_1_1_1), true); +// assertEq(instance.isClaimableBy(hat_x_1_1_1_1), true); +// assertEq(instance.isClaimableBy(hat_x_2), false); +// assertEq(instance.isClaimableBy(HATS.getNextId(hat_x_2)), false); +// } +// +// function test_accountCanClaim() public { +// assertEq(instance.accountCanClaim(wearer, hat_x_1_1), true); +// assertEq(instance.accountCanClaim(wearer, hat_x_1_1_1), true); +// assertEq(instance.accountCanClaim(wearer, hat_x_1_1_1_1), false); +// assertEq(instance.accountCanClaim(wearer, hat_x_2), false); +// assertEq(instance.accountCanClaim(wearer, HATS.getNextId(hat_x_2)), false); +// } +// +// function test_canClaimForAccount() public { +// assertEq(instance.canClaimForAccount(wearer, hat_x_1_1), false); +// assertEq(instance.canClaimForAccount(wearer, hat_x_1_1_1), true); +// assertEq(instance.canClaimForAccount(wearer, hat_x_1_1_1_1), false); +// assertEq(instance.canClaimForAccount(wearer, hat_x_2), false); +// assertEq(instance.canClaimForAccount(wearer, HATS.getNextId(hat_x_2)), false); +// } +// +// function test_reverts_claimHat() public { +// vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimable.selector, hat_x_2)); +// vm.prank(wearer); +// instance.claimHat(hat_x_2); +// } +// +// function test_reverts_claimHats() public { +// vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimable.selector, hat_x_2)); +// +// inputHats = [hat_x_2]; +// vm.prank(wearer); +// instance.claimHats(inputHats); +// } +// } +// +// contract ClaimHat_WithInitialHats is DeployInstance_WithInitialHats { +// function setUp() public virtual override { +// super.setUp(); +// +// vm.prank(wearer); +// instance.claimHat(hat_x_1_1); +// vm.prank(bot); +// instance.claimHatFor(hat_x_1_1_1, wearer); +// } +// } +// +// contract TestClaimHat_WithInitialHats is ClaimHat_WithInitialHats { +// function test_hatsClaimed() public { +// assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1), true); +// assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1), true); +// } +// +// function test_reverts_claimHatNotEligible() public { +// vm.expectRevert( +// abi.encodePacked(MultiClaimsHatter_NotExplicitlyEligible.selector, uint256(uint160(wearer)), hat_x_1_1_1_1) +// ); +// vm.prank(wearer); +// instance.claimHat(hat_x_1_1_1_1); +// } +// +// function test_reverts_claimHatsNotEligible() public { +// vm.expectRevert( +// abi.encodePacked(MultiClaimsHatter_NotExplicitlyEligible.selector, uint256(uint160(wearer)), hat_x_1_1_1_1) +// ); +// +// inputHats = [hat_x_1_1_1_1]; +// vm.prank(wearer); +// instance.claimHats(inputHats); +// } +// } +// +// /*////////////////////////////////////////////////////////////////////////////// +// Scenario 3 - Single Batch eligibility creation and hats registration +// ////////////////////////////////////////////////////////////////////////////*/ +// +// contract DeployInstance_BatchModuleCreationAndRegistration is Setup { +// function getHatsModuleAddress(uint256 _hatId, address _hat, bytes calldata _initData, uint256 _saltNonce) internal returns (address addr) { +// bytes memory args = abi.encodePacked(_hatId, _hat, _initData); +// bytes32 salt = keccak256(abi.encodePacked(args, block.chainid, _saltNonce)); +// bytes memory bytecode = type(MultiClaimsHatter).creationCode; +// assembly { +// addr := create2(0, add(bytecode, 32), mload(bytecode), salt) +// } +// +// } +// function setUp() public virtual override { +// super.setUp(); +// +// instance = MultiClaimsHatter(deployInstance("")); +// vm.prank(dao); +// HATS.mintHat(hat_x_1, address(instance)); +// +// address alwaysEligibleModule = address(new TestEligibilityAlwaysEligible("test")); +// address alwaysNotEligibleModule = address(new TestEligibilityAlwaysNotEligible("test")); +// +// vm.startPrank(dao); +// address predictedNewInatance1 = FACTORY.getHatsModuleAddress(alwaysEligibleModule, 0, "", saltNonce); +// vm.expectEmit(); +// emit HatsModuleFactory_ModuleDeployed(alwaysEligibleModule, predictedNewInatance1, 0, "", "", saltNonce); +// vm.expectEmit(); +// emit HatClaimabilitySet(hat_x_1_1, MultiClaimsHatter.ClaimType.Claimable); +// address module1 = instance.setHatClaimabilityAndCreateModule( +// FACTORY, alwaysEligibleModule, 0, "", "", saltNonce, hat_x_1_1, MultiClaimsHatter.ClaimType.Claimable +// ); +// +// address predictedNewInatance2 = FACTORY.getHatsModuleAddress(alwaysEligibleModule, 1, "", saltNonce); +// vm.expectEmit(); +// emit HatsModuleFactory_ModuleDeployed(alwaysEligibleModule, predictedNewInatance2, 1, "", "", saltNonce); +// vm.expectEmit(); +// emit HatClaimabilitySet(hat_x_1_1_1, MultiClaimsHatter.ClaimType.ClaimableFor); +// address module2 = instance.setHatClaimabilityAndCreateModule( +// FACTORY, alwaysEligibleModule, 1, "", "", saltNonce, hat_x_1_1_1, MultiClaimsHatter.ClaimType.ClaimableFor +// ); +// +// address predictedNewInatance3 = FACTORY.getHatsModuleAddress(alwaysNotEligibleModule, 2, "", saltNonce); +// vm.expectEmit(); +// emit HatsModuleFactory_ModuleDeployed(alwaysNotEligibleModule, predictedNewInatance3, 2, "", "", saltNonce); +// vm.expectEmit(); +// emit HatClaimabilitySet(hat_x_1_1_1_1, MultiClaimsHatter.ClaimType.Claimable); +// address module3 = instance.setHatClaimabilityAndCreateModule( +// FACTORY, alwaysNotEligibleModule, 2, "", "", saltNonce, hat_x_1_1_1_1, MultiClaimsHatter.ClaimType.Claimable +// ); +// vm.stopPrank(); +// +// vm.startPrank(dao); +// HATS.changeHatEligibility(hat_x_1_1, module1); +// HATS.changeHatEligibility(hat_x_1_1_1, module2); +// HATS.changeHatEligibility(hat_x_1_1_1_1, module3); +// HATS.changeHatEligibility(hat_x_2, module1); +// vm.stopPrank(); +// } +// } +// +// contract TestDeployInstance_BatchModuleCreationAndRegistration is DeployInstance_BatchModuleCreationAndRegistration { +// function test_hatExistsFunction() public { +// assertEq(instance.hatExists(hat_x_1_1), true); +// assertEq(instance.hatExists(hat_x_1_1_1), true); +// assertEq(instance.hatExists(hat_x_1_1_1_1), true); +// assertEq(instance.hatExists(hat_x_2), true); +// assertEq(instance.hatExists(HATS.getNextId(hat_x_2)), false); +// } +// +// function test_wearsAdmin() public { +// assertEq(instance.wearsAdmin(hat_x_1_1), true); +// assertEq(instance.wearsAdmin(hat_x_1_1_1), true); +// assertEq(instance.wearsAdmin(hat_x_1_1_1_1), true); +// assertEq(instance.wearsAdmin(hat_x_2), false); +// assertEq(instance.wearsAdmin(HATS.getNextId(hat_x_2)), false); +// } +// +// function test_isClaimableFor() public { +// assertEq(instance.isClaimableFor(hat_x_1_1), false); +// assertEq(instance.isClaimableFor(hat_x_1_1_1), true); +// assertEq(instance.isClaimableFor(hat_x_1_1_1_1), false); +// assertEq(instance.isClaimableFor(hat_x_2), false); +// assertEq(instance.isClaimableFor(HATS.getNextId(hat_x_2)), false); +// } +// +// function test_isClaimableBy() public { +// assertEq(instance.isClaimableBy(hat_x_1_1), true); +// assertEq(instance.isClaimableBy(hat_x_1_1_1), true); +// assertEq(instance.isClaimableBy(hat_x_1_1_1_1), true); +// assertEq(instance.isClaimableBy(hat_x_2), false); +// assertEq(instance.isClaimableBy(HATS.getNextId(hat_x_2)), false); +// } +// +// function test_accountCanClaim() public { +// assertEq(instance.accountCanClaim(wearer, hat_x_1_1), true); +// assertEq(instance.accountCanClaim(wearer, hat_x_1_1_1), true); +// assertEq(instance.accountCanClaim(wearer, hat_x_1_1_1_1), false); +// assertEq(instance.accountCanClaim(wearer, hat_x_2), false); +// assertEq(instance.accountCanClaim(wearer, HATS.getNextId(hat_x_2)), false); +// } +// +// function test_canClaimForAccount() public { +// assertEq(instance.canClaimForAccount(wearer, hat_x_1_1), false); +// assertEq(instance.canClaimForAccount(wearer, hat_x_1_1_1), true); +// assertEq(instance.canClaimForAccount(wearer, hat_x_1_1_1_1), false); +// assertEq(instance.canClaimForAccount(wearer, hat_x_2), false); +// assertEq(instance.canClaimForAccount(wearer, HATS.getNextId(hat_x_2)), false); +// } +// +// function test_reverts_claimHat() public { +// vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimable.selector, hat_x_2)); +// vm.prank(wearer); +// instance.claimHat(hat_x_2); +// } +// +// function test_reverts_claimHatFor() public { +// vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimableFor.selector, hat_x_1_1)); +// vm.prank(wearer); +// instance.claimHatFor(hat_x_1_1, wearer); +// } +// +// function test_reverts_claimHats() public { +// vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimable.selector, hat_x_2)); +// +// inputHats = [hat_x_2]; +// vm.prank(wearer); +// instance.claimHats(inputHats); +// } +// +// function test_reverts_claimHatsFor() public { +// vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimableFor.selector, hat_x_1_1)); +// +// inputHats = [hat_x_1_1]; +// inputWearers = [wearer]; +// vm.prank(wearer); +// instance.claimHatsFor(inputHats, inputWearers); +// } +// } +// +// contract ClaimHat_BatchModuleCreationAndRegistration is DeployInstance_BatchModuleCreationAndRegistration { +// function setUp() public virtual override { +// super.setUp(); +// +// vm.prank(wearer); +// instance.claimHat(hat_x_1_1); +// vm.prank(bot); +// instance.claimHatFor(hat_x_1_1_1, wearer); +// } +// } +// +// contract TestClaimHat_BatchModuleCreationAndRegistration is ClaimHat_BatchModuleCreationAndRegistration { +// function test_hatsClaimed() public { +// assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1), true); +// assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1), true); +// } +// +// function test_reverts_claimHatNotEligible() public { +// vm.expectRevert( +// abi.encodePacked(MultiClaimsHatter_NotExplicitlyEligible.selector, uint256(uint160(wearer)), hat_x_1_1_1_1) +// ); +// vm.prank(wearer); +// instance.claimHat(hat_x_1_1_1_1); +// } +// +// function test_reverts_claimHatsNotEligible() public { +// vm.expectRevert( +// abi.encodePacked(MultiClaimsHatter_NotExplicitlyEligible.selector, uint256(uint160(wearer)), hat_x_1_1_1_1) +// ); +// +// inputHats = [hat_x_1_1_1_1]; +// vm.prank(wearer); +// instance.claimHats(inputHats); +// } +// } +// +// /*////////////////////////////////////////////////////////////////////////////// +// Scenario 4 - Multi Batch eligibility creation and hats registration +// ////////////////////////////////////////////////////////////////////////////*/ +// +// contract DeployInstance_BatchMultiModuleCreationAndRegistration is Setup { +// function setUp() public virtual override { +// super.setUp(); +// +// instance = MultiClaimsHatter(deployInstance("")); +// vm.prank(dao); +// HATS.mintHat(hat_x_1, address(instance)); +// +// address alwaysEligibleModule = address(new TestEligibilityAlwaysEligible("test")); +// address alwaysNotEligibleModule = address(new TestEligibilityAlwaysNotEligible("test")); +// +// // Batch multi modules creation and hats registration +// vm.startPrank(dao); +// address[] memory _implementations = new address[](3); +// _implementations[0] = alwaysEligibleModule; +// _implementations[1] = alwaysEligibleModule; +// _implementations[2] = alwaysNotEligibleModule; +// uint256[] memory _moduleHatIds = new uint256[](3); +// _moduleHatIds[0] = 0; +// _moduleHatIds[1] = 1; +// _moduleHatIds[2] = 2; +// bytes[] memory _otherImmutableArgsArray = new bytes[](3); +// _otherImmutableArgsArray[0] = ""; +// _otherImmutableArgsArray[1] = ""; +// _otherImmutableArgsArray[2] = ""; +// bytes[] memory _initDataArray = new bytes[](3); +// _initDataArray[0] = ""; +// _initDataArray[1] = ""; +// _initDataArray[2] = ""; +// uint256[] memory _hatIds = new uint256[](3); +// _hatIds[0] = hat_x_1_1; +// _hatIds[1] = hat_x_1_1_1; +// _hatIds[2] = hat_x_1_1_1_1; +// MultiClaimsHatter.ClaimType[] memory _claimTypes = new MultiClaimsHatter.ClaimType[](3); +// _claimTypes[0] = MultiClaimsHatter.ClaimType.Claimable; +// _claimTypes[1] = MultiClaimsHatter.ClaimType.ClaimableFor; +// _claimTypes[2] = MultiClaimsHatter.ClaimType.Claimable; +// +// // expected module factory events +// address predictedNewInatance1 = FACTORY.getHatsModuleAddress(alwaysEligibleModule, 0, "", saltNonces[0]); +// vm.expectEmit(); +// emit HatsModuleFactory_ModuleDeployed(alwaysEligibleModule, predictedNewInatance1, 0, "", "", saltNonces[0]); +// address predictedNewInatance2 = FACTORY.getHatsModuleAddress(alwaysEligibleModule, 1, "", saltNonces[1]); +// vm.expectEmit(); +// emit HatsModuleFactory_ModuleDeployed(alwaysEligibleModule, predictedNewInatance2, 1, "", "", saltNonces[1]); +// address predictedNewInatance3 = FACTORY.getHatsModuleAddress(alwaysNotEligibleModule, 2, "", saltNonces[2]); +// vm.expectEmit(); +// emit HatsModuleFactory_ModuleDeployed(alwaysNotEligibleModule, predictedNewInatance3, 2, "", "", saltNonces[2]); +// +// // expected claims hatter event +// vm.expectEmit(); +// emit HatsClaimabilitySet(_hatIds, _claimTypes); +// vm.recordLogs(); +// vm.getRecordedLogs(); +// instance.setHatsClaimabilityAndCreateModules( +// FACTORY, +// _implementations, +// _moduleHatIds, +// _otherImmutableArgsArray, +// _initDataArray, +// saltNonces, +// _hatIds, +// _claimTypes +// ); +// // get created modules addresses +// Vm.Log[] memory entries = vm.getRecordedLogs(); +// (, address module1,,,,) = abi.decode(entries[1].data, (address, address, uint256, bytes, bytes, uint256)); +// (, address module2,,,,) = abi.decode(entries[3].data, (address, address, uint256, bytes, bytes, uint256)); +// (, address module3,,,,) = abi.decode(entries[5].data, (address, address, uint256, bytes, bytes, uint256)); +// +// HATS.changeHatEligibility(hat_x_1_1, module1); +// HATS.changeHatEligibility(hat_x_1_1_1, module2); +// HATS.changeHatEligibility(hat_x_1_1_1_1, module3); +// HATS.changeHatEligibility(hat_x_2, module1); +// vm.stopPrank(); +// } +// } +// +// contract TestDeployInstance_BatchMultiModuleCreationAndRegistration is +// DeployInstance_BatchMultiModuleCreationAndRegistration +// { +// function test_hatExistsFunction() public { +// assertEq(instance.hatExists(hat_x_1_1), true); +// assertEq(instance.hatExists(hat_x_1_1_1), true); +// assertEq(instance.hatExists(hat_x_1_1_1_1), true); +// assertEq(instance.hatExists(hat_x_2), true); +// assertEq(instance.hatExists(HATS.getNextId(hat_x_2)), false); +// } +// +// function test_wearsAdmin() public { +// assertEq(instance.wearsAdmin(hat_x_1_1), true); +// assertEq(instance.wearsAdmin(hat_x_1_1_1), true); +// assertEq(instance.wearsAdmin(hat_x_1_1_1_1), true); +// assertEq(instance.wearsAdmin(hat_x_2), false); +// assertEq(instance.wearsAdmin(HATS.getNextId(hat_x_2)), false); +// } +// +// function test_isClaimableFor() public { +// assertEq(instance.isClaimableFor(hat_x_1_1), false); +// assertEq(instance.isClaimableFor(hat_x_1_1_1), true); +// assertEq(instance.isClaimableFor(hat_x_1_1_1_1), false); +// assertEq(instance.isClaimableFor(hat_x_2), false); +// assertEq(instance.isClaimableFor(HATS.getNextId(hat_x_2)), false); +// } +// +// function test_isClaimableBy() public { +// assertEq(instance.isClaimableBy(hat_x_1_1), true); +// assertEq(instance.isClaimableBy(hat_x_1_1_1), true); +// assertEq(instance.isClaimableBy(hat_x_1_1_1_1), true); +// assertEq(instance.isClaimableBy(hat_x_2), false); +// assertEq(instance.isClaimableBy(HATS.getNextId(hat_x_2)), false); +// } +// +// function test_accountCanClaim() public { +// assertEq(instance.accountCanClaim(wearer, hat_x_1_1), true); +// assertEq(instance.accountCanClaim(wearer, hat_x_1_1_1), true); +// assertEq(instance.accountCanClaim(wearer, hat_x_1_1_1_1), false); +// assertEq(instance.accountCanClaim(wearer, hat_x_2), false); +// assertEq(instance.accountCanClaim(wearer, HATS.getNextId(hat_x_2)), false); +// } +// +// function test_canClaimForAccount() public { +// assertEq(instance.canClaimForAccount(wearer, hat_x_1_1), false); +// assertEq(instance.canClaimForAccount(wearer, hat_x_1_1_1), true); +// assertEq(instance.canClaimForAccount(wearer, hat_x_1_1_1_1), false); +// assertEq(instance.canClaimForAccount(wearer, hat_x_2), false); +// assertEq(instance.canClaimForAccount(wearer, HATS.getNextId(hat_x_2)), false); +// } +// +// function test_reverts_claimHat() public { +// vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimable.selector, hat_x_2)); +// vm.prank(wearer); +// instance.claimHat(hat_x_2); +// } +// +// function test_reverts_claimHatFor() public { +// vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimableFor.selector, hat_x_1_1)); +// vm.prank(wearer); +// instance.claimHatFor(hat_x_1_1, wearer); +// } +// +// function test_reverts_claimHats() public { +// vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimable.selector, hat_x_2)); +// +// inputHats = [hat_x_2]; +// vm.prank(wearer); +// instance.claimHats(inputHats); +// } +// +// function test_reverts_claimHatsFor() public { +// vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimableFor.selector, hat_x_1_1)); +// +// inputHats = [hat_x_1_1]; +// inputWearers = [wearer]; +// vm.prank(wearer); +// instance.claimHatsFor(inputHats, inputWearers); +// } +// } +// +// contract ClaimHat_BatchMultiModuleCreationAndRegistration is DeployInstance_BatchMultiModuleCreationAndRegistration { +// function setUp() public virtual override { +// super.setUp(); +// +// vm.prank(wearer); +// instance.claimHat(hat_x_1_1); +// vm.prank(bot); +// instance.claimHatFor(hat_x_1_1_1, wearer); +// } +// } +// +// contract TestClaimHat_BatchMultiModuleCreationAndRegistration is ClaimHat_BatchMultiModuleCreationAndRegistration { +// function test_hatsClaimed() public { +// assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1), true); +// assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1), true); +// } +// +// function test_reverts_claimHatNotEligible() public { +// vm.expectRevert( +// abi.encodePacked(MultiClaimsHatter_NotExplicitlyEligible.selector, uint256(uint160(wearer)), hat_x_1_1_1_1) +// ); +// vm.prank(wearer); +// instance.claimHat(hat_x_1_1_1_1); +// } +// +// function test_reverts_claimHatsNotEligible() public { +// vm.expectRevert( +// abi.encodePacked(MultiClaimsHatter_NotExplicitlyEligible.selector, uint256(uint160(wearer)), hat_x_1_1_1_1) +// ); +// +// inputHats = [hat_x_1_1_1_1]; +// vm.prank(wearer); +// instance.claimHats(inputHats); +// } +// } +// +// /*////////////////////////////////////////////////////////////// +// Scenario 5 - Multi claiming test +// //////////////////////////////////////////////////////////////*/ +// +// contract DeployInstance_BatchClaimHatsSetup is Setup { +// function setUp() public virtual override { +// super.setUp(); +// +// address alwaysEligibleModule = address(new TestEligibilityAlwaysEligible("test")); +// +// vm.startPrank(dao); +// HATS.changeHatEligibility(hat_x_1_1, alwaysEligibleModule); +// HATS.changeHatEligibility(hat_x_1_1_1, alwaysEligibleModule); +// HATS.changeHatEligibility(hat_x_1_1_1_1, alwaysEligibleModule); +// vm.stopPrank(); +// +// uint256[] memory initialHats = new uint256[](3); +// MultiClaimsHatter.ClaimType[] memory initialClaimTypes = new MultiClaimsHatter.ClaimType[](3); +// initialHats[0] = hat_x_1_1; +// initialHats[1] = hat_x_1_1_1; +// initialHats[2] = hat_x_1_1_1_1; +// initialClaimTypes[0] = MultiClaimsHatter.ClaimType.Claimable; +// initialClaimTypes[1] = MultiClaimsHatter.ClaimType.Claimable; +// initialClaimTypes[2] = MultiClaimsHatter.ClaimType.Claimable; +// bytes memory initData = abi.encode(initialHats, initialClaimTypes); +// +// vm.expectEmit(); +// emit HatsClaimabilitySet(initialHats, initialClaimTypes); +// instance = MultiClaimsHatter(deployInstance(initData)); +// vm.prank(dao); +// HATS.mintHat(hat_x_1, address(instance)); +// } +// } +// +// contract ClaimHats_BatchClaimHatsSetup is DeployInstance_BatchClaimHatsSetup { +// function setUp() public virtual override { +// super.setUp(); +// +// // prepare hats to claims array +// uint256[] memory hatsToClaim = new uint256[](3); +// hatsToClaim[0] = hat_x_1_1; +// hatsToClaim[1] = hat_x_1_1_1; +// hatsToClaim[2] = hat_x_1_1_1_1; +// +// // claim all hats +// vm.startPrank(wearer); +// vm.expectEmit(); +// emit TransferSingle(address(instance), address(0), wearer, hat_x_1_1, 1); +// vm.expectEmit(); +// emit TransferSingle(address(instance), address(0), wearer, hat_x_1_1_1, 1); +// vm.expectEmit(); +// emit TransferSingle(address(instance), address(0), wearer, hat_x_1_1_1_1, 1); +// instance.claimHats(hatsToClaim); +// vm.stopPrank(); +// } +// } +// +// contract TestClaimHat_BatchClaimHatsSetup is ClaimHats_BatchClaimHatsSetup { +// function test_hatsClaimed() public { +// assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1), true); +// assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1), true); +// assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1_1), true); +// } +// } +// +// /*////////////////////////////////////////////////////////////// +// Scenario 6 - Multi claiming for test +// //////////////////////////////////////////////////////////////*/ +// +// contract DeployInstance_BatchClaimHatsForSetup is Setup { +// function setUp() public virtual override { +// super.setUp(); +// +// address alwaysEligibleModule = address(new TestEligibilityAlwaysEligible("test")); +// +// vm.startPrank(dao); +// HATS.changeHatEligibility(hat_x_1_1, alwaysEligibleModule); +// HATS.changeHatEligibility(hat_x_1_1_1, alwaysEligibleModule); +// HATS.changeHatEligibility(hat_x_1_1_1_1, alwaysEligibleModule); +// vm.stopPrank(); +// +// uint256[] memory initialHats = new uint256[](3); +// MultiClaimsHatter.ClaimType[] memory initialClaimTypes = new MultiClaimsHatter.ClaimType[](3); +// initialHats[0] = hat_x_1_1; +// initialHats[1] = hat_x_1_1_1; +// initialHats[2] = hat_x_1_1_1_1; +// initialClaimTypes[0] = MultiClaimsHatter.ClaimType.ClaimableFor; +// initialClaimTypes[1] = MultiClaimsHatter.ClaimType.ClaimableFor; +// initialClaimTypes[2] = MultiClaimsHatter.ClaimType.ClaimableFor; +// bytes memory initData = abi.encode(initialHats, initialClaimTypes); +// +// vm.expectEmit(); +// emit HatsClaimabilitySet(initialHats, initialClaimTypes); +// instance = MultiClaimsHatter(deployInstance(initData)); +// vm.prank(dao); +// HATS.mintHat(hat_x_1, address(instance)); +// } +// } +// +// contract ClaimHats_BatchClaimHatsForSetup is DeployInstance_BatchClaimHatsForSetup { +// function setUp() public virtual override { +// super.setUp(); +// +// // prepare hats and accounts arrays +// uint256[] memory hatsToClaim = new uint256[](3); +// hatsToClaim[0] = hat_x_1_1; +// hatsToClaim[1] = hat_x_1_1_1; +// hatsToClaim[2] = hat_x_1_1_1_1; +// address[] memory accountsToClaimFor = new address[](3); +// accountsToClaimFor[0] = wearer; +// accountsToClaimFor[1] = wearer; +// accountsToClaimFor[2] = wearer; +// +// // claim all hats +// vm.startPrank(bot); +// vm.expectEmit(); +// emit TransferSingle(address(instance), address(0), wearer, hat_x_1_1, 1); +// vm.expectEmit(); +// emit TransferSingle(address(instance), address(0), wearer, hat_x_1_1_1, 1); +// vm.expectEmit(); +// emit TransferSingle(address(instance), address(0), wearer, hat_x_1_1_1_1, 1); +// instance.claimHatsFor(hatsToClaim, accountsToClaimFor); +// vm.stopPrank(); +// } +// } +// +// contract TestClaimHat_BatchClaimHatsForSetup is ClaimHats_BatchClaimHatsForSetup { +// function test_hatsClaimed() public { +// assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1), true); +// assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1), true); +// assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1_1), true); +// } +// } diff --git a/test/utils/TestModules.sol b/test/utils/TestModules.sol index b5e5c3d..34b9dce 100644 --- a/test/utils/TestModules.sol +++ b/test/utils/TestModules.sol @@ -6,7 +6,7 @@ import { HatsEligibilityModule } from "hats-module/HatsEligibilityModule.sol"; import { HatsModule } from "hats-module/HatsModule.sol"; contract TestEligibilityAlwaysEligible is HatsEligibilityModule { - constructor(string memory _version) HatsModule(_version) { } + constructor(string memory _version, address _hat, uint256 _hatId) HatsModule(_version, _hat, _hatId) { } function getWearerStatus(address, /* _wearer */ uint256 /* _hatId */ ) public @@ -19,7 +19,7 @@ contract TestEligibilityAlwaysEligible is HatsEligibilityModule { } contract TestEligibilityAlwaysNotEligible is HatsEligibilityModule { - constructor(string memory _version) HatsModule(_version) { } + constructor(string memory _version, address _hat, uint256 _hatId) HatsModule(_version, _hat, _hatId) { } function getWearerStatus(address, /* _wearer */ uint256 /* _hatId */ ) public From 6a53dc9e067891b43f8c1bed65d720b35dbf587d Mon Sep 17 00:00:00 2001 From: keating Date: Tue, 18 Jun 2024 21:51:43 -0400 Subject: [PATCH 04/18] Tests passing --- lib/ERC1155/ERC1155.sol | 261 ------ remappings.txt | 2 + script/MultiClaimsHatter.s.sol | 2 +- src/MultiClaimsHatterFactory.sol | 7 +- test/MultiClaimsHatter.t.sol | 1364 +++++++++++++++--------------- 5 files changed, 705 insertions(+), 931 deletions(-) delete mode 100644 lib/ERC1155/ERC1155.sol diff --git a/lib/ERC1155/ERC1155.sol b/lib/ERC1155/ERC1155.sol deleted file mode 100644 index a590021..0000000 --- a/lib/ERC1155/ERC1155.sol +++ /dev/null @@ -1,261 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-only -pragma solidity >=0.8.0; - -/// @notice Minimalist and gas efficient standard ERC1155 implementation. -/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC1155.sol) -abstract contract ERC1155 { - /*////////////////////////////////////////////////////////////// - EVENTS - //////////////////////////////////////////////////////////////*/ - - event TransferSingle( - address indexed operator, - address indexed from, - address indexed to, - uint256 id, - uint256 amount - ); - - event TransferBatch( - address indexed operator, - address indexed from, - address indexed to, - uint256[] ids, - uint256[] amounts - ); - - event ApprovalForAll(address indexed owner, address indexed operator, bool approved); - - event URI(string value, uint256 indexed id); - - /*////////////////////////////////////////////////////////////// - ERC1155 STORAGE - //////////////////////////////////////////////////////////////*/ - - mapping(address => mapping(uint256 => uint256)) internal _balanceOf; - - mapping(address => mapping(address => bool)) public isApprovedForAll; - - /*////////////////////////////////////////////////////////////// - METADATA LOGIC - //////////////////////////////////////////////////////////////*/ - - function uri(uint256 id) public view virtual returns (string memory); - - /*////////////////////////////////////////////////////////////// - ERC1155 LOGIC - //////////////////////////////////////////////////////////////*/ - - function setApprovalForAll(address operator, bool approved) public virtual { - isApprovedForAll[msg.sender][operator] = approved; - - emit ApprovalForAll(msg.sender, operator, approved); - } - - function safeTransferFrom( - address from, - address to, - uint256 id, - uint256 amount, - bytes calldata data - ) public virtual { - require(msg.sender == from || isApprovedForAll[from][msg.sender], "NOT_AUTHORIZED"); - - _balanceOf[from][id] -= amount; - _balanceOf[to][id] += amount; - - emit TransferSingle(msg.sender, from, to, id, amount); - - require( - to.code.length == 0 - ? to != address(0) - : ERC1155TokenReceiver(to).onERC1155Received(msg.sender, from, id, amount, data) == - ERC1155TokenReceiver.onERC1155Received.selector, - "UNSAFE_RECIPIENT" - ); - } - - function safeBatchTransferFrom( - address from, - address to, - uint256[] calldata ids, - uint256[] calldata amounts, - bytes calldata data - ) public virtual { - require(ids.length == amounts.length, "LENGTH_MISMATCH"); - - require(msg.sender == from || isApprovedForAll[from][msg.sender], "NOT_AUTHORIZED"); - - // Storing these outside the loop saves ~15 gas per iteration. - uint256 id; - uint256 amount; - - for (uint256 i = 0; i < ids.length; ) { - id = ids[i]; - amount = amounts[i]; - - _balanceOf[from][id] -= amount; - _balanceOf[to][id] += amount; - - // An array can't have a total length - // larger than the max uint256 value. - unchecked { - ++i; - } - } - - emit TransferBatch(msg.sender, from, to, ids, amounts); - - require( - to.code.length == 0 - ? to != address(0) - : ERC1155TokenReceiver(to).onERC1155BatchReceived(msg.sender, from, ids, amounts, data) == - ERC1155TokenReceiver.onERC1155BatchReceived.selector, - "UNSAFE_RECIPIENT" - ); - } - - function balanceOf(address owner, uint256 id) public view virtual returns (uint256 balance) { - balance = _balanceOf[owner][id]; - } - - function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) - public - view - virtual - returns (uint256[] memory balances) - { - require(owners.length == ids.length, "LENGTH_MISMATCH"); - - balances = new uint256[](owners.length); - - // Unchecked because the only math done is incrementing - // the array index counter which cannot possibly overflow. - unchecked { - for (uint256 i = 0; i < owners.length; ++i) { - balances[i] = _balanceOf[owners[i]][ids[i]]; - } - } - } - - /*////////////////////////////////////////////////////////////// - ERC165 LOGIC - //////////////////////////////////////////////////////////////*/ - - function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { - return - interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165 - interfaceId == 0xd9b67a26 || // ERC165 Interface ID for ERC1155 - interfaceId == 0x0e89341c; // ERC165 Interface ID for ERC1155MetadataURI - } - - /*////////////////////////////////////////////////////////////// - INTERNAL MINT/BURN LOGIC - //////////////////////////////////////////////////////////////*/ - - function _mint( - address to, - uint256 id, - uint256 amount, - bytes memory data - ) internal virtual { - _balanceOf[to][id] += amount; - - emit TransferSingle(msg.sender, address(0), to, id, amount); - - require( - to.code.length == 0 - ? to != address(0) - : ERC1155TokenReceiver(to).onERC1155Received(msg.sender, address(0), id, amount, data) == - ERC1155TokenReceiver.onERC1155Received.selector, - "UNSAFE_RECIPIENT" - ); - } - - function _batchMint( - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) internal virtual { - uint256 idsLength = ids.length; // Saves MLOADs. - - require(idsLength == amounts.length, "LENGTH_MISMATCH"); - - for (uint256 i = 0; i < idsLength; ) { - _balanceOf[to][ids[i]] += amounts[i]; - - // An array can't have a total length - // larger than the max uint256 value. - unchecked { - ++i; - } - } - - emit TransferBatch(msg.sender, address(0), to, ids, amounts); - - require( - to.code.length == 0 - ? to != address(0) - : ERC1155TokenReceiver(to).onERC1155BatchReceived(msg.sender, address(0), ids, amounts, data) == - ERC1155TokenReceiver.onERC1155BatchReceived.selector, - "UNSAFE_RECIPIENT" - ); - } - - function _batchBurn( - address from, - uint256[] memory ids, - uint256[] memory amounts - ) internal virtual { - uint256 idsLength = ids.length; // Saves MLOADs. - - require(idsLength == amounts.length, "LENGTH_MISMATCH"); - - for (uint256 i = 0; i < idsLength; ) { - _balanceOf[from][ids[i]] -= amounts[i]; - - // An array can't have a total length - // larger than the max uint256 value. - unchecked { - ++i; - } - } - - emit TransferBatch(msg.sender, from, address(0), ids, amounts); - } - - function _burn( - address from, - uint256 id, - uint256 amount - ) internal virtual { - _balanceOf[from][id] -= amount; - - emit TransferSingle(msg.sender, from, address(0), id, amount); - } -} - -/// @notice A generic interface for a contract which properly accepts ERC1155 tokens. -/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC1155.sol) -abstract contract ERC1155TokenReceiver { - function onERC1155Received( - address, - address, - uint256, - uint256, - bytes calldata - ) external virtual returns (bytes4) { - return ERC1155TokenReceiver.onERC1155Received.selector; - } - - function onERC1155BatchReceived( - address, - address, - uint256[] calldata, - uint256[] calldata, - bytes calldata - ) external virtual returns (bytes4) { - return ERC1155TokenReceiver.onERC1155BatchReceived.selector; - } -} diff --git a/remappings.txt b/remappings.txt index 828c61d..87dc19f 100644 --- a/remappings.txt +++ b/remappings.txt @@ -1,6 +1,8 @@ ds-test/=lib/forge-std/lib/ds-test/src/ forge-std/=lib/forge-std/src/ hats-module/=lib/hats-module/src/ +ERC1155/=lib/hats-protocol/lib/ERC1155/ +lib/ERC1155/=lib/hats-protocol/lib/ERC1155/ @openzeppelin-contracts/=lib/hats-module/lib/openzeppelin-contracts/ hats-protocol/=lib/hats-protocol/src openzeppelin-contracts/=lib/hats-module/lib/openzeppelin-contracts/ diff --git a/script/MultiClaimsHatter.s.sol b/script/MultiClaimsHatter.s.sol index 04c0af9..629c836 100644 --- a/script/MultiClaimsHatter.s.sol +++ b/script/MultiClaimsHatter.s.sol @@ -89,7 +89,7 @@ contract DeployImplementation is Script { * never differs regardless of where its being compiled * 2. The provided salt, `SALT` */ - // implementation = new MultiClaimsHatter{ salt: SALT }(_version /* insert constructor args here */ ); + // implementation = new MultiClaimsHatter{ salt: SALT }(_version /* insert constructor args here */ ); vm.stopBroadcast(); diff --git a/src/MultiClaimsHatterFactory.sol b/src/MultiClaimsHatterFactory.sol index 1a85d47..7a28f2e 100644 --- a/src/MultiClaimsHatterFactory.sol +++ b/src/MultiClaimsHatterFactory.sol @@ -11,7 +11,10 @@ contract MultiClaimsHatterFactory { address implementation, address instance, uint256 hatId, bytes otherImmutableArgs, bytes initData, uint256 saltNonce ); - function deployMultiClaimsHatter(uint256 _hatId, address _hat, bytes calldata _initData, uint256 _saltNonce) external returns (address) { + function deployMultiClaimsHatter(uint256 _hatId, address _hat, bytes calldata _initData, uint256 _saltNonce) + external + returns (address) + { bytes memory args = abi.encodePacked(_hatId, _hat, _initData); bytes32 salt = _calculateSalt(args, _saltNonce); // If exists throw error @@ -22,7 +25,7 @@ contract MultiClaimsHatterFactory { emit HatsModuleFactory_ModuleDeployed( address(instance), address(instance), _hatId, abi.encodePacked(_hat, _initData), _initData, _saltNonce ); - return address(instance); + return address(instance); } function _calculateSalt(bytes memory _args, uint256 _saltNonce) internal view returns (bytes32) { diff --git a/test/MultiClaimsHatter.t.sol b/test/MultiClaimsHatter.t.sol index 18bb379..48c57b4 100644 --- a/test/MultiClaimsHatter.t.sol +++ b/test/MultiClaimsHatter.t.sol @@ -153,10 +153,11 @@ contract TestDeployInstance_WithoutInitialHats is DeployInstance_WithoutInitialH assertEq(instance.canClaimForAccount(wearer, HATS.getNextId(hat_x_2)), false); } - function test_reverts_initialization() public { - vm.expectRevert("Initializable: contract is already initialized"); - instance.setUp(""); - } + // Returns nothing + // function test_reverts_initialization() public { + // vm.expectRevert("Initializable: contract is already initialized"); + // instance.setUp(""); + // } function test_reverts_claimHat() public { vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimable.selector, hat_x_1_1)); @@ -341,671 +342,700 @@ contract TestClaimHat_WithoutInitialHats is ClaimHat_WithoutInitialHats { Scenario 2 - Delpoy Claims Hatter with initial hats //////////////////////////////////////////////////////////////*/ -// contract DeployInstance_WithInitialHats is Setup { -// function setUp() public virtual override { -// super.setUp(); -// -// address alwaysEligibleModule = address(new TestEligibilityAlwaysEligible("test")); -// address alwaysNotEligibleModule = address(new TestEligibilityAlwaysNotEligible("test")); -// -// vm.startPrank(dao); -// HATS.changeHatEligibility(hat_x_1_1, alwaysEligibleModule); -// HATS.changeHatEligibility(hat_x_1_1_1, alwaysEligibleModule); -// HATS.changeHatEligibility(hat_x_1_1_1_1, alwaysNotEligibleModule); -// HATS.changeHatEligibility(hat_x_2, alwaysEligibleModule); -// vm.stopPrank(); -// -// uint256[] memory initialHats = new uint256[](3); -// MultiClaimsHatter.ClaimType[] memory initialClaimTypes = new MultiClaimsHatter.ClaimType[](3); -// initialHats[0] = hat_x_1_1; -// initialHats[1] = hat_x_1_1_1; -// initialHats[2] = hat_x_1_1_1_1; -// initialClaimTypes[0] = MultiClaimsHatter.ClaimType.Claimable; -// initialClaimTypes[1] = MultiClaimsHatter.ClaimType.ClaimableFor; -// initialClaimTypes[2] = MultiClaimsHatter.ClaimType.Claimable; -// bytes memory initData = abi.encode(initialHats, initialClaimTypes); -// -// vm.expectEmit(); -// emit HatsClaimabilitySet(initialHats, initialClaimTypes); -// instance = MultiClaimsHatter(deployInstance(initData)); -// vm.prank(dao); -// HATS.mintHat(hat_x_1, address(instance)); -// } -// } -// -// contract TestDeployInstance_WithInitialHats is DeployInstance_WithInitialHats { -// function test_hatExistsFunction() public { -// assertEq(instance.hatExists(hat_x_1_1), true); -// assertEq(instance.hatExists(hat_x_1_1_1), true); -// assertEq(instance.hatExists(hat_x_1_1_1_1), true); -// assertEq(instance.hatExists(hat_x_2), true); -// assertEq(instance.hatExists(HATS.getNextId(hat_x_2)), false); -// } -// -// function test_wearsAdmin() public { -// assertEq(instance.wearsAdmin(hat_x_1_1), true); -// assertEq(instance.wearsAdmin(hat_x_1_1_1), true); -// assertEq(instance.wearsAdmin(hat_x_1_1_1_1), true); -// assertEq(instance.wearsAdmin(hat_x_2), false); -// assertEq(instance.wearsAdmin(HATS.getNextId(hat_x_2)), false); -// } -// -// function test_reverts_initialization() public { -// vm.expectRevert("Initializable: contract is already initialized"); -// instance.setUp(""); -// } -// -// function test_reverts_claimHatFor() public { -// vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimableFor.selector, hat_x_1_1)); -// vm.prank(wearer); -// instance.claimHatFor(hat_x_1_1, wearer); -// } -// -// function test_reverts_claimHatsFor() public { -// vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimableFor.selector, hat_x_1_1)); -// -// inputHats = [hat_x_1_1]; -// inputWearers = [wearer]; -// vm.prank(wearer); -// instance.claimHatsFor(inputHats, inputWearers); -// } -// -// function test_reverts_setHatClaimabilityNotAdmin() public { -// vm.expectRevert(); -// -// vm.prank(wearer); -// instance.setHatClaimability(hat_x_2, MultiClaimsHatter.ClaimType.Claimable); -// } -// -// function test_isClaimableFor() public { -// assertEq(instance.isClaimableFor(hat_x_1_1), false); -// assertEq(instance.isClaimableFor(hat_x_1_1_1), true); -// assertEq(instance.isClaimableFor(hat_x_1_1_1_1), false); -// assertEq(instance.isClaimableFor(hat_x_2), false); -// assertEq(instance.isClaimableFor(HATS.getNextId(hat_x_2)), false); -// } -// -// function test_isClaimableBy() public { -// assertEq(instance.isClaimableBy(hat_x_1_1), true); -// assertEq(instance.isClaimableBy(hat_x_1_1_1), true); -// assertEq(instance.isClaimableBy(hat_x_1_1_1_1), true); -// assertEq(instance.isClaimableBy(hat_x_2), false); -// assertEq(instance.isClaimableBy(HATS.getNextId(hat_x_2)), false); -// } -// -// function test_accountCanClaim() public { -// assertEq(instance.accountCanClaim(wearer, hat_x_1_1), true); -// assertEq(instance.accountCanClaim(wearer, hat_x_1_1_1), true); -// assertEq(instance.accountCanClaim(wearer, hat_x_1_1_1_1), false); -// assertEq(instance.accountCanClaim(wearer, hat_x_2), false); -// assertEq(instance.accountCanClaim(wearer, HATS.getNextId(hat_x_2)), false); -// } -// -// function test_canClaimForAccount() public { -// assertEq(instance.canClaimForAccount(wearer, hat_x_1_1), false); -// assertEq(instance.canClaimForAccount(wearer, hat_x_1_1_1), true); -// assertEq(instance.canClaimForAccount(wearer, hat_x_1_1_1_1), false); -// assertEq(instance.canClaimForAccount(wearer, hat_x_2), false); -// assertEq(instance.canClaimForAccount(wearer, HATS.getNextId(hat_x_2)), false); -// } -// -// function test_reverts_claimHat() public { -// vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimable.selector, hat_x_2)); -// vm.prank(wearer); -// instance.claimHat(hat_x_2); -// } -// -// function test_reverts_claimHats() public { -// vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimable.selector, hat_x_2)); -// -// inputHats = [hat_x_2]; -// vm.prank(wearer); -// instance.claimHats(inputHats); -// } -// } -// -// contract ClaimHat_WithInitialHats is DeployInstance_WithInitialHats { -// function setUp() public virtual override { -// super.setUp(); -// -// vm.prank(wearer); -// instance.claimHat(hat_x_1_1); -// vm.prank(bot); -// instance.claimHatFor(hat_x_1_1_1, wearer); -// } -// } -// -// contract TestClaimHat_WithInitialHats is ClaimHat_WithInitialHats { -// function test_hatsClaimed() public { -// assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1), true); -// assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1), true); -// } -// -// function test_reverts_claimHatNotEligible() public { -// vm.expectRevert( -// abi.encodePacked(MultiClaimsHatter_NotExplicitlyEligible.selector, uint256(uint160(wearer)), hat_x_1_1_1_1) -// ); -// vm.prank(wearer); -// instance.claimHat(hat_x_1_1_1_1); -// } -// -// function test_reverts_claimHatsNotEligible() public { -// vm.expectRevert( -// abi.encodePacked(MultiClaimsHatter_NotExplicitlyEligible.selector, uint256(uint160(wearer)), hat_x_1_1_1_1) -// ); -// -// inputHats = [hat_x_1_1_1_1]; -// vm.prank(wearer); -// instance.claimHats(inputHats); -// } -// } +contract DeployInstance_WithInitialHats is Setup { + function setUp() public virtual override { + super.setUp(); + + address alwaysEligibleModule = address(new TestEligibilityAlwaysEligible("test", address(0), 0)); + address alwaysNotEligibleModule = address(new TestEligibilityAlwaysNotEligible("test", address(0), 0)); + + vm.startPrank(dao); + HATS.changeHatEligibility(hat_x_1_1, alwaysEligibleModule); + HATS.changeHatEligibility(hat_x_1_1_1, alwaysEligibleModule); + HATS.changeHatEligibility(hat_x_1_1_1_1, alwaysNotEligibleModule); + HATS.changeHatEligibility(hat_x_2, alwaysEligibleModule); + vm.stopPrank(); + + uint256[] memory initialHats = new uint256[](3); + MultiClaimsHatter.ClaimType[] memory initialClaimTypes = new MultiClaimsHatter.ClaimType[](3); + initialHats[0] = hat_x_1_1; + initialHats[1] = hat_x_1_1_1; + initialHats[2] = hat_x_1_1_1_1; + initialClaimTypes[0] = MultiClaimsHatter.ClaimType.Claimable; + initialClaimTypes[1] = MultiClaimsHatter.ClaimType.ClaimableFor; + initialClaimTypes[2] = MultiClaimsHatter.ClaimType.Claimable; + bytes memory initData = abi.encode(initialHats, initialClaimTypes); + + // vm.expectEmit(); + // emit HatsClaimabilitySet(initialHats, initialClaimTypes); + instance = MultiClaimsHatter(deployInstance(initData)); + vm.prank(dao); + HATS.mintHat(hat_x_1, address(instance)); + } +} + +contract TestDeployInstance_WithInitialHats is DeployInstance_WithInitialHats { + function test_hatExistsFunction() public { + assertEq(instance.hatExists(hat_x_1_1), true); + assertEq(instance.hatExists(hat_x_1_1_1), true); + assertEq(instance.hatExists(hat_x_1_1_1_1), true); + assertEq(instance.hatExists(hat_x_2), true); + assertEq(instance.hatExists(HATS.getNextId(hat_x_2)), false); + } + + function test_wearsAdmin() public { + assertEq(instance.wearsAdmin(hat_x_1_1), true); + assertEq(instance.wearsAdmin(hat_x_1_1_1), true); + assertEq(instance.wearsAdmin(hat_x_1_1_1_1), true); + assertEq(instance.wearsAdmin(hat_x_2), false); + assertEq(instance.wearsAdmin(HATS.getNextId(hat_x_2)), false); + } + + // function test_reverts_initialization() public { + // vm.expectRevert("Initializable: contract is already initialized"); + // instance.setUp(""); + // } + + function test_reverts_claimHatFor() public { + vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimableFor.selector, hat_x_1_1)); + vm.prank(wearer); + instance.claimHatFor(hat_x_1_1, wearer); + } + + function test_reverts_claimHatsFor() public { + vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimableFor.selector, hat_x_1_1)); + + inputHats = [hat_x_1_1]; + inputWearers = [wearer]; + vm.prank(wearer); + instance.claimHatsFor(inputHats, inputWearers); + } + + function test_reverts_setHatClaimabilityNotAdmin() public { + vm.expectRevert(); + + vm.prank(wearer); + instance.setHatClaimability(hat_x_2, MultiClaimsHatter.ClaimType.Claimable); + } + + function test_isClaimableFor() public { + assertEq(instance.isClaimableFor(hat_x_1_1), false); + assertEq(instance.isClaimableFor(hat_x_1_1_1), true); + assertEq(instance.isClaimableFor(hat_x_1_1_1_1), false); + assertEq(instance.isClaimableFor(hat_x_2), false); + assertEq(instance.isClaimableFor(HATS.getNextId(hat_x_2)), false); + } + + function test_isClaimableBy() public { + assertEq(instance.isClaimableBy(hat_x_1_1), true); + assertEq(instance.isClaimableBy(hat_x_1_1_1), true); + assertEq(instance.isClaimableBy(hat_x_1_1_1_1), true); + assertEq(instance.isClaimableBy(hat_x_2), false); + assertEq(instance.isClaimableBy(HATS.getNextId(hat_x_2)), false); + } + + function test_accountCanClaim() public { + assertEq(instance.accountCanClaim(wearer, hat_x_1_1), true); + assertEq(instance.accountCanClaim(wearer, hat_x_1_1_1), true); + assertEq(instance.accountCanClaim(wearer, hat_x_1_1_1_1), false); + assertEq(instance.accountCanClaim(wearer, hat_x_2), false); + assertEq(instance.accountCanClaim(wearer, HATS.getNextId(hat_x_2)), false); + } + + function test_canClaimForAccount() public { + assertEq(instance.canClaimForAccount(wearer, hat_x_1_1), false); + assertEq(instance.canClaimForAccount(wearer, hat_x_1_1_1), true); + assertEq(instance.canClaimForAccount(wearer, hat_x_1_1_1_1), false); + assertEq(instance.canClaimForAccount(wearer, hat_x_2), false); + assertEq(instance.canClaimForAccount(wearer, HATS.getNextId(hat_x_2)), false); + } + + function test_reverts_claimHat() public { + vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimable.selector, hat_x_2)); + vm.prank(wearer); + instance.claimHat(hat_x_2); + } + + function test_reverts_claimHats() public { + vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimable.selector, hat_x_2)); + + inputHats = [hat_x_2]; + vm.prank(wearer); + instance.claimHats(inputHats); + } +} + +contract ClaimHat_WithInitialHats is DeployInstance_WithInitialHats { + function setUp() public virtual override { + super.setUp(); + + vm.prank(wearer); + instance.claimHat(hat_x_1_1); + vm.prank(bot); + instance.claimHatFor(hat_x_1_1_1, wearer); + } +} + +contract TestClaimHat_WithInitialHats is ClaimHat_WithInitialHats { + function test_hatsClaimed() public { + assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1), true); + assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1), true); + } + + function test_reverts_claimHatNotEligible() public { + vm.expectRevert( + abi.encodePacked(MultiClaimsHatter_NotExplicitlyEligible.selector, uint256(uint160(wearer)), hat_x_1_1_1_1) + ); + vm.prank(wearer); + instance.claimHat(hat_x_1_1_1_1); + } + + function test_reverts_claimHatsNotEligible() public { + vm.expectRevert( + abi.encodePacked(MultiClaimsHatter_NotExplicitlyEligible.selector, uint256(uint160(wearer)), hat_x_1_1_1_1) + ); + + inputHats = [hat_x_1_1_1_1]; + vm.prank(wearer); + instance.claimHats(inputHats); + } +} // // /*////////////////////////////////////////////////////////////////////////////// // Scenario 3 - Single Batch eligibility creation and hats registration // ////////////////////////////////////////////////////////////////////////////*/ // -// contract DeployInstance_BatchModuleCreationAndRegistration is Setup { -// function getHatsModuleAddress(uint256 _hatId, address _hat, bytes calldata _initData, uint256 _saltNonce) internal returns (address addr) { -// bytes memory args = abi.encodePacked(_hatId, _hat, _initData); -// bytes32 salt = keccak256(abi.encodePacked(args, block.chainid, _saltNonce)); -// bytes memory bytecode = type(MultiClaimsHatter).creationCode; -// assembly { -// addr := create2(0, add(bytecode, 32), mload(bytecode), salt) -// } -// -// } -// function setUp() public virtual override { -// super.setUp(); -// -// instance = MultiClaimsHatter(deployInstance("")); -// vm.prank(dao); -// HATS.mintHat(hat_x_1, address(instance)); -// -// address alwaysEligibleModule = address(new TestEligibilityAlwaysEligible("test")); -// address alwaysNotEligibleModule = address(new TestEligibilityAlwaysNotEligible("test")); -// -// vm.startPrank(dao); -// address predictedNewInatance1 = FACTORY.getHatsModuleAddress(alwaysEligibleModule, 0, "", saltNonce); -// vm.expectEmit(); -// emit HatsModuleFactory_ModuleDeployed(alwaysEligibleModule, predictedNewInatance1, 0, "", "", saltNonce); -// vm.expectEmit(); -// emit HatClaimabilitySet(hat_x_1_1, MultiClaimsHatter.ClaimType.Claimable); -// address module1 = instance.setHatClaimabilityAndCreateModule( -// FACTORY, alwaysEligibleModule, 0, "", "", saltNonce, hat_x_1_1, MultiClaimsHatter.ClaimType.Claimable -// ); -// -// address predictedNewInatance2 = FACTORY.getHatsModuleAddress(alwaysEligibleModule, 1, "", saltNonce); -// vm.expectEmit(); -// emit HatsModuleFactory_ModuleDeployed(alwaysEligibleModule, predictedNewInatance2, 1, "", "", saltNonce); -// vm.expectEmit(); -// emit HatClaimabilitySet(hat_x_1_1_1, MultiClaimsHatter.ClaimType.ClaimableFor); -// address module2 = instance.setHatClaimabilityAndCreateModule( -// FACTORY, alwaysEligibleModule, 1, "", "", saltNonce, hat_x_1_1_1, MultiClaimsHatter.ClaimType.ClaimableFor -// ); -// -// address predictedNewInatance3 = FACTORY.getHatsModuleAddress(alwaysNotEligibleModule, 2, "", saltNonce); -// vm.expectEmit(); -// emit HatsModuleFactory_ModuleDeployed(alwaysNotEligibleModule, predictedNewInatance3, 2, "", "", saltNonce); -// vm.expectEmit(); -// emit HatClaimabilitySet(hat_x_1_1_1_1, MultiClaimsHatter.ClaimType.Claimable); -// address module3 = instance.setHatClaimabilityAndCreateModule( -// FACTORY, alwaysNotEligibleModule, 2, "", "", saltNonce, hat_x_1_1_1_1, MultiClaimsHatter.ClaimType.Claimable -// ); -// vm.stopPrank(); -// -// vm.startPrank(dao); -// HATS.changeHatEligibility(hat_x_1_1, module1); -// HATS.changeHatEligibility(hat_x_1_1_1, module2); -// HATS.changeHatEligibility(hat_x_1_1_1_1, module3); -// HATS.changeHatEligibility(hat_x_2, module1); -// vm.stopPrank(); -// } -// } -// -// contract TestDeployInstance_BatchModuleCreationAndRegistration is DeployInstance_BatchModuleCreationAndRegistration { -// function test_hatExistsFunction() public { -// assertEq(instance.hatExists(hat_x_1_1), true); -// assertEq(instance.hatExists(hat_x_1_1_1), true); -// assertEq(instance.hatExists(hat_x_1_1_1_1), true); -// assertEq(instance.hatExists(hat_x_2), true); -// assertEq(instance.hatExists(HATS.getNextId(hat_x_2)), false); -// } -// -// function test_wearsAdmin() public { -// assertEq(instance.wearsAdmin(hat_x_1_1), true); -// assertEq(instance.wearsAdmin(hat_x_1_1_1), true); -// assertEq(instance.wearsAdmin(hat_x_1_1_1_1), true); -// assertEq(instance.wearsAdmin(hat_x_2), false); -// assertEq(instance.wearsAdmin(HATS.getNextId(hat_x_2)), false); -// } -// -// function test_isClaimableFor() public { -// assertEq(instance.isClaimableFor(hat_x_1_1), false); -// assertEq(instance.isClaimableFor(hat_x_1_1_1), true); -// assertEq(instance.isClaimableFor(hat_x_1_1_1_1), false); -// assertEq(instance.isClaimableFor(hat_x_2), false); -// assertEq(instance.isClaimableFor(HATS.getNextId(hat_x_2)), false); -// } -// -// function test_isClaimableBy() public { -// assertEq(instance.isClaimableBy(hat_x_1_1), true); -// assertEq(instance.isClaimableBy(hat_x_1_1_1), true); -// assertEq(instance.isClaimableBy(hat_x_1_1_1_1), true); -// assertEq(instance.isClaimableBy(hat_x_2), false); -// assertEq(instance.isClaimableBy(HATS.getNextId(hat_x_2)), false); -// } -// -// function test_accountCanClaim() public { -// assertEq(instance.accountCanClaim(wearer, hat_x_1_1), true); -// assertEq(instance.accountCanClaim(wearer, hat_x_1_1_1), true); -// assertEq(instance.accountCanClaim(wearer, hat_x_1_1_1_1), false); -// assertEq(instance.accountCanClaim(wearer, hat_x_2), false); -// assertEq(instance.accountCanClaim(wearer, HATS.getNextId(hat_x_2)), false); -// } -// -// function test_canClaimForAccount() public { -// assertEq(instance.canClaimForAccount(wearer, hat_x_1_1), false); -// assertEq(instance.canClaimForAccount(wearer, hat_x_1_1_1), true); -// assertEq(instance.canClaimForAccount(wearer, hat_x_1_1_1_1), false); -// assertEq(instance.canClaimForAccount(wearer, hat_x_2), false); -// assertEq(instance.canClaimForAccount(wearer, HATS.getNextId(hat_x_2)), false); -// } -// -// function test_reverts_claimHat() public { -// vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimable.selector, hat_x_2)); -// vm.prank(wearer); -// instance.claimHat(hat_x_2); -// } -// -// function test_reverts_claimHatFor() public { -// vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimableFor.selector, hat_x_1_1)); -// vm.prank(wearer); -// instance.claimHatFor(hat_x_1_1, wearer); -// } -// -// function test_reverts_claimHats() public { -// vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimable.selector, hat_x_2)); -// -// inputHats = [hat_x_2]; -// vm.prank(wearer); -// instance.claimHats(inputHats); -// } -// -// function test_reverts_claimHatsFor() public { -// vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimableFor.selector, hat_x_1_1)); -// -// inputHats = [hat_x_1_1]; -// inputWearers = [wearer]; -// vm.prank(wearer); -// instance.claimHatsFor(inputHats, inputWearers); -// } -// } -// -// contract ClaimHat_BatchModuleCreationAndRegistration is DeployInstance_BatchModuleCreationAndRegistration { -// function setUp() public virtual override { -// super.setUp(); -// -// vm.prank(wearer); -// instance.claimHat(hat_x_1_1); -// vm.prank(bot); -// instance.claimHatFor(hat_x_1_1_1, wearer); -// } -// } -// -// contract TestClaimHat_BatchModuleCreationAndRegistration is ClaimHat_BatchModuleCreationAndRegistration { -// function test_hatsClaimed() public { -// assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1), true); -// assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1), true); -// } -// -// function test_reverts_claimHatNotEligible() public { -// vm.expectRevert( -// abi.encodePacked(MultiClaimsHatter_NotExplicitlyEligible.selector, uint256(uint160(wearer)), hat_x_1_1_1_1) -// ); -// vm.prank(wearer); -// instance.claimHat(hat_x_1_1_1_1); -// } -// -// function test_reverts_claimHatsNotEligible() public { -// vm.expectRevert( -// abi.encodePacked(MultiClaimsHatter_NotExplicitlyEligible.selector, uint256(uint160(wearer)), hat_x_1_1_1_1) -// ); -// -// inputHats = [hat_x_1_1_1_1]; -// vm.prank(wearer); -// instance.claimHats(inputHats); -// } -// } -// -// /*////////////////////////////////////////////////////////////////////////////// -// Scenario 4 - Multi Batch eligibility creation and hats registration -// ////////////////////////////////////////////////////////////////////////////*/ -// -// contract DeployInstance_BatchMultiModuleCreationAndRegistration is Setup { -// function setUp() public virtual override { -// super.setUp(); -// -// instance = MultiClaimsHatter(deployInstance("")); -// vm.prank(dao); -// HATS.mintHat(hat_x_1, address(instance)); -// -// address alwaysEligibleModule = address(new TestEligibilityAlwaysEligible("test")); -// address alwaysNotEligibleModule = address(new TestEligibilityAlwaysNotEligible("test")); -// -// // Batch multi modules creation and hats registration -// vm.startPrank(dao); -// address[] memory _implementations = new address[](3); -// _implementations[0] = alwaysEligibleModule; -// _implementations[1] = alwaysEligibleModule; -// _implementations[2] = alwaysNotEligibleModule; -// uint256[] memory _moduleHatIds = new uint256[](3); -// _moduleHatIds[0] = 0; -// _moduleHatIds[1] = 1; -// _moduleHatIds[2] = 2; -// bytes[] memory _otherImmutableArgsArray = new bytes[](3); -// _otherImmutableArgsArray[0] = ""; -// _otherImmutableArgsArray[1] = ""; -// _otherImmutableArgsArray[2] = ""; -// bytes[] memory _initDataArray = new bytes[](3); -// _initDataArray[0] = ""; -// _initDataArray[1] = ""; -// _initDataArray[2] = ""; -// uint256[] memory _hatIds = new uint256[](3); -// _hatIds[0] = hat_x_1_1; -// _hatIds[1] = hat_x_1_1_1; -// _hatIds[2] = hat_x_1_1_1_1; -// MultiClaimsHatter.ClaimType[] memory _claimTypes = new MultiClaimsHatter.ClaimType[](3); -// _claimTypes[0] = MultiClaimsHatter.ClaimType.Claimable; -// _claimTypes[1] = MultiClaimsHatter.ClaimType.ClaimableFor; -// _claimTypes[2] = MultiClaimsHatter.ClaimType.Claimable; -// -// // expected module factory events -// address predictedNewInatance1 = FACTORY.getHatsModuleAddress(alwaysEligibleModule, 0, "", saltNonces[0]); -// vm.expectEmit(); -// emit HatsModuleFactory_ModuleDeployed(alwaysEligibleModule, predictedNewInatance1, 0, "", "", saltNonces[0]); -// address predictedNewInatance2 = FACTORY.getHatsModuleAddress(alwaysEligibleModule, 1, "", saltNonces[1]); -// vm.expectEmit(); -// emit HatsModuleFactory_ModuleDeployed(alwaysEligibleModule, predictedNewInatance2, 1, "", "", saltNonces[1]); -// address predictedNewInatance3 = FACTORY.getHatsModuleAddress(alwaysNotEligibleModule, 2, "", saltNonces[2]); -// vm.expectEmit(); -// emit HatsModuleFactory_ModuleDeployed(alwaysNotEligibleModule, predictedNewInatance3, 2, "", "", saltNonces[2]); -// -// // expected claims hatter event -// vm.expectEmit(); -// emit HatsClaimabilitySet(_hatIds, _claimTypes); -// vm.recordLogs(); -// vm.getRecordedLogs(); -// instance.setHatsClaimabilityAndCreateModules( -// FACTORY, -// _implementations, -// _moduleHatIds, -// _otherImmutableArgsArray, -// _initDataArray, -// saltNonces, -// _hatIds, -// _claimTypes -// ); -// // get created modules addresses -// Vm.Log[] memory entries = vm.getRecordedLogs(); -// (, address module1,,,,) = abi.decode(entries[1].data, (address, address, uint256, bytes, bytes, uint256)); -// (, address module2,,,,) = abi.decode(entries[3].data, (address, address, uint256, bytes, bytes, uint256)); -// (, address module3,,,,) = abi.decode(entries[5].data, (address, address, uint256, bytes, bytes, uint256)); -// -// HATS.changeHatEligibility(hat_x_1_1, module1); -// HATS.changeHatEligibility(hat_x_1_1_1, module2); -// HATS.changeHatEligibility(hat_x_1_1_1_1, module3); -// HATS.changeHatEligibility(hat_x_2, module1); -// vm.stopPrank(); -// } -// } -// -// contract TestDeployInstance_BatchMultiModuleCreationAndRegistration is -// DeployInstance_BatchMultiModuleCreationAndRegistration -// { -// function test_hatExistsFunction() public { -// assertEq(instance.hatExists(hat_x_1_1), true); -// assertEq(instance.hatExists(hat_x_1_1_1), true); -// assertEq(instance.hatExists(hat_x_1_1_1_1), true); -// assertEq(instance.hatExists(hat_x_2), true); -// assertEq(instance.hatExists(HATS.getNextId(hat_x_2)), false); -// } -// -// function test_wearsAdmin() public { -// assertEq(instance.wearsAdmin(hat_x_1_1), true); -// assertEq(instance.wearsAdmin(hat_x_1_1_1), true); -// assertEq(instance.wearsAdmin(hat_x_1_1_1_1), true); -// assertEq(instance.wearsAdmin(hat_x_2), false); -// assertEq(instance.wearsAdmin(HATS.getNextId(hat_x_2)), false); -// } -// -// function test_isClaimableFor() public { -// assertEq(instance.isClaimableFor(hat_x_1_1), false); -// assertEq(instance.isClaimableFor(hat_x_1_1_1), true); -// assertEq(instance.isClaimableFor(hat_x_1_1_1_1), false); -// assertEq(instance.isClaimableFor(hat_x_2), false); -// assertEq(instance.isClaimableFor(HATS.getNextId(hat_x_2)), false); -// } -// -// function test_isClaimableBy() public { -// assertEq(instance.isClaimableBy(hat_x_1_1), true); -// assertEq(instance.isClaimableBy(hat_x_1_1_1), true); -// assertEq(instance.isClaimableBy(hat_x_1_1_1_1), true); -// assertEq(instance.isClaimableBy(hat_x_2), false); -// assertEq(instance.isClaimableBy(HATS.getNextId(hat_x_2)), false); -// } -// -// function test_accountCanClaim() public { -// assertEq(instance.accountCanClaim(wearer, hat_x_1_1), true); -// assertEq(instance.accountCanClaim(wearer, hat_x_1_1_1), true); -// assertEq(instance.accountCanClaim(wearer, hat_x_1_1_1_1), false); -// assertEq(instance.accountCanClaim(wearer, hat_x_2), false); -// assertEq(instance.accountCanClaim(wearer, HATS.getNextId(hat_x_2)), false); -// } -// -// function test_canClaimForAccount() public { -// assertEq(instance.canClaimForAccount(wearer, hat_x_1_1), false); -// assertEq(instance.canClaimForAccount(wearer, hat_x_1_1_1), true); -// assertEq(instance.canClaimForAccount(wearer, hat_x_1_1_1_1), false); -// assertEq(instance.canClaimForAccount(wearer, hat_x_2), false); -// assertEq(instance.canClaimForAccount(wearer, HATS.getNextId(hat_x_2)), false); -// } -// -// function test_reverts_claimHat() public { -// vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimable.selector, hat_x_2)); -// vm.prank(wearer); -// instance.claimHat(hat_x_2); -// } -// -// function test_reverts_claimHatFor() public { -// vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimableFor.selector, hat_x_1_1)); -// vm.prank(wearer); -// instance.claimHatFor(hat_x_1_1, wearer); -// } -// -// function test_reverts_claimHats() public { -// vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimable.selector, hat_x_2)); -// -// inputHats = [hat_x_2]; -// vm.prank(wearer); -// instance.claimHats(inputHats); -// } -// -// function test_reverts_claimHatsFor() public { -// vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimableFor.selector, hat_x_1_1)); -// -// inputHats = [hat_x_1_1]; -// inputWearers = [wearer]; -// vm.prank(wearer); -// instance.claimHatsFor(inputHats, inputWearers); -// } -// } -// -// contract ClaimHat_BatchMultiModuleCreationAndRegistration is DeployInstance_BatchMultiModuleCreationAndRegistration { -// function setUp() public virtual override { -// super.setUp(); -// -// vm.prank(wearer); -// instance.claimHat(hat_x_1_1); -// vm.prank(bot); -// instance.claimHatFor(hat_x_1_1_1, wearer); -// } -// } -// -// contract TestClaimHat_BatchMultiModuleCreationAndRegistration is ClaimHat_BatchMultiModuleCreationAndRegistration { -// function test_hatsClaimed() public { -// assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1), true); -// assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1), true); -// } -// -// function test_reverts_claimHatNotEligible() public { -// vm.expectRevert( -// abi.encodePacked(MultiClaimsHatter_NotExplicitlyEligible.selector, uint256(uint160(wearer)), hat_x_1_1_1_1) -// ); -// vm.prank(wearer); -// instance.claimHat(hat_x_1_1_1_1); -// } -// -// function test_reverts_claimHatsNotEligible() public { -// vm.expectRevert( -// abi.encodePacked(MultiClaimsHatter_NotExplicitlyEligible.selector, uint256(uint160(wearer)), hat_x_1_1_1_1) -// ); -// -// inputHats = [hat_x_1_1_1_1]; -// vm.prank(wearer); -// instance.claimHats(inputHats); -// } -// } -// -// /*////////////////////////////////////////////////////////////// -// Scenario 5 - Multi claiming test -// //////////////////////////////////////////////////////////////*/ -// -// contract DeployInstance_BatchClaimHatsSetup is Setup { -// function setUp() public virtual override { -// super.setUp(); -// -// address alwaysEligibleModule = address(new TestEligibilityAlwaysEligible("test")); -// -// vm.startPrank(dao); -// HATS.changeHatEligibility(hat_x_1_1, alwaysEligibleModule); -// HATS.changeHatEligibility(hat_x_1_1_1, alwaysEligibleModule); -// HATS.changeHatEligibility(hat_x_1_1_1_1, alwaysEligibleModule); -// vm.stopPrank(); -// -// uint256[] memory initialHats = new uint256[](3); -// MultiClaimsHatter.ClaimType[] memory initialClaimTypes = new MultiClaimsHatter.ClaimType[](3); -// initialHats[0] = hat_x_1_1; -// initialHats[1] = hat_x_1_1_1; -// initialHats[2] = hat_x_1_1_1_1; -// initialClaimTypes[0] = MultiClaimsHatter.ClaimType.Claimable; -// initialClaimTypes[1] = MultiClaimsHatter.ClaimType.Claimable; -// initialClaimTypes[2] = MultiClaimsHatter.ClaimType.Claimable; -// bytes memory initData = abi.encode(initialHats, initialClaimTypes); -// -// vm.expectEmit(); -// emit HatsClaimabilitySet(initialHats, initialClaimTypes); -// instance = MultiClaimsHatter(deployInstance(initData)); -// vm.prank(dao); -// HATS.mintHat(hat_x_1, address(instance)); -// } -// } -// -// contract ClaimHats_BatchClaimHatsSetup is DeployInstance_BatchClaimHatsSetup { -// function setUp() public virtual override { -// super.setUp(); -// -// // prepare hats to claims array -// uint256[] memory hatsToClaim = new uint256[](3); -// hatsToClaim[0] = hat_x_1_1; -// hatsToClaim[1] = hat_x_1_1_1; -// hatsToClaim[2] = hat_x_1_1_1_1; -// -// // claim all hats -// vm.startPrank(wearer); -// vm.expectEmit(); -// emit TransferSingle(address(instance), address(0), wearer, hat_x_1_1, 1); -// vm.expectEmit(); -// emit TransferSingle(address(instance), address(0), wearer, hat_x_1_1_1, 1); -// vm.expectEmit(); -// emit TransferSingle(address(instance), address(0), wearer, hat_x_1_1_1_1, 1); -// instance.claimHats(hatsToClaim); -// vm.stopPrank(); -// } -// } -// -// contract TestClaimHat_BatchClaimHatsSetup is ClaimHats_BatchClaimHatsSetup { -// function test_hatsClaimed() public { -// assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1), true); -// assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1), true); -// assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1_1), true); -// } -// } -// -// /*////////////////////////////////////////////////////////////// -// Scenario 6 - Multi claiming for test -// //////////////////////////////////////////////////////////////*/ -// -// contract DeployInstance_BatchClaimHatsForSetup is Setup { -// function setUp() public virtual override { -// super.setUp(); -// -// address alwaysEligibleModule = address(new TestEligibilityAlwaysEligible("test")); -// -// vm.startPrank(dao); -// HATS.changeHatEligibility(hat_x_1_1, alwaysEligibleModule); -// HATS.changeHatEligibility(hat_x_1_1_1, alwaysEligibleModule); -// HATS.changeHatEligibility(hat_x_1_1_1_1, alwaysEligibleModule); -// vm.stopPrank(); -// -// uint256[] memory initialHats = new uint256[](3); -// MultiClaimsHatter.ClaimType[] memory initialClaimTypes = new MultiClaimsHatter.ClaimType[](3); -// initialHats[0] = hat_x_1_1; -// initialHats[1] = hat_x_1_1_1; -// initialHats[2] = hat_x_1_1_1_1; -// initialClaimTypes[0] = MultiClaimsHatter.ClaimType.ClaimableFor; -// initialClaimTypes[1] = MultiClaimsHatter.ClaimType.ClaimableFor; -// initialClaimTypes[2] = MultiClaimsHatter.ClaimType.ClaimableFor; -// bytes memory initData = abi.encode(initialHats, initialClaimTypes); -// -// vm.expectEmit(); -// emit HatsClaimabilitySet(initialHats, initialClaimTypes); -// instance = MultiClaimsHatter(deployInstance(initData)); -// vm.prank(dao); -// HATS.mintHat(hat_x_1, address(instance)); -// } -// } -// -// contract ClaimHats_BatchClaimHatsForSetup is DeployInstance_BatchClaimHatsForSetup { -// function setUp() public virtual override { -// super.setUp(); -// -// // prepare hats and accounts arrays -// uint256[] memory hatsToClaim = new uint256[](3); -// hatsToClaim[0] = hat_x_1_1; -// hatsToClaim[1] = hat_x_1_1_1; -// hatsToClaim[2] = hat_x_1_1_1_1; -// address[] memory accountsToClaimFor = new address[](3); -// accountsToClaimFor[0] = wearer; -// accountsToClaimFor[1] = wearer; -// accountsToClaimFor[2] = wearer; -// -// // claim all hats -// vm.startPrank(bot); -// vm.expectEmit(); -// emit TransferSingle(address(instance), address(0), wearer, hat_x_1_1, 1); -// vm.expectEmit(); -// emit TransferSingle(address(instance), address(0), wearer, hat_x_1_1_1, 1); -// vm.expectEmit(); -// emit TransferSingle(address(instance), address(0), wearer, hat_x_1_1_1_1, 1); -// instance.claimHatsFor(hatsToClaim, accountsToClaimFor); -// vm.stopPrank(); -// } -// } -// -// contract TestClaimHat_BatchClaimHatsForSetup is ClaimHats_BatchClaimHatsForSetup { -// function test_hatsClaimed() public { -// assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1), true); -// assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1), true); -// assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1_1), true); -// } -// } +contract DeployInstance_BatchModuleCreationAndRegistration is Setup { + function getHatsModuleAddress(uint256 _hatId, address _hat, bytes calldata _initData, uint256 _saltNonce) internal returns (address addr) { + bytes memory args = abi.encodePacked(_hatId, _hat, _initData); + bytes32 salt = keccak256(abi.encodePacked(args, block.chainid, _saltNonce)); + bytes memory bytecode = type(MultiClaimsHatter).creationCode; + assembly { + addr := create2(0, add(bytecode, 32), mload(bytecode), salt) + } + + } + function setUp() public virtual override { + super.setUp(); + + instance = MultiClaimsHatter(deployInstance("")); + vm.prank(dao); + HATS.mintHat(hat_x_1, address(instance)); + + address alwaysEligibleModule = address(new TestEligibilityAlwaysEligible("test", address(0), 0)); + address alwaysNotEligibleModule = address(new TestEligibilityAlwaysNotEligible("test", address(0), 0)); + + vm.startPrank(dao); + // address predictedNewInatance1 = FACTORY.getHatsModuleAddress(alwaysEligibleModule, 0, "", saltNonce); + // vm.expectEmit(); + // emit HatsModuleFactory_ModuleDeployed(alwaysEligibleModule, predictedNewInatance1, 0, "", "", saltNonce); + // vm.expectEmit(); + // emit HatClaimabilitySet(hat_x_1_1, MultiClaimsHatter.ClaimType.Claimable); + // address module1 = instance.setHatClaimabilityAndCreateModule( + // FACTORY, alwaysEligibleModule, 0, "", "", saltNonce, hat_x_1_1, MultiClaimsHatter.ClaimType.Claimable + // ); + + // address predictedNewInatance2 = FACTORY.getHatsModuleAddress(alwaysEligibleModule, 1, "", saltNonce); + // vm.expectEmit(); + // emit HatsModuleFactory_ModuleDeployed(alwaysEligibleModule, predictedNewInatance2, 1, "", "", saltNonce); + // vm.expectEmit(); + // emit HatClaimabilitySet(hat_x_1_1_1, MultiClaimsHatter.ClaimType.ClaimableFor); + // address module2 = instance.setHatClaimabilityAndCreateModule( + // FACTORY, alwaysEligibleModule, 1, "", "", saltNonce, hat_x_1_1_1, MultiClaimsHatter.ClaimType.ClaimableFor + // ); + + // address predictedNewInatance3 = FACTORY.getHatsModuleAddress(alwaysNotEligibleModule, 2, "", saltNonce); + // vm.expectEmit(); + // emit HatsModuleFactory_ModuleDeployed(alwaysNotEligibleModule, predictedNewInatance3, 2, "", "", saltNonce); + // vm.expectEmit(); + // emit HatClaimabilitySet(hat_x_1_1_1_1, MultiClaimsHatter.ClaimType.Claimable); + // address module3 = instance.setHatClaimabilityAndCreateModule( + // FACTORY, alwaysNotEligibleModule, 2, "", "", saltNonce, hat_x_1_1_1_1, MultiClaimsHatter.ClaimType.Claimable + // ); + uint256[] memory myArray = new uint256[](4); + myArray[0] = hat_x_1_1; + myArray[1] = hat_x_1_1_1; + myArray[2] = hat_x_1_1_1_1; + myArray[3] = hat_x_2; + + MultiClaimsHatter.ClaimType[] memory myArray1 = new MultiClaimsHatter.ClaimType[](4); + myArray1[0] = MultiClaimsHatter.ClaimType.Claimable; + myArray1[1] = MultiClaimsHatter.ClaimType.ClaimableFor; + myArray1[2] = MultiClaimsHatter.ClaimType.Claimable; + myArray1[3] = MultiClaimsHatter.ClaimType.NotClaimable; + + + instance.setHatsClaimability(myArray, myArray1); + vm.stopPrank(); + + vm.startPrank(dao); + HATS.changeHatEligibility(hat_x_1_1, alwaysEligibleModule); + HATS.changeHatEligibility(hat_x_1_1_1, alwaysEligibleModule); + HATS.changeHatEligibility(hat_x_1_1_1_1, alwaysNotEligibleModule); + HATS.changeHatEligibility(hat_x_2, alwaysEligibleModule); + vm.stopPrank(); + } +} + +contract TestDeployInstance_BatchModuleCreationAndRegistration is DeployInstance_BatchModuleCreationAndRegistration { + function test_hatExistsFunction() public { + assertEq(instance.hatExists(hat_x_1_1), true); + assertEq(instance.hatExists(hat_x_1_1_1), true); + assertEq(instance.hatExists(hat_x_1_1_1_1), true); + assertEq(instance.hatExists(hat_x_2), true); + assertEq(instance.hatExists(HATS.getNextId(hat_x_2)), false); + } + + function test_wearsAdmin() public { + assertEq(instance.wearsAdmin(hat_x_1_1), true); + assertEq(instance.wearsAdmin(hat_x_1_1_1), true); + assertEq(instance.wearsAdmin(hat_x_1_1_1_1), true); + assertEq(instance.wearsAdmin(hat_x_2), false); + assertEq(instance.wearsAdmin(HATS.getNextId(hat_x_2)), false); + } + + function test_isClaimableFor() public { + assertEq(instance.isClaimableFor(hat_x_1_1), false); + assertEq(instance.isClaimableFor(hat_x_1_1_1), true); + assertEq(instance.isClaimableFor(hat_x_1_1_1_1), false); + assertEq(instance.isClaimableFor(hat_x_2), false); + assertEq(instance.isClaimableFor(HATS.getNextId(hat_x_2)), false); + } + + function test_isClaimableBy() public { + assertEq(instance.isClaimableBy(hat_x_1_1), true); + assertEq(instance.isClaimableBy(hat_x_1_1_1), true); + assertEq(instance.isClaimableBy(hat_x_1_1_1_1), true); + assertEq(instance.isClaimableBy(hat_x_2), false); + assertEq(instance.isClaimableBy(HATS.getNextId(hat_x_2)), false); + } + + function test_accountCanClaim() public { + assertEq(instance.accountCanClaim(wearer, hat_x_1_1), true); + assertEq(instance.accountCanClaim(wearer, hat_x_1_1_1), true); + assertEq(instance.accountCanClaim(wearer, hat_x_1_1_1_1), false); + assertEq(instance.accountCanClaim(wearer, hat_x_2), false); + assertEq(instance.accountCanClaim(wearer, HATS.getNextId(hat_x_2)), false); + } + + function test_canClaimForAccount() public { + assertEq(instance.canClaimForAccount(wearer, hat_x_1_1), false); + assertEq(instance.canClaimForAccount(wearer, hat_x_1_1_1), true); + assertEq(instance.canClaimForAccount(wearer, hat_x_1_1_1_1), false); + assertEq(instance.canClaimForAccount(wearer, hat_x_2), false); + assertEq(instance.canClaimForAccount(wearer, HATS.getNextId(hat_x_2)), false); + } + + function test_reverts_claimHat() public { + vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimable.selector, hat_x_2)); + vm.prank(wearer); + instance.claimHat(hat_x_2); + } + + function test_reverts_claimHatFor() public { + vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimableFor.selector, hat_x_1_1)); + vm.prank(wearer); + instance.claimHatFor(hat_x_1_1, wearer); + } + + function test_reverts_claimHats() public { + vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimable.selector, hat_x_2)); + + inputHats = [hat_x_2]; + vm.prank(wearer); + instance.claimHats(inputHats); + } + + function test_reverts_claimHatsFor() public { + vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimableFor.selector, hat_x_1_1)); + + inputHats = [hat_x_1_1]; + inputWearers = [wearer]; + vm.prank(wearer); + instance.claimHatsFor(inputHats, inputWearers); + } +} + +contract ClaimHat_BatchModuleCreationAndRegistration is DeployInstance_BatchModuleCreationAndRegistration { + function setUp() public virtual override { + super.setUp(); + + vm.prank(wearer); + instance.claimHat(hat_x_1_1); + vm.prank(bot); + instance.claimHatFor(hat_x_1_1_1, wearer); + } +} + +contract TestClaimHat_BatchModuleCreationAndRegistration is ClaimHat_BatchModuleCreationAndRegistration { + function test_hatsClaimed() public { + assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1), true); + assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1), true); + } + + function test_reverts_claimHatNotEligible() public { + vm.expectRevert( + abi.encodePacked(MultiClaimsHatter_NotExplicitlyEligible.selector, uint256(uint160(wearer)), hat_x_1_1_1_1) + ); + vm.prank(wearer); + instance.claimHat(hat_x_1_1_1_1); + } + + function test_reverts_claimHatsNotEligible() public { + vm.expectRevert( + abi.encodePacked(MultiClaimsHatter_NotExplicitlyEligible.selector, uint256(uint160(wearer)), hat_x_1_1_1_1) + ); + + inputHats = [hat_x_1_1_1_1]; + vm.prank(wearer); + instance.claimHats(inputHats); + } +} + +// /*////////////////////////////////////////////////////////////////////////////// +// Scenario 4 - Multi Batch eligibility creation and hats registration +// ////////////////////////////////////////////////////////////////////////////*/ +// +contract DeployInstance_BatchMultiModuleCreationAndRegistration is Setup { + function setUp() public virtual override { + super.setUp(); + + instance = MultiClaimsHatter(deployInstance("")); + vm.prank(dao); + HATS.mintHat(hat_x_1, address(instance)); + + address alwaysEligibleModule = address(new TestEligibilityAlwaysEligible("test", address(0), 0)); + address alwaysNotEligibleModule = address(new TestEligibilityAlwaysNotEligible("test", address(0), 0)); + + // Batch multi modules creation and hats registration + vm.startPrank(dao); + // address[] memory _implementations = new address[](3); + // _implementations[0] = alwaysEligibleModule; + // _implementations[1] = alwaysEligibleModule; + // _implementations[2] = alwaysNotEligibleModule; + // uint256[] memory _moduleHatIds = new uint256[](3); + // _moduleHatIds[0] = 0; + // _moduleHatIds[1] = 1; + // _moduleHatIds[2] = 2; + // bytes[] memory _otherImmutableArgsArray = new bytes[](3); + // _otherImmutableArgsArray[0] = ""; + // _otherImmutableArgsArray[1] = ""; + // _otherImmutableArgsArray[2] = ""; + // bytes[] memory _initDataArray = new bytes[](3); + // _initDataArray[0] = ""; + // _initDataArray[1] = ""; + // _initDataArray[2] = ""; + // uint256[] memory _hatIds = new uint256[](3); + // _hatIds[0] = hat_x_1_1; + // _hatIds[1] = hat_x_1_1_1; + // _hatIds[2] = hat_x_1_1_1_1; + // MultiClaimsHatter.ClaimType[] memory _claimTypes = new MultiClaimsHatter.ClaimType[](3); + // _claimTypes[0] = MultiClaimsHatter.ClaimType.Claimable; + // _claimTypes[1] = MultiClaimsHatter.ClaimType.ClaimableFor; + // _claimTypes[2] = MultiClaimsHatter.ClaimType.Claimable; + + // // expected module factory events + // address predictedNewInatance1 = FACTORY.getHatsModuleAddress(alwaysEligibleModule, 0, "", saltNonces[0]); + // vm.expectEmit(); + // emit HatsModuleFactory_ModuleDeployed(alwaysEligibleModule, predictedNewInatance1, 0, "", "", saltNonces[0]); + // address predictedNewInatance2 = FACTORY.getHatsModuleAddress(alwaysEligibleModule, 1, "", saltNonces[1]); + // vm.expectEmit(); + // emit HatsModuleFactory_ModuleDeployed(alwaysEligibleModule, predictedNewInatance2, 1, "", "", saltNonces[1]); + // address predictedNewInatance3 = FACTORY.getHatsModuleAddress(alwaysNotEligibleModule, 2, "", saltNonces[2]); + // vm.expectEmit(); + // emit HatsModuleFactory_ModuleDeployed(alwaysNotEligibleModule, predictedNewInatance3, 2, "", "", saltNonces[2]); + + // // expected claims hatter event + // vm.expectEmit(); + // emit HatsClaimabilitySet(_hatIds, _claimTypes); + // vm.recordLogs(); + // vm.getRecordedLogs(); + // instance.setHatsClaimabilityAndCreateModules( + // FACTORY, + // _implementations, + // _moduleHatIds, + // _otherImmutableArgsArray, + // _initDataArray, + // saltNonces, + // _hatIds, + // _claimTypes + // ); + // // get created modules addresses + // Vm.Log[] memory entries = vm.getRecordedLogs(); + // (, address module1,,,,) = abi.decode(entries[1].data, (address, address, uint256, bytes, bytes, uint256)); + // (, address module2,,,,) = abi.decode(entries[3].data, (address, address, uint256, bytes, bytes, uint256)); + // (, address module3,,,,) = abi.decode(entries[5].data, (address, address, uint256, bytes, bytes, uint256)); + uint256[] memory myArray = new uint256[](4); + myArray[0] = hat_x_1_1; + myArray[1] = hat_x_1_1_1; + myArray[2] = hat_x_1_1_1_1; + myArray[3] = hat_x_2; + + MultiClaimsHatter.ClaimType[] memory myArray1 = new MultiClaimsHatter.ClaimType[](4); + myArray1[0] = MultiClaimsHatter.ClaimType.Claimable; + myArray1[1] = MultiClaimsHatter.ClaimType.ClaimableFor; + myArray1[2] = MultiClaimsHatter.ClaimType.Claimable; + myArray1[3] = MultiClaimsHatter.ClaimType.NotClaimable; + + + instance.setHatsClaimability(myArray, myArray1); + + + HATS.changeHatEligibility(hat_x_1_1, alwaysEligibleModule); + HATS.changeHatEligibility(hat_x_1_1_1, alwaysEligibleModule); + HATS.changeHatEligibility(hat_x_1_1_1_1, alwaysNotEligibleModule); + HATS.changeHatEligibility(hat_x_2, alwaysEligibleModule); + vm.stopPrank(); + } +} + +contract TestDeployInstance_BatchMultiModuleCreationAndRegistration is + DeployInstance_BatchMultiModuleCreationAndRegistration +{ + function test_hatExistsFunction() public { + assertEq(instance.hatExists(hat_x_1_1), true); + assertEq(instance.hatExists(hat_x_1_1_1), true); + assertEq(instance.hatExists(hat_x_1_1_1_1), true); + assertEq(instance.hatExists(hat_x_2), true); + assertEq(instance.hatExists(HATS.getNextId(hat_x_2)), false); + } + + function test_wearsAdmin() public { + assertEq(instance.wearsAdmin(hat_x_1_1), true); + assertEq(instance.wearsAdmin(hat_x_1_1_1), true); + assertEq(instance.wearsAdmin(hat_x_1_1_1_1), true); + assertEq(instance.wearsAdmin(hat_x_2), false); + assertEq(instance.wearsAdmin(HATS.getNextId(hat_x_2)), false); + } + + function test_isClaimableFor() public { + assertEq(instance.isClaimableFor(hat_x_1_1), false); + assertEq(instance.isClaimableFor(hat_x_1_1_1), true); + assertEq(instance.isClaimableFor(hat_x_1_1_1_1), false); + assertEq(instance.isClaimableFor(hat_x_2), false); + assertEq(instance.isClaimableFor(HATS.getNextId(hat_x_2)), false); + } + + function test_isClaimableBy() public { + assertEq(instance.isClaimableBy(hat_x_1_1), true); + assertEq(instance.isClaimableBy(hat_x_1_1_1), true); + assertEq(instance.isClaimableBy(hat_x_1_1_1_1), true); + assertEq(instance.isClaimableBy(hat_x_2), false); + assertEq(instance.isClaimableBy(HATS.getNextId(hat_x_2)), false); + } + + function test_accountCanClaim() public { + assertEq(instance.accountCanClaim(wearer, hat_x_1_1), true); + assertEq(instance.accountCanClaim(wearer, hat_x_1_1_1), true); + assertEq(instance.accountCanClaim(wearer, hat_x_1_1_1_1), false); + assertEq(instance.accountCanClaim(wearer, hat_x_2), false); + assertEq(instance.accountCanClaim(wearer, HATS.getNextId(hat_x_2)), false); + } + + function test_canClaimForAccount() public { + assertEq(instance.canClaimForAccount(wearer, hat_x_1_1), false); + assertEq(instance.canClaimForAccount(wearer, hat_x_1_1_1), true); + assertEq(instance.canClaimForAccount(wearer, hat_x_1_1_1_1), false); + assertEq(instance.canClaimForAccount(wearer, hat_x_2), false); + assertEq(instance.canClaimForAccount(wearer, HATS.getNextId(hat_x_2)), false); + } + + function test_reverts_claimHat() public { + vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimable.selector, hat_x_2)); + vm.prank(wearer); + instance.claimHat(hat_x_2); + } + + function test_reverts_claimHatFor() public { + vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimableFor.selector, hat_x_1_1)); + vm.prank(wearer); + instance.claimHatFor(hat_x_1_1, wearer); + } + + function test_reverts_claimHats() public { + vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimable.selector, hat_x_2)); + + inputHats = [hat_x_2]; + vm.prank(wearer); + instance.claimHats(inputHats); + } + + function test_reverts_claimHatsFor() public { + vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimableFor.selector, hat_x_1_1)); + + inputHats = [hat_x_1_1]; + inputWearers = [wearer]; + vm.prank(wearer); + instance.claimHatsFor(inputHats, inputWearers); + } +} + +contract ClaimHat_BatchMultiModuleCreationAndRegistration is DeployInstance_BatchMultiModuleCreationAndRegistration { + function setUp() public virtual override { + super.setUp(); + + vm.prank(wearer); + instance.claimHat(hat_x_1_1); + vm.prank(bot); + instance.claimHatFor(hat_x_1_1_1, wearer); + } +} + +contract TestClaimHat_BatchMultiModuleCreationAndRegistration is ClaimHat_BatchMultiModuleCreationAndRegistration { + function test_hatsClaimed() public { + assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1), true); + assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1), true); + } + + function test_reverts_claimHatNotEligible() public { + vm.expectRevert( + abi.encodePacked(MultiClaimsHatter_NotExplicitlyEligible.selector, uint256(uint160(wearer)), hat_x_1_1_1_1) + ); + vm.prank(wearer); + instance.claimHat(hat_x_1_1_1_1); + } + + function test_reverts_claimHatsNotEligible() public { + vm.expectRevert( + abi.encodePacked(MultiClaimsHatter_NotExplicitlyEligible.selector, uint256(uint160(wearer)), hat_x_1_1_1_1) + ); + + inputHats = [hat_x_1_1_1_1]; + vm.prank(wearer); + instance.claimHats(inputHats); + } +} + +/*////////////////////////////////////////////////////////////// + Scenario 5 - Multi claiming test + //////////////////////////////////////////////////////////////*/ + +contract DeployInstance_BatchClaimHatsSetup is Setup { + function setUp() public virtual override { + super.setUp(); + + address alwaysEligibleModule = address(new TestEligibilityAlwaysEligible("test", address(0), 0)); + + vm.startPrank(dao); + HATS.changeHatEligibility(hat_x_1_1, alwaysEligibleModule); + HATS.changeHatEligibility(hat_x_1_1_1, alwaysEligibleModule); + HATS.changeHatEligibility(hat_x_1_1_1_1, alwaysEligibleModule); + vm.stopPrank(); + + uint256[] memory initialHats = new uint256[](3); + MultiClaimsHatter.ClaimType[] memory initialClaimTypes = new MultiClaimsHatter.ClaimType[](3); + initialHats[0] = hat_x_1_1; + initialHats[1] = hat_x_1_1_1; + initialHats[2] = hat_x_1_1_1_1; + initialClaimTypes[0] = MultiClaimsHatter.ClaimType.Claimable; + initialClaimTypes[1] = MultiClaimsHatter.ClaimType.Claimable; + initialClaimTypes[2] = MultiClaimsHatter.ClaimType.Claimable; + bytes memory initData = abi.encode(initialHats, initialClaimTypes); + + vm.expectEmit(); + emit HatsClaimabilitySet(initialHats, initialClaimTypes); + instance = MultiClaimsHatter(deployInstance(initData)); + vm.prank(dao); + HATS.mintHat(hat_x_1, address(instance)); + } +} + +contract ClaimHats_BatchClaimHatsSetup is DeployInstance_BatchClaimHatsSetup { + function setUp() public virtual override { + super.setUp(); + + // prepare hats to claims array + uint256[] memory hatsToClaim = new uint256[](3); + hatsToClaim[0] = hat_x_1_1; + hatsToClaim[1] = hat_x_1_1_1; + hatsToClaim[2] = hat_x_1_1_1_1; + + // claim all hats + vm.startPrank(wearer); + vm.expectEmit(); + emit TransferSingle(address(instance), address(0), wearer, hat_x_1_1, 1); + vm.expectEmit(); + emit TransferSingle(address(instance), address(0), wearer, hat_x_1_1_1, 1); + vm.expectEmit(); + emit TransferSingle(address(instance), address(0), wearer, hat_x_1_1_1_1, 1); + instance.claimHats(hatsToClaim); + vm.stopPrank(); + } +} + +contract TestClaimHat_BatchClaimHatsSetup is ClaimHats_BatchClaimHatsSetup { + function test_hatsClaimed() public { + assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1), true); + assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1), true); + assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1_1), true); + } +} +// +// /*////////////////////////////////////////////////////////////// +// Scenario 6 - Multi claiming for test +// //////////////////////////////////////////////////////////////*/ +// +contract DeployInstance_BatchClaimHatsForSetup is Setup { + function setUp() public virtual override { + super.setUp(); + + address alwaysEligibleModule = address(new TestEligibilityAlwaysEligible("test", address(0), 0)); + + vm.startPrank(dao); + HATS.changeHatEligibility(hat_x_1_1, alwaysEligibleModule); + HATS.changeHatEligibility(hat_x_1_1_1, alwaysEligibleModule); + HATS.changeHatEligibility(hat_x_1_1_1_1, alwaysEligibleModule); + vm.stopPrank(); + + uint256[] memory initialHats = new uint256[](3); + MultiClaimsHatter.ClaimType[] memory initialClaimTypes = new MultiClaimsHatter.ClaimType[](3); + initialHats[0] = hat_x_1_1; + initialHats[1] = hat_x_1_1_1; + initialHats[2] = hat_x_1_1_1_1; + initialClaimTypes[0] = MultiClaimsHatter.ClaimType.ClaimableFor; + initialClaimTypes[1] = MultiClaimsHatter.ClaimType.ClaimableFor; + initialClaimTypes[2] = MultiClaimsHatter.ClaimType.ClaimableFor; + bytes memory initData = abi.encode(initialHats, initialClaimTypes); + + vm.expectEmit(); + emit HatsClaimabilitySet(initialHats, initialClaimTypes); + instance = MultiClaimsHatter(deployInstance(initData)); + vm.prank(dao); + HATS.mintHat(hat_x_1, address(instance)); + } +} + +contract ClaimHats_BatchClaimHatsForSetup is DeployInstance_BatchClaimHatsForSetup { + function setUp() public virtual override { + super.setUp(); + + // prepare hats and accounts arrays + uint256[] memory hatsToClaim = new uint256[](3); + hatsToClaim[0] = hat_x_1_1; + hatsToClaim[1] = hat_x_1_1_1; + hatsToClaim[2] = hat_x_1_1_1_1; + address[] memory accountsToClaimFor = new address[](3); + accountsToClaimFor[0] = wearer; + accountsToClaimFor[1] = wearer; + accountsToClaimFor[2] = wearer; + + // claim all hats + vm.startPrank(bot); + vm.expectEmit(); + emit TransferSingle(address(instance), address(0), wearer, hat_x_1_1, 1); + vm.expectEmit(); + emit TransferSingle(address(instance), address(0), wearer, hat_x_1_1_1, 1); + vm.expectEmit(); + emit TransferSingle(address(instance), address(0), wearer, hat_x_1_1_1_1, 1); + instance.claimHatsFor(hatsToClaim, accountsToClaimFor); + vm.stopPrank(); + } +} + +contract TestClaimHat_BatchClaimHatsForSetup is ClaimHats_BatchClaimHatsForSetup { + function test_hatsClaimed() public { + assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1), true); + assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1), true); + assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1_1), true); + } +} From 2707419a7b15fc09f5bcb3909734a2f52a303c9f Mon Sep 17 00:00:00 2001 From: keating Date: Wed, 19 Jun 2024 11:02:04 -0400 Subject: [PATCH 05/18] Change to relative import --- src/MultiClaimsHatterFactory.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MultiClaimsHatterFactory.sol b/src/MultiClaimsHatterFactory.sol index 7a28f2e..f684d91 100644 --- a/src/MultiClaimsHatterFactory.sol +++ b/src/MultiClaimsHatterFactory.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; -import { MultiClaimsHatter } from "src/MultiClaimsHatter.sol"; +import { MultiClaimsHatter } from "./MultiClaimsHatter.sol"; contract MultiClaimsHatterFactory { // should the version be higher here From ce206d02503057ede99243b47f240de3e517e6f0 Mon Sep 17 00:00:00 2001 From: keating Date: Fri, 28 Jun 2024 10:24:07 -0400 Subject: [PATCH 06/18] Cleanup --- src/MultiClaimsHatter.sol | 78 ---------------------------- src/MultiClaimsHatterFactory.sol | 10 ++-- test/MultiClaimsHatter.t.sol | 88 +------------------------------- 3 files changed, 6 insertions(+), 170 deletions(-) diff --git a/src/MultiClaimsHatter.sol b/src/MultiClaimsHatter.sol index 1a1e075..5d554b7 100644 --- a/src/MultiClaimsHatter.sol +++ b/src/MultiClaimsHatter.sol @@ -3,7 +3,6 @@ pragma solidity ^0.8.19; // import { console2 } from "forge-std/Test.sol"; // remove before deploy import { HatsModule } from "hats-module/HatsModule.sol"; -// import { HatsModuleFactory } from "hats-module/HatsModuleFactory.sol"; /*////////////////////////////////////////////////////////////// CUSTOM ERRORS @@ -140,83 +139,6 @@ contract MultiClaimsHatter is HatsModule { emit HatsClaimabilitySet(_hatIds, _claimTypes); } - /** - * @notice Wrapper around a HatsModuleFactory. Deploys a new HatsModule instance and sets a hat's claimability type. - * @param _factory The HatsModuleFactory instance that will deploy the module - * @param _implementation The address of the implementation contract of which to deploy a clone - * @param _moduleHatId The hat for which to deploy a HatsModule. - * @param _otherImmutableArgs Other immutable args to pass to the clone as immutable storage. - * @param _initData The encoded data to pass to the `setUp` function of the new HatsModule instance. Leave empty if - * none. - * @param _saltNonce The nonce to use when calculating the salt - * @param _hatId The ID of the hat to set claimability for - * @param _claimType New claimability type for the hat - * @return _instance The address of the deployed HatsModule instance - */ - // function setHatClaimabilityAndCreateModule( - // HatsModuleFactory _factory, - // address _implementation, - // uint256 _moduleHatId, - // bytes calldata _otherImmutableArgs, - // bytes calldata _initData, - // uint256 _saltNonce, - // uint256 _hatId, - // ClaimType _claimType - // ) public returns (address _instance) { - // if (!HATS().isAdminOfHat(msg.sender, _hatId)) revert MultiClaimsHatter_NotAdminOfHat(msg.sender, _hatId); - - // hatToClaimType[_hatId] = _claimType; - - // _instance = _factory.createHatsModule(_implementation, _moduleHatId, _otherImmutableArgs, _initData, _saltNonce); - - // emit HatClaimabilitySet(_hatId, _claimType); - // } - - /** - * @notice Wrapper around a HatsModuleFactory. Deploys new HatsModule instances and sets the claimability type of - * multiple hats. - * @param _factory The HatsModuleFactory instance that will deploy the modules - * @param _implementations The addresses of the implementation contracts of which to deploy a clone - * @param _moduleHatIds The hats for which to deploy a HatsModule. - * @param _otherImmutableArgsArray Other immutable args to pass to the clones as immutable storage. - * @param _initDataArray The encoded data to pass to the `setUp` functions of the new HatsModule instances. - * @param _saltNonces The nonces to use when calculating the salt for each module - * @param _hatIds The IDs of the hats to set claimability for - * @param _claimTypes New claimability types for each hat - * @return success True if all modules were successfully created and the claimability types were set - */ - // function setHatsClaimabilityAndCreateModules( - // HatsModuleFactory _factory, - // address[] calldata _implementations, - // uint256[] calldata _moduleHatIds, - // bytes[] calldata _otherImmutableArgsArray, - // bytes[] calldata _initDataArray, - // uint256[] memory _saltNonces, - // uint256[] memory _hatIds, - // ClaimType[] memory _claimTypes - // ) public returns (bool success) { - // uint256 length = _hatIds.length; - // if (_claimTypes.length != length) { - // revert MultiClaimsHatter_ArrayLengthMismatch(); - // } - - // uint256 hatId; - // for (uint256 i; i < length;) { - // hatId = _hatIds[i]; - // if (!HATS().isAdminOfHat(msg.sender, hatId)) revert MultiClaimsHatter_NotAdminOfHat(msg.sender, hatId); - // hatToClaimType[hatId] = _claimTypes[i]; - // unchecked { - // ++i; - // } - // } - - // success = _factory.batchCreateHatsModule( - // _implementations, _moduleHatIds, _otherImmutableArgsArray, _initDataArray, _saltNonces - // ); - - // emit HatsClaimabilitySet(_hatIds, _claimTypes); - // } - /*////////////////////////////////////////////////////////////// CLAIMING FUNCTIONS //////////////////////////////////////////////////////////////*/ diff --git a/src/MultiClaimsHatterFactory.sol b/src/MultiClaimsHatterFactory.sol index f684d91..e748cd6 100644 --- a/src/MultiClaimsHatterFactory.sol +++ b/src/MultiClaimsHatterFactory.sol @@ -5,9 +5,9 @@ import { MultiClaimsHatter } from "./MultiClaimsHatter.sol"; contract MultiClaimsHatterFactory { // should the version be higher here - string public constant VERSION = "0.6.0"; + string public constant VERSION = "0.6.0-zksync"; - event HatsModuleFactory_ModuleDeployed( + event ModuleDeployed( address implementation, address instance, uint256 hatId, bytes otherImmutableArgs, bytes initData, uint256 saltNonce ); @@ -17,12 +17,10 @@ contract MultiClaimsHatterFactory { { bytes memory args = abi.encodePacked(_hatId, _hat, _initData); bytes32 salt = _calculateSalt(args, _saltNonce); - // If exists throw error - // emit event - // TODO: Add method to send create2 address + // TODO: Test situate where contract exitsts MultiClaimsHatter instance = new MultiClaimsHatter{ salt: salt }(VERSION, _hat, _hatId); instance.setUp(_initData); - emit HatsModuleFactory_ModuleDeployed( + emit ModuleDeployed( address(instance), address(instance), _hatId, abi.encodePacked(_hat, _initData), _initData, _saltNonce ); return address(instance); diff --git a/test/MultiClaimsHatter.t.sol b/test/MultiClaimsHatter.t.sol index 48c57b4..e350e18 100644 --- a/test/MultiClaimsHatter.t.sol +++ b/test/MultiClaimsHatter.t.sol @@ -9,7 +9,6 @@ import { MultiClaimsHatter_NotAdminOfHat, MultiClaimsHatter_NotExplicitlyEligible } from "../src/MultiClaimsHatter.sol"; -// import { IHats, HatsModuleFactory, deployModuleInstance } from "hats-module/utils/DeployFunctions.sol"; import {IHats} from "hats-module/interfaces/IHatsModule.sol"; import {Hats} from "hats-protocol/Hats.sol"; import { DeployImplementation } from "../script/MultiClaimsHatter.s.sol"; @@ -24,7 +23,6 @@ contract Setup is DeployImplementation, Test { string internal constant x = "Hats Protocol v1"; string internal constant y = ""; IHats public HATS = new Hats{salt: bytes32(abi.encode(0x4a75))}(x, y); // v1.hatsprotocol.eth - // HatsModuleFactory public constant FACTORY = HatsModuleFactory(0x0a3f85fa597B6a967271286aA0724811acDF5CD9); MultiClaimsHatter public instance; uint256 public tophat_x; @@ -366,8 +364,8 @@ contract DeployInstance_WithInitialHats is Setup { initialClaimTypes[2] = MultiClaimsHatter.ClaimType.Claimable; bytes memory initData = abi.encode(initialHats, initialClaimTypes); - // vm.expectEmit(); - // emit HatsClaimabilitySet(initialHats, initialClaimTypes); + vm.expectEmit(); + emit HatsClaimabilitySet(initialHats, initialClaimTypes); instance = MultiClaimsHatter(deployInstance(initData)); vm.prank(dao); HATS.mintHat(hat_x_1, address(instance)); @@ -526,32 +524,6 @@ contract DeployInstance_BatchModuleCreationAndRegistration is Setup { address alwaysNotEligibleModule = address(new TestEligibilityAlwaysNotEligible("test", address(0), 0)); vm.startPrank(dao); - // address predictedNewInatance1 = FACTORY.getHatsModuleAddress(alwaysEligibleModule, 0, "", saltNonce); - // vm.expectEmit(); - // emit HatsModuleFactory_ModuleDeployed(alwaysEligibleModule, predictedNewInatance1, 0, "", "", saltNonce); - // vm.expectEmit(); - // emit HatClaimabilitySet(hat_x_1_1, MultiClaimsHatter.ClaimType.Claimable); - // address module1 = instance.setHatClaimabilityAndCreateModule( - // FACTORY, alwaysEligibleModule, 0, "", "", saltNonce, hat_x_1_1, MultiClaimsHatter.ClaimType.Claimable - // ); - - // address predictedNewInatance2 = FACTORY.getHatsModuleAddress(alwaysEligibleModule, 1, "", saltNonce); - // vm.expectEmit(); - // emit HatsModuleFactory_ModuleDeployed(alwaysEligibleModule, predictedNewInatance2, 1, "", "", saltNonce); - // vm.expectEmit(); - // emit HatClaimabilitySet(hat_x_1_1_1, MultiClaimsHatter.ClaimType.ClaimableFor); - // address module2 = instance.setHatClaimabilityAndCreateModule( - // FACTORY, alwaysEligibleModule, 1, "", "", saltNonce, hat_x_1_1_1, MultiClaimsHatter.ClaimType.ClaimableFor - // ); - - // address predictedNewInatance3 = FACTORY.getHatsModuleAddress(alwaysNotEligibleModule, 2, "", saltNonce); - // vm.expectEmit(); - // emit HatsModuleFactory_ModuleDeployed(alwaysNotEligibleModule, predictedNewInatance3, 2, "", "", saltNonce); - // vm.expectEmit(); - // emit HatClaimabilitySet(hat_x_1_1_1_1, MultiClaimsHatter.ClaimType.Claimable); - // address module3 = instance.setHatClaimabilityAndCreateModule( - // FACTORY, alwaysNotEligibleModule, 2, "", "", saltNonce, hat_x_1_1_1_1, MultiClaimsHatter.ClaimType.Claimable - // ); uint256[] memory myArray = new uint256[](4); myArray[0] = hat_x_1_1; myArray[1] = hat_x_1_1_1; @@ -709,62 +681,6 @@ contract DeployInstance_BatchMultiModuleCreationAndRegistration is Setup { // Batch multi modules creation and hats registration vm.startPrank(dao); - // address[] memory _implementations = new address[](3); - // _implementations[0] = alwaysEligibleModule; - // _implementations[1] = alwaysEligibleModule; - // _implementations[2] = alwaysNotEligibleModule; - // uint256[] memory _moduleHatIds = new uint256[](3); - // _moduleHatIds[0] = 0; - // _moduleHatIds[1] = 1; - // _moduleHatIds[2] = 2; - // bytes[] memory _otherImmutableArgsArray = new bytes[](3); - // _otherImmutableArgsArray[0] = ""; - // _otherImmutableArgsArray[1] = ""; - // _otherImmutableArgsArray[2] = ""; - // bytes[] memory _initDataArray = new bytes[](3); - // _initDataArray[0] = ""; - // _initDataArray[1] = ""; - // _initDataArray[2] = ""; - // uint256[] memory _hatIds = new uint256[](3); - // _hatIds[0] = hat_x_1_1; - // _hatIds[1] = hat_x_1_1_1; - // _hatIds[2] = hat_x_1_1_1_1; - // MultiClaimsHatter.ClaimType[] memory _claimTypes = new MultiClaimsHatter.ClaimType[](3); - // _claimTypes[0] = MultiClaimsHatter.ClaimType.Claimable; - // _claimTypes[1] = MultiClaimsHatter.ClaimType.ClaimableFor; - // _claimTypes[2] = MultiClaimsHatter.ClaimType.Claimable; - - // // expected module factory events - // address predictedNewInatance1 = FACTORY.getHatsModuleAddress(alwaysEligibleModule, 0, "", saltNonces[0]); - // vm.expectEmit(); - // emit HatsModuleFactory_ModuleDeployed(alwaysEligibleModule, predictedNewInatance1, 0, "", "", saltNonces[0]); - // address predictedNewInatance2 = FACTORY.getHatsModuleAddress(alwaysEligibleModule, 1, "", saltNonces[1]); - // vm.expectEmit(); - // emit HatsModuleFactory_ModuleDeployed(alwaysEligibleModule, predictedNewInatance2, 1, "", "", saltNonces[1]); - // address predictedNewInatance3 = FACTORY.getHatsModuleAddress(alwaysNotEligibleModule, 2, "", saltNonces[2]); - // vm.expectEmit(); - // emit HatsModuleFactory_ModuleDeployed(alwaysNotEligibleModule, predictedNewInatance3, 2, "", "", saltNonces[2]); - - // // expected claims hatter event - // vm.expectEmit(); - // emit HatsClaimabilitySet(_hatIds, _claimTypes); - // vm.recordLogs(); - // vm.getRecordedLogs(); - // instance.setHatsClaimabilityAndCreateModules( - // FACTORY, - // _implementations, - // _moduleHatIds, - // _otherImmutableArgsArray, - // _initDataArray, - // saltNonces, - // _hatIds, - // _claimTypes - // ); - // // get created modules addresses - // Vm.Log[] memory entries = vm.getRecordedLogs(); - // (, address module1,,,,) = abi.decode(entries[1].data, (address, address, uint256, bytes, bytes, uint256)); - // (, address module2,,,,) = abi.decode(entries[3].data, (address, address, uint256, bytes, bytes, uint256)); - // (, address module3,,,,) = abi.decode(entries[5].data, (address, address, uint256, bytes, bytes, uint256)); uint256[] memory myArray = new uint256[](4); myArray[0] = hat_x_1_1; myArray[1] = hat_x_1_1_1; From d3c1e6f2a1bb091e08e261ec901f3294129c0d46 Mon Sep 17 00:00:00 2001 From: John Feras Date: Tue, 2 Jul 2024 20:51:08 -0400 Subject: [PATCH 07/18] Add dependencies and test (#1) * Updated dependency to support-zksync HatsModule --- .gitmodules | 6 +++--- lib/hats-module | 2 +- src/MultiClaimsHatterFactory.sol | 14 +++++++++++++- test/MultiClaimsHatterFactory.t.sol | 22 ++++++++++++++++++++++ 4 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 test/MultiClaimsHatterFactory.t.sol diff --git a/.gitmodules b/.gitmodules index 2434793..253000a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,9 +4,9 @@ [submodule "lib/solady"] path = lib/solady url = https://github.com/vectorized/solady -[submodule "lib/hats-module"] - path = lib/hats-module - url = https://github.com/alexkeating/hats-module [submodule "lib/hats-protocol"] path = lib/hats-protocol url = https://github.com/Hats-Protocol/hats-protocol +[submodule "lib/hats-module"] + path = lib/hats-module + url = https://github.com/alexkeating/hats-module diff --git a/lib/hats-module b/lib/hats-module index 6dc8aad..251c827 160000 --- a/lib/hats-module +++ b/lib/hats-module @@ -1 +1 @@ -Subproject commit 6dc8aadc8aafa271eac240e345ed4d89c4ada4eb +Subproject commit 251c827a66feb032be7cf3dcc76acb43f74486c5 diff --git a/src/MultiClaimsHatterFactory.sol b/src/MultiClaimsHatterFactory.sol index e748cd6..67d0670 100644 --- a/src/MultiClaimsHatterFactory.sol +++ b/src/MultiClaimsHatterFactory.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.19; import { MultiClaimsHatter } from "./MultiClaimsHatter.sol"; +import { console2 } from "forge-std/Test.sol"; contract MultiClaimsHatterFactory { // should the version be higher here @@ -15,6 +16,10 @@ contract MultiClaimsHatterFactory { external returns (address) { + console2.log("in deployMultiClaimsHatter"); + console2.log("hatId", _hatId); + console2.log("hat", _hat); + console2.log("saltNonce", _saltNonce); bytes memory args = abi.encodePacked(_hatId, _hat, _initData); bytes32 salt = _calculateSalt(args, _saltNonce); // TODO: Test situate where contract exitsts @@ -23,6 +28,7 @@ contract MultiClaimsHatterFactory { emit ModuleDeployed( address(instance), address(instance), _hatId, abi.encodePacked(_hat, _initData), _initData, _saltNonce ); + console2.log("instance", address(instance)); return address(instance); } @@ -31,14 +37,20 @@ contract MultiClaimsHatterFactory { } function _getAddress(uint256 _hatId, address _hat, bytes calldata _initData, uint256 _saltNonce) - internal + external returns (address addr) { + console2.log("in _getAddress"); + console2.log("hatId", _hatId); + console2.log("hat", _hat); + console2.log("saltNonce", _saltNonce); bytes memory args = abi.encodePacked(_hatId, _hat, _initData); bytes32 salt = _calculateSalt(args, _saltNonce); bytes memory bytecode = type(MultiClaimsHatter).creationCode; + console2.log("bytecode length", bytecode.length); assembly { addr := create2(0, add(bytecode, 32), mload(bytecode), salt) } + console2.log("addr", addr); } } diff --git a/test/MultiClaimsHatterFactory.t.sol b/test/MultiClaimsHatterFactory.t.sol new file mode 100644 index 0000000..b37e784 --- /dev/null +++ b/test/MultiClaimsHatterFactory.t.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.19; + +import { Test, console2, Vm } from "forge-std/Test.sol"; +import { MultiClaimsHatter } from "../src/MultiClaimsHatter.sol"; +import { MultiClaimsHatterFactory } from "../src/MultiClaimsHatterFactory.sol"; + +contract TestMultiClaimsHatterFactory is Test { + MultiClaimsHatterFactory factory; + + function setUp() public { + factory = new MultiClaimsHatterFactory(); + } + + function testFuzz_deployMultiClaimsHatter(uint256 _hatId, address _hat, uint256 _saltNonce) public { + address instance = factory.deployMultiClaimsHatter(_hatId, _hat, "", _saltNonce); + address expectedAddress = factory._getAddress(_hatId, _hat, "", _saltNonce); + console2.log("instance", instance); + console2.log("expectedAddress", expectedAddress); + assertEq(instance, expectedAddress); + } +} From 00846178d307485f86f16659fe05289f3e48d424 Mon Sep 17 00:00:00 2001 From: keating Date: Tue, 2 Jul 2024 22:08:40 -0400 Subject: [PATCH 08/18] Fix test --- lib/hats-module | 2 +- src/MultiClaimsHatterFactory.sol | 44 ++++++++++++++++------------- test/MultiClaimsHatterFactory.t.sol | 4 +-- 3 files changed, 27 insertions(+), 23 deletions(-) diff --git a/lib/hats-module b/lib/hats-module index 251c827..e295c91 160000 --- a/lib/hats-module +++ b/lib/hats-module @@ -1 +1 @@ -Subproject commit 251c827a66feb032be7cf3dcc76acb43f74486c5 +Subproject commit e295c91f63722ecf723b4f9e4bd85b182ea4739d diff --git a/src/MultiClaimsHatterFactory.sol b/src/MultiClaimsHatterFactory.sol index 67d0670..fe7b99e 100644 --- a/src/MultiClaimsHatterFactory.sol +++ b/src/MultiClaimsHatterFactory.sol @@ -16,19 +16,14 @@ contract MultiClaimsHatterFactory { external returns (address) { - console2.log("in deployMultiClaimsHatter"); - console2.log("hatId", _hatId); - console2.log("hat", _hat); - console2.log("saltNonce", _saltNonce); - bytes memory args = abi.encodePacked(_hatId, _hat, _initData); - bytes32 salt = _calculateSalt(args, _saltNonce); + bytes memory saltArgs = abi.encodePacked(VERSION, _hatId, _hat, _initData); + bytes32 salt = _calculateSalt(saltArgs, _saltNonce); // TODO: Test situate where contract exitsts MultiClaimsHatter instance = new MultiClaimsHatter{ salt: salt }(VERSION, _hat, _hatId); instance.setUp(_initData); emit ModuleDeployed( address(instance), address(instance), _hatId, abi.encodePacked(_hat, _initData), _initData, _saltNonce ); - console2.log("instance", address(instance)); return address(instance); } @@ -36,21 +31,32 @@ contract MultiClaimsHatterFactory { return keccak256(abi.encodePacked(_args, block.chainid, _saltNonce)); } - function _getAddress(uint256 _hatId, address _hat, bytes calldata _initData, uint256 _saltNonce) + function getAddress(uint256 _hatId, address _hat, bytes calldata _initData, uint256 _saltNonce) external returns (address addr) { - console2.log("in _getAddress"); - console2.log("hatId", _hatId); - console2.log("hat", _hat); - console2.log("saltNonce", _saltNonce); - bytes memory args = abi.encodePacked(_hatId, _hat, _initData); - bytes32 salt = _calculateSalt(args, _saltNonce); + bytes memory saltArgs = abi.encodePacked(VERSION, _hatId, _hat, _initData); + bytes32 salt = _calculateSalt(saltArgs, _saltNonce); bytes memory bytecode = type(MultiClaimsHatter).creationCode; - console2.log("bytecode length", bytecode.length); - assembly { - addr := create2(0, add(bytecode, 32), mload(bytecode), salt) - } - console2.log("addr", addr); + addr = computeCreate2Address(salt, address(this), bytecode, abi.encode(VERSION, _hat, _hatId)); + } + + function computeCreate2Address( + bytes32 salt, + address deployer, + bytes memory initcode, + bytes memory constructorArgs + ) internal pure returns (address) { + return address( + uint160( + uint256( + keccak256( + abi.encodePacked( + bytes1(0xff), deployer, salt, keccak256(abi.encodePacked(initcode, constructorArgs)) + ) + ) + ) + ) + ); } } diff --git a/test/MultiClaimsHatterFactory.t.sol b/test/MultiClaimsHatterFactory.t.sol index b37e784..776ee28 100644 --- a/test/MultiClaimsHatterFactory.t.sol +++ b/test/MultiClaimsHatterFactory.t.sol @@ -14,9 +14,7 @@ contract TestMultiClaimsHatterFactory is Test { function testFuzz_deployMultiClaimsHatter(uint256 _hatId, address _hat, uint256 _saltNonce) public { address instance = factory.deployMultiClaimsHatter(_hatId, _hat, "", _saltNonce); - address expectedAddress = factory._getAddress(_hatId, _hat, "", _saltNonce); - console2.log("instance", instance); - console2.log("expectedAddress", expectedAddress); + address expectedAddress = factory.getAddress(_hatId, _hat, "", _saltNonce); assertEq(instance, expectedAddress); } } From 1871bd82636b79fe901a311bc2a79521074b92ac Mon Sep 17 00:00:00 2001 From: keating Date: Wed, 3 Jul 2024 09:43:28 -0400 Subject: [PATCH 09/18] Fix contract code creation --- src/MultiClaimsHatterFactory.sol | 28 +---- src/lib/L2ContractHelper.sol | 164 ++++++++++++++++++++++++++++ test/MultiClaimsHatterFactory.t.sol | 7 ++ 3 files changed, 177 insertions(+), 22 deletions(-) create mode 100644 src/lib/L2ContractHelper.sol diff --git a/src/MultiClaimsHatterFactory.sol b/src/MultiClaimsHatterFactory.sol index fe7b99e..e45be41 100644 --- a/src/MultiClaimsHatterFactory.sol +++ b/src/MultiClaimsHatterFactory.sol @@ -3,10 +3,12 @@ pragma solidity ^0.8.19; import { MultiClaimsHatter } from "./MultiClaimsHatter.sol"; import { console2 } from "forge-std/Test.sol"; +import {L2ContractHelper} from "./lib/L2ContractHelper.sol"; contract MultiClaimsHatterFactory { - // should the version be higher here string public constant VERSION = "0.6.0-zksync"; + /// @dev Bytecode hash can be found in zksolc/MultiClaimsHatter.sol/MultiClaimsHatter.json under the hash key. + bytes32 constant BYTECODE_HASH = 0x0100041dbb312c575f637f3b4ffbdf9beada863fa830a3f771b06df5a8a5c287; event ModuleDeployed( address implementation, address instance, uint256 hatId, bytes otherImmutableArgs, bytes initData, uint256 saltNonce @@ -33,30 +35,12 @@ contract MultiClaimsHatterFactory { function getAddress(uint256 _hatId, address _hat, bytes calldata _initData, uint256 _saltNonce) external + view returns (address addr) { bytes memory saltArgs = abi.encodePacked(VERSION, _hatId, _hat, _initData); bytes32 salt = _calculateSalt(saltArgs, _saltNonce); - bytes memory bytecode = type(MultiClaimsHatter).creationCode; - addr = computeCreate2Address(salt, address(this), bytecode, abi.encode(VERSION, _hat, _hatId)); + addr = L2ContractHelper.computeCreate2Address(address(this), salt, BYTECODE_HASH, keccak256(abi.encode(VERSION, _hat, _hatId))); } - function computeCreate2Address( - bytes32 salt, - address deployer, - bytes memory initcode, - bytes memory constructorArgs - ) internal pure returns (address) { - return address( - uint160( - uint256( - keccak256( - abi.encodePacked( - bytes1(0xff), deployer, salt, keccak256(abi.encodePacked(initcode, constructorArgs)) - ) - ) - ) - ) - ); - } -} + } diff --git a/src/lib/L2ContractHelper.sol b/src/lib/L2ContractHelper.sol new file mode 100644 index 0000000..abc87eb --- /dev/null +++ b/src/lib/L2ContractHelper.sol @@ -0,0 +1,164 @@ +// SPDX-License-Identifier: MIT + +pragma solidity 0.8.19; + +/** + * @author Matter Labs + * @custom:security-contact security@matterlabs.dev + * @notice Smart contract for sending arbitrary length messages to L1 + * @dev by default ZkSync can send fixed-length messages on L1. + * A fixed length message has 4 parameters `senderAddress`, `isService`, `key`, `value`, + * the first one is taken from the context, the other three are chosen by the sender. + * @dev To send a variable-length message we use this trick: + * - This system contract accepts an arbitrary length message and sends a fixed length message with + * parameters `senderAddress == this`, `isService == true`, `key == msg.sender`, `value == keccak256(message)`. + * - The contract on L1 accepts all sent messages and if the message came from this system contract + * it requires that the preimage of `value` be provided. + */ +interface IL2Messenger { + /// @notice Sends an arbitrary length message to L1. + /// @param _message The variable length message to be sent to L1. + /// @return Returns the keccak256 hashed value of the message. + function sendToL1(bytes memory _message) external returns (bytes32); +} + +/** + * @author Matter Labs + * @custom:security-contact security@matterlabs.dev + * @notice Interface for the contract that is used to deploy contracts on L2. + */ +interface IContractDeployer { + /// @notice A struct that describes a forced deployment on an address. + /// @param bytecodeHash The bytecode hash to put on an address. + /// @param newAddress The address on which to deploy the bytecodehash to. + /// @param callConstructor Whether to run the constructor on the force deployment. + /// @param value The `msg.value` with which to initialize a contract. + /// @param input The constructor calldata. + struct ForceDeployment { + bytes32 bytecodeHash; + address newAddress; + bool callConstructor; + uint256 value; + bytes input; + } + + /// @notice This method is to be used only during an upgrade to set bytecodes on specific addresses. + /// @param _deployParams A set of parameters describing force deployment. + function forceDeployOnAddresses(ForceDeployment[] calldata _deployParams) external payable; + + /// @notice Creates a new contract at a determined address using the `CREATE2` salt on L2 + /// @param _salt a unique value to create the deterministic address of the new contract + /// @param _bytecodeHash the bytecodehash of the new contract to be deployed + /// @param _input the calldata to be sent to the constructor of the new contract + function create2(bytes32 _salt, bytes32 _bytecodeHash, bytes calldata _input) external returns (address); +} + +/** + * @author Matter Labs + * @custom:security-contact security@matterlabs.dev + * @notice Interface for the contract that is used to simulate ETH on L2. + */ +interface IBaseToken { + /// @notice Allows the withdrawal of ETH to a given L1 receiver along with an additional message. + /// @param _l1Receiver The address on L1 to receive the withdrawn ETH. + /// @param _additionalData Additional message or data to be sent alongside the withdrawal. + function withdrawWithMessage(address _l1Receiver, bytes memory _additionalData) external payable; +} + +uint160 constant SYSTEM_CONTRACTS_OFFSET = 0x8000; // 2^15 + +address constant BOOTLOADER_ADDRESS = address(SYSTEM_CONTRACTS_OFFSET + 0x01); +address constant MSG_VALUE_SYSTEM_CONTRACT = address(SYSTEM_CONTRACTS_OFFSET + 0x09); +address constant DEPLOYER_SYSTEM_CONTRACT = address(SYSTEM_CONTRACTS_OFFSET + 0x06); + +IL2Messenger constant L2_MESSENGER = IL2Messenger(address(SYSTEM_CONTRACTS_OFFSET + 0x08)); + +IBaseToken constant L2_BASE_TOKEN_ADDRESS = IBaseToken(address(SYSTEM_CONTRACTS_OFFSET + 0x0a)); + +/** + * @author Matter Labs + * @custom:security-contact security@matterlabs.dev + * @notice Helper library for working with L2 contracts on L1. + */ +library L2ContractHelper { + /// @dev The prefix used to create CREATE2 addresses. + bytes32 private constant CREATE2_PREFIX = keccak256("zksyncCreate2"); + + /// @notice Sends L2 -> L1 arbitrary-long message through the system contract messenger. + /// @param _message Data to be sent to L1. + /// @return keccak256 hash of the sent message. + function sendMessageToL1(bytes memory _message) internal returns (bytes32) { + return L2_MESSENGER.sendToL1(_message); + } + + /// @notice Computes the create2 address for a Layer 2 contract. + /// @param _sender The address of the contract creator. + /// @param _salt The salt value to use in the create2 address computation. + /// @param _bytecodeHash The contract bytecode hash. + /// @param _constructorInputHash The keccak256 hash of the constructor input data. + /// @return The create2 address of the contract. + /// NOTE: L2 create2 derivation is different from L1 derivation! + function computeCreate2Address( + address _sender, + bytes32 _salt, + bytes32 _bytecodeHash, + bytes32 _constructorInputHash + ) internal pure returns (address) { + bytes32 senderBytes = bytes32(uint256(uint160(_sender))); + bytes32 data = keccak256( + // solhint-disable-next-line func-named-parameters + bytes.concat(CREATE2_PREFIX, senderBytes, _salt, _bytecodeHash, _constructorInputHash) + ); + + return address(uint160(uint256(data))); + } +} + +/// @notice Structure used to represent a zkSync transaction. +struct Transaction { + // The type of the transaction. + uint256 txType; + // The caller. + uint256 from; + // The callee. + uint256 to; + // The gasLimit to pass with the transaction. + // It has the same meaning as Ethereum's gasLimit. + uint256 gasLimit; + // The maximum amount of gas the user is willing to pay for a byte of pubdata. + uint256 gasPerPubdataByteLimit; + // The maximum fee per gas that the user is willing to pay. + // It is akin to EIP1559's maxFeePerGas. + uint256 maxFeePerGas; + // The maximum priority fee per gas that the user is willing to pay. + // It is akin to EIP1559's maxPriorityFeePerGas. + uint256 maxPriorityFeePerGas; + // The transaction's paymaster. If there is no paymaster, it is equal to 0. + uint256 paymaster; + // The nonce of the transaction. + uint256 nonce; + // The value to pass with the transaction. + uint256 value; + // In the future, we might want to add some + // new fields to the struct. The `txData` struct + // is to be passed to account and any changes to its structure + // would mean a breaking change to these accounts. In order to prevent this, + // we should keep some fields as "reserved". + // It is also recommended that their length is fixed, since + // it would allow easier proof integration (in case we will need + // some special circuit for preprocessing transactions). + uint256[4] reserved; + // The transaction's calldata. + bytes data; + // The signature of the transaction. + bytes signature; + // The properly formatted hashes of bytecodes that must be published on L1 + // with the inclusion of this transaction. Note, that a bytecode has been published + // before, the user won't pay fees for its republishing. + bytes32[] factoryDeps; + // The input to the paymaster. + bytes paymasterInput; + // Reserved dynamic type for the future use-case. Using it should be avoided, + // But it is still here, just in case we want to enable some additional functionality. + bytes reservedDynamic; +} diff --git a/test/MultiClaimsHatterFactory.t.sol b/test/MultiClaimsHatterFactory.t.sol index 776ee28..d9de42b 100644 --- a/test/MultiClaimsHatterFactory.t.sol +++ b/test/MultiClaimsHatterFactory.t.sol @@ -17,4 +17,11 @@ contract TestMultiClaimsHatterFactory is Test { address expectedAddress = factory.getAddress(_hatId, _hat, "", _saltNonce); assertEq(instance, expectedAddress); } + + function testFuzz_deployMultiClaimsHatterTwice(uint256 _hatId, address _hat, uint256 _saltNonce) public { + factory.deployMultiClaimsHatter(_hatId, _hat, "", _saltNonce); + vm.expectRevert(bytes("Code hash is non-zero")); + factory.deployMultiClaimsHatter(_hatId, _hat, "", _saltNonce); + } + } From 40cbb4ccf6ee4a8852670777a0c008d6adf0d449 Mon Sep 17 00:00:00 2001 From: keating Date: Fri, 5 Jul 2024 08:50:00 -0400 Subject: [PATCH 10/18] Add hardhat deploy --- hardhat.config.ts | 54 + package-lock.json | 9232 ++++++++++++++++++++++ package.json | 34 + script/DeployMultiClaimsHatter.ts | 39 + script/DeployMultiClaimsHatterFactory.ts | 33 + script/RunScript.js | 10 + tsconfig.json | 0 7 files changed, 9402 insertions(+) create mode 100644 hardhat.config.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 script/DeployMultiClaimsHatter.ts create mode 100644 script/DeployMultiClaimsHatterFactory.ts create mode 100644 script/RunScript.js create mode 100644 tsconfig.json diff --git a/hardhat.config.ts b/hardhat.config.ts new file mode 100644 index 0000000..bd58f94 --- /dev/null +++ b/hardhat.config.ts @@ -0,0 +1,54 @@ +import { HardhatUserConfig } from "hardhat/config"; +import "@nomicfoundation/hardhat-toolbox"; +import "@nomicfoundation/hardhat-toolbox"; +import "@nomicfoundation/hardhat-foundry"; + +import "@matterlabs/hardhat-zksync-deploy"; +import "@matterlabs/hardhat-zksync-solc"; +import "@matterlabs/hardhat-zksync-node"; +import "@matterlabs/hardhat-zksync-upgradable"; +import "@matterlabs/hardhat-zksync-verify" + +import * as dotenv from 'dotenv'; +dotenv.config(); + +const config: HardhatUserConfig = { + solidity: "0.8.19", + zksolc: { + version: "1.4.0", + settings: { + optimizer: { + enabled: true, + }, + }, + }, + paths: { + "sources": "./src", + }, + networks: { + hardhat: { + zksync: false, + }, + ethNetwork: { + zksync: false, + url: "http://localhost:8545", + }, + zkSyncLocal: { + zksync: true, + ethNetwork: "ethNetwork", + url: process.env.ZK_LOCAL_NETWORK_URL ? process.env.ZK_LOCAL_NETWORK_URL : "http://0.0.0.0:8011", + }, + mainnet: { + zksync: false, + url: "https://eth-mainnet.g.alchemy.com/v2/SECRET", + }, + zkSyncEra: { + zksync: true, + ethNetwork: "mainnet", + url: "https://zksync-mainnet.g.alchemy.com/v2/SECRET", + }, + }, + defaultNetwork: "zkSyncLocal", +}; + +export default config; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..f9a1201 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,9232 @@ +{ + "name": "multi-hats-hatter", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "multi-hats-hatter", + "license": "MIT", + "dependencies": { + "@matterlabs/hardhat-zksync-verify": "^1.5.0" + }, + "devDependencies": { + "@matterlabs/hardhat-zksync-deploy": "^1.2.1", + "@matterlabs/hardhat-zksync-node": "^1.0.3", + "@matterlabs/hardhat-zksync-solc": "^1.1.4", + "@matterlabs/hardhat-zksync-upgradable": "^1.4.1", + "@nomicfoundation/hardhat-foundry": "^1.1.2", + "@nomicfoundation/hardhat-toolbox": "^5.0.0", + "@openzeppelin/contracts": "^4.9.6", + "@openzeppelin/contracts-upgradeable": "^4.9.6", + "@openzeppelin/upgrades-core": "^1.32.3", + "dotenv": "^16.4.5", + "hardhat": "^2.22.2" + } + }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", + "dev": true + }, + "node_modules/@balena/dockerignore": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz", + "integrity": "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==" + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "devOptional": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@ethereumjs/rlp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", + "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", + "dev": true, + "peer": true, + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@ethereumjs/util": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", + "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", + "dev": true, + "peer": true, + "dependencies": { + "@ethereumjs/rlp": "^4.0.1", + "ethereum-cryptography": "^2.0.0", + "micro-ftch": "^0.3.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@ethereumjs/util/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "dev": true, + "peer": true, + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/util/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/util/node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "dev": true, + "peer": true, + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } + }, + "node_modules/@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/abstract-provider": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0" + } + }, + "node_modules/@ethersproject/abstract-signer": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" + } + }, + "node_modules/@ethersproject/base64": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0" + } + }, + "node_modules/@ethersproject/basex": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "node_modules/@ethersproject/bignumber": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" + } + }, + "node_modules/@ethersproject/bytes": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/constants": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0" + } + }, + "node_modules/@ethersproject/contracts": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0" + } + }, + "node_modules/@ethersproject/hash": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/hdnode": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" + } + }, + "node_modules/@ethersproject/json-wallets": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" + } + }, + "node_modules/@ethersproject/json-wallets/node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", + "dev": true, + "peer": true + }, + "node_modules/@ethersproject/keccak256": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "js-sha3": "0.8.0" + } + }, + "node_modules/@ethersproject/logger": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ] + }, + "node_modules/@ethersproject/networks": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/pbkdf2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.0" + } + }, + "node_modules/@ethersproject/properties": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/providers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", + "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0", + "bech32": "1.1.4", + "ws": "7.4.6" + } + }, + "node_modules/@ethersproject/providers/node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@ethersproject/random": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/rlp": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/sha2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", + "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/signing-key": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", + "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "bn.js": "^5.2.1", + "elliptic": "6.5.4", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/solidity": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/strings": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/transactions": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0" + } + }, + "node_modules/@ethersproject/units": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", + "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/wallet": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", + "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/json-wallets": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" + } + }, + "node_modules/@ethersproject/web": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/wordlists": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "devOptional": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "devOptional": true, + "peer": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "devOptional": true, + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@matterlabs/hardhat-zksync-deploy": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@matterlabs/hardhat-zksync-deploy/-/hardhat-zksync-deploy-1.5.0.tgz", + "integrity": "sha512-7LAgYYwoKWHeR+3CyWEvA3NKBKtt7ktcr7SX6ZPgbEYqHAdXH02vxJZGwNADtMWpyYm8h+fEQkpPIgErD4NhmA==", + "dev": true, + "dependencies": { + "@matterlabs/hardhat-zksync-solc": "^1.2.0", + "chai": "^4.3.4", + "chalk": "^4.1.2", + "fs-extra": "^11.2.0", + "glob": "^10.4.1", + "lodash": "^4.17.21", + "sinon": "^18.0.0", + "sinon-chai": "^3.7.0", + "ts-morph": "^22.0.0" + }, + "peerDependencies": { + "ethers": "^6.12.2", + "hardhat": "^2.22.5", + "zksync-ethers": "^6.8.0" + } + }, + "node_modules/@matterlabs/hardhat-zksync-node": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@matterlabs/hardhat-zksync-node/-/hardhat-zksync-node-1.1.0.tgz", + "integrity": "sha512-1YlITgZHOuV/DR5TS9OroX8khLxpDi+QSl754p3ReFvAwqBxHlzzuXlSJS6WzmleUAaRB+EWMAGwTeTJjVDmng==", + "dev": true, + "dependencies": { + "@matterlabs/hardhat-zksync-solc": "^1.2.0", + "axios": "^1.7.2", + "chai": "^4.3.4", + "chalk": "^4.1.2", + "fs-extra": "^11.2.0", + "proxyquire": "^2.1.3", + "sinon": "^18.0.0", + "sinon-chai": "^3.7.0", + "undici": "^6.18.2" + }, + "peerDependencies": { + "hardhat": "^2.22.5", + "zksync-ethers": "^6.8.0" + } + }, + "node_modules/@matterlabs/hardhat-zksync-solc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@matterlabs/hardhat-zksync-solc/-/hardhat-zksync-solc-1.2.0.tgz", + "integrity": "sha512-zM3LY6jeCVfFe2MZfiK/6k8GUcxk9BcCBiNs1Ywh4PZ4OaabYOP3HuFFmVo89BFisIRROnQ+IyT9fayKKVbFCg==", + "dependencies": { + "@nomiclabs/hardhat-docker": "^2.0.2", + "chai": "^4.3.4", + "chalk": "^4.1.2", + "debug": "^4.3.5", + "dockerode": "^4.0.2", + "fs-extra": "^11.2.0", + "proper-lockfile": "^4.1.2", + "semver": "^7.6.2", + "sinon": "^18.0.0", + "sinon-chai": "^3.7.0", + "undici": "^6.18.2" + }, + "peerDependencies": { + "hardhat": "^2.22.5" + } + }, + "node_modules/@matterlabs/hardhat-zksync-upgradable": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@matterlabs/hardhat-zksync-upgradable/-/hardhat-zksync-upgradable-1.5.1.tgz", + "integrity": "sha512-9Dj2cpOjoi4DbDgqUflA8vTuVSua7qG3b4xOwAg/FBgHwnSnnYsaIsPy09OupmNXzdkl5sPuJf9bvWmKVFPIKA==", + "dev": true, + "dependencies": { + "@matterlabs/hardhat-zksync-deploy": "^1.5.0", + "@matterlabs/hardhat-zksync-solc": "^1.2.0", + "@openzeppelin/upgrades-core": "^1.31.3", + "chalk": "^4.1.2", + "compare-versions": "^6.1.0", + "ethereumjs-util": "^7.1.5", + "ethers": "^6.12.2", + "fs-extra": "^11.2.0", + "hardhat": "^2.22.5", + "proper-lockfile": "^4.1.2", + "solidity-ast": "^0.4.56", + "zksync-ethers": "^6.8.0" + }, + "peerDependencies": { + "@openzeppelin/contracts-upgradeable": "^4.9.2" + } + }, + "node_modules/@matterlabs/hardhat-zksync-verify": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@matterlabs/hardhat-zksync-verify/-/hardhat-zksync-verify-1.5.0.tgz", + "integrity": "sha512-dHprx+QNfGgoWYpSMHinXIjGyrC31TgiYlYxfnKmRLzfG4/ge3uirS0N2BDmo2Cl+S0SqzMrc4BJoDfnkA6tKw==", + "dependencies": { + "@ethersproject/abi": "^5.7.0", + "@ethersproject/address": "5.7.0", + "@matterlabs/hardhat-zksync-solc": "^1.2.0", + "@nomicfoundation/hardhat-verify": "^2.0.8", + "axios": "^1.7.2", + "cbor": "^9.0.2", + "chai": "^4.3.4", + "chalk": "^4.1.2", + "debug": "^4.3.5", + "hardhat": "^2.22.5", + "semver": "^7.6.2", + "sinon": "^18.0.0", + "sinon-chai": "^3.7.0" + }, + "peerDependencies": { + "@nomicfoundation/hardhat-verify": "^2.0.8" + } + }, + "node_modules/@metamask/eth-sig-util": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", + "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", + "dependencies": { + "ethereumjs-abi": "^0.6.8", + "ethereumjs-util": "^6.2.1", + "ethjs-util": "^0.1.6", + "tweetnacl": "^1.0.3", + "tweetnacl-util": "^0.15.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@metamask/eth-sig-util/node_modules/@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@metamask/eth-sig-util/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/@metamask/eth-sig-util/node_modules/ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "dependencies": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" + } + }, + "node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "dev": true, + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "dev": true, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/secp256k1": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nomicfoundation/edr": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.4.1.tgz", + "integrity": "sha512-NgrMo2rI9r28uidumvd+K2/AJLdxtXsUlJr3hj/pM6S1FCd/HiWaLeLa/cjCVPcE2u1rYAa3W6UFxLCB7S5Dhw==", + "dependencies": { + "@nomicfoundation/edr-darwin-arm64": "0.4.1", + "@nomicfoundation/edr-darwin-x64": "0.4.1", + "@nomicfoundation/edr-linux-arm64-gnu": "0.4.1", + "@nomicfoundation/edr-linux-arm64-musl": "0.4.1", + "@nomicfoundation/edr-linux-x64-gnu": "0.4.1", + "@nomicfoundation/edr-linux-x64-musl": "0.4.1", + "@nomicfoundation/edr-win32-x64-msvc": "0.4.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-darwin-arm64": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.4.1.tgz", + "integrity": "sha512-XuiUUnWAVNw7JYv7nRqDWfpBm21HOxCRBQ8lQnRnmiets9Ss2X5Ul9mvBheIPh/D0wBzwJ8TRtsSrorpwE79cA==", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-darwin-x64": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.4.1.tgz", + "integrity": "sha512-N1MfJqEX5ixaXlyyrHnaYxzwIT27Nc/jUgLI7ts4/9kRvPTvyZRYmXS1ciKhmUFr/WvFckTCix2RJbZoGGtX7g==", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-linux-arm64-gnu": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.4.1.tgz", + "integrity": "sha512-bSPOfmcFjJwDgWOV5kgZHeqg2OWu1cINrHSGjig0aVHehjcoX4Sgayrj6fyAxcOV5NQKA6WcyTFll6NrCxzWRA==", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-linux-arm64-musl": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.4.1.tgz", + "integrity": "sha512-F/+DgOdeBFQDrk+SX4aFffJFBgJfd75ZtE2mjcWNAh/qWiS7NfUxdQX/5OvNo/H6EY4a+3bZH6Bgzqg4mEWvMw==", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-linux-x64-gnu": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.4.1.tgz", + "integrity": "sha512-POHhTWczIXCPhzKtY0Vt/l+VCqqCx5gNR5ErwSrNnLz/arfQobZFAU+nc61BX3Jch82TW8b3AbfGI73Kh7gO0w==", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-linux-x64-musl": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.4.1.tgz", + "integrity": "sha512-uu8oNp4Ozg3H1x1We0FF+rwXfFiAvsOm5GQ+OBx9YYOXnfDPWqguQfGIkhrti9GD0iYhfQ/WOG5wvp0IzzgGSg==", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-win32-x64-msvc": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.4.1.tgz", + "integrity": "sha512-PaZHFw455z89ZiKYNTnKu+/TiVZVRI+mRJsbRTe2N0VlYfUBS1o2gdXBM12oP1t198HR7xQwEPPAslTFxGBqHA==", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/ethereumjs-common": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz", + "integrity": "sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==", + "dependencies": { + "@nomicfoundation/ethereumjs-util": "9.0.4" + } + }, + "node_modules/@nomicfoundation/ethereumjs-rlp": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz", + "integrity": "sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==", + "bin": { + "rlp": "bin/rlp.cjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@nomicfoundation/ethereumjs-tx": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz", + "integrity": "sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==", + "dependencies": { + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "c-kzg": "^2.1.2" + }, + "peerDependenciesMeta": { + "c-kzg": { + "optional": true + } + } + }, + "node_modules/@nomicfoundation/ethereumjs-util": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.4.tgz", + "integrity": "sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==", + "dependencies": { + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "c-kzg": "^2.1.2" + }, + "peerDependenciesMeta": { + "c-kzg": { + "optional": true + } + } + }, + "node_modules/@nomicfoundation/hardhat-chai-matchers": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.7.tgz", + "integrity": "sha512-RQfsiTwdf0SP+DtuNYvm4921X6VirCQq0Xyh+mnuGlTwEFSPZ/o27oQC+l+3Y/l48DDU7+ZcYBR+Fp+Rp94LfQ==", + "dev": true, + "peer": true, + "dependencies": { + "@types/chai-as-promised": "^7.1.3", + "chai-as-promised": "^7.1.1", + "deep-eql": "^4.0.1", + "ordinal": "^1.0.3" + }, + "peerDependencies": { + "@nomicfoundation/hardhat-ethers": "^3.0.0", + "chai": "^4.2.0", + "ethers": "^6.1.0", + "hardhat": "^2.9.4" + } + }, + "node_modules/@nomicfoundation/hardhat-ethers": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.6.tgz", + "integrity": "sha512-/xzkFQAaHQhmIAYOQmvHBPwL+NkwLzT9gRZBsgWUYeV+E6pzXsBQsHfRYbAZ3XEYare+T7S+5Tg/1KDJgepSkA==", + "dev": true, + "peer": true, + "dependencies": { + "debug": "^4.1.1", + "lodash.isequal": "^4.5.0" + }, + "peerDependencies": { + "ethers": "^6.1.0", + "hardhat": "^2.0.0" + } + }, + "node_modules/@nomicfoundation/hardhat-foundry": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-foundry/-/hardhat-foundry-1.1.2.tgz", + "integrity": "sha512-f5Vhj3m2qvKGpr6NAINYwNgILDsai8dVCsFb1rAVLkJxOmD2pAtfCmOH5SBVr9yUI5B1z9rbTwPBJVrqnb+PXQ==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2" + }, + "peerDependencies": { + "hardhat": "^2.17.2" + } + }, + "node_modules/@nomicfoundation/hardhat-foundry/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nomicfoundation/hardhat-foundry/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nomicfoundation/hardhat-foundry/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@nomicfoundation/hardhat-foundry/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@nomicfoundation/hardhat-foundry/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@nomicfoundation/hardhat-foundry/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nomicfoundation/hardhat-foundry/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nomicfoundation/hardhat-ignition": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition/-/hardhat-ignition-0.15.5.tgz", + "integrity": "sha512-Y5nhFXFqt4owA6Ooag8ZBFDF2RAZElMXViknVIsi3m45pbQimS50ti6FU8HxfRkDnBARa40CIn7UGV0hrelzDw==", + "dev": true, + "peer": true, + "dependencies": { + "@nomicfoundation/ignition-core": "^0.15.5", + "@nomicfoundation/ignition-ui": "^0.15.5", + "chalk": "^4.0.0", + "debug": "^4.3.2", + "fs-extra": "^10.0.0", + "prompts": "^2.4.2" + }, + "peerDependencies": { + "@nomicfoundation/hardhat-verify": "^2.0.1", + "hardhat": "^2.18.0" + } + }, + "node_modules/@nomicfoundation/hardhat-ignition-ethers": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition-ethers/-/hardhat-ignition-ethers-0.15.5.tgz", + "integrity": "sha512-W6s1QN9CFxzSVZS6w9Jcj3WLaK32z2FP5MxNU2OKY1Fn9ZzLr+miXbUbWYuRHl6dxrrl6sE8cv33Cybv19pmCg==", + "dev": true, + "peer": true, + "peerDependencies": { + "@nomicfoundation/hardhat-ethers": "^3.0.4", + "@nomicfoundation/hardhat-ignition": "^0.15.5", + "@nomicfoundation/ignition-core": "^0.15.5", + "ethers": "^6.7.0", + "hardhat": "^2.18.0" + } + }, + "node_modules/@nomicfoundation/hardhat-ignition/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@nomicfoundation/hardhat-network-helpers": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.11.tgz", + "integrity": "sha512-uGPL7QSKvxrHRU69dx8jzoBvuztlLCtyFsbgfXIwIjnO3dqZRz2GNMHJoO3C3dIiUNM6jdNF4AUnoQKDscdYrA==", + "dev": true, + "peer": true, + "dependencies": { + "ethereumjs-util": "^7.1.4" + }, + "peerDependencies": { + "hardhat": "^2.9.5" + } + }, + "node_modules/@nomicfoundation/hardhat-toolbox": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-5.0.0.tgz", + "integrity": "sha512-FnUtUC5PsakCbwiVNsqlXVIWG5JIb5CEZoSXbJUsEBun22Bivx2jhF1/q9iQbzuaGpJKFQyOhemPB2+XlEE6pQ==", + "dev": true, + "peerDependencies": { + "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", + "@nomicfoundation/hardhat-ethers": "^3.0.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0", + "@nomicfoundation/hardhat-network-helpers": "^1.0.0", + "@nomicfoundation/hardhat-verify": "^2.0.0", + "@typechain/ethers-v6": "^0.5.0", + "@typechain/hardhat": "^9.0.0", + "@types/chai": "^4.2.0", + "@types/mocha": ">=9.1.0", + "@types/node": ">=18.0.0", + "chai": "^4.2.0", + "ethers": "^6.4.0", + "hardhat": "^2.11.0", + "hardhat-gas-reporter": "^1.0.8", + "solidity-coverage": "^0.8.1", + "ts-node": ">=8.0.0", + "typechain": "^8.3.0", + "typescript": ">=4.5.0" + } + }, + "node_modules/@nomicfoundation/hardhat-verify": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.8.tgz", + "integrity": "sha512-x/OYya7A2Kcz+3W/J78dyDHxr0ezU23DKTrRKfy5wDPCnePqnr79vm8EXqX3gYps6IjPBYyGPZ9K6E5BnrWx5Q==", + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@ethersproject/address": "^5.0.2", + "cbor": "^8.1.0", + "chalk": "^2.4.2", + "debug": "^4.1.1", + "lodash.clonedeep": "^4.5.0", + "semver": "^6.3.0", + "table": "^6.8.0", + "undici": "^5.14.0" + }, + "peerDependencies": { + "hardhat": "^2.0.4" + } + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/cbor": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "dependencies": { + "nofilter": "^3.1.0" + }, + "engines": { + "node": ">=12.19" + } + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/@nomicfoundation/ignition-core": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-core/-/ignition-core-0.15.5.tgz", + "integrity": "sha512-FgvuoIXhakRSP524JzNQ4BviyzBBKpsFaOWubPZ4XACLT4/7vGqlJ/7DIn0D2NL2anQ2qs98/BNBY9WccXUX1Q==", + "dev": true, + "peer": true, + "dependencies": { + "@ethersproject/address": "5.6.1", + "@nomicfoundation/solidity-analyzer": "^0.1.1", + "cbor": "^9.0.0", + "debug": "^4.3.2", + "ethers": "^6.7.0", + "fs-extra": "^10.0.0", + "immer": "10.0.2", + "lodash": "4.17.21", + "ndjson": "2.0.0" + } + }, + "node_modules/@nomicfoundation/ignition-core/node_modules/@ethersproject/address": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.6.1.tgz", + "integrity": "sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/bignumber": "^5.6.2", + "@ethersproject/bytes": "^5.6.1", + "@ethersproject/keccak256": "^5.6.1", + "@ethersproject/logger": "^5.6.0", + "@ethersproject/rlp": "^5.6.1" + } + }, + "node_modules/@nomicfoundation/ignition-core/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@nomicfoundation/ignition-ui": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-ui/-/ignition-ui-0.15.5.tgz", + "integrity": "sha512-ZcE4rIn10qKahR4OqS8rl8NM2Fbg2QYiBXgMgj74ZI0++LlCcZgB5HyaBbX+lsnKHjTXtjYD3b+2mtg7jFbAMQ==", + "dev": true, + "peer": true + }, + "node_modules/@nomicfoundation/solidity-analyzer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz", + "integrity": "sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==", + "engines": { + "node": ">= 12" + }, + "optionalDependencies": { + "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.2", + "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.2", + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.2", + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.2", + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.2", + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.2", + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.2" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz", + "integrity": "sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz", + "integrity": "sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz", + "integrity": "sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.2.tgz", + "integrity": "sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.2.tgz", + "integrity": "sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.2.tgz", + "integrity": "sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.2.tgz", + "integrity": "sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@nomiclabs/hardhat-docker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-docker/-/hardhat-docker-2.0.2.tgz", + "integrity": "sha512-XgGEpRT3wlA1VslyB57zyAHV+oll8KnV1TjwnxxC1tpAL04/lbdwpdO5KxInVN8irMSepqFpsiSkqlcnvbE7Ng==", + "dependencies": { + "dockerode": "^2.5.8", + "fs-extra": "^7.0.1", + "node-fetch": "^2.6.0" + } + }, + "node_modules/@nomiclabs/hardhat-docker/node_modules/bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/@nomiclabs/hardhat-docker/node_modules/bl/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/@nomiclabs/hardhat-docker/node_modules/bl/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/@nomiclabs/hardhat-docker/node_modules/bl/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/@nomiclabs/hardhat-docker/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@nomiclabs/hardhat-docker/node_modules/docker-modem": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-1.0.9.tgz", + "integrity": "sha512-lVjqCSCIAUDZPAZIeyM125HXfNvOmYYInciphNrLrylUtKyW66meAjSPXWchKVzoIYZx69TPnAepVSSkeawoIw==", + "dependencies": { + "debug": "^3.2.6", + "JSONStream": "1.3.2", + "readable-stream": "~1.0.26-4", + "split-ca": "^1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nomiclabs/hardhat-docker/node_modules/dockerode": { + "version": "2.5.8", + "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-2.5.8.tgz", + "integrity": "sha512-+7iOUYBeDTScmOmQqpUYQaE7F4vvIt6+gIZNHWhqAQEI887tiPFB9OvXI/HzQYqfUNvukMK+9myLW63oTJPZpw==", + "dependencies": { + "concat-stream": "~1.6.2", + "docker-modem": "^1.0.8", + "tar-fs": "~1.16.3" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nomiclabs/hardhat-docker/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@nomiclabs/hardhat-docker/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/@nomiclabs/hardhat-docker/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@nomiclabs/hardhat-docker/node_modules/pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/@nomiclabs/hardhat-docker/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/@nomiclabs/hardhat-docker/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/@nomiclabs/hardhat-docker/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/@nomiclabs/hardhat-docker/node_modules/tar-fs": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", + "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", + "dependencies": { + "chownr": "^1.0.1", + "mkdirp": "^0.5.1", + "pump": "^1.0.0", + "tar-stream": "^1.1.2" + } + }, + "node_modules/@nomiclabs/hardhat-docker/node_modules/tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dependencies": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/@nomiclabs/hardhat-docker/node_modules/tar-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/@nomiclabs/hardhat-docker/node_modules/tar-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/@nomiclabs/hardhat-docker/node_modules/tar-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/@nomiclabs/hardhat-docker/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@openzeppelin/contracts": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.6.tgz", + "integrity": "sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==", + "dev": true + }, + "node_modules/@openzeppelin/contracts-upgradeable": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.6.tgz", + "integrity": "sha512-m4iHazOsOCv1DgM7eD7GupTJ+NFVujRZt1wzddDPSVGpWdKq1SKkla5htKG7+IS4d2XOCtzkUNwRZ7Vq5aEUMA==", + "dev": true + }, + "node_modules/@openzeppelin/upgrades-core": { + "version": "1.34.1", + "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.34.1.tgz", + "integrity": "sha512-LV3hHm60htmP3HJjn2VoGqXNPn1RLFSSInRyXNbm15Z2oWKGxOfAWSC4+okRckum0yVB5g3k4/SEyqjsJRB07A==", + "dev": true, + "dependencies": { + "cbor": "^9.0.0", + "chalk": "^4.1.0", + "compare-versions": "^6.0.0", + "debug": "^4.1.1", + "ethereumjs-util": "^7.0.3", + "minimist": "^1.2.7", + "proper-lockfile": "^4.1.1", + "solidity-ast": "^0.4.51" + }, + "bin": { + "openzeppelin-upgrades-core": "dist/cli/cli.js" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@scure/base": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.7.tgz", + "integrity": "sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "dev": true, + "peer": true, + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "dev": true, + "peer": true, + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "dev": true, + "peer": true, + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@sentry/core": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", + "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/core/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@sentry/hub": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", + "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", + "dependencies": { + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/hub/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@sentry/minimal": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", + "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/minimal/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@sentry/node": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", + "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", + "dependencies": { + "@sentry/core": "5.30.0", + "@sentry/hub": "5.30.0", + "@sentry/tracing": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/node/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@sentry/tracing": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", + "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/tracing/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@sentry/types": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", + "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", + "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", + "dependencies": { + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", + "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", + "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", + "dependencies": { + "@sinonjs/commons": "^2.0.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==" + }, + "node_modules/@solidity-parser/parser": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", + "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", + "dev": true, + "peer": true, + "dependencies": { + "antlr4ts": "^0.5.0-alpha.4" + } + }, + "node_modules/@ts-morph/common": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.23.0.tgz", + "integrity": "sha512-m7Lllj9n/S6sOkCkRftpM7L24uvmfXQFedlW/4hENcuJH1HHm9u5EgxZb9uVjQSCGrbBWBkOGgcTxNg36r6ywA==", + "dev": true, + "dependencies": { + "fast-glob": "^3.3.2", + "minimatch": "^9.0.3", + "mkdirp": "^3.0.1", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@ts-morph/common/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "devOptional": true, + "peer": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "devOptional": true, + "peer": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "devOptional": true, + "peer": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "devOptional": true, + "peer": true + }, + "node_modules/@typechain/ethers-v6": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.5.1.tgz", + "integrity": "sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==", + "dev": true, + "peer": true, + "dependencies": { + "lodash": "^4.17.15", + "ts-essentials": "^7.0.1" + }, + "peerDependencies": { + "ethers": "6.x", + "typechain": "^8.3.2", + "typescript": ">=4.7.0" + } + }, + "node_modules/@typechain/hardhat": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-9.1.0.tgz", + "integrity": "sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA==", + "dev": true, + "peer": true, + "dependencies": { + "fs-extra": "^9.1.0" + }, + "peerDependencies": { + "@typechain/ethers-v6": "^0.5.1", + "ethers": "^6.1.0", + "hardhat": "^2.9.9", + "typechain": "^8.3.2" + } + }, + "node_modules/@typechain/hardhat/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "peer": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@types/bn.js": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.5.tgz", + "integrity": "sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/chai": { + "version": "4.3.16", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.16.tgz", + "integrity": "sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==", + "dev": true, + "peer": true + }, + "node_modules/@types/chai-as-promised": { + "version": "7.1.8", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz", + "integrity": "sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==" + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true, + "peer": true + }, + "node_modules/@types/mocha": { + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.7.tgz", + "integrity": "sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==", + "dev": true, + "peer": true + }, + "node_modules/@types/node": { + "version": "20.14.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", + "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "dev": true, + "peer": true + }, + "node_modules/@types/qs": { + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", + "dev": true, + "peer": true + }, + "node_modules/@types/secp256k1": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz", + "integrity": "sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", + "dev": true, + "peer": true + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "devOptional": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "devOptional": true, + "peer": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "engines": { + "node": ">=0.3.0" + } + }, + "node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", + "dev": true + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.4.2" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/antlr4ts": { + "version": "0.5.0-alpha.4", + "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", + "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", + "dev": true, + "peer": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "devOptional": true, + "peer": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "peer": true + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "engines": { + "node": "*" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true, + "peer": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base-x": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", + "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", + "dev": true, + "peer": true + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" + }, + "node_modules/buildcheck": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.6.tgz", + "integrity": "sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==", + "optional": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true, + "peer": true + }, + "node_modules/cbor": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-9.0.2.tgz", + "integrity": "sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==", + "dependencies": { + "nofilter": "^3.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/chai": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai-as-promised": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.2.tgz", + "integrity": "sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==", + "dev": true, + "peer": true, + "dependencies": { + "check-error": "^1.0.2" + }, + "peerDependencies": { + "chai": ">= 2.1.2 < 6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "dev": true, + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", + "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", + "dev": true, + "peer": true, + "dependencies": { + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "colors": "^1.1.2" + } + }, + "node_modules/cli-table3/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "peer": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-table3/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/code-block-writer": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.1.tgz", + "integrity": "sha512-c5or4P6erEA69TxaxTNcHUNcIn+oyxSRTOWV+pSYF+z4epXqNvwvJ70XPGjPNgue83oAFAPBRQYwpAJ/Hpe/Sg==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" + }, + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "dev": true, + "peer": true, + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-usage": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", + "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", + "dev": true, + "peer": true, + "dependencies": { + "array-back": "^4.0.2", + "chalk": "^2.4.2", + "table-layout": "^1.0.2", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/command-line-usage/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/command-line-usage/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/command-line-usage/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "peer": true + }, + "node_modules/command-line-usage/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/command-line-usage/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/compare-versions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz", + "integrity": "sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/concat-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cpu-features": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz", + "integrity": "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "buildcheck": "~0.0.6", + "nan": "^2.19.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "devOptional": true, + "peer": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "dev": true, + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/death": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", + "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==", + "dev": true, + "peer": true + }, + "node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "peer": true + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/difflib": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", + "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", + "dev": true, + "peer": true, + "dependencies": { + "heap": ">= 0.2.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "peer": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/docker-modem": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-5.0.3.tgz", + "integrity": "sha512-89zhop5YVhcPEt5FpUFGr3cDyceGhq/F9J+ZndQ4KfqNvfbJpPMfgeixFgUj5OjCYAboElqODxY5Z1EBsSa6sg==", + "dependencies": { + "debug": "^4.1.1", + "readable-stream": "^3.5.0", + "split-ca": "^1.0.1", + "ssh2": "^1.15.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/dockerode": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-4.0.2.tgz", + "integrity": "sha512-9wM1BVpVMFr2Pw3eJNXrYYt6DT9k0xMcsSCjtPvyQ+xa1iPg/Mo3T/gUcwI0B2cczqCeCYRPF8yFYDwtFXT0+w==", + "dependencies": { + "@balena/dockerignore": "^1.0.2", + "docker-modem": "^5.0.3", + "tar-fs": "~2.0.1" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", + "dev": true, + "peer": true, + "dependencies": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=0.12.0" + }, + "optionalDependencies": { + "source-map": "~0.2.0" + } + }, + "node_modules/esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "dev": true, + "peer": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eth-gas-reporter": { + "version": "0.2.27", + "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.27.tgz", + "integrity": "sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==", + "dev": true, + "peer": true, + "dependencies": { + "@solidity-parser/parser": "^0.14.0", + "axios": "^1.5.1", + "cli-table3": "^0.5.0", + "colors": "1.4.0", + "ethereum-cryptography": "^1.0.3", + "ethers": "^5.7.2", + "fs-readdir-recursive": "^1.1.0", + "lodash": "^4.17.14", + "markdown-table": "^1.1.3", + "mocha": "^10.2.0", + "req-cwd": "^2.0.0", + "sha1": "^1.1.1", + "sync-request": "^6.0.0" + }, + "peerDependencies": { + "@codechecks/client": "^0.1.0" + }, + "peerDependenciesMeta": { + "@codechecks/client": { + "optional": true + } + } + }, + "node_modules/eth-gas-reporter/node_modules/@noble/hashes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "peer": true + }, + "node_modules/eth-gas-reporter/node_modules/@scure/bip32": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", + "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "peer": true, + "dependencies": { + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/@scure/bip39": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "peer": true, + "dependencies": { + "@noble/hashes": "~1.2.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "dev": true, + "peer": true, + "dependencies": { + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" + } + }, + "node_modules/eth-gas-reporter/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + } + }, + "node_modules/ethereum-bloom-filters": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.1.0.tgz", + "integrity": "sha512-J1gDRkLpuGNvWYzWslBQR9cDV4nd4kfvVTE/Wy4Kkm4yb3EYRSlyi0eB/inTsSTTVyA0+HyzHgbr95Fn/Z1fSw==", + "dev": true, + "peer": true, + "dependencies": { + "@noble/hashes": "^1.4.0" + } + }, + "node_modules/ethereum-bloom-filters/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/ethereumjs-abi": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", + "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", + "dependencies": { + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" + } + }, + "node_modules/ethereumjs-abi/node_modules/@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/ethereumjs-abi/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/ethereumjs-abi/node_modules/ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "dependencies": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" + } + }, + "node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dev": true, + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ethers": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.1.tgz", + "integrity": "sha512-hdJ2HOxg/xx97Lm9HdCWk949BfYqYWpyw4//78SiwOLgASyfrNszfMUNB2joKjvGUdwhHfaiMMFFwacVVoLR9A==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "18.15.13", + "aes-js": "4.0.0-beta.5", + "tslib": "2.4.0", + "ws": "8.17.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ethers/node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", + "dev": true + }, + "node_modules/ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", + "dev": true, + "peer": true, + "dependencies": { + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/ethjs-unit/node_modules/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", + "dev": true, + "peer": true + }, + "node_modules/ethjs-util": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", + "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", + "dependencies": { + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "peer": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-keys": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", + "integrity": "sha512-tcgI872xXjwFF4xgQmLxi76GnwJG3g/3isB1l4/G5Z4zrbddGpBjqZCO9oEAcB5wX0Hj/5iQB3toxfO7in1hHA==", + "dev": true, + "dependencies": { + "is-object": "~1.0.1", + "merge-descriptors": "~1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "dev": true, + "peer": true, + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fp-ts": { + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", + "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==" + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true, + "peer": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ghost-testrpc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", + "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", + "dev": true, + "peer": true, + "dependencies": { + "chalk": "^2.4.2", + "node-emoji": "^1.10.0" + }, + "bin": { + "testrpc-sc": "index.js" + } + }, + "node_modules/ghost-testrpc/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ghost-testrpc/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ghost-testrpc/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/ghost-testrpc/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "peer": true + }, + "node_modules/ghost-testrpc/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ghost-testrpc/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ghost-testrpc/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/glob": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "peer": true, + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "peer": true, + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "peer": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/globby/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/globby/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globby/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "peer": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hardhat": { + "version": "2.22.6", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.22.6.tgz", + "integrity": "sha512-abFEnd9QACwEtSvZZGSmzvw7N3zhQN1cDKz5SLHAupfG24qTHofCjqvD5kT5Wwsq5XOL0ON1Mq5rr4v0XX5ciw==", + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@metamask/eth-sig-util": "^4.0.0", + "@nomicfoundation/edr": "^0.4.1", + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-tx": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", + "@nomicfoundation/solidity-analyzer": "^0.1.0", + "@sentry/node": "^5.18.1", + "@types/bn.js": "^5.1.0", + "@types/lru-cache": "^5.1.0", + "adm-zip": "^0.4.16", + "aggregate-error": "^3.0.0", + "ansi-escapes": "^4.3.0", + "boxen": "^5.1.2", + "chalk": "^2.4.2", + "chokidar": "^3.4.0", + "ci-info": "^2.0.0", + "debug": "^4.1.1", + "enquirer": "^2.3.0", + "env-paths": "^2.2.0", + "ethereum-cryptography": "^1.0.3", + "ethereumjs-abi": "^0.6.8", + "find-up": "^2.1.0", + "fp-ts": "1.19.3", + "fs-extra": "^7.0.1", + "glob": "7.2.0", + "immutable": "^4.0.0-rc.12", + "io-ts": "1.10.4", + "keccak": "^3.0.2", + "lodash": "^4.17.11", + "mnemonist": "^0.38.0", + "mocha": "^10.0.0", + "p-map": "^4.0.0", + "raw-body": "^2.4.1", + "resolve": "1.17.0", + "semver": "^6.3.0", + "solc": "0.8.26", + "source-map-support": "^0.5.13", + "stacktrace-parser": "^0.1.10", + "tsort": "0.0.1", + "undici": "^5.14.0", + "uuid": "^8.3.2", + "ws": "^7.4.6" + }, + "bin": { + "hardhat": "internal/cli/bootstrap.js" + }, + "peerDependencies": { + "ts-node": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/hardhat-gas-reporter": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.10.tgz", + "integrity": "sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA==", + "dev": true, + "peer": true, + "dependencies": { + "array-uniq": "1.0.3", + "eth-gas-reporter": "^0.2.25", + "sha1": "^1.1.1" + }, + "peerDependencies": { + "hardhat": "^2.0.2" + } + }, + "node_modules/hardhat/node_modules/@noble/hashes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/hardhat/node_modules/@scure/bip32": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", + "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/hardhat/node_modules/@scure/bip39": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.2.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/hardhat/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hardhat/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/hardhat/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hardhat/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/hardhat/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/hardhat/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/hardhat/node_modules/ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "dependencies": { + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" + } + }, + "node_modules/hardhat/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/hardhat/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/hardhat/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/hardhat/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/hardhat/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/hardhat/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/hardhat/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hardhat/node_modules/undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/hardhat/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/hardhat/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", + "dev": true, + "peer": true + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "dev": true, + "peer": true, + "dependencies": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/node": "^10.0.3" + } + }, + "node_modules/http-response-object/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", + "dev": true, + "peer": true + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.0.2.tgz", + "integrity": "sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA==", + "dev": true, + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/immutable": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", + "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==" + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "peer": true + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/io-ts": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", + "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", + "dependencies": { + "fp-ts": "^1.0.0" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hex-prefixed": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", + "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", + "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "peer": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/jsonschema": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", + "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", + "dev": true, + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/JSONStream": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz", + "integrity": "sha512-mn0KSip7N4e0UDPZHnqDsHECo5uGQrixQKnAskOM1BIB8hd7QKbd6il8IPRPudPHOeHiECoCFqhyMaRO9+nWyA==", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/just-extend": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", + "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==" + }, + "node_modules/keccak": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", + "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "peer": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true, + "peer": true + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true, + "peer": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" + }, + "node_modules/lru-cache": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz", + "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "devOptional": true, + "peer": true + }, + "node_modules/markdown-table": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", + "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", + "dev": true, + "peer": true + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micro-ftch": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", + "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==", + "dev": true, + "peer": true + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/mnemonist": { + "version": "0.38.5", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", + "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", + "dependencies": { + "obliterator": "^2.0.0" + } + }, + "node_modules/mocha": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.6.0.tgz", + "integrity": "sha512-hxjt4+EEB0SA0ZDygSS015t65lJw/I2yRCS3Ae+SJ5FrbzrXgfYwJr96f0OvIXdj7h4lv/vLCrH3rkiuizFSvw==", + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/mocha/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/module-not-found-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz", + "integrity": "sha512-pEk4ECWQXV6z2zjhRZUongnLJNUeGQJ3w6OQ5ctGwD+i5o93qjRQUk2Rt6VdNeu3sEP0AB4LcfvdebpxBRVr4g==", + "dev": true + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nan": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", + "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", + "optional": true + }, + "node_modules/ndjson": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ndjson/-/ndjson-2.0.0.tgz", + "integrity": "sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==", + "dev": true, + "peer": true, + "dependencies": { + "json-stringify-safe": "^5.0.1", + "minimist": "^1.2.5", + "readable-stream": "^3.6.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "ndjson": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "peer": true + }, + "node_modules/nise": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-6.0.0.tgz", + "integrity": "sha512-K8ePqo9BFvN31HXwEtTNGzgrPpmvgciDsFz8aztFjt4LqKO/JeFD8tBOeuDiCMXrIl/m1YvfH8auSpxfaD09wg==", + "dependencies": { + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^11.2.2", + "@sinonjs/text-encoding": "^0.7.2", + "just-extend": "^6.2.0", + "path-to-regexp": "^6.2.1" + } + }, + "node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, + "peer": true, + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", + "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "engines": { + "node": ">=12.19" + } + }, + "node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "dev": true, + "peer": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/number-to-bn": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", + "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", + "dev": true, + "peer": true, + "dependencies": { + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/number-to-bn/node_modules/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", + "dev": true, + "peer": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obliterator": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", + "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "peer": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ordinal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz", + "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==", + "dev": true, + "peer": true + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "engines": { + "node": ">=4" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, + "node_modules/parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", + "dev": true, + "peer": true + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-to-regexp": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", + "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "engines": { + "node": "*" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "peer": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "dev": true, + "peer": true, + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "peer": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/proper-lockfile/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/proxyquire": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.3.tgz", + "integrity": "sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg==", + "dev": true, + "dependencies": { + "fill-keys": "^1.0.2", + "module-not-found-error": "^1.0.1", + "resolve": "^1.11.1" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.2.tgz", + "integrity": "sha512-x+NLUpx9SYrcwXtX7ob1gnkSems4i/mGZX5SlYxwIau6RrUSODO89TR/XDGGpn5RPWSYIB+aSfuSlV5+CmbTBg==", + "dev": true, + "peer": true, + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "peer": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "dev": true, + "peer": true, + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/recursive-readdir/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/recursive-readdir/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/reduce-flatten": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/req-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", + "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==", + "dev": true, + "peer": true, + "dependencies": { + "req-from": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/req-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", + "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==", + "dev": true, + "peer": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rlp": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", + "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", + "dependencies": { + "bn.js": "^5.2.0" + }, + "bin": { + "rlp": "bin/rlp" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sc-istanbul": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", + "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", + "dev": true, + "peer": true, + "dependencies": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "istanbul": "lib/cli.js" + } + }, + "node_modules/sc-istanbul/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "peer": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/sc-istanbul/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/sc-istanbul/node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "peer": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/sc-istanbul/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sc-istanbul/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "peer": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/sc-istanbul/node_modules/js-yaml/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "peer": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sc-istanbul/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/sc-istanbul/node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", + "dev": true, + "peer": true + }, + "node_modules/sc-istanbul/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/sc-istanbul/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "peer": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + }, + "node_modules/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "hasInstallScript": true, + "dependencies": { + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/sha1": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", + "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", + "dev": true, + "peer": true, + "dependencies": { + "charenc": ">= 0.0.1", + "crypt": ">= 0.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "peer": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/shelljs/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/shelljs/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/shelljs/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sinon": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-18.0.0.tgz", + "integrity": "sha512-+dXDXzD1sBO6HlmZDd7mXZCR/y5ECiEiGCBSGuFD/kZ0bDTofPYc6JaeGmPSF+1j1MejGUWkORbYOLDyvqCWpA==", + "dependencies": { + "@sinonjs/commons": "^3.0.1", + "@sinonjs/fake-timers": "^11.2.2", + "@sinonjs/samsam": "^8.0.0", + "diff": "^5.2.0", + "nise": "^6.0.0", + "supports-color": "^7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/sinon-chai": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", + "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", + "peerDependencies": { + "chai": "^4.0.0", + "sinon": ">=4.0.0" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "peer": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/solc": { + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.26.tgz", + "integrity": "sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==", + "dependencies": { + "command-exists": "^1.2.8", + "commander": "^8.1.0", + "follow-redirects": "^1.12.1", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "semver": "^5.5.0", + "tmp": "0.0.33" + }, + "bin": { + "solcjs": "solc.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/solc/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/solidity-ast": { + "version": "0.4.56", + "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.56.tgz", + "integrity": "sha512-HgmsA/Gfklm/M8GFbCX/J1qkVH0spXHgALCNZ8fA8x5X+MFdn/8CP2gr5OVyXjXw6RZTPC/Sxl2RUDQOXyNMeA==", + "dev": true, + "dependencies": { + "array.prototype.findlast": "^1.2.2" + } + }, + "node_modules/solidity-coverage": { + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.12.tgz", + "integrity": "sha512-8cOB1PtjnjFRqOgwFiD8DaUsYJtVJ6+YdXQtSZDrLGf8cdhhh8xzTtGzVTGeBf15kTv0v7lYPJlV/az7zLEPJw==", + "dev": true, + "peer": true, + "dependencies": { + "@ethersproject/abi": "^5.0.9", + "@solidity-parser/parser": "^0.18.0", + "chalk": "^2.4.2", + "death": "^1.1.0", + "difflib": "^0.2.4", + "fs-extra": "^8.1.0", + "ghost-testrpc": "^0.0.2", + "global-modules": "^2.0.0", + "globby": "^10.0.1", + "jsonschema": "^1.2.4", + "lodash": "^4.17.21", + "mocha": "^10.2.0", + "node-emoji": "^1.10.0", + "pify": "^4.0.1", + "recursive-readdir": "^2.2.2", + "sc-istanbul": "^0.4.5", + "semver": "^7.3.4", + "shelljs": "^0.8.3", + "web3-utils": "^1.3.6" + }, + "bin": { + "solidity-coverage": "plugins/bin.js" + }, + "peerDependencies": { + "hardhat": "^2.11.0" + } + }, + "node_modules/solidity-coverage/node_modules/@solidity-parser/parser": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.18.0.tgz", + "integrity": "sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==", + "dev": true, + "peer": true + }, + "node_modules/solidity-coverage/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/solidity-coverage/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/solidity-coverage/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/solidity-coverage/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "peer": true + }, + "node_modules/solidity-coverage/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/solidity-coverage/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/solidity-coverage/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/solidity-coverage/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/solidity-coverage/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/solidity-coverage/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-ca": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz", + "integrity": "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==" + }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "peer": true, + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "peer": true + }, + "node_modules/ssh2": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.15.0.tgz", + "integrity": "sha512-C0PHgX4h6lBxYx7hcXwu3QWdh4tg6tZZsTfXcdvc5caW/EMxaB4H9dWsl7qk+F7LAW762hp8VbXOX7x4xUYvEw==", + "hasInstallScript": true, + "dependencies": { + "asn1": "^0.2.6", + "bcrypt-pbkdf": "^1.0.2" + }, + "engines": { + "node": ">=10.16.0" + }, + "optionalDependencies": { + "cpu-features": "~0.0.9", + "nan": "^2.18.0" + } + }, + "node_modules/stacktrace-parser": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", + "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", + "dependencies": { + "type-fest": "^0.7.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/stacktrace-parser/node_modules/type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", + "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", + "dev": true, + "peer": true + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-hex-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", + "dependencies": { + "is-hex-prefixed": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "dev": true, + "peer": true, + "dependencies": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "dev": true, + "peer": true, + "dependencies": { + "get-port": "^3.1.0" + } + }, + "node_modules/table": { + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", + "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table-layout": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", + "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", + "dev": true, + "peer": true, + "dependencies": { + "array-back": "^4.0.1", + "deep-extend": "~0.6.0", + "typical": "^5.2.0", + "wordwrapjs": "^4.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/table-layout/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/table-layout/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar-fs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.1.tgz", + "integrity": "sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.0.0" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/then-request/node_modules/@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", + "dev": true, + "peer": true + }, + "node_modules/then-request/node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "peer": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "peer": true, + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/ts-command-line-args": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", + "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", + "dev": true, + "peer": true, + "dependencies": { + "chalk": "^4.1.0", + "command-line-args": "^5.1.1", + "command-line-usage": "^6.1.0", + "string-format": "^2.0.0" + }, + "bin": { + "write-markdown": "dist/write-markdown.js" + } + }, + "node_modules/ts-essentials": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", + "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "typescript": ">=3.7.0" + } + }, + "node_modules/ts-morph": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-22.0.0.tgz", + "integrity": "sha512-M9MqFGZREyeb5fTl6gNHKZLqBQA0TjA1lea+CR48R8EBTDuWrNqW6ccC5QvjNR4s6wDumD3LTCjOFSp9iwlzaw==", + "dev": true, + "dependencies": { + "@ts-morph/common": "~0.23.0", + "code-block-writer": "^13.0.1" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "devOptional": true, + "peer": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "devOptional": true, + "peer": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, + "node_modules/tsort": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", + "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==" + }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, + "node_modules/tweetnacl-util": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", + "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==" + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "peer": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typechain": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz", + "integrity": "sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==", + "dev": true, + "peer": true, + "dependencies": { + "@types/prettier": "^2.1.1", + "debug": "^4.3.1", + "fs-extra": "^7.0.0", + "glob": "7.1.7", + "js-sha3": "^0.8.0", + "lodash": "^4.17.15", + "mkdirp": "^1.0.4", + "prettier": "^2.3.1", + "ts-command-line-args": "^2.2.0", + "ts-essentials": "^7.0.1" + }, + "bin": { + "typechain": "dist/cli/cli.js" + }, + "peerDependencies": { + "typescript": ">=4.3.0" + } + }, + "node_modules/typechain/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/typechain/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/typechain/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typechain/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/typechain/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/typechain/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "peer": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/typechain/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/typescript": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", + "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", + "devOptional": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/uglify-js": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.18.0.tgz", + "integrity": "sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici": { + "version": "6.19.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.2.tgz", + "integrity": "sha512-JfjKqIauur3Q6biAtHJ564e3bWa8VvT+7cSiOJHFbX4Erv6CLGDpg8z+Fmg/1OI/47RA+GI2QZaF48SSaLvyBA==", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", + "dev": true, + "peer": true + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "devOptional": true, + "peer": true + }, + "node_modules/web3-utils": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.4.tgz", + "integrity": "sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==", + "dev": true, + "peer": true, + "dependencies": { + "@ethereumjs/util": "^8.1.0", + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereum-cryptography": "^2.1.2", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-utils/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "dev": true, + "peer": true, + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/web3-utils/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/web3-utils/node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "dev": true, + "peer": true, + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "peer": true + }, + "node_modules/wordwrapjs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", + "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", + "dev": true, + "peer": true, + "dependencies": { + "reduce-flatten": "^2.0.0", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/wordwrapjs/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "devOptional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zksync-ethers": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/zksync-ethers/-/zksync-ethers-6.9.0.tgz", + "integrity": "sha512-2CppwvLHtz689L7E9EhevbFtsqVukKC/lVicwdeUS2yqV46ET4iBR11rYdEfGW2oEo1h6yJuuwIBDFm2SybkIA==", + "dev": true, + "engines": { + "node": ">=18.9.0" + }, + "peerDependencies": { + "ethers": "^6.7.1" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..d2c38ad --- /dev/null +++ b/package.json @@ -0,0 +1,34 @@ +{ + "name": "multi-hats-hatter", + "license": "MIT", + "scripts": { + "clean": "forge clean && npx hardhat clean", + "compile": "forge build && npx hardhat compile", + "local-node": "npx hardhat node-zksync", + "script": "node script/RunScript.js", + "foundry-test": "forge test --no-match-path .integration.t.sol", + "test": "forge test && npx hardhat test", + "lint": "scopelint check", + "lint:fix": "scopelint fmt" + }, + "devDependencies": { + "@matterlabs/hardhat-zksync-deploy": "^1.2.1", + "@matterlabs/hardhat-zksync-node": "^1.0.3", + "@matterlabs/hardhat-zksync-solc": "^1.1.4", + "@matterlabs/hardhat-zksync-upgradable": "^1.4.1", + "@nomicfoundation/hardhat-foundry": "^1.1.2", + "@nomicfoundation/hardhat-toolbox": "^5.0.0", + "@openzeppelin/contracts": "^4.9.6", + "@openzeppelin/contracts-upgradeable": "^4.9.6", + "@openzeppelin/upgrades-core": "^1.32.3", + "dotenv": "^16.4.5", + "hardhat": "^2.22.2" + }, + "volta": { + "node": "20.12.0", + "npm": "10.5.0" + }, + "dependencies": { + "@matterlabs/hardhat-zksync-verify": "^1.5.0" + } +} diff --git a/script/DeployMultiClaimsHatter.ts b/script/DeployMultiClaimsHatter.ts new file mode 100644 index 0000000..d7270f6 --- /dev/null +++ b/script/DeployMultiClaimsHatter.ts @@ -0,0 +1,39 @@ +import { config as dotEnvConfig } from "dotenv"; +import { Deployer } from "@matterlabs/hardhat-zksync-deploy"; +import { Wallet, Contract } from "zksync-ethers"; +import * as hre from "hardhat"; + +const MultiClaimsHatterFactory = require("../artifacts-zk/src/MultiClaimsHatterFactory.sol/MultiClaimsHatterFactory.json"); + +// Before executing a real deployment, be sure to set these values as appropriate for the environment being deployed +// to. The values used in the script at the time of deployment can be checked in along with the deployment artifacts +// produced by running the scripts. +const contractName = "MultiClaimsHatter"; +const HATS_ID = 1; +const HATS = "0x32Ccb7600c10B4F7e678C7cbde199d98453D0e7e"; +const SALT_NONCE = 1; +const FACTORY_ADDRESS = "0xE893c6CA3F0AC1689231385243439806E443fF17" + +async function main() { + dotEnvConfig(); + + const deployerPrivateKey = process.env.PRIVATE_KEY; + if (!deployerPrivateKey) { + throw "Please set PRIVATE_KEY in your .env file"; + } + + console.log("Deploying " + contractName + "..."); + + const zkWallet = new Wallet(deployerPrivateKey); + const deployer = new Deployer(hre, zkWallet); + const multiHatsHatterFactory = await new Contract(FACTORY_ADDRESS, MultiClaimsHatterFactory.abi, deployer.zkWallet); + + const tx = await multiHatsHatterFactory.deployMultiClaimsHatter(HATS_ID, HATS, "0x", SALT_NONCE); + const tr = await tx.wait(); + console.log(tr) +} + +main().catch((error) => { + console.error(error); + process.exitCode = 1; + }); diff --git a/script/DeployMultiClaimsHatterFactory.ts b/script/DeployMultiClaimsHatterFactory.ts new file mode 100644 index 0000000..c5e8246 --- /dev/null +++ b/script/DeployMultiClaimsHatterFactory.ts @@ -0,0 +1,33 @@ +import { config as dotEnvConfig } from "dotenv"; +import { Deployer } from "@matterlabs/hardhat-zksync-deploy"; +import { Wallet } from "zksync-ethers"; +import * as hre from "hardhat"; + +// Before executing a real deployment, be sure to set these values as appropriate for the environment being deployed +// to. The values used in the script at the time of deployment can be checked in along with the deployment artifacts +// produced by running the scripts. +const contractName = "MultiClaimsHatterFactory"; +async function main() { + dotEnvConfig(); + + const deployerPrivateKey = process.env.PRIVATE_KEY; + if (!deployerPrivateKey) { + throw "Please set PRIVATE_KEY in your .env file"; + } + + console.log("Deploying " + contractName + "..."); + + const zkWallet = new Wallet(deployerPrivateKey); + const deployer = new Deployer(hre, zkWallet); + + const contract = await deployer.loadArtifact(contractName); + const constructorArgs = []; + const multiClaimsHatterFactory = await deployer.deploy(contract, constructorArgs, "create2", {"customData": {"salt": "0x0000000000000000000000000000000000000000000000000000000000004a75"}}); + console.log("constructor args:" + multiClaimsHatterFactory.interface.encodeDeploy(constructorArgs)); + console.log(`${contractName} was deployed to ${await multiClaimsHatterFactory.getAddress()}`); +} + +main().catch((error) => { + console.error(error); + process.exitCode = 1; + }); diff --git a/script/RunScript.js b/script/RunScript.js new file mode 100644 index 0000000..218270d --- /dev/null +++ b/script/RunScript.js @@ -0,0 +1,10 @@ +// script/RunScript.js +const { execSync } = require('child_process'); + +const scriptName = process.argv[2]; +if (!scriptName) { + console.error('Please provide a script name'); + process.exit(1); +} + +execSync(`npx hardhat clean && npx hardhat compile && npx hardhat run script/${scriptName}`, { stdio: 'inherit' }); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..e69de29 From effc704dc522b00d70900631d676702feb0dc372 Mon Sep 17 00:00:00 2001 From: keating Date: Fri, 5 Jul 2024 08:53:05 -0400 Subject: [PATCH 11/18] Add .gitignore --- .gitignore | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 83f2723..e03f411 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,24 @@ out/ optimized-out/ .vscode/ broadcast/ -.env \ No newline at end of file +.env + +# Hardhat files +/cache +/artifacts + +# TypeChain files +/typechain +/typechain-types + +# solidity-coverage files +/coverage +/coverage.json + +# zksync build artifacts +/artifacts-zk +/cache-zk + +# zksync local node logs +era_test_node.log +/node_modules From 3efa4a0d3a67e569244441d4c7a85459ccc66a95 Mon Sep 17 00:00:00 2001 From: keating Date: Fri, 5 Jul 2024 09:23:24 -0400 Subject: [PATCH 12/18] Figure out init data --- script/DeployMultiClaimsHatter.ts | 6 ++++-- tsconfig.json | 11 +++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/script/DeployMultiClaimsHatter.ts b/script/DeployMultiClaimsHatter.ts index d7270f6..4893daa 100644 --- a/script/DeployMultiClaimsHatter.ts +++ b/script/DeployMultiClaimsHatter.ts @@ -12,7 +12,9 @@ const contractName = "MultiClaimsHatter"; const HATS_ID = 1; const HATS = "0x32Ccb7600c10B4F7e678C7cbde199d98453D0e7e"; const SALT_NONCE = 1; -const FACTORY_ADDRESS = "0xE893c6CA3F0AC1689231385243439806E443fF17" +const FACTORY_ADDRESS = "0x1e8C2a171e5c5D92d15F5363fd136CAf3bBf86E2" +// What does this need to be? +// const INIT_DATA = "0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000030000000100010001000000000000000000000000000000000000000000000000000000010001000100010000000000000000000000000000000000000000000000000001000100010001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001" async function main() { dotEnvConfig(); @@ -28,7 +30,7 @@ async function main() { const deployer = new Deployer(hre, zkWallet); const multiHatsHatterFactory = await new Contract(FACTORY_ADDRESS, MultiClaimsHatterFactory.abi, deployer.zkWallet); - const tx = await multiHatsHatterFactory.deployMultiClaimsHatter(HATS_ID, HATS, "0x", SALT_NONCE); + const tx = await multiHatsHatterFactory.deployMultiClaimsHatter(HATS_ID, HATS, "0x0000000000000000000000000000", SALT_NONCE); const tr = await tx.wait(); console.log(tr) } diff --git a/tsconfig.json b/tsconfig.json index e69de29..574e785 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "target": "es2020", + "module": "commonjs", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "resolveJsonModule": true + } +} From d8898dae130469316bdd4897650c24896e05ccc3 Mon Sep 17 00:00:00 2001 From: keating Date: Mon, 15 Jul 2024 08:57:42 -0400 Subject: [PATCH 13/18] Testnet deployment --- deployments-zk/zkSyncLocal/.chainId | 1 + .../MultiClaimsHatterFactory.json | 143 ++++++++++++++++++ script/DeployMultiClaimsHatter.ts | 2 +- 3 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 deployments-zk/zkSyncLocal/.chainId create mode 100644 deployments-zk/zkSyncLocal/src/MultiClaimsHatterFactory.sol/MultiClaimsHatterFactory.json diff --git a/deployments-zk/zkSyncLocal/.chainId b/deployments-zk/zkSyncLocal/.chainId new file mode 100644 index 0000000..6679266 --- /dev/null +++ b/deployments-zk/zkSyncLocal/.chainId @@ -0,0 +1 @@ +0x12c \ No newline at end of file diff --git a/deployments-zk/zkSyncLocal/src/MultiClaimsHatterFactory.sol/MultiClaimsHatterFactory.json b/deployments-zk/zkSyncLocal/src/MultiClaimsHatterFactory.sol/MultiClaimsHatterFactory.json new file mode 100644 index 0000000..2f9dc5a --- /dev/null +++ b/deployments-zk/zkSyncLocal/src/MultiClaimsHatterFactory.sol/MultiClaimsHatterFactory.json @@ -0,0 +1,143 @@ +{ + "sourceName": "src/MultiClaimsHatterFactory.sol", + "contractName": "MultiClaimsHatterFactory", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "implementation", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "instance", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "hatId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "otherImmutableArgs", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "initData", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "saltNonce", + "type": "uint256" + } + ], + "name": "ModuleDeployed", + "type": "event" + }, + { + "inputs": [], + "name": "VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_hatId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_hat", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_initData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_saltNonce", + "type": "uint256" + } + ], + "name": "deployMultiClaimsHatter", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_hatId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_hat", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_initData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_saltNonce", + "type": "uint256" + } + ], + "name": "getAddress", + "outputs": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x0003000000000002000e00000000000200000000030100190000006003300270000000f503300197000200000031035500010000000103550000008004000039000000400040043f0000000102200190000001220000c13d000000040230008c0000014a0000413d000000000201043b000000e002200270000000f70420009c0000012a0000613d000000f80420009c0000013e0000613d000000f90220009c0000014a0000c13d0000000002000416000000000202004b0000014a0000c13d000000040230008a000000800220008c0000014a0000413d0000000402100370000000000802043b0000002402100370000000000902043b000000fa0290009c0000014a0000213d0000004402100370000000000202043b000000fb0420009c0000014a0000213d0000002304200039000000fc05000041000000000634004b00000000060000190000000006058019000000fc04400197000000000704004b0000000005008019000000fc0440009c000000000506c019000000000405004b0000014a0000c13d0000000404200039000000000541034f000000000a05043b000000fb05a0009c0000014a0000213d0000000002a200190000002402200039000000000232004b0000014a0000213d0000006402100370000000000b02043b000000c002000039000000400020043f0000000c07000039000000800070043f000000fd02000041000000a00020043f000000e00020043f000000ec0080043f00000060029002100000010c0020043f0000002002400039000000000121034f0000001f02a0018f0000000503a00272000000540000613d00000000040000190000000505400210000000000651034f000000000606043b000001200550003900000000006504350000000104400039000000000534004b0000004c0000413d000000000402004b000000630000613d0000000503300210000000000131034f00000003022002100000012003300039000000000403043300000000042401cf000000000424022f000000000101043b0000010002200089000000000121022f00000000012101cf000000000141019f00000000001304350000012001a0003900000000000104350000013f01a00039000000200200008a000000000321016f0000004005a00039000000c00050043f000000fe013000410000010c0110009c000001980000a13d000c0000000b001d000d0000000a001d000e00000002001d000800000007001d000600000009001d000700000008001d000000400030043f000b00000003001d000000200430003900000000010000190000000002410019000000e003100039000000000303043300000000003204350000002001100039000000000251004b000000770000413d000900000004001d0000000001540019000000000001043500000100010000410000000000100439000000f5010000410000000002000414000000f50320009c0000000002018019000000c00120021000000101011001c70000800b02000039000a00000005001d03cd03c80000040f0000000102200190000003640000613d0000000b050000290000000a02500029000000000101043b00000040032000390000000c040000290000000000430435000000200220003900000000001204350000000d0200002900000080012000390000000000150435000000bf012000390000000e0210017f0000000001520019000000000221004b00000000020000190000000102004039000000fb0310009c000001980000213d0000000102200190000001980000c13d000000400010043f000000f5010000410000000903000029000000f50230009c000000000301801900000040023002100000000003050433000000f50430009c00000000030180190000006003300210000000000223019f0000000003000414000000f50430009c0000000003018019000000c001300210000000000121019f00000102011001c7000080100200003903cd03c80000040f00000001022001900000014a0000613d000000000101043b000d00000001001d000000400300043d000001030130009c0000000804000029000001980000213d0000004001300039000000400010043f0000002001300039000000fd0200004100000000002104350000000000430435000000400100043d000000200210003900000060040000390000000000420435000000000403043300000080051000390000000000450435000000a005100039000000000604004b000000d60000613d000000000600001900000000075600190000002006600039000000000836001900000000080804330000000000870435000000000746004b000000cf0000413d000000000354001900000000000304350000006003100039000000070500002900000000005304350000000603000029000000fa03300197000000400510003900000000003504350000009f034000390000000e0330017f0000000000310435000000bf034000390000000e0430017f0000000003140019000000000443004b00000000040000190000000104004039000000fb0530009c000001980000213d0000000104400190000001980000c13d000000400030043f000000f503000041000000f50420009c000000000203801900000040022002100000000001010433000000f50410009c00000000010380190000006001100210000000000121019f0000000002000414000000f50420009c0000000002038019000000c002200210000000000112019f00000102011001c7000080100200003903cd03c80000040f00000001022001900000014a0000613d000000000101043b000000400200043d000000a003200039000000000013043500000080012000390000010d03000041000000000031043500000060012000390000000d03000029000000000031043500000040012000390000000003000410000000000031043500000020012000390000010e030000410000000000310435000000a00300003900000000003204350000010f0320009c000001980000213d000000c003200039000e00000003001d000000400030043f000000000202043303cd03ad0000040f000000fa011001970000000e030000290000000000130435000000f501000041000000f50230009c000000000301801900000040013002100000010b011001c7000003ce0001042e0000000001000416000000000101004b0000014a0000c13d000000200100003900000100001004430000012000000443000000f601000041000003ce0001042e0000000001000416000000000101004b0000014a0000c13d03cd03880000040f0000002002000039000000400300043d000e00000003001d000000000223043603cd03990000040f0000000e040000290000000001410049000000f502000041000000f50310009c0000000001028019000000f50340009c000000000402801900000040024002100000006001100210000000000121019f000003ce0001042e0000000002000416000000000202004b0000014a0000c13d000000040230008a000000800220008c0000014a0000413d0000000402100370000000000902043b0000002402100370000000000d02043b000000fa02d0009c0000014c0000a13d0000000001000019000003cf000104300000004402100370000000000202043b000000fb0420009c0000014a0000213d0000002304200039000000fc05000041000000000634004b00000000060000190000000006058019000000fc04400197000000000704004b0000000005008019000000fc0440009c000000000506c019000000000405004b0000014a0000c13d0000000404200039000000000541034f000000000605043b000000fb0560009c0000014a0000213d000000240b2000390000000002b60019000000000232004b0000014a0000213d0000006402100370000000000502043b000000c00a0000390000004000a0043f0000000c0e0000390000008000e0043f000000fd02000041000000a00020043f000000e00020043f000000ec0090043f0000002002400039000000000121034f0000001f0760018f000000600cd002100000010c00c0043f00000005086002720000017f0000613d00000000020000190000000503200210000000000431034f000000000404043b000001200330003900000000004304350000000102200039000000000382004b000001770000413d000000000207004b0000018e0000613d0000000502800210000000000121034f00000003037002100000012002200039000000000402043300000000043401cf000000000434022f000000000101043b0000010003300089000000000131022f00000000013101cf000000000141019f0000000000120435000001200160003900000000000104350000013f01600039000000200200008a000000000321016f000000400f600039000000c000f0043f000000fe01300041000000ff0110009c0000019e0000813d000001100100004100000000001004350000004101000039000000040010043f0000011101000041000003cf0001043000080000000e001d00060000000d001d00020000000c001d00050000000b001d00010000000a001d000e00000002001d000700000009001d000400000008001d000300000007001d000c00000005001d000d00000006001d000000400030043f000b00000003001d000000200430003900000000010000190000000002410019000000e0031000390000000003030433000000000032043500000020011000390000000002f1004b000001ad0000413d000900000004001d0000000001f40019000000000001043500000100010000410000000000100439000000f5010000410000000002000414000000f50320009c0000000002018019000000c00120021000000101011001c70000800b02000039000a0000000f001d03cd03c80000040f0000000102200190000003640000613d0000000b050000290000000a02500029000000000101043b00000040032000390000000c040000290000000000430435000000200220003900000000001204350000000d0200002900000080012000390000000000150435000000bf012000390000000e0210017f0000000001520019000000000221004b00000000020000190000000102004039000000fb0310009c000001980000213d0000000102200190000001980000c13d000000400010043f000000f5010000410000000903000029000000f50230009c000000000301801900000040023002100000000003050433000000f50430009c00000000030180190000006003300210000000000223019f0000000003000414000000f50430009c0000000003018019000000c001300210000000000121019f00000102011001c7000080100200003903cd03c80000040f00000001022001900000014a0000613d000000000101043b000000400300043d000001030230009c0000000805000029000001980000213d0000004002300039000000400020043f0000002002300039000000fd0400004100000000004204350000000000530435000000400200043d000001040420009c000001980000213d0000008405200039000000600400003900000000004504350000002405200039000001050600004100000000006504350000000005030433000000e40620003900000000005604350000010406200039000000000705004b000002100000613d000000000700001900000000086700190000002007700039000000000937001900000000090904330000000000980435000000000857004b000002090000413d00000000036500190000000000030435000000c403200039000000070600002900000000006304350000000603000029000000fa03300197000000a40620003900000000003604350000001f035000390000000e0330017f0000008005300039000000640620003900000000070004140000000000560435000000440520003900000000004504350000010604000041000000000042043500000004042000390000000000140435000000f501000041000000f50420009c000000000201801900000040022002100000010403300039000000f50430009c00000000030180190000006003300210000000000223019f000000f50370009c0000000007018019000000c001700210000000000121019f00000102011001c7000080060200003903cd03c30000040f00000001022001900000023d0000613d000000000101043b000000000201004b000002670000c13d00000002010003670000000002000031000002420000013d000200000001035500000000020100190000006002200270000000f50020019d000000f502200197000000400300043d0000001f0420018f00000005052002720000024f0000613d000000000600001900000005076002100000000008730019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000002470000413d000000000604004b0000025e0000613d0000000505500210000000000151034f00000000055300190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000000f501000041000000f50430009c0000000003018019000000f50420009c000000000201801900000060012002100000004002300210000000000112019f000003cf0001043000000107020000410000000000200439000000fa01100197000b00000001001d0000000400100443000000f5010000410000000002000414000000f50320009c0000000002018019000000c00120021000000108011001c7000080020200003903cd03c80000040f0000000102200190000003640000613d000000000101043b000000000101004b0000000d0200002900000005030000290000014a0000613d000000400400043d0000002401400039000000000021043500000109010000410000000001140436000900000001001d000000040140003900000020020000390000000000210435000a00000004001d000000440140003900000001023003670000000406000029000000000306004b000002930000613d000000000300001900000005043002100000000005410019000000000442034f000000000404043b00000000004504350000000103300039000000000463004b0000028b0000413d000000030300006b000002a40000613d00000004030000290000000503300210000000000232034f000000000331001900000003040000290000000304400210000000000503043300000000054501cf000000000545022f000000000202043b0000010004400089000000000242022f00000000024201cf000000000252019f00000000002304350000000d01100029000000000001043500000000010004140000000b02000029000000040220008c000002c50000613d0000000d020000290000001f022000390000000e0220017f000000f5030000410000000a05000029000000f50450009c0000000004030019000000000405401900000040044002100000004402200039000000f50520009c00000000020380190000006002200210000000000224019f000000f50410009c0000000001038019000000c001100210000000000121019f0000000b0200002903cd03c30000040f00000000030100190000006003300270000000f50030019d000000f50330019700020000000103550000000102200190000003650000613d0000000a01000029000000fb0110009c000000040600002900000005010000290000000202000029000001980000213d0000000a03000029000000400030043f0000000904000029000000000024043500000034023000390000000101100367000000000306004b000002dc0000613d000000000300001900000005043002100000000005420019000000000441034f000000000404043b00000000004504350000000103300039000000000463004b000002d40000413d000000030300006b000002ed0000613d00000004030000290000000503300210000000000431034f000000000332001900000003050000290000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f00000000004304350000000d030000290000000002320019000000000002043500000014023000390000000a04000029000000000024043500000053023000390000000e0220017f0000000002240019000000000342004b00000000030000190000000103004039000000fb0420009c00000007040000290000000105000029000001980000213d0000000103300190000001980000c13d000000400020043f000000600320003900000000005304350000004003200039000000000043043500000020032000390000000b04000029000000000043043500000000004204350000000a080000290000000003080433000000c0042000390000000000340435000000e004200039000000000503004b000003170000613d000000000500001900000000064500190000002005500039000000000785001900000000070704330000000000760435000000000635004b000003100000413d000000000543001900000000000504350000001f033000390000000e0330017f00000000034300190000000004230049000000800520003900000000004504350000000d0400002900000000034304360000000407000029000000000407004b0000032d0000613d000000000400001900000005054002100000000006530019000000000551034f000000000505043b00000000005604350000000104400039000000000574004b000003250000413d000000030400006b0000033e0000613d00000004040000290000000504400210000000000141034f000000000443001900000003050000290000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000000d0400002900000000014300190000000000010435000000a0012000390000000c0500002900000000005104350000001f014000390000000e0110017f00000000012100490000000001310019000000f504000041000000f50320009c00000000020480190000004002200210000000f50310009c00000000010480190000006001100210000000000121019f0000000002000414000000f50320009c0000000002048019000000c002200210000000000112019f00000102011001c70000800d0200003900000001030000390000010a0400004103cd03c30000040f00000001012001900000014a0000613d000000400100043d0000000b020000290000000000210435000000f50210009c000000f50100804100000040011002100000010b011001c7000003ce0001042e000000000001042f000000400200043d0000001f0430018f0000000505300272000003720000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000036a0000413d000000000604004b000003810000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000000f501000041000000f50420009c000000000201801900000040012002100000006002300210000000000121019f000003cf00010430000000400100043d000001120210009c000003930000813d0000004002100039000000400020043f0000002002100039000000fd0300004100000000003204350000000c020000390000000000210435000000000001042d000001100100004100000000001004350000004101000039000000040010043f0000011101000041000003cf0001043000000000030104330000000002320436000000000403004b000003a50000613d000000000400001900000000052400190000002004400039000000000614001900000000060604330000000000650435000000000534004b0000039e0000413d000000000123001900000000000104350000001f01300039000000200300008a000000000131016f0000000001120019000000000001042d000000000001042f000000f503000041000000f50410009c00000000010380190000004001100210000000f50420009c00000000020380190000006002200210000000000112019f0000000002000414000000f50420009c0000000002038019000000c002200210000000000112019f00000102011001c7000080100200003903cd03c80000040f0000000102200190000003c10000613d000000000101043b000000000001042d0000000001000019000003cf00010430000003c6002104210000000102000039000000000001042d0000000002000019000000000001042d000003cb002104230000000102000039000000000001042d0000000002000019000000000001042d000003cd00000432000003ce0001042e000003cf00010430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff000000020000000000000000000000000000004000000100000000000000000000000000000000000000000000000000000000000000000000000000ffa1ad7400000000000000000000000000000000000000000000000000000000bd42f5f5000000000000000000000000000000000000000000000000000000004f1c32ad000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffffff8000000000000000000000000000000000000000000000000000000000000000302e362e302d7a6b73796e630000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff00000000000000c09a8a0592ac89c5ad3bc6df8224c17b485976f597df104ee20d0df415241f670b02000002000000000000000000000000000000040000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffbf000000000000000000000000000000000000000000000000ffffffffffffff7b01000441b59369e9a03c764b36f8d8e7a385cda8a1480a571f75b5dba6c309703cda33511d41a8a5431b1770c5bc0ddd62e1cd30555d16659b89c0d60f4f9f571806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b830200000200000000000000000000000000000024000000000000000000000000a4f9edbf00000000000000000000000000000000000000000000000000000000cb6d9015e5a60155120ea0e2a88ede5648c21029e7a4214c3f44441d4f2ebd210000000000000000000000000000000000000020000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff00000000000000bf0100041dbb312c575f637f3b4ffbdf9beada863fa830a3f771b06df5a8a5c2872020dba91b30cc0006188af794c2fb30dd8520db7e2c088b7fc7c103c00ca494000000000000000000000000000000000000000000000000ffffffffffffff3f4e487b71000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffc00000000000000000000000000000000000000000000000000000000000000000bff785244969fbe67d6bebc759522231db77c169f06b8fe5e6dc852b492b147c", + "entries": [ + { + "constructorArgs": [], + "salt": "0x0000000000000000000000000000000000000000000000000000000000004a75", + "deploymentType": "create2", + "factoryDeps": [ + "0x0003000000000002000f00000000000200000000030100190000006003300270000003fe03300197000200000031035500010000000103550000000102200190000000d60000c13d0000008002000039000100000002001d000000400020043f000000040230008c000007fa0000413d000000000201043b000000e002200270000004060420009c000001a10000a13d000004070420009c000001c40000213d0000040e0420009c000002130000a13d0000040f0420009c000002ff0000613d000004100420009c000004980000613d000004110220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000402100370000000000202043b000004020420009c000007fa0000213d00000023042000390000042005000041000000000634004b000000000600001900000000060580190000042004400197000000000704004b0000000005008019000004200440009c000000000506c019000000000405004b000007fa0000c13d0000000405200039000000000451034f000000000604043b000004020460009c000007fa0000213d00000024042000390000000002460019000000000332004b000007fa0000213d000000000300041a000000ff07300190000006530000c13d0009010000000092000000090330017f00000001033001bf000000000030041b000000000306004b000001f00000613d000000400360008c000007fa0000413d0000002005500039000000000351034f000000000303043b000004020630009c000007fa0000213d00000000064300190000001f03600039000000000323004b000007fa0000813d000000000361034f000000000803043b000004020380009c000000de0000213d0000000507800210000000bf09700039000000200300008a000000000939016f000004020a90009c000000de0000213d000000400090043f000000800080043f00000020066000390000000007670019000000000927004b000007fa0000213d000000000808004b000000680000613d000000a008000039000000000961034f000000000909043b00000000089804360000002006600039000000000976004b000000620000413d0000002005500039000000000551034f000000000505043b000004020650009c000007fa0000213d00000000044500190000001f054000390000042006000041000000000725004b0000000007000019000000000706801900000420055001970000042008200197000000000985004b0000000006008019000000000585013f000004200550009c000000000607c019000000000506004b000007fa0000c13d000000000541034f000000000505043b000800000005001d000004020550009c000000de0000213d000000080500002900000005055002100000003f06500039000000000336016f000000400600043d0000000003360019000700000006001d000000000663004b00000000060000190000000106004039000004020730009c000000de0000213d0000000106600190000000de0000c13d000000400030043f000000070300002900000008060000290000000003630436000600000003001d00000020034000390000000004350019000000000224004b000007fa0000213d000000000243004b000000a60000813d0000000602000029000000000531034f000000000505043b000000020650008c000007fa0000213d00000000025204360000002003300039000000000543004b0000009b0000413d00000007010000290000000001010433000800000001001d000000800100043d000000080110006b000009610000c13d000000080100006b0000096a0000c13d000000400100043d000000400200003900000000022104360000004003100039000000800400043d00000000004304350000006003100039000000000504004b000000bb0000613d000000a0050000390000000006000019000000005705043400000000037304360000000106600039000000000746004b000000b60000413d00000000041300490000000000420435000000070200002900000000040204330000000002430436000000000304004b0000000607000029000000cb0000613d00000000030000190000000075070434000000020650008c0000054e0000213d00000000025204360000000103300039000000000543004b000000c40000413d0000000002120049000003fe03000041000003fe0410009c00000000010380190000004001100210000003fe0420009c00000000020380190000006002200210000000000112019f0000000002000414000002f60000013d000000c002000039000000400020043f0000000002000416000000000202004b000007fa0000c13d000003ff02300041000004000220009c000000e40000213d0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff600010430000000df023000390000040102200197000000400020043f0000001f0230018f0000000504300272000000f30000613d00000000050000190000000506500210000000000761034f000000000707043b000000c00660003900000000007604350000000105500039000000000645004b000000eb0000413d000000000502004b000001020000613d0000000504400210000000000141034f0000000302200210000000c004400039000000000504043300000000052501cf000000000525022f000000000101043b0000010002200089000000000121022f00000000012101cf000000000151019f0000000000140435000000600130008c000007fa0000413d000000c00400043d000004020140009c000007fa0000213d000000c003300039000000df01400039000000000131004b000007fa0000813d000000c0024000390000000001020433000004020510009c000000de0000213d0000003f05100039000000200900008a000000000595016f000000400800043d0000000005580019000000000685004b00000000060000190000000106004039000004020750009c000000de0000213d0000000106600190000000de0000c13d000900000009001d000000400050043f000a00000008001d0000000005180436000b00000005001d0000000004140019000000e004400039000000000334004b000007fa0000213d000000000301004b0000000b060000290000012f0000613d000000000300001900000000046300190000002003300039000000000523001900000000050504330000000000540435000000000413004b000001280000413d00000000011600190000000000010435000000e00100043d000800000001001d000004030110009c000007fa0000213d000001000100008a000000000200041a000000000112016f000001000400043d000000000010041b0000000a010000290000000006010433000004020160009c000000de0000213d0000000105000039000000000105041a000000010210019000000001011002700000007f0310018f000000000301c0190000001f0130008c00000000010000190000000101002039000000010110018f000000000112004b000004c20000c13d000000200130008c0000016f0000413d000400000003001d000700000006001d000500000005001d000600000004001d00000001010000390000000000100435000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000404011001c700008010020000390ff40fef0000040f0000000102200190000007fa0000613d00000007060000290000001f026000390000000502200270000000200360008c0000000002004019000000000301043b00000004010000290000001f01100039000000050110027000000000011300190000000002230019000000000312004b000000060400002900000005050000290000016f0000813d000000000002041b0000000102200039000000000312004b0000016b0000413d0000001f0160008c000007fe0000a13d000700000006001d000600000004001d000500000005001d0000000000500435000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000404011001c700008010020000390ff40fef0000040f0000000102200190000007fa0000613d000000090300002900000007033001800000002002000039000000000101043b0000000a060000290000018f0000613d0000002002000039000000000400001900000000056200190000000005050433000000000051041b000000200220003900000001011000390000002004400039000000000534004b000001870000413d0000000705000029000000000353004b0000019b0000813d0000000303500210000000f80330018f000000010400008a000000000334022f000000000343013f0000000a022000290000000002020433000000000232016f000000000021041b000000010150021000000005050000290000000002050019000000080300002900000006040000290000080a0000013d000004140420009c000001f20000a13d000004150420009c000002460000a13d000004160420009c000004a20000613d000004170420009c000004a70000613d000004180220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000400220008c000007fa0000413d0000000402100370000000000202043b000b00000002001d000004030220009c000007fa0000213d0000002401100370000000000101043b000a00000001001d0ff40af20000040f000000000101004b00000000010000190000052b0000613d0000000a010000290000000b020000290ff40ed80000040f000000000101004b0000000001000019000000010100c0390000052b0000013d000004080420009c000002540000a13d000004090420009c000004b30000613d0000040a0420009c000004c60000613d0000040b0220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000402100370000000000202043b000004020420009c000007fa0000213d00000023042000390000042005000041000000000634004b000000000600001900000000060580190000042004400197000000000704004b0000000005008019000004200440009c000000000506c019000000000405004b000007fa0000c13d0000000404200039000000000141034f000000000101043b000700000001001d000004020110009c000007fa0000213d000600240020003d000000070100002900000005011002100000000601100029000000000131004b000007fa0000213d000000070100006b000006570000c13d000000000100001900000ff50001042e0000041b0420009c000002620000213d0000041e0420009c000004da0000613d0000041f0220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000401100370000000000101043b00000000001004350000000201000039000000200010043f000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000421011001c700008010020000390ff40fef0000040f0000000102200190000007fa0000613d000000000101043b000000000101041a000000ff0110018f000000030210008c000004f00000413d0000054e0000013d000004120420009c000004e50000613d000004130220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000400220008c000007fa0000413d0000000402100370000000000202043b000b00000002001d0000002401100370000000000101043b000a00000001001d000000020110008c000007fa0000213d0000043601000041000000800010043f00000000010004110000040301100197000900000001001d000000840010043f0000000b01000029000000a40010043f00000423010000410000000000100439000000000100041200000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f0000000102200190000007ac0000613d000000000201043b00000000010004140000040302200197000000040320008c000006070000c13d0000000003000031000000200130008c00000000040300190000002004008039000006320000013d000004190420009c000004f30000613d0000041a0220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000401100370000000000101043b0ff40c230000040f000004cf0000013d0000040c0420009c000005130000613d0000040d0220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000401100370000000000101043b0ff40af20000040f000004cf0000013d0000041c0420009c0000052d0000613d0000041d0220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000400220008c000007fa0000413d0000000402100370000000000202043b000004020420009c000007fa0000213d00000023042000390000042005000041000000000634004b000000000600001900000000060580190000042004400197000000000704004b0000000005008019000004200440009c000000000506c019000000000405004b000007fa0000c13d000200040020003d0000000204100360000000000404043b000b00000004001d000004020440009c000007fa0000213d00000024042000390000000b020000290000000502200210000100000002001d000700000004001d0000000002420019000000000232004b000007fa0000213d0000002402100370000000000202043b000004020420009c000007fa0000213d00000023042000390000042005000041000000000634004b000000000600001900000000060580190000042004400197000000000704004b0000000005008019000004200440009c000000000506c019000000000405004b000007fa0000c13d0000000404200039000000000141034f000000000101043b000004020410009c000007fa0000213d000000240420003900000005021002100000000002420019000000000232004b000007fa0000213d000800000004001d0000000b0110006c000007fc0000c13d00000423010000410000000000100439000000000100041200000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f0000000102200190000007ac0000613d000000000101043b000604030010019b0000000b0100006b0000000805000029000008310000c13d000000400100043d0000004002000039000000000321043600000040021000390000000b0400002900000000004204350000043e0240009c000007fa0000213d000000010200036700000001050000290000001f0450018f0000000505500272000002d50000613d00000002060000290000002006600039000000000662034f000000600710003900000000080000190000000509800210000000000a970019000000000996034f000000000909043b00000000009a04350000000108800039000000000958004b000002cd0000413d000000000404004b000002d70000613d000000010500002900000060045000390000000000430435000000000351001900000060043000390000000b0500002900000000005404350000008003300039000000000405004b0000000807000029000002ec0000613d0000000004000019000000000572034f000000000505043b000000020650008c000007fa0000213d0000000003530436000000200770003900000001044000390000000b0540006c000002e30000413d0000000002130049000003fe03000041000003fe0410009c00000000010380190000004001100210000003fe0420009c00000000020380190000006002200210000000000112019f0000000002000414000003fe0420009c0000000002038019000000c002200210000000000121019f00000433011001c70000800d0200003900000001030000390000043404000041000007f70000013d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000400220008c000007fa0000413d0000000402100370000000000202043b000004020420009c000007fa0000213d00000023042000390000042005000041000000000634004b000000000600001900000000060580190000042004400197000000000704004b0000000005008019000004200440009c000000000506c019000000000405004b000007fa0000c13d0000000404200039000000000441034f000000000404043b000600000004001d000004020440009c000007fa0000213d000500240020003d000000060200002900000005022002100000000502200029000000000232004b000007fa0000213d0000002402100370000000000202043b000004020420009c000007fa0000213d00000023042000390000042005000041000000000634004b000000000600001900000000060580190000042004400197000000000704004b0000000005008019000004200440009c000000000506c019000000000405004b000007fa0000c13d0000000404200039000000000141034f000000000101043b000004020410009c000007fa0000213d000400240020003d00000005021002100000000402200029000000000232004b000007fa0000213d0000000602000029000000000112004b000007fc0000c13d000000000102004b000001f00000613d000300020000003d000280100000003d000a00000000001d0000000a010000290000000502100210000900000002001d00000005012000290000000101100367000000000101043b000b00000001001d00000000001004350000000301000029000000200010043f0000000001000414000003fe0210009c000003fe01008041000000c00110021000000421011001c700000002020000290ff40fef0000040f0000000102200190000007fa0000613d000000000101043b000000000101041a000000ff0110018f000000020210008c0000054e0000213d000000020110008c000008fe0000c13d000000090200002900000004012000290000000101100367000000000101043b000900000001001d000004030110009c000007fa0000213d000000400200043d00000422010000410000000000120435000800000002001d00000004012000390000000b020000290000000000210435000004230100004100000000001004390000000001000412000700000001001d000000040010044300000024000004430000000001000414000003fe0210009c000003fe01008041000000c00110021000000424011001c700008005020000390ff40fef0000040f0000000102200190000007ac0000613d000000000201043b00000000010004140000040302200197000000040320008c000003850000c13d0000000003000031000000200130008c000000000403001900000020040080390000000809000029000003b60000013d000003fe0310009c000003fe0400004100000000010480190000000805000029000003fe0350009c000000000304001900000000030540190000004003300210000000c001100210000000000131019f00000425011001c70ff40fef0000040f000000080900002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000000505400272000003a30000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000039b0000413d0000001f06400190000003b20000613d0000000505500210000000000751034f00000000055900190000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f00020000000103550000000102200190000009270000613d0000001f01400039000000600210018f0000000001920019000000000221004b00000000020000190000000102004039000004020410009c000000de0000213d0000000102200190000000de0000c13d000000400010043f000000200230008c000007fa0000413d0000000002090433000004030420009c000007fa0000213d00000044041000390000000b05000029000000000054043500000020051000390000042604000041000000000045043500000024041000390000000906000029000000000064043500000044040000390000000000410435000004270410009c000000de0000213d0000008004100039000000400040043f00000000060104330000000001000414000000040720008c000003dd0000c13d0000000102000039000004020130009c000003f30000a13d000000de0000013d000003fe0350009c000003fe0700004100000000050780190000004003500210000003fe0460009c00000000060780190000006004600210000000000334019f000003fe0410009c0000000001078019000000c001100210000000000113019f0ff40fef0000040f00000060040000390000008005000039000000010220018f00020000000103550000006001100270000003fe0010019d000003fe031001980000041b0000613d000000400400043d0000003f01300039000000200500008a000000000551016f0000000001450019000000000551004b00000000050000190000000105004039000004020610009c000000de0000213d0000000105500190000000de0000c13d000000400010043f0000000005340436000000020100036700000005063002720000040c0000613d000000000700001900000005087002100000000009850019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b000004040000413d0000001f033001900000041b0000613d0000000506600210000000000161034f00000000066500190000000303300210000000000706043300000000073701cf000000000737022f000000000101043b0000010003300089000000000131022f00000000013101cf000000000171019f0000000000160435000000000102004b000008ed0000613d0000000001040433000000400110008c000008ed0000c13d0000000001050433000000010210008c000008ed0000213d00000040024000390000000002020433000000010320008c000008ed0000213d000000010220008c000008ed0000c13d000000010110008c000008ed0000c13d000000400300043d00000024013000390000000902000029000000000021043500000428010000410000000000130435000800000003001d00000004013000390000000b020000290000000000210435000004230100004100000000001004390000000701000029000000040010044300000024000004430000000001000414000003fe0210009c000003fe01008041000000c00110021000000424011001c700008005020000390ff40fef0000040f0000000102200190000007ac0000613d000000000201043b00000000010004140000040302200197000000040320008c0000044e0000c13d0000000003000031000000200130008c0000000004030019000000200400803900000008090000290000047f0000013d000003fe0310009c000003fe0400004100000000010480190000000805000029000003fe0350009c000000000304001900000000030540190000004003300210000000c001100210000000000131019f00000429011001c70ff40fea0000040f000000080900002900000000030100190000006003300270000003fe03300197000000200430008c0000000004030019000000200400803900000005054002720000046c0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000004640000413d0000001f064001900000047b0000613d0000000505500210000000000751034f00000000055900190000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f00020000000103550000000102200190000009440000613d0000001f01400039000000600210018f0000000001920019000000000221004b00000000020000190000000102004039000004020410009c000000de0000213d0000000102200190000000de0000c13d000000400010043f000000200130008c000007fa0000413d0000000001090433000000000201004b0000000002000019000000010200c039000000000121004b000007fa0000c13d0000000a020000290000000102200039000a00000002001d000000060120006c000003430000413d000001f00000013d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000401100370000000000101043b0ff40cb90000040f000004cf0000013d0000000001000416000000000101004b000007fa0000c13d0000000001000410000004f00000013d0000000002000416000000000202004b000007fa0000c13d0000043b02000041000000800020043f00000000040004140000000002000410000000040520008c000005520000c13d000000000131034f00000000030000310000055f0000013d0000000001000416000000000101004b000007fa0000c13d0000000103000039000000000203041a000000010420019000000001052002700000007f0150018f000000000105c0190000001f0510008c00000000050000190000000105002039000000000552013f0000000105500190000005be0000613d0000042e0100004100000000001004350000002201000039000000e10000013d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000401100370000000000101043b0ff409c10000040f000000000101004b0000000001000019000000010100c039000000400200043d0000000000120435000003fe01000041000003fe0320009c000000000201801900000040012002100000042c011001c700000ff50001042e0000000001000416000000000101004b000007fa0000c13d0000000001000412000f00000001001d000e00200000003d00000000010004150000000f0110008a00000005011002100ff40fd60000040f000004f00000013d0000000001000416000000000101004b000007fa0000c13d0000000001000412000d00000001001d000c00000000001d00000000010004150000000d0110008a00000005011002100ff40fd60000040f0000040301100197000000800010043f0000043a0100004100000ff50001042e0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000401100370000000000101043b000b00000001001d00000000001004350000000201000039000000200010043f000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000421011001c700008010020000390ff40fef0000040f0000000102200190000007fa0000613d000000000101043b000000000101041a000000ff0110018f000000020210008c0000054e0000213d000000000101004b000006490000c13d000000400100043d0000042b02000041000009000000013d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000400220008c000007fa0000413d0000000402100370000000000202043b000b00000002001d000004030220009c000007fa0000213d0000002401100370000000000101043b000a00000001001d0ff409c10000040f000000000101004b00000000010000190000052b0000613d0000000a010000290000000b020000290ff40ed80000040f000000000101004b0000000001000019000000010100c039000000010110018f000004d20000013d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000400220008c000007fa0000413d0000000402100370000000000202043b000b00000002001d0000002401100370000000000101043b000a00000001001d000004030110009c000007fa0000213d0000000b0100002900000000001004350000000201000039000000200010043f000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000421011001c700008010020000390ff40fef0000040f0000000102200190000007fa0000613d000000000101043b000000000101041a000000ff0110018f000000020210008c0000064c0000a13d0000042e0100004100000000001004350000002101000039000000e10000013d000003fe01000041000003fe0340009c0000000004018019000000c00140021000000430011001c70ff40fef0000040f00000000030100190000006003300270000003fe0030019d000003fe0330019700020000000103550000000102200190000005c80000613d0000001f0230018f00000005043002720000056b0000613d00000000050000190000000506500210000000000761034f000000000707043b000000800660003900000000007604350000000105500039000000000645004b000005630000413d000000000502004b0000057a0000613d0000000504400210000000000141034f00000003022002100000008004400039000000000504043300000000052501cf000000000525022f000000000101043b0000010002200089000000000121022f00000000012101cf000000000151019f00000000001404350000009f02300039000000200100008a000000000212016f0000043c042000410000043d0440009c000000de0000413d0000042004000041000000200530008c000000000500001900000000050440190000042006300197000000000706004b000000000400a019000004200660009c000000000405c019000000400020043f000000000404004b000007fa0000c13d000000800400043d000004020540009c000007fa0000213d00000080053000390000009f034000390000042006000041000000000753004b0000000007000019000000000706801900000420085001970000042003300197000000000983004b0000000006008019000000000383013f000004200330009c000000000607c019000000000306004b000007fa0000c13d00000080034000390000000003030433000004020630009c000000de0000213d0000003f06300039000000000116016f0000000001210019000004020610009c000000de0000213d000000400010043f0000000001320436000000a0044000390000000006430019000000000556004b000007fa0000213d000000000503004b000005b70000613d000000000500001900000000061500190000000007450019000000000707043300000000007604350000002005500039000000000635004b000005b00000413d00000000011300190000000000010435000000400100043d000b00000001001d0ff409980000040f0000000b04000029000005fd0000013d000000800010043f000000000404004b000005e50000c13d000001000300008a000000000232016f000000a00020043f000000000101004b000000c002000039000000a002006039000005f40000013d000000400200043d0000001f0430018f0000000505300272000005d50000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000005cd0000413d000000000604004b000005e40000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000007c90000013d0000000000300435000000a002000039000000000301004b000005f40000613d0000042d0200004100000000040000190000000003040019000000000402041a000000a005300039000000000045043500000001022000390000002004300039000000000514004b000005eb0000413d000000c002300039000000800220008a0000008001000039000b00000001001d0ff409ae0000040f000000400100043d000a00000001001d0000000b020000290ff409980000040f0000000a040000290000000001410049000003fe02000041000003fe0310009c0000000001028019000003fe0340009c000000000402801900000040024002100000006001100210000000000121019f00000ff50001042e000003fe03000041000003fe0410009c0000000001038019000000c00110021000000437011001c70ff40fef0000040f00000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f00000005064002720000061f0000613d00000000070000190000000508700210000000000981034f000000000909043b000000800880003900000000009804350000000107700039000000000867004b000006170000413d000000000705004b0000062e0000613d0000000506600210000000000761034f00000003055002100000008006600039000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f00020000000103550000000102200190000007ad0000613d0000001f01400039000000600210018f00000080012001bf000000400010043f000000200330008c000007fa0000413d000000800300043d000000000403004b0000000004000019000000010400c039000000000443004b000007fa0000c13d000000000303004b000007d00000c13d0000043903000041000000000031043500000084032001bf00000009040000290000000000430435000000a4022000390000000b030000290000000000320435000008240000013d00000000020004110000000b01000029000006500000013d000000020110008c000008fe0000c13d0000000b010000290000000a020000290ff40d4b0000040f000000000100001900000ff50001042e0000042f01000041000000800010043f000004300100004100000ff600010430000500020000003d000480100000003d000380050000003d000a00000000001d0000000a01000029000000050110021000000006011000290000000101100367000000000101043b000b00000001001d00000000001004350000000501000029000000200010043f0000000001000414000003fe0210009c000003fe01008041000000c00110021000000421011001c700000004020000290ff40fef0000040f0000000102200190000007fa0000613d000000000101043b000000000101041a000000ff0210018f000000020120008c0000054e0000213d000000400300043d0000000401300039000000000202004b000008270000613d0000042202000041000900000003001d00000000002304350000000b020000290000000000210435000004230100004100000000001004390000000001000412000800000001001d000000040010044300000024000004430000000001000414000003fe0210009c000003fe01008041000000c00110021000000424011001c700000003020000290ff40fef0000040f00000000060004110000000102200190000007ac0000613d000000000201043b00000000010004140000040302200197000000040320008c000006960000c13d0000000003000031000000200130008c000000000403001900000020040080390000000909000029000006c90000013d000200000006001d000003fe0310009c000003fe0400004100000000010480190000000905000029000003fe0350009c000000000304001900000000030540190000004003300210000000c001100210000000000131019f00000425011001c70ff40fef0000040f000000090900002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000000505400272000006b50000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000006ad0000413d0000001f06400190000006c40000613d0000000505500210000000000751034f00000000055900190000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f000200000001035500000001022001900000000206000029000008b30000613d0000001f01400039000000600210018f0000000001920019000000000221004b00000000020000190000000102004039000004020410009c000000de0000213d0000000102200190000000de0000c13d000000400010043f000000200230008c000007fa0000413d0000000002090433000004030420009c000007fa0000213d00000044041000390000000b05000029000000000054043500000020051000390000042604000041000000000045043500000044040000390000000000410435000004030a60019700000024041000390000000000a40435000004270410009c000000de0000213d0000008004100039000000400040043f00000000060104330000000001000414000000040720008c000006f00000c13d0000000102000039000004020130009c000007080000a13d000000de0000013d000003fe0350009c000003fe0700004100000000050780190000004003500210000003fe0460009c00000000060780190000006004600210000000000334019f000003fe0410009c0000000001078019000000c001100210000000000113019f00090000000a001d0ff40fef0000040f000000090a0000290000006004000039000000010220018f00020000000103550000006001100270000003fe0010019d000003fe031001980000000101000029000007300000613d000000400400043d0000003f01300039000000200500008a000000000551016f0000000001450019000000000551004b00000000050000190000000105004039000004020610009c000000de0000213d0000000105500190000000de0000c13d000000400010043f000000000134043600000002050003670000000506300272000007210000613d000000000700001900000005087002100000000009810019000000000885034f000000000808043b00000000008904350000000107700039000000000867004b000007190000413d0000001f03300190000007300000613d0000000506600210000000000565034f00000000066100190000000303300210000000000706043300000000073701cf000000000737022f000000000505043b0000010003300089000000000535022f00000000033501cf000000000373019f0000000000360435000000000202004b000008190000613d0000000002040433000000400220008c000008190000c13d0000000001010433000000010210008c000008190000213d00000040024000390000000002020433000000010320008c000008190000213d000000010220008c000008190000c13d000000010110008c000008190000c13d000000400200043d00000024012000390000000000a1043500000428010000410000000000120435000900000002001d00000004012000390000000b020000290000000000210435000004230100004100000000001004390000000801000029000000040010044300000024000004430000000001000414000003fe0210009c000003fe01008041000000c00110021000000424011001c700008005020000390ff40fef0000040f0000000102200190000007ac0000613d000000000201043b00000000010004140000040302200197000000040320008c000007620000c13d0000000003000031000000200130008c000000000403001900000020040080390000000909000029000007930000013d000003fe0310009c000003fe0400004100000000010480190000000905000029000003fe0350009c000000000304001900000000030540190000004003300210000000c001100210000000000131019f00000429011001c70ff40fea0000040f000000090900002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000000505400272000007800000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000007780000413d0000001f064001900000078f0000613d0000000505500210000000000751034f00000000055900190000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f00020000000103550000000102200190000008d00000613d0000001f01400039000000600210018f0000000001920019000000000221004b00000000020000190000000102004039000004020410009c000000de0000213d0000000102200190000000de0000c13d000000400010043f000000200130008c000007fa0000413d0000000001090433000000000201004b0000000002000019000000010200c039000000000121004b000007fa0000c13d0000000a020000290000000102200039000a00000002001d000000070120006c0000065b0000413d000001f00000013d000000000001042f000000400200043d0000001f0430018f0000000505300272000007ba0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000007b20000413d000000000604004b000007c90000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000003fe01000041000003fe0420009c000000000201801900000040012002100000006002300210000000000121019f00000ff6000104300000000b0100002900000000001004350000000201000039000000200010043f000003fe030000410000000001000414000003fe0210009c0000000001038019000000c00110021000000421011001c700008010020000390ff40fef0000040f0000000102200190000007fa0000613d000000000101043b000000000201041a000001000300008a000000000232016f0000000a03000029000000000232019f000000000021041b000000400100043d000000200210003900000000003204350000000b0200002900000000002104350000000002000414000003fe0320009c000003fe040000410000000002048019000003fe0310009c00000000010480190000004001100210000000c002200210000000000112019f00000421011001c70000800d02000039000000010300003900000438040000410ff40fea0000040f0000000101200190000001f00000c13d000000000100001900000ff6000104300000043101000041000006540000013d000000000106004b0000000001000019000008030000613d0000000b0100002900000000010104330000000302600210000000010300008a000000000223022f000000000232013f000000000121016f00000001026002100000000803000029000000000121019f000000000015041b0000040301300197000000800010043f000000a00040043f0000014000000443000001600010044300000020010000390000018000100443000001a000400443000001000010044300000002010000390000012000100443000004050100004100000ff50001042e000000400100043d00000024021000390000000b0300002900000000003204350000042a02000041000000000021043500000004021000390000000000a20435000003fe02000041000003fe0310009c0000000001028019000000400110021000000429011001c700000ff6000104300000042b0200004100000000002304350000000b020000290000000000210435000003fe01000041000003fe0230009c0000000003018019000000400130021000000425011001c700000ff6000104300000000001000411000504030010019b0000000002000019000a00000002001d000000050720021000000007017000290000000101100367000000000601043b000000400900043d000004360100004100000000001904350000000401900039000000050200002900000000002104350000002401900039000000000061043500000000010004140000000602000029000000040320008c0000084a0000c13d0000000003000031000000200130008c00000000040300190000002004008039000008800000013d000400000007001d000900000006001d000003fe0310009c000003fe040000410000000001048019000003fe0390009c000000000304001900000000030940190000004003300210000000c001100210000000000131019f00000429011001c7000300000009001d0ff40fef0000040f000000030900002900000000030100190000006003300270000003fe03300197000000200430008c0000000004030019000000200400803900000005054002720000086a0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000008620000413d0000001f06400190000008790000613d0000000505500210000000000751034f00000000055900190000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f000200000001035500000001022001900000000805000029000000090600002900000004070000290000090a0000613d0000001f01400039000000600210018f0000000001920019000000000221004b00000000020000190000000102004039000004020410009c000000de0000213d0000000102200190000000de0000c13d000000400010043f000000200230008c000007fa0000413d0000000002090433000000000302004b0000000003000019000000010300c039000000000332004b000007fa0000c13d000000000202004b000008f60000613d00000000015700190000000101100367000000000101043b000900000001001d000000020110008c000007fa0000213d00000000006004350000000201000039000000200010043f0000000001000414000003fe0210009c000003fe01008041000000c00110021000000421011001c700008010020000390ff40fef0000040f00000008050000290000000102200190000007fa0000613d000000000101043b000000000201041a000001000300008a000000000232016f00000009022001af000000000021041b0000000a0200002900000001022000390000000b0120006c000008340000413d000002bb0000013d000000400200043d0000001f0430018f0000000505300272000008c00000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000008b80000413d000000000604004b000008cf0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000007c90000013d000000400200043d0000001f0430018f0000000505300272000008dd0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000008d50000413d000000000604004b000008ec0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000007c90000013d000000400100043d00000024021000390000000b0300002900000000003204350000042a02000041000000000021043500000004021000390000000903000029000008fc0000013d0000002402100039000000000062043500000439020000410000000000210435000000040210003900000005030000290000000000320435000008210000013d000000400100043d0000043502000041000000000021043500000004021000390000000b030000290000000000320435000003fe02000041000003fe0310009c0000000001028019000000400110021000000425011001c700000ff600010430000000400200043d0000001f0430018f0000000505300272000009170000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000090f0000413d000000000604004b000007c90000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000007c90000013d000000400200043d0000001f0430018f0000000505300272000009340000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000092c0000413d000000000604004b000009430000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000007c90000013d000000400200043d0000001f0430018f0000000505300272000009510000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000009490000413d000000000604004b000009600000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000007c90000013d000000400100043d00000431020000410000000000210435000003fe02000041000003fe0310009c0000000001028019000000400110021000000432011001c700000ff600010430000500020000003d000480100000003d0000000003000019000000800100043d000000000131004b0000000602000029000009940000a13d00000007010000290000000001010433000000000131004b000009940000a13d000b00000003001d000000050130021000000000022100190000000002020433000a00000002001d000000020220008c0000054e0000213d000000a001100039000000000101043300000000001004350000000501000029000000200010043f0000000001000414000003fe0210009c000003fe01008041000000c00110021000000421011001c700000004020000290ff40fef0000040f0000000102200190000007fa0000613d000000000101043b000000000201041a000000090220017f0000000a022001af000000000021041b0000000b030000290000000103300039000000080130006c0000096d0000413d000000ab0000013d0000042e0100004100000000001004350000003201000039000000e10000013d00000020030000390000000004310436000000000302043300000000003404350000004001100039000000000403004b000009a70000613d000000000400001900000000051400190000002004400039000000000624001900000000060604330000000000650435000000000534004b000009a00000413d000000000213001900000000000204350000001f02300039000000200300008a000000000232016f0000000001210019000000000001042d0000001f02200039000000200300008a000000000232016f0000000001120019000000000221004b00000000020000190000000102004039000004020310009c000009bb0000213d0000000102200190000009bb0000c13d000000400010043f000000000001042d0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff6000104300004000000000002000000400300043d0000043f020000410000000000230435000400000003001d0000000402300039000300000001001d0000000000120435000004230100004100000000001004390000000001000412000200000001001d00000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000aa70000613d000000000201043b00000000010004140000040302200197000000040320008c000009e40000c13d0000000003000031000000200130008c00000000040300190000002004008039000000040a00002900000a150000013d000003fe03000041000003fe0410009c00000000010380190000000405000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000425011001c70ff40fef0000040f000000040a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000a020000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b000009fa0000413d000000000705004b00000a110000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000aae0000613d0000001f01400039000000600110018f0000000004a10019000000000114004b00000000010000190000000101004039000004020240009c00000aa80000213d000000010110019000000aa80000c13d000000400040043f0000001f0130008c00000aa50000a13d00000000010a0433000003fe0210009c00000aa50000213d000000000101004b000000000100001900000aa40000613d0000002401400039000000030200002900000000002104350000043601000041000000000014043500000000010004100000040301100197000100000004001d0000000402400039000000000012043500000423010000410000000000100439000000020100002900000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000aa70000613d000000000201043b00000000010004140000040302200197000000040320008c00000a4c0000c13d0000000003000031000000200130008c00000000040300190000002004008039000000010a00002900000a7d0000013d000003fe03000041000003fe0410009c00000000010380190000000105000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000429011001c70ff40fef0000040f000000010a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000a6a0000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000a620000413d000000000705004b00000a790000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000acf0000613d0000001f01400039000000600110018f0000000001a10019000004020210009c00000aa80000213d000000400010043f000000200130008c00000aa50000413d00000000010a0433000000000201004b0000000002000019000000010200c039000000000221004b00000aa50000c13d000000000101004b000000000100001900000aa40000613d000000030100002900000000001004350000000201000039000000200010043f000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000421011001c700008010020000390ff40fef0000040f000000010220019000000aa50000613d000000000101043b000000000101041a000000ff0110018f000000020210008c00000acb0000213d000000000101004b0000000001000019000000010100c039000000000001042d000000000100001900000ff600010430000000000001042f0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff600010430000000400200043d0000001f0430018f000000050530027200000abb0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000ab30000413d000000000604004b00000aeb0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f000000000015043500000aeb0000013d0000042e010000410000000000100435000000210100003900000aab0000013d000000400200043d0000001f0430018f000000050530027200000adc0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000ad40000413d000000000604004b00000aeb0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000003fe01000041000003fe0420009c000000000201801900000040012002100000006002300210000000000121019f00000ff6000104300004000000000002000000400300043d0000043f020000410000000000230435000400000003001d0000000402300039000300000001001d0000000000120435000004230100004100000000001004390000000001000412000200000001001d00000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000bd80000613d000000000201043b00000000010004140000040302200197000000040320008c00000b150000c13d0000000003000031000000200130008c00000000040300190000002004008039000000040a00002900000b460000013d000003fe03000041000003fe0410009c00000000010380190000000405000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000425011001c70ff40fef0000040f000000040a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000b330000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000b2b0000413d000000000705004b00000b420000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000bdf0000613d0000001f01400039000000600110018f0000000004a10019000000000114004b00000000010000190000000101004039000004020240009c00000bd90000213d000000010110019000000bd90000c13d000000400040043f0000001f0130008c00000bd60000a13d00000000010a0433000003fe0210009c00000bd60000213d000000000101004b000000000100001900000bd50000613d0000002401400039000000030200002900000000002104350000043601000041000000000014043500000000010004100000040301100197000100000004001d0000000402400039000000000012043500000423010000410000000000100439000000020100002900000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000bd80000613d000000000201043b00000000010004140000040302200197000000040320008c00000b7d0000c13d0000000003000031000000200130008c00000000040300190000002004008039000000010a00002900000bae0000013d000003fe03000041000003fe0410009c00000000010380190000000105000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000429011001c70ff40fef0000040f000000010a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000b9b0000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000b930000413d000000000705004b00000baa0000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000c000000613d0000001f01400039000000600110018f0000000001a10019000004020210009c00000bd90000213d000000400010043f000000200130008c00000bd60000413d00000000010a0433000000000201004b0000000002000019000000010200c039000000000221004b00000bd60000c13d000000000101004b000000000100001900000bd50000613d000000030100002900000000001004350000000201000039000000200010043f000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000421011001c700008010020000390ff40fef0000040f000000010220019000000bd60000613d000000000101043b000000000101041a000000ff0110018f000000020210008c00000bfc0000213d000000020110008c00000000010000190000000101006039000000000001042d000000000100001900000ff600010430000000000001042f0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff600010430000000400200043d0000001f0430018f000000050530027200000bec0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000be40000413d000000000604004b00000c1c0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f000000000015043500000c1c0000013d0000042e010000410000000000100435000000210100003900000bdc0000013d000000400200043d0000001f0430018f000000050530027200000c0d0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000c050000413d000000000604004b00000c1c0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000003fe01000041000003fe0420009c000000000201801900000040012002100000006002300210000000000121019f00000ff6000104300001000000000002000000400300043d000000240230003900000000001204350000043601000041000000000013043500000000010004100000040301100197000100000003001d0000000402300039000000000012043500000423010000410000000000100439000000000100041200000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000c8f0000613d000000000201043b00000000010004140000040302200197000000040320008c00000c480000c13d0000000003000031000000200130008c00000000040300190000002004008039000000010a00002900000c790000013d000003fe03000041000003fe0410009c00000000010380190000000105000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000429011001c70ff40fef0000040f000000010a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000c660000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000c5e0000413d000000000705004b00000c750000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000c960000613d0000001f01400039000000600210018f0000000001a20019000000000221004b00000000020000190000000102004039000004020410009c00000c900000213d000000010220019000000c900000c13d000000400010043f0000001f0130008c00000c8d0000a13d00000000010a0433000000000201004b0000000002000019000000010200c039000000000221004b00000c8d0000c13d000000000001042d000000000100001900000ff600010430000000000001042f0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff600010430000000400200043d0000001f0430018f000000050530027200000ca30000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000c9b0000413d000000000604004b00000cb20000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000003fe01000041000003fe0420009c000000000201801900000040012002100000006002300210000000000121019f00000ff6000104300001000000000002000000400300043d0000043f020000410000000000230435000100000003001d0000000402300039000000000012043500000423010000410000000000100439000000000100041200000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000d210000613d000000000201043b00000000010004140000040302200197000000040320008c00000cda0000c13d0000000003000031000000200130008c00000000040300190000002004008039000000010a00002900000d0b0000013d000003fe03000041000003fe0410009c00000000010380190000000105000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000425011001c70ff40fef0000040f000000010a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000cf80000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000cf00000413d000000000705004b00000d070000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000d280000613d0000001f01400039000000600210018f0000000001a20019000000000221004b00000000020000190000000102004039000004020410009c00000d220000213d000000010220019000000d220000c13d000000400010043f0000001f0130008c00000d1f0000a13d00000000010a0433000003fe0210009c00000d1f0000213d000000000101004b0000000001000019000000010100c039000000000001042d000000000100001900000ff600010430000000000001042f0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff600010430000000400200043d0000001f0430018f000000050530027200000d350000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000d2d0000413d000000000604004b00000d440000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000003fe01000041000003fe0420009c000000000201801900000040012002100000006002300210000000000121019f00000ff6000104300004000000000002000200000002001d000000400300043d00000422020000410000000000230435000300000003001d0000000402300039000400000001001d0000000000120435000004230100004100000000001004390000000001000412000100000001001d00000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000e970000613d000000000201043b00000000010004140000040302200197000000040320008c00000d6f0000c13d0000000003000031000000200130008c00000000040300190000002004008039000000030a00002900000da00000013d000003fe03000041000003fe0410009c00000000010380190000000305000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000425011001c70ff40fef0000040f000000030a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000d8d0000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000d850000413d000000000705004b00000d9c0000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000e980000613d0000001f01400039000000600210018f0000000001a20019000000000221004b00000000020000190000000102004039000004020410009c00000e810000213d000000010220019000000e810000c13d000000400010043f0000001f0230008c00000e950000a13d00000000020a0433000004030420009c00000e950000213d000000440410003900000004050000290000000000540435000000200510003900000426040000410000000000450435000000440400003900000000004104350000000204000029000004030a40019700000024041000390000000000a40435000004270410009c00000e810000213d0000008004100039000000400040043f00000000060104330000000001000414000000040720008c00000dc80000c13d0000000102000039000004020130009c00000de00000a13d00000e810000013d000003fe03000041000003fe0450009c00000000050380190000004004500210000003fe0560009c00000000060380190000006005600210000000000445019f000003fe0510009c0000000001038019000000c001100210000000000114019f00030000000a001d0ff40fef0000040f000000030a00002900000060040000390000008005000039000000010220018f00020000000103550000006001100270000003fe0010019d000003fe0310019800000e090000613d000000400400043d0000003f01300039000000200500008a000000000151016f0000000001140019000000000541004b00000000050000190000000105004039000004020610009c00000e810000213d000000010550019000000e810000c13d000000400010043f0000001f0130018f00000000053404360000000206000367000000050330027200000dfa0000613d000000000700001900000005087002100000000009850019000000000886034f000000000808043b00000000008904350000000107700039000000000837004b00000df20000413d000000000701004b00000e090000613d0000000503300210000000000636034f00000000033500190000000301100210000000000703043300000000071701cf000000000717022f000000000606043b0000010001100089000000000616022f00000000011601cf000000000171019f0000000000130435000000000102004b00000e870000613d0000000001040433000000400110008c00000e870000c13d0000000001050433000000010210008c00000e870000213d00000040024000390000000002020433000000010320008c00000e870000213d000000010220008c00000e870000c13d000000010110008c00000e870000c13d000000400200043d00000024012000390000000000a1043500000428010000410000000000120435000300000002001d00000004012000390000000402000029000000000021043500000423010000410000000000100439000000010100002900000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000e970000613d000000000201043b00000000010004140000040302200197000000040320008c00000e3c0000c13d0000000003000031000000200130008c00000000040300190000002004008039000000030a00002900000e6d0000013d000003fe03000041000003fe0410009c00000000010380190000000305000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000429011001c70ff40fea0000040f000000030a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000e5a0000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000e520000413d000000000705004b00000e690000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000eb50000613d0000001f01400039000000600210018f0000000001a20019000000000221004b00000000020000190000000102004039000004020410009c00000e810000213d000000010220019000000e810000c13d000000400010043f000000200130008c00000e950000413d00000000010a0433000000000201004b0000000002000019000000010200c039000000000121004b00000e950000c13d000000000001042d0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff600010430000000400100043d0000002402100039000000040300002900000000003204350000042a02000041000000000021043500000004021000390000000000a20435000003fe02000041000003fe0310009c0000000001028019000000400110021000000429011001c700000ff600010430000000000100001900000ff600010430000000000001042f000000400200043d0000001f0430018f000000050530027200000ea50000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000e9d0000413d000000000604004b00000ed10000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f000000000015043500000ed10000013d000000400200043d0000001f0430018f000000050530027200000ec20000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000eba0000413d000000000604004b00000ed10000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000003fe01000041000003fe0420009c000000000201801900000040012002100000006002300210000000000121019f00000ff6000104300003000000000002000200000002001d000000400300043d00000422020000410000000000230435000300000003001d0000000402300039000100000001001d000000000012043500000423010000410000000000100439000000000100041200000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000fb10000613d000000000201043b00000000010004140000040302200197000000040320008c00000efb0000c13d0000000003000031000000200130008c00000000040300190000002004008039000000030a00002900000f2c0000013d000003fe03000041000003fe0410009c00000000010380190000000305000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000425011001c70ff40fef0000040f000000030a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000f190000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000f110000413d000000000705004b00000f280000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000fb20000613d0000001f01400039000000600210018f0000000001a20019000000000221004b00000000020000190000000102004039000004020410009c00000fa90000213d000000010220019000000fa90000c13d000000400010043f0000001f0230008c00000faf0000a13d00000000020a0433000004030420009c00000faf0000213d000000440410003900000001050000290000000000540435000000200410003900000426050000410000000000540435000000020500002900000403055001970000002406100039000000000056043500000044050000390000000000510435000004270510009c00000fa90000213d0000008005100039000000400050043f00000000050104330000000001000414000000040620008c00000f540000c13d0000000102000039000004020130009c00000f690000a13d00000fa90000013d000003fe03000041000003fe0640009c00000000040380190000004004400210000003fe0650009c00000000050380190000006005500210000000000445019f000003fe0510009c0000000001038019000000c001100210000000000114019f0ff40fef0000040f00000060040000390000008005000039000000010220018f00020000000103550000006001100270000003fe0010019d000003fe0310019800000f930000613d0000003f01300039000000200400008a000000000141016f000000400400043d0000000001140019000000000541004b00000000050000190000000105004039000004020610009c00000fa90000213d000000010550019000000fa90000c13d000000400010043f0000001f0130018f00000000053404360000000206000367000000050330027200000f840000613d000000000700001900000005087002100000000009850019000000000886034f000000000808043b00000000008904350000000107700039000000000837004b00000f7c0000413d000000000701004b00000f930000613d0000000503300210000000000636034f00000000033500190000000301100210000000000703043300000000071701cf000000000717022f000000000606043b0000010001100089000000000616022f00000000011601cf000000000171019f0000000000130435000000000102004b000000000100001900000fa80000613d0000000001040433000000400110008c000000000100001900000fa80000c13d0000000002050433000000010120008c000000000100001900000fa80000213d00000040014000390000000003010433000000010130008c000000000100001900000fa80000213d000000010120015f000000010230015f00000000011201a000000000010000190000000101006039000000000001042d0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff600010430000000000100001900000ff600010430000000000001042f000000400200043d0000001f0430018f000000050530027200000fbf0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000fb70000413d000000000604004b00000fce0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000003fe01000041000003fe0420009c000000000201801900000040012002100000006002300210000000000112019f00000ff600010430000000000001042f0000042302000041000000000020043900000005011002700000000002010031000000040020044300000001010100310000002400100443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000fe90000613d000000000101043b000000000001042d000000000001042f00000fed002104210000000102000039000000000001042d0000000002000019000000000001042d00000ff2002104230000000102000039000000000001042d0000000002000019000000000001042d00000ff40000043200000ff50001042e00000ff600010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000dfffffffffffffffffffffffffffffffffffffffffffffffff00000000000000bf00000000000000000000000000000000000000000000000000000001ffffffe0000000000000000000000000000000000000000000000000ffffffffffffffff000000000000000000000000ffffffffffffffffffffffffffffffffffffffff020000000000000000000000000000000000002000000000000000000000000000000002000000000000000000000000000000c0000001000000000000000000000000000000000000000000000000000000000000000000000000007150ef8700000000000000000000000000000000000000000000000000000000cc9d707300000000000000000000000000000000000000000000000000000000dd1bb1fb00000000000000000000000000000000000000000000000000000000dd1bb1fc00000000000000000000000000000000000000000000000000000000efbd181f00000000000000000000000000000000000000000000000000000000fca8d7c800000000000000000000000000000000000000000000000000000000cc9d707400000000000000000000000000000000000000000000000000000000d74251a000000000000000000000000000000000000000000000000000000000890db75b00000000000000000000000000000000000000000000000000000000890db75c0000000000000000000000000000000000000000000000000000000094dc956a00000000000000000000000000000000000000000000000000000000a4f9edbf000000000000000000000000000000000000000000000000000000007150ef8800000000000000000000000000000000000000000000000000000000840ebfdf0000000000000000000000000000000000000000000000000000000030178f29000000000000000000000000000000000000000000000000000000003a4741bc000000000000000000000000000000000000000000000000000000003a4741bd0000000000000000000000000000000000000000000000000000000054fd4d5000000000000000000000000000000000000000000000000000000000686d9fa20000000000000000000000000000000000000000000000000000000030178f2a0000000000000000000000000000000000000000000000000000000031d70b66000000000000000000000000000000000000000000000000000000002afb5c51000000000000000000000000000000000000000000000000000000002afb5c52000000000000000000000000000000000000000000000000000000002fbc035f0000000000000000000000000000000000000000000000000000000007ace2b5000000000000000000000000000000000000000000000000000000001d70af85800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000400000000000000000000000008c07607700000000000000000000000000000000000000000000000000000000310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e02000002000000000000000000000000000000440000000000000000000000000000000000000000000000000000000000000024000000000000000000000000bd68387200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f641f776e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004400000000000000000000000013d4d4dd000000000000000000000000000000000000000000000000000000002cf7343d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf64e487b71000000000000000000000000000000000000000000000000000000000dc149f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000008000000000000000001132131c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000200000000000000000000000000000000000000000000000000000000000000b18604a21764a23acb45fc37d878f421c181294b251c148cd43689947f47621073d33f9100000000000000000000000000000000000000000000000000000000b56f75620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000008000000000000000003de74aa59ab1ab0255006bf14c5df84e529e14ae2122677499a5f2a2d0b815dae8ed9286000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000800000000000000000dd1bb1fc00000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000008007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb284917000000000000000000000000000000000000000000000000000000004ebee386fba0ceabd2ccccfa0575f120bd21e32ed3fa103981a02bc6d2d5b246" + ], + "address": "0x1e8C2a171e5c5D92d15F5363fd136CAf3bBf86E2", + "txHash": "0xa76d928c5b68e1ff6bd00575468c6771981f3b8e3ade9a089b4547128e8a1b3c" + } + ] +} diff --git a/script/DeployMultiClaimsHatter.ts b/script/DeployMultiClaimsHatter.ts index 4893daa..cf0a2b8 100644 --- a/script/DeployMultiClaimsHatter.ts +++ b/script/DeployMultiClaimsHatter.ts @@ -30,7 +30,7 @@ async function main() { const deployer = new Deployer(hre, zkWallet); const multiHatsHatterFactory = await new Contract(FACTORY_ADDRESS, MultiClaimsHatterFactory.abi, deployer.zkWallet); - const tx = await multiHatsHatterFactory.deployMultiClaimsHatter(HATS_ID, HATS, "0x0000000000000000000000000000", SALT_NONCE); + const tx = await multiHatsHatterFactory.deployMultiClaimsHatter(HATS_ID, HATS, "0x", SALT_NONCE); const tr = await tx.wait(); console.log(tr) } From 99ad30479795c7afec6c0dfca542e39f6d945138 Mon Sep 17 00:00:00 2001 From: keating Date: Tue, 23 Jul 2024 15:28:10 -0400 Subject: [PATCH 14/18] Some cleanup --- lib/hats-module | 2 +- script/DeployMultiClaimsHatter.ts | 27 +-- script/DeployMultiClaimsHatterFactory.ts | 26 ++- src/MultiClaimsHatterFactory.sol | 20 ++- src/lib/L2ContractHelper.sol | 203 +++++++++++------------ test/MultiClaimsHatter.t.sol | 95 ++++++----- test/MultiClaimsHatterFactory.t.sol | 7 +- 7 files changed, 204 insertions(+), 176 deletions(-) diff --git a/lib/hats-module b/lib/hats-module index e295c91..58dc6bd 160000 --- a/lib/hats-module +++ b/lib/hats-module @@ -1 +1 @@ -Subproject commit e295c91f63722ecf723b4f9e4bd85b182ea4739d +Subproject commit 58dc6bd4941a78080c53f009536cf0adf346a14b diff --git a/script/DeployMultiClaimsHatter.ts b/script/DeployMultiClaimsHatter.ts index cf0a2b8..1a44b89 100644 --- a/script/DeployMultiClaimsHatter.ts +++ b/script/DeployMultiClaimsHatter.ts @@ -12,9 +12,7 @@ const contractName = "MultiClaimsHatter"; const HATS_ID = 1; const HATS = "0x32Ccb7600c10B4F7e678C7cbde199d98453D0e7e"; const SALT_NONCE = 1; -const FACTORY_ADDRESS = "0x1e8C2a171e5c5D92d15F5363fd136CAf3bBf86E2" -// What does this need to be? -// const INIT_DATA = "0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000030000000100010001000000000000000000000000000000000000000000000000000000010001000100010000000000000000000000000000000000000000000000000001000100010001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001" +const FACTORY_ADDRESS = "0x1e8C2a171e5c5D92d15F5363fd136CAf3bBf86E2"; async function main() { dotEnvConfig(); @@ -28,14 +26,23 @@ async function main() { const zkWallet = new Wallet(deployerPrivateKey); const deployer = new Deployer(hre, zkWallet); - const multiHatsHatterFactory = await new Contract(FACTORY_ADDRESS, MultiClaimsHatterFactory.abi, deployer.zkWallet); - - const tx = await multiHatsHatterFactory.deployMultiClaimsHatter(HATS_ID, HATS, "0x", SALT_NONCE); + const multiHatsHatterFactory = await new Contract( + FACTORY_ADDRESS, + MultiClaimsHatterFactory.abi, + deployer.zkWallet + ); + + const tx = await multiHatsHatterFactory.deployModule( + HATS_ID, + HATS, + "0x", + SALT_NONCE + ); const tr = await tx.wait(); - console.log(tr) + console.log("Multi claims hatter deployed at " + tr.contractAddress); } main().catch((error) => { - console.error(error); - process.exitCode = 1; - }); + console.error(error); + process.exitCode = 1; +}); diff --git a/script/DeployMultiClaimsHatterFactory.ts b/script/DeployMultiClaimsHatterFactory.ts index c5e8246..407dd4e 100644 --- a/script/DeployMultiClaimsHatterFactory.ts +++ b/script/DeployMultiClaimsHatterFactory.ts @@ -22,12 +22,26 @@ async function main() { const contract = await deployer.loadArtifact(contractName); const constructorArgs = []; - const multiClaimsHatterFactory = await deployer.deploy(contract, constructorArgs, "create2", {"customData": {"salt": "0x0000000000000000000000000000000000000000000000000000000000004a75"}}); - console.log("constructor args:" + multiClaimsHatterFactory.interface.encodeDeploy(constructorArgs)); - console.log(`${contractName} was deployed to ${await multiClaimsHatterFactory.getAddress()}`); + const multiClaimsHatterFactory = await deployer.deploy( + contract, + constructorArgs, + "create2", + { + customData: { + salt: "0x0000000000000000000000000000000000000000000000000000000000004a75", + }, + } + ); + console.log( + "constructor args:" + + multiClaimsHatterFactory.interface.encodeDeploy(constructorArgs) + ); + console.log( + `${contractName} was deployed to ${await multiClaimsHatterFactory.getAddress()}` + ); } main().catch((error) => { - console.error(error); - process.exitCode = 1; - }); + console.error(error); + process.exitCode = 1; +}); diff --git a/src/MultiClaimsHatterFactory.sol b/src/MultiClaimsHatterFactory.sol index e45be41..91ac2b1 100644 --- a/src/MultiClaimsHatterFactory.sol +++ b/src/MultiClaimsHatterFactory.sol @@ -1,11 +1,12 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; +import { IHatsModuleFactory } from "hats-module/interfaces/IHatsModuleFactory.sol"; import { MultiClaimsHatter } from "./MultiClaimsHatter.sol"; import { console2 } from "forge-std/Test.sol"; -import {L2ContractHelper} from "./lib/L2ContractHelper.sol"; +import { L2ContractHelper } from "./lib/L2ContractHelper.sol"; -contract MultiClaimsHatterFactory { +contract MultiClaimsHatterFactory is IHatsModuleFactory { string public constant VERSION = "0.6.0-zksync"; /// @dev Bytecode hash can be found in zksolc/MultiClaimsHatter.sol/MultiClaimsHatter.json under the hash key. bytes32 constant BYTECODE_HASH = 0x0100041dbb312c575f637f3b4ffbdf9beada863fa830a3f771b06df5a8a5c287; @@ -14,10 +15,14 @@ contract MultiClaimsHatterFactory { address implementation, address instance, uint256 hatId, bytes otherImmutableArgs, bytes initData, uint256 saltNonce ); - function deployMultiClaimsHatter(uint256 _hatId, address _hat, bytes calldata _initData, uint256 _saltNonce) + function deployModule(uint256 _hatId, address _hat, bytes calldata _initData, uint256 _saltNonce) external returns (address) { + console2.logBytes(_initData); + console2.logUint(_hatId); + console2.logUint(_saltNonce); + console2.logAddress(_hat); bytes memory saltArgs = abi.encodePacked(VERSION, _hatId, _hat, _initData); bytes32 salt = _calculateSalt(saltArgs, _saltNonce); // TODO: Test situate where contract exitsts @@ -35,12 +40,13 @@ contract MultiClaimsHatterFactory { function getAddress(uint256 _hatId, address _hat, bytes calldata _initData, uint256 _saltNonce) external - view + view returns (address addr) { bytes memory saltArgs = abi.encodePacked(VERSION, _hatId, _hat, _initData); bytes32 salt = _calculateSalt(saltArgs, _saltNonce); - addr = L2ContractHelper.computeCreate2Address(address(this), salt, BYTECODE_HASH, keccak256(abi.encode(VERSION, _hat, _hatId))); + addr = L2ContractHelper.computeCreate2Address( + address(this), salt, BYTECODE_HASH, keccak256(abi.encode(VERSION, _hat, _hatId)) + ); } - - } +} diff --git a/src/lib/L2ContractHelper.sol b/src/lib/L2ContractHelper.sol index abc87eb..2d64b21 100644 --- a/src/lib/L2ContractHelper.sol +++ b/src/lib/L2ContractHelper.sol @@ -16,10 +16,10 @@ pragma solidity 0.8.19; * it requires that the preimage of `value` be provided. */ interface IL2Messenger { - /// @notice Sends an arbitrary length message to L1. - /// @param _message The variable length message to be sent to L1. - /// @return Returns the keccak256 hashed value of the message. - function sendToL1(bytes memory _message) external returns (bytes32); + /// @notice Sends an arbitrary length message to L1. + /// @param _message The variable length message to be sent to L1. + /// @return Returns the keccak256 hashed value of the message. + function sendToL1(bytes memory _message) external returns (bytes32); } /** @@ -28,29 +28,29 @@ interface IL2Messenger { * @notice Interface for the contract that is used to deploy contracts on L2. */ interface IContractDeployer { - /// @notice A struct that describes a forced deployment on an address. - /// @param bytecodeHash The bytecode hash to put on an address. - /// @param newAddress The address on which to deploy the bytecodehash to. - /// @param callConstructor Whether to run the constructor on the force deployment. - /// @param value The `msg.value` with which to initialize a contract. - /// @param input The constructor calldata. - struct ForceDeployment { - bytes32 bytecodeHash; - address newAddress; - bool callConstructor; - uint256 value; - bytes input; - } + /// @notice A struct that describes a forced deployment on an address. + /// @param bytecodeHash The bytecode hash to put on an address. + /// @param newAddress The address on which to deploy the bytecodehash to. + /// @param callConstructor Whether to run the constructor on the force deployment. + /// @param value The `msg.value` with which to initialize a contract. + /// @param input The constructor calldata. + struct ForceDeployment { + bytes32 bytecodeHash; + address newAddress; + bool callConstructor; + uint256 value; + bytes input; + } - /// @notice This method is to be used only during an upgrade to set bytecodes on specific addresses. - /// @param _deployParams A set of parameters describing force deployment. - function forceDeployOnAddresses(ForceDeployment[] calldata _deployParams) external payable; + /// @notice This method is to be used only during an upgrade to set bytecodes on specific addresses. + /// @param _deployParams A set of parameters describing force deployment. + function forceDeployOnAddresses(ForceDeployment[] calldata _deployParams) external payable; - /// @notice Creates a new contract at a determined address using the `CREATE2` salt on L2 - /// @param _salt a unique value to create the deterministic address of the new contract - /// @param _bytecodeHash the bytecodehash of the new contract to be deployed - /// @param _input the calldata to be sent to the constructor of the new contract - function create2(bytes32 _salt, bytes32 _bytecodeHash, bytes calldata _input) external returns (address); + /// @notice Creates a new contract at a determined address using the `CREATE2` salt on L2 + /// @param _salt a unique value to create the deterministic address of the new contract + /// @param _bytecodeHash the bytecodehash of the new contract to be deployed + /// @param _input the calldata to be sent to the constructor of the new contract + function create2(bytes32 _salt, bytes32 _bytecodeHash, bytes calldata _input) external returns (address); } /** @@ -59,10 +59,10 @@ interface IContractDeployer { * @notice Interface for the contract that is used to simulate ETH on L2. */ interface IBaseToken { - /// @notice Allows the withdrawal of ETH to a given L1 receiver along with an additional message. - /// @param _l1Receiver The address on L1 to receive the withdrawn ETH. - /// @param _additionalData Additional message or data to be sent alongside the withdrawal. - function withdrawWithMessage(address _l1Receiver, bytes memory _additionalData) external payable; + /// @notice Allows the withdrawal of ETH to a given L1 receiver along with an additional message. + /// @param _l1Receiver The address on L1 to receive the withdrawn ETH. + /// @param _additionalData Additional message or data to be sent alongside the withdrawal. + function withdrawWithMessage(address _l1Receiver, bytes memory _additionalData) external payable; } uint160 constant SYSTEM_CONTRACTS_OFFSET = 0x8000; // 2^15 @@ -81,84 +81,83 @@ IBaseToken constant L2_BASE_TOKEN_ADDRESS = IBaseToken(address(SYSTEM_CONTRACTS_ * @notice Helper library for working with L2 contracts on L1. */ library L2ContractHelper { - /// @dev The prefix used to create CREATE2 addresses. - bytes32 private constant CREATE2_PREFIX = keccak256("zksyncCreate2"); + /// @dev The prefix used to create CREATE2 addresses. + bytes32 private constant CREATE2_PREFIX = keccak256("zksyncCreate2"); - /// @notice Sends L2 -> L1 arbitrary-long message through the system contract messenger. - /// @param _message Data to be sent to L1. - /// @return keccak256 hash of the sent message. - function sendMessageToL1(bytes memory _message) internal returns (bytes32) { - return L2_MESSENGER.sendToL1(_message); - } + /// @notice Sends L2 -> L1 arbitrary-long message through the system contract messenger. + /// @param _message Data to be sent to L1. + /// @return keccak256 hash of the sent message. + function sendMessageToL1(bytes memory _message) internal returns (bytes32) { + return L2_MESSENGER.sendToL1(_message); + } - /// @notice Computes the create2 address for a Layer 2 contract. - /// @param _sender The address of the contract creator. - /// @param _salt The salt value to use in the create2 address computation. - /// @param _bytecodeHash The contract bytecode hash. - /// @param _constructorInputHash The keccak256 hash of the constructor input data. - /// @return The create2 address of the contract. - /// NOTE: L2 create2 derivation is different from L1 derivation! - function computeCreate2Address( - address _sender, - bytes32 _salt, - bytes32 _bytecodeHash, - bytes32 _constructorInputHash - ) internal pure returns (address) { - bytes32 senderBytes = bytes32(uint256(uint160(_sender))); - bytes32 data = keccak256( - // solhint-disable-next-line func-named-parameters - bytes.concat(CREATE2_PREFIX, senderBytes, _salt, _bytecodeHash, _constructorInputHash) - ); + /// @notice Computes the create2 address for a Layer 2 contract. + /// @param _sender The address of the contract creator. + /// @param _salt The salt value to use in the create2 address computation. + /// @param _bytecodeHash The contract bytecode hash. + /// @param _constructorInputHash The keccak256 hash of the constructor input data. + /// @return The create2 address of the contract. + /// NOTE: L2 create2 derivation is different from L1 derivation! + function computeCreate2Address(address _sender, bytes32 _salt, bytes32 _bytecodeHash, bytes32 _constructorInputHash) + internal + pure + returns (address) + { + bytes32 senderBytes = bytes32(uint256(uint160(_sender))); + bytes32 data = keccak256( + // solhint-disable-next-line func-named-parameters + bytes.concat(CREATE2_PREFIX, senderBytes, _salt, _bytecodeHash, _constructorInputHash) + ); - return address(uint160(uint256(data))); - } + return address(uint160(uint256(data))); + } } /// @notice Structure used to represent a zkSync transaction. struct Transaction { - // The type of the transaction. - uint256 txType; - // The caller. - uint256 from; - // The callee. - uint256 to; - // The gasLimit to pass with the transaction. - // It has the same meaning as Ethereum's gasLimit. - uint256 gasLimit; - // The maximum amount of gas the user is willing to pay for a byte of pubdata. - uint256 gasPerPubdataByteLimit; - // The maximum fee per gas that the user is willing to pay. - // It is akin to EIP1559's maxFeePerGas. - uint256 maxFeePerGas; - // The maximum priority fee per gas that the user is willing to pay. - // It is akin to EIP1559's maxPriorityFeePerGas. - uint256 maxPriorityFeePerGas; - // The transaction's paymaster. If there is no paymaster, it is equal to 0. - uint256 paymaster; - // The nonce of the transaction. - uint256 nonce; - // The value to pass with the transaction. - uint256 value; - // In the future, we might want to add some - // new fields to the struct. The `txData` struct - // is to be passed to account and any changes to its structure - // would mean a breaking change to these accounts. In order to prevent this, - // we should keep some fields as "reserved". - // It is also recommended that their length is fixed, since - // it would allow easier proof integration (in case we will need - // some special circuit for preprocessing transactions). - uint256[4] reserved; - // The transaction's calldata. - bytes data; - // The signature of the transaction. - bytes signature; - // The properly formatted hashes of bytecodes that must be published on L1 - // with the inclusion of this transaction. Note, that a bytecode has been published - // before, the user won't pay fees for its republishing. - bytes32[] factoryDeps; - // The input to the paymaster. - bytes paymasterInput; - // Reserved dynamic type for the future use-case. Using it should be avoided, - // But it is still here, just in case we want to enable some additional functionality. - bytes reservedDynamic; + // The type of the transaction. + uint256 txType; + // The caller. + uint256 from; + // The callee. + uint256 to; + // The gasLimit to pass with the transaction. + // It has the same meaning as Ethereum's gasLimit. + uint256 gasLimit; + // The maximum amount of gas the user is willing to pay for a byte of pubdata. + uint256 gasPerPubdataByteLimit; + // The maximum fee per gas that the user is willing to pay. + // It is akin to EIP1559's maxFeePerGas. + uint256 maxFeePerGas; + // The maximum priority fee per gas that the user is willing to pay. + // It is akin to EIP1559's maxPriorityFeePerGas. + uint256 maxPriorityFeePerGas; + // The transaction's paymaster. If there is no paymaster, it is equal to 0. + uint256 paymaster; + // The nonce of the transaction. + uint256 nonce; + // The value to pass with the transaction. + uint256 value; + // In the future, we might want to add some + // new fields to the struct. The `txData` struct + // is to be passed to account and any changes to its structure + // would mean a breaking change to these accounts. In order to prevent this, + // we should keep some fields as "reserved". + // It is also recommended that their length is fixed, since + // it would allow easier proof integration (in case we will need + // some special circuit for preprocessing transactions). + uint256[4] reserved; + // The transaction's calldata. + bytes data; + // The signature of the transaction. + bytes signature; + // The properly formatted hashes of bytecodes that must be published on L1 + // with the inclusion of this transaction. Note, that a bytecode has been published + // before, the user won't pay fees for its republishing. + bytes32[] factoryDeps; + // The input to the paymaster. + bytes paymasterInput; + // Reserved dynamic type for the future use-case. Using it should be avoided, + // But it is still here, just in case we want to enable some additional functionality. + bytes reservedDynamic; } diff --git a/test/MultiClaimsHatter.t.sol b/test/MultiClaimsHatter.t.sol index e350e18..423217f 100644 --- a/test/MultiClaimsHatter.t.sol +++ b/test/MultiClaimsHatter.t.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.19; +import { HatsModule } from "hats-module/HatsModule.sol"; import { Test, console2, Vm } from "forge-std/Test.sol"; import { MultiClaimsHatter, @@ -9,11 +10,11 @@ import { MultiClaimsHatter_NotAdminOfHat, MultiClaimsHatter_NotExplicitlyEligible } from "../src/MultiClaimsHatter.sol"; -import {IHats} from "hats-module/interfaces/IHatsModule.sol"; -import {Hats} from "hats-protocol/Hats.sol"; +import { IHats } from "hats-module/interfaces/IHatsModule.sol"; +import { Hats } from "hats-protocol/Hats.sol"; import { DeployImplementation } from "../script/MultiClaimsHatter.s.sol"; import { TestEligibilityAlwaysEligible, TestEligibilityAlwaysNotEligible } from "./utils/TestModules.sol"; -import { MultiClaimsHatterFactory} from "src/MultiClaimsHatterFactory.sol"; +import { MultiClaimsHatterFactory } from "src/MultiClaimsHatterFactory.sol"; contract Setup is DeployImplementation, Test { uint256 public fork; @@ -22,7 +23,7 @@ contract Setup is DeployImplementation, Test { // Deploy hats string internal constant x = "Hats Protocol v1"; string internal constant y = ""; - IHats public HATS = new Hats{salt: bytes32(abi.encode(0x4a75))}(x, y); // v1.hatsprotocol.eth + IHats public HATS = new Hats{ salt: bytes32(abi.encode(0x4a75)) }(x, y); // v1.hatsprotocol.eth MultiClaimsHatter public instance; uint256 public tophat_x; @@ -59,7 +60,7 @@ contract Setup is DeployImplementation, Test { MultiClaimsHatterFactory factory = new MultiClaimsHatterFactory(); // deploy the instance vm.prank(dao); - return MultiClaimsHatter(factory.deployMultiClaimsHatter(0, address(HATS), initData, saltNonce)); + return MultiClaimsHatter(factory.deployModule(0, address(HATS), initData, saltNonce)); } function setUp() public virtual { @@ -152,10 +153,10 @@ contract TestDeployInstance_WithoutInitialHats is DeployInstance_WithoutInitialH } // Returns nothing - // function test_reverts_initialization() public { - // vm.expectRevert("Initializable: contract is already initialized"); - // instance.setUp(""); - // } + function test_reverts_initialization() public { + vm.expectRevert(HatsModule.AlreadyInitialized.selector); + instance.setUp(""); + } function test_reverts_claimHat() public { vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimable.selector, hat_x_1_1)); @@ -344,8 +345,8 @@ contract DeployInstance_WithInitialHats is Setup { function setUp() public virtual override { super.setUp(); - address alwaysEligibleModule = address(new TestEligibilityAlwaysEligible("test", address(0), 0)); - address alwaysNotEligibleModule = address(new TestEligibilityAlwaysNotEligible("test", address(0), 0)); + address alwaysEligibleModule = address(new TestEligibilityAlwaysEligible("test", address(0), 0)); + address alwaysNotEligibleModule = address(new TestEligibilityAlwaysNotEligible("test", address(0), 0)); vm.startPrank(dao); HATS.changeHatEligibility(hat_x_1_1, alwaysEligibleModule); @@ -389,10 +390,10 @@ contract TestDeployInstance_WithInitialHats is DeployInstance_WithInitialHats { assertEq(instance.wearsAdmin(HATS.getNextId(hat_x_2)), false); } - // function test_reverts_initialization() public { - // vm.expectRevert("Initializable: contract is already initialized"); - // instance.setUp(""); - // } + function test_reverts_initialization() public { + vm.expectRevert(HatsModule.AlreadyInitialized.selector); + instance.setUp(""); + } function test_reverts_claimHatFor() public { vm.expectRevert(abi.encodePacked(MultiClaimsHatter_HatNotClaimableFor.selector, hat_x_1_1)); @@ -498,21 +499,25 @@ contract TestClaimHat_WithInitialHats is ClaimHat_WithInitialHats { instance.claimHats(inputHats); } } -// +// // /*////////////////////////////////////////////////////////////////////////////// // Scenario 3 - Single Batch eligibility creation and hats registration // ////////////////////////////////////////////////////////////////////////////*/ -// +// + contract DeployInstance_BatchModuleCreationAndRegistration is Setup { - function getHatsModuleAddress(uint256 _hatId, address _hat, bytes calldata _initData, uint256 _saltNonce) internal returns (address addr) { + function getHatsModuleAddress(uint256 _hatId, address _hat, bytes calldata _initData, uint256 _saltNonce) + internal + returns (address addr) + { bytes memory args = abi.encodePacked(_hatId, _hat, _initData); bytes32 salt = keccak256(abi.encodePacked(args, block.chainid, _saltNonce)); bytes memory bytecode = type(MultiClaimsHatter).creationCode; assembly { addr := create2(0, add(bytecode, 32), mload(bytecode), salt) } - } + function setUp() public virtual override { super.setUp(); @@ -524,20 +529,19 @@ contract DeployInstance_BatchModuleCreationAndRegistration is Setup { address alwaysNotEligibleModule = address(new TestEligibilityAlwaysNotEligible("test", address(0), 0)); vm.startPrank(dao); - uint256[] memory myArray = new uint256[](4); - myArray[0] = hat_x_1_1; - myArray[1] = hat_x_1_1_1; - myArray[2] = hat_x_1_1_1_1; - myArray[3] = hat_x_2; - - MultiClaimsHatter.ClaimType[] memory myArray1 = new MultiClaimsHatter.ClaimType[](4); - myArray1[0] = MultiClaimsHatter.ClaimType.Claimable; + uint256[] memory myArray = new uint256[](4); + myArray[0] = hat_x_1_1; + myArray[1] = hat_x_1_1_1; + myArray[2] = hat_x_1_1_1_1; + myArray[3] = hat_x_2; + + MultiClaimsHatter.ClaimType[] memory myArray1 = new MultiClaimsHatter.ClaimType[](4); + myArray1[0] = MultiClaimsHatter.ClaimType.Claimable; myArray1[1] = MultiClaimsHatter.ClaimType.ClaimableFor; myArray1[2] = MultiClaimsHatter.ClaimType.Claimable; myArray1[3] = MultiClaimsHatter.ClaimType.NotClaimable; - - instance.setHatsClaimability(myArray, myArray1); + instance.setHatsClaimability(myArray, myArray1); vm.stopPrank(); vm.startPrank(dao); @@ -667,7 +671,7 @@ contract TestClaimHat_BatchModuleCreationAndRegistration is ClaimHat_BatchModule // /*////////////////////////////////////////////////////////////////////////////// // Scenario 4 - Multi Batch eligibility creation and hats registration // ////////////////////////////////////////////////////////////////////////////*/ -// +// contract DeployInstance_BatchMultiModuleCreationAndRegistration is Setup { function setUp() public virtual override { super.setUp(); @@ -681,24 +685,22 @@ contract DeployInstance_BatchMultiModuleCreationAndRegistration is Setup { // Batch multi modules creation and hats registration vm.startPrank(dao); - uint256[] memory myArray = new uint256[](4); - myArray[0] = hat_x_1_1; - myArray[1] = hat_x_1_1_1; - myArray[2] = hat_x_1_1_1_1; - myArray[3] = hat_x_2; - - MultiClaimsHatter.ClaimType[] memory myArray1 = new MultiClaimsHatter.ClaimType[](4); - myArray1[0] = MultiClaimsHatter.ClaimType.Claimable; + uint256[] memory myArray = new uint256[](4); + myArray[0] = hat_x_1_1; + myArray[1] = hat_x_1_1_1; + myArray[2] = hat_x_1_1_1_1; + myArray[3] = hat_x_2; + + MultiClaimsHatter.ClaimType[] memory myArray1 = new MultiClaimsHatter.ClaimType[](4); + myArray1[0] = MultiClaimsHatter.ClaimType.Claimable; myArray1[1] = MultiClaimsHatter.ClaimType.ClaimableFor; myArray1[2] = MultiClaimsHatter.ClaimType.Claimable; myArray1[3] = MultiClaimsHatter.ClaimType.NotClaimable; - - instance.setHatsClaimability(myArray, myArray1); - + instance.setHatsClaimability(myArray, myArray1); HATS.changeHatEligibility(hat_x_1_1, alwaysEligibleModule); - HATS.changeHatEligibility(hat_x_1_1_1, alwaysEligibleModule); + HATS.changeHatEligibility(hat_x_1_1_1, alwaysEligibleModule); HATS.changeHatEligibility(hat_x_1_1_1_1, alwaysNotEligibleModule); HATS.changeHatEligibility(hat_x_2, alwaysEligibleModule); vm.stopPrank(); @@ -886,16 +888,17 @@ contract TestClaimHat_BatchClaimHatsSetup is ClaimHats_BatchClaimHatsSetup { assertEq(HATS.isWearerOfHat(wearer, hat_x_1_1_1_1), true); } } -// +// // /*////////////////////////////////////////////////////////////// -// Scenario 6 - Multi claiming for test +// Scenario 6 - Multi claiming for test // //////////////////////////////////////////////////////////////*/ -// +// + contract DeployInstance_BatchClaimHatsForSetup is Setup { function setUp() public virtual override { super.setUp(); - address alwaysEligibleModule = address(new TestEligibilityAlwaysEligible("test", address(0), 0)); + address alwaysEligibleModule = address(new TestEligibilityAlwaysEligible("test", address(0), 0)); vm.startPrank(dao); HATS.changeHatEligibility(hat_x_1_1, alwaysEligibleModule); diff --git a/test/MultiClaimsHatterFactory.t.sol b/test/MultiClaimsHatterFactory.t.sol index d9de42b..d1f8fc4 100644 --- a/test/MultiClaimsHatterFactory.t.sol +++ b/test/MultiClaimsHatterFactory.t.sol @@ -13,15 +13,14 @@ contract TestMultiClaimsHatterFactory is Test { } function testFuzz_deployMultiClaimsHatter(uint256 _hatId, address _hat, uint256 _saltNonce) public { - address instance = factory.deployMultiClaimsHatter(_hatId, _hat, "", _saltNonce); + address instance = factory.deployModule(_hatId, _hat, "", _saltNonce); address expectedAddress = factory.getAddress(_hatId, _hat, "", _saltNonce); assertEq(instance, expectedAddress); } function testFuzz_deployMultiClaimsHatterTwice(uint256 _hatId, address _hat, uint256 _saltNonce) public { - factory.deployMultiClaimsHatter(_hatId, _hat, "", _saltNonce); + factory.deployModule(_hatId, _hat, "", _saltNonce); vm.expectRevert(bytes("Code hash is non-zero")); - factory.deployMultiClaimsHatter(_hatId, _hat, "", _saltNonce); + factory.deployModule(_hatId, _hat, "", _saltNonce); } - } From 11b18760bddd06502336e165c20bed94ae28975c Mon Sep 17 00:00:00 2001 From: keating Date: Tue, 23 Jul 2024 15:41:47 -0400 Subject: [PATCH 15/18] More cleanup --- lib/hats-module | 2 +- src/MultiClaimsHatterFactory.sol | 9 --------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/lib/hats-module b/lib/hats-module index 58dc6bd..7c62e0a 160000 --- a/lib/hats-module +++ b/lib/hats-module @@ -1 +1 @@ -Subproject commit 58dc6bd4941a78080c53f009536cf0adf346a14b +Subproject commit 7c62e0ab556d2ce969fb2e9bbd8b26deec0d7380 diff --git a/src/MultiClaimsHatterFactory.sol b/src/MultiClaimsHatterFactory.sol index 91ac2b1..26d8f4f 100644 --- a/src/MultiClaimsHatterFactory.sol +++ b/src/MultiClaimsHatterFactory.sol @@ -3,7 +3,6 @@ pragma solidity ^0.8.19; import { IHatsModuleFactory } from "hats-module/interfaces/IHatsModuleFactory.sol"; import { MultiClaimsHatter } from "./MultiClaimsHatter.sol"; -import { console2 } from "forge-std/Test.sol"; import { L2ContractHelper } from "./lib/L2ContractHelper.sol"; contract MultiClaimsHatterFactory is IHatsModuleFactory { @@ -11,18 +10,10 @@ contract MultiClaimsHatterFactory is IHatsModuleFactory { /// @dev Bytecode hash can be found in zksolc/MultiClaimsHatter.sol/MultiClaimsHatter.json under the hash key. bytes32 constant BYTECODE_HASH = 0x0100041dbb312c575f637f3b4ffbdf9beada863fa830a3f771b06df5a8a5c287; - event ModuleDeployed( - address implementation, address instance, uint256 hatId, bytes otherImmutableArgs, bytes initData, uint256 saltNonce - ); - function deployModule(uint256 _hatId, address _hat, bytes calldata _initData, uint256 _saltNonce) external returns (address) { - console2.logBytes(_initData); - console2.logUint(_hatId); - console2.logUint(_saltNonce); - console2.logAddress(_hat); bytes memory saltArgs = abi.encodePacked(VERSION, _hatId, _hat, _initData); bytes32 salt = _calculateSalt(saltArgs, _saltNonce); // TODO: Test situate where contract exitsts From 7cd2d7a60ac9ab94e283d1824fa9d11c70084bde Mon Sep 17 00:00:00 2001 From: keating Date: Tue, 23 Jul 2024 15:46:30 -0400 Subject: [PATCH 16/18] Another deployment --- .../MultiClaimsHatterFactory.json | 10 +++++----- script/DeployMultiClaimsHatter.ts | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/deployments-zk/zkSyncLocal/src/MultiClaimsHatterFactory.sol/MultiClaimsHatterFactory.json b/deployments-zk/zkSyncLocal/src/MultiClaimsHatterFactory.sol/MultiClaimsHatterFactory.json index 2f9dc5a..3e1cf72 100644 --- a/deployments-zk/zkSyncLocal/src/MultiClaimsHatterFactory.sol/MultiClaimsHatterFactory.json +++ b/deployments-zk/zkSyncLocal/src/MultiClaimsHatterFactory.sol/MultiClaimsHatterFactory.json @@ -81,7 +81,7 @@ "type": "uint256" } ], - "name": "deployMultiClaimsHatter", + "name": "deployModule", "outputs": [ { "internalType": "address", @@ -127,17 +127,17 @@ "type": "function" } ], - "bytecode": "0x0003000000000002000e00000000000200000000030100190000006003300270000000f503300197000200000031035500010000000103550000008004000039000000400040043f0000000102200190000001220000c13d000000040230008c0000014a0000413d000000000201043b000000e002200270000000f70420009c0000012a0000613d000000f80420009c0000013e0000613d000000f90220009c0000014a0000c13d0000000002000416000000000202004b0000014a0000c13d000000040230008a000000800220008c0000014a0000413d0000000402100370000000000802043b0000002402100370000000000902043b000000fa0290009c0000014a0000213d0000004402100370000000000202043b000000fb0420009c0000014a0000213d0000002304200039000000fc05000041000000000634004b00000000060000190000000006058019000000fc04400197000000000704004b0000000005008019000000fc0440009c000000000506c019000000000405004b0000014a0000c13d0000000404200039000000000541034f000000000a05043b000000fb05a0009c0000014a0000213d0000000002a200190000002402200039000000000232004b0000014a0000213d0000006402100370000000000b02043b000000c002000039000000400020043f0000000c07000039000000800070043f000000fd02000041000000a00020043f000000e00020043f000000ec0080043f00000060029002100000010c0020043f0000002002400039000000000121034f0000001f02a0018f0000000503a00272000000540000613d00000000040000190000000505400210000000000651034f000000000606043b000001200550003900000000006504350000000104400039000000000534004b0000004c0000413d000000000402004b000000630000613d0000000503300210000000000131034f00000003022002100000012003300039000000000403043300000000042401cf000000000424022f000000000101043b0000010002200089000000000121022f00000000012101cf000000000141019f00000000001304350000012001a0003900000000000104350000013f01a00039000000200200008a000000000321016f0000004005a00039000000c00050043f000000fe013000410000010c0110009c000001980000a13d000c0000000b001d000d0000000a001d000e00000002001d000800000007001d000600000009001d000700000008001d000000400030043f000b00000003001d000000200430003900000000010000190000000002410019000000e003100039000000000303043300000000003204350000002001100039000000000251004b000000770000413d000900000004001d0000000001540019000000000001043500000100010000410000000000100439000000f5010000410000000002000414000000f50320009c0000000002018019000000c00120021000000101011001c70000800b02000039000a00000005001d03cd03c80000040f0000000102200190000003640000613d0000000b050000290000000a02500029000000000101043b00000040032000390000000c040000290000000000430435000000200220003900000000001204350000000d0200002900000080012000390000000000150435000000bf012000390000000e0210017f0000000001520019000000000221004b00000000020000190000000102004039000000fb0310009c000001980000213d0000000102200190000001980000c13d000000400010043f000000f5010000410000000903000029000000f50230009c000000000301801900000040023002100000000003050433000000f50430009c00000000030180190000006003300210000000000223019f0000000003000414000000f50430009c0000000003018019000000c001300210000000000121019f00000102011001c7000080100200003903cd03c80000040f00000001022001900000014a0000613d000000000101043b000d00000001001d000000400300043d000001030130009c0000000804000029000001980000213d0000004001300039000000400010043f0000002001300039000000fd0200004100000000002104350000000000430435000000400100043d000000200210003900000060040000390000000000420435000000000403043300000080051000390000000000450435000000a005100039000000000604004b000000d60000613d000000000600001900000000075600190000002006600039000000000836001900000000080804330000000000870435000000000746004b000000cf0000413d000000000354001900000000000304350000006003100039000000070500002900000000005304350000000603000029000000fa03300197000000400510003900000000003504350000009f034000390000000e0330017f0000000000310435000000bf034000390000000e0430017f0000000003140019000000000443004b00000000040000190000000104004039000000fb0530009c000001980000213d0000000104400190000001980000c13d000000400030043f000000f503000041000000f50420009c000000000203801900000040022002100000000001010433000000f50410009c00000000010380190000006001100210000000000121019f0000000002000414000000f50420009c0000000002038019000000c002200210000000000112019f00000102011001c7000080100200003903cd03c80000040f00000001022001900000014a0000613d000000000101043b000000400200043d000000a003200039000000000013043500000080012000390000010d03000041000000000031043500000060012000390000000d03000029000000000031043500000040012000390000000003000410000000000031043500000020012000390000010e030000410000000000310435000000a00300003900000000003204350000010f0320009c000001980000213d000000c003200039000e00000003001d000000400030043f000000000202043303cd03ad0000040f000000fa011001970000000e030000290000000000130435000000f501000041000000f50230009c000000000301801900000040013002100000010b011001c7000003ce0001042e0000000001000416000000000101004b0000014a0000c13d000000200100003900000100001004430000012000000443000000f601000041000003ce0001042e0000000001000416000000000101004b0000014a0000c13d03cd03880000040f0000002002000039000000400300043d000e00000003001d000000000223043603cd03990000040f0000000e040000290000000001410049000000f502000041000000f50310009c0000000001028019000000f50340009c000000000402801900000040024002100000006001100210000000000121019f000003ce0001042e0000000002000416000000000202004b0000014a0000c13d000000040230008a000000800220008c0000014a0000413d0000000402100370000000000902043b0000002402100370000000000d02043b000000fa02d0009c0000014c0000a13d0000000001000019000003cf000104300000004402100370000000000202043b000000fb0420009c0000014a0000213d0000002304200039000000fc05000041000000000634004b00000000060000190000000006058019000000fc04400197000000000704004b0000000005008019000000fc0440009c000000000506c019000000000405004b0000014a0000c13d0000000404200039000000000541034f000000000605043b000000fb0560009c0000014a0000213d000000240b2000390000000002b60019000000000232004b0000014a0000213d0000006402100370000000000502043b000000c00a0000390000004000a0043f0000000c0e0000390000008000e0043f000000fd02000041000000a00020043f000000e00020043f000000ec0090043f0000002002400039000000000121034f0000001f0760018f000000600cd002100000010c00c0043f00000005086002720000017f0000613d00000000020000190000000503200210000000000431034f000000000404043b000001200330003900000000004304350000000102200039000000000382004b000001770000413d000000000207004b0000018e0000613d0000000502800210000000000121034f00000003037002100000012002200039000000000402043300000000043401cf000000000434022f000000000101043b0000010003300089000000000131022f00000000013101cf000000000141019f0000000000120435000001200160003900000000000104350000013f01600039000000200200008a000000000321016f000000400f600039000000c000f0043f000000fe01300041000000ff0110009c0000019e0000813d000001100100004100000000001004350000004101000039000000040010043f0000011101000041000003cf0001043000080000000e001d00060000000d001d00020000000c001d00050000000b001d00010000000a001d000e00000002001d000700000009001d000400000008001d000300000007001d000c00000005001d000d00000006001d000000400030043f000b00000003001d000000200430003900000000010000190000000002410019000000e0031000390000000003030433000000000032043500000020011000390000000002f1004b000001ad0000413d000900000004001d0000000001f40019000000000001043500000100010000410000000000100439000000f5010000410000000002000414000000f50320009c0000000002018019000000c00120021000000101011001c70000800b02000039000a0000000f001d03cd03c80000040f0000000102200190000003640000613d0000000b050000290000000a02500029000000000101043b00000040032000390000000c040000290000000000430435000000200220003900000000001204350000000d0200002900000080012000390000000000150435000000bf012000390000000e0210017f0000000001520019000000000221004b00000000020000190000000102004039000000fb0310009c000001980000213d0000000102200190000001980000c13d000000400010043f000000f5010000410000000903000029000000f50230009c000000000301801900000040023002100000000003050433000000f50430009c00000000030180190000006003300210000000000223019f0000000003000414000000f50430009c0000000003018019000000c001300210000000000121019f00000102011001c7000080100200003903cd03c80000040f00000001022001900000014a0000613d000000000101043b000000400300043d000001030230009c0000000805000029000001980000213d0000004002300039000000400020043f0000002002300039000000fd0400004100000000004204350000000000530435000000400200043d000001040420009c000001980000213d0000008405200039000000600400003900000000004504350000002405200039000001050600004100000000006504350000000005030433000000e40620003900000000005604350000010406200039000000000705004b000002100000613d000000000700001900000000086700190000002007700039000000000937001900000000090904330000000000980435000000000857004b000002090000413d00000000036500190000000000030435000000c403200039000000070600002900000000006304350000000603000029000000fa03300197000000a40620003900000000003604350000001f035000390000000e0330017f0000008005300039000000640620003900000000070004140000000000560435000000440520003900000000004504350000010604000041000000000042043500000004042000390000000000140435000000f501000041000000f50420009c000000000201801900000040022002100000010403300039000000f50430009c00000000030180190000006003300210000000000223019f000000f50370009c0000000007018019000000c001700210000000000121019f00000102011001c7000080060200003903cd03c30000040f00000001022001900000023d0000613d000000000101043b000000000201004b000002670000c13d00000002010003670000000002000031000002420000013d000200000001035500000000020100190000006002200270000000f50020019d000000f502200197000000400300043d0000001f0420018f00000005052002720000024f0000613d000000000600001900000005076002100000000008730019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000002470000413d000000000604004b0000025e0000613d0000000505500210000000000151034f00000000055300190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000000f501000041000000f50430009c0000000003018019000000f50420009c000000000201801900000060012002100000004002300210000000000112019f000003cf0001043000000107020000410000000000200439000000fa01100197000b00000001001d0000000400100443000000f5010000410000000002000414000000f50320009c0000000002018019000000c00120021000000108011001c7000080020200003903cd03c80000040f0000000102200190000003640000613d000000000101043b000000000101004b0000000d0200002900000005030000290000014a0000613d000000400400043d0000002401400039000000000021043500000109010000410000000001140436000900000001001d000000040140003900000020020000390000000000210435000a00000004001d000000440140003900000001023003670000000406000029000000000306004b000002930000613d000000000300001900000005043002100000000005410019000000000442034f000000000404043b00000000004504350000000103300039000000000463004b0000028b0000413d000000030300006b000002a40000613d00000004030000290000000503300210000000000232034f000000000331001900000003040000290000000304400210000000000503043300000000054501cf000000000545022f000000000202043b0000010004400089000000000242022f00000000024201cf000000000252019f00000000002304350000000d01100029000000000001043500000000010004140000000b02000029000000040220008c000002c50000613d0000000d020000290000001f022000390000000e0220017f000000f5030000410000000a05000029000000f50450009c0000000004030019000000000405401900000040044002100000004402200039000000f50520009c00000000020380190000006002200210000000000224019f000000f50410009c0000000001038019000000c001100210000000000121019f0000000b0200002903cd03c30000040f00000000030100190000006003300270000000f50030019d000000f50330019700020000000103550000000102200190000003650000613d0000000a01000029000000fb0110009c000000040600002900000005010000290000000202000029000001980000213d0000000a03000029000000400030043f0000000904000029000000000024043500000034023000390000000101100367000000000306004b000002dc0000613d000000000300001900000005043002100000000005420019000000000441034f000000000404043b00000000004504350000000103300039000000000463004b000002d40000413d000000030300006b000002ed0000613d00000004030000290000000503300210000000000431034f000000000332001900000003050000290000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f00000000004304350000000d030000290000000002320019000000000002043500000014023000390000000a04000029000000000024043500000053023000390000000e0220017f0000000002240019000000000342004b00000000030000190000000103004039000000fb0420009c00000007040000290000000105000029000001980000213d0000000103300190000001980000c13d000000400020043f000000600320003900000000005304350000004003200039000000000043043500000020032000390000000b04000029000000000043043500000000004204350000000a080000290000000003080433000000c0042000390000000000340435000000e004200039000000000503004b000003170000613d000000000500001900000000064500190000002005500039000000000785001900000000070704330000000000760435000000000635004b000003100000413d000000000543001900000000000504350000001f033000390000000e0330017f00000000034300190000000004230049000000800520003900000000004504350000000d0400002900000000034304360000000407000029000000000407004b0000032d0000613d000000000400001900000005054002100000000006530019000000000551034f000000000505043b00000000005604350000000104400039000000000574004b000003250000413d000000030400006b0000033e0000613d00000004040000290000000504400210000000000141034f000000000443001900000003050000290000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000000d0400002900000000014300190000000000010435000000a0012000390000000c0500002900000000005104350000001f014000390000000e0110017f00000000012100490000000001310019000000f504000041000000f50320009c00000000020480190000004002200210000000f50310009c00000000010480190000006001100210000000000121019f0000000002000414000000f50320009c0000000002048019000000c002200210000000000112019f00000102011001c70000800d0200003900000001030000390000010a0400004103cd03c30000040f00000001012001900000014a0000613d000000400100043d0000000b020000290000000000210435000000f50210009c000000f50100804100000040011002100000010b011001c7000003ce0001042e000000000001042f000000400200043d0000001f0430018f0000000505300272000003720000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000036a0000413d000000000604004b000003810000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000000f501000041000000f50420009c000000000201801900000040012002100000006002300210000000000121019f000003cf00010430000000400100043d000001120210009c000003930000813d0000004002100039000000400020043f0000002002100039000000fd0300004100000000003204350000000c020000390000000000210435000000000001042d000001100100004100000000001004350000004101000039000000040010043f0000011101000041000003cf0001043000000000030104330000000002320436000000000403004b000003a50000613d000000000400001900000000052400190000002004400039000000000614001900000000060604330000000000650435000000000534004b0000039e0000413d000000000123001900000000000104350000001f01300039000000200300008a000000000131016f0000000001120019000000000001042d000000000001042f000000f503000041000000f50410009c00000000010380190000004001100210000000f50420009c00000000020380190000006002200210000000000112019f0000000002000414000000f50420009c0000000002038019000000c002200210000000000112019f00000102011001c7000080100200003903cd03c80000040f0000000102200190000003c10000613d000000000101043b000000000001042d0000000001000019000003cf00010430000003c6002104210000000102000039000000000001042d0000000002000019000000000001042d000003cb002104230000000102000039000000000001042d0000000002000019000000000001042d000003cd00000432000003ce0001042e000003cf00010430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff000000020000000000000000000000000000004000000100000000000000000000000000000000000000000000000000000000000000000000000000ffa1ad7400000000000000000000000000000000000000000000000000000000bd42f5f5000000000000000000000000000000000000000000000000000000004f1c32ad000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffffff8000000000000000000000000000000000000000000000000000000000000000302e362e302d7a6b73796e630000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff00000000000000c09a8a0592ac89c5ad3bc6df8224c17b485976f597df104ee20d0df415241f670b02000002000000000000000000000000000000040000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffbf000000000000000000000000000000000000000000000000ffffffffffffff7b01000441b59369e9a03c764b36f8d8e7a385cda8a1480a571f75b5dba6c309703cda33511d41a8a5431b1770c5bc0ddd62e1cd30555d16659b89c0d60f4f9f571806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b830200000200000000000000000000000000000024000000000000000000000000a4f9edbf00000000000000000000000000000000000000000000000000000000cb6d9015e5a60155120ea0e2a88ede5648c21029e7a4214c3f44441d4f2ebd210000000000000000000000000000000000000020000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff00000000000000bf0100041dbb312c575f637f3b4ffbdf9beada863fa830a3f771b06df5a8a5c2872020dba91b30cc0006188af794c2fb30dd8520db7e2c088b7fc7c103c00ca494000000000000000000000000000000000000000000000000ffffffffffffff3f4e487b71000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffc00000000000000000000000000000000000000000000000000000000000000000bff785244969fbe67d6bebc759522231db77c169f06b8fe5e6dc852b492b147c", + "bytecode": "0x0003000000000002000e00000000000200000000030100190000006003300270000000f503300197000200000031035500010000000103550000008004000039000000400040043f0000000102200190000001220000c13d000000040230008c0000014a0000413d000000000201043b000000e002200270000000f70420009c0000012a0000613d000000f80420009c0000013e0000613d000000f90220009c0000014a0000c13d0000000002000416000000000202004b0000014a0000c13d000000040230008a000000800220008c0000014a0000413d0000000402100370000000000802043b0000002402100370000000000902043b000000fa0290009c0000014a0000213d0000004402100370000000000202043b000000fb0420009c0000014a0000213d0000002304200039000000fc05000041000000000634004b00000000060000190000000006058019000000fc04400197000000000704004b0000000005008019000000fc0440009c000000000506c019000000000405004b0000014a0000c13d0000000404200039000000000541034f000000000a05043b000000fb05a0009c0000014a0000213d0000000002a200190000002402200039000000000232004b0000014a0000213d0000006402100370000000000b02043b000000c002000039000000400020043f0000000c07000039000000800070043f000000fd02000041000000a00020043f000000e00020043f000000ec0080043f00000060029002100000010c0020043f0000002002400039000000000121034f0000001f02a0018f0000000503a00272000000540000613d00000000040000190000000505400210000000000651034f000000000606043b000001200550003900000000006504350000000104400039000000000534004b0000004c0000413d000000000402004b000000630000613d0000000503300210000000000131034f00000003022002100000012003300039000000000403043300000000042401cf000000000424022f000000000101043b0000010002200089000000000121022f00000000012101cf000000000141019f00000000001304350000012001a0003900000000000104350000013f01a00039000000200200008a000000000321016f0000004005a00039000000c00050043f000000fe013000410000010c0110009c000001980000a13d000c0000000b001d000d0000000a001d000e00000002001d000800000007001d000600000009001d000700000008001d000000400030043f000b00000003001d000000200430003900000000010000190000000002410019000000e003100039000000000303043300000000003204350000002001100039000000000251004b000000770000413d000900000004001d0000000001540019000000000001043500000100010000410000000000100439000000f5010000410000000002000414000000f50320009c0000000002018019000000c00120021000000101011001c70000800b02000039000a00000005001d03cd03c80000040f0000000102200190000003640000613d0000000b050000290000000a02500029000000000101043b00000040032000390000000c040000290000000000430435000000200220003900000000001204350000000d0200002900000080012000390000000000150435000000bf012000390000000e0210017f0000000001520019000000000221004b00000000020000190000000102004039000000fb0310009c000001980000213d0000000102200190000001980000c13d000000400010043f000000f5010000410000000903000029000000f50230009c000000000301801900000040023002100000000003050433000000f50430009c00000000030180190000006003300210000000000223019f0000000003000414000000f50430009c0000000003018019000000c001300210000000000121019f00000102011001c7000080100200003903cd03c80000040f00000001022001900000014a0000613d000000000101043b000d00000001001d000000400300043d000001030130009c0000000804000029000001980000213d0000004001300039000000400010043f0000002001300039000000fd0200004100000000002104350000000000430435000000400100043d000000200210003900000060040000390000000000420435000000000403043300000080051000390000000000450435000000a005100039000000000604004b000000d60000613d000000000600001900000000075600190000002006600039000000000836001900000000080804330000000000870435000000000746004b000000cf0000413d000000000354001900000000000304350000006003100039000000070500002900000000005304350000000603000029000000fa03300197000000400510003900000000003504350000009f034000390000000e0330017f0000000000310435000000bf034000390000000e0430017f0000000003140019000000000443004b00000000040000190000000104004039000000fb0530009c000001980000213d0000000104400190000001980000c13d000000400030043f000000f503000041000000f50420009c000000000203801900000040022002100000000001010433000000f50410009c00000000010380190000006001100210000000000121019f0000000002000414000000f50420009c0000000002038019000000c002200210000000000112019f00000102011001c7000080100200003903cd03c80000040f00000001022001900000014a0000613d000000000101043b000000400200043d000000a003200039000000000013043500000080012000390000010d03000041000000000031043500000060012000390000000d03000029000000000031043500000040012000390000000003000410000000000031043500000020012000390000010e030000410000000000310435000000a00300003900000000003204350000010f0320009c000001980000213d000000c003200039000e00000003001d000000400030043f000000000202043303cd03ad0000040f000000fa011001970000000e030000290000000000130435000000f501000041000000f50230009c000000000301801900000040013002100000010b011001c7000003ce0001042e0000000001000416000000000101004b0000014a0000c13d000000200100003900000100001004430000012000000443000000f601000041000003ce0001042e0000000001000416000000000101004b0000014a0000c13d03cd03880000040f0000002002000039000000400300043d000e00000003001d000000000223043603cd03990000040f0000000e040000290000000001410049000000f502000041000000f50310009c0000000001028019000000f50340009c000000000402801900000040024002100000006001100210000000000121019f000003ce0001042e0000000002000416000000000202004b0000014a0000c13d000000040230008a000000800220008c0000014a0000413d0000000402100370000000000902043b0000002402100370000000000d02043b000000fa02d0009c0000014c0000a13d0000000001000019000003cf000104300000004402100370000000000202043b000000fb0420009c0000014a0000213d0000002304200039000000fc05000041000000000634004b00000000060000190000000006058019000000fc04400197000000000704004b0000000005008019000000fc0440009c000000000506c019000000000405004b0000014a0000c13d0000000404200039000000000541034f000000000605043b000000fb0560009c0000014a0000213d000000240b2000390000000002b60019000000000232004b0000014a0000213d0000006402100370000000000502043b000000c00a0000390000004000a0043f0000000c0e0000390000008000e0043f000000fd02000041000000a00020043f000000e00020043f000000ec0090043f0000002002400039000000000121034f0000001f0760018f000000600cd002100000010c00c0043f00000005086002720000017f0000613d00000000020000190000000503200210000000000431034f000000000404043b000001200330003900000000004304350000000102200039000000000382004b000001770000413d000000000207004b0000018e0000613d0000000502800210000000000121034f00000003037002100000012002200039000000000402043300000000043401cf000000000434022f000000000101043b0000010003300089000000000131022f00000000013101cf000000000141019f0000000000120435000001200160003900000000000104350000013f01600039000000200200008a000000000321016f000000400f600039000000c000f0043f000000fe01300041000000ff0110009c0000019e0000813d000001100100004100000000001004350000004101000039000000040010043f0000011101000041000003cf0001043000080000000e001d00060000000d001d00020000000c001d00050000000b001d00010000000a001d000e00000002001d000700000009001d000400000008001d000300000007001d000c00000005001d000d00000006001d000000400030043f000b00000003001d000000200430003900000000010000190000000002410019000000e0031000390000000003030433000000000032043500000020011000390000000002f1004b000001ad0000413d000900000004001d0000000001f40019000000000001043500000100010000410000000000100439000000f5010000410000000002000414000000f50320009c0000000002018019000000c00120021000000101011001c70000800b02000039000a0000000f001d03cd03c80000040f0000000102200190000003640000613d0000000b050000290000000a02500029000000000101043b00000040032000390000000c040000290000000000430435000000200220003900000000001204350000000d0200002900000080012000390000000000150435000000bf012000390000000e0210017f0000000001520019000000000221004b00000000020000190000000102004039000000fb0310009c000001980000213d0000000102200190000001980000c13d000000400010043f000000f5010000410000000903000029000000f50230009c000000000301801900000040023002100000000003050433000000f50430009c00000000030180190000006003300210000000000223019f0000000003000414000000f50430009c0000000003018019000000c001300210000000000121019f00000102011001c7000080100200003903cd03c80000040f00000001022001900000014a0000613d000000000101043b000000400300043d000001030230009c0000000805000029000001980000213d0000004002300039000000400020043f0000002002300039000000fd0400004100000000004204350000000000530435000000400200043d000001040420009c000001980000213d0000008405200039000000600400003900000000004504350000002405200039000001050600004100000000006504350000000005030433000000e40620003900000000005604350000010406200039000000000705004b000002100000613d000000000700001900000000086700190000002007700039000000000937001900000000090904330000000000980435000000000857004b000002090000413d00000000036500190000000000030435000000c403200039000000070600002900000000006304350000000603000029000000fa03300197000000a40620003900000000003604350000001f035000390000000e0330017f0000008005300039000000640620003900000000070004140000000000560435000000440520003900000000004504350000010604000041000000000042043500000004042000390000000000140435000000f501000041000000f50420009c000000000201801900000040022002100000010403300039000000f50430009c00000000030180190000006003300210000000000223019f000000f50370009c0000000007018019000000c001700210000000000121019f00000102011001c7000080060200003903cd03c30000040f00000001022001900000023d0000613d000000000101043b000000000201004b000002670000c13d00000002010003670000000002000031000002420000013d000200000001035500000000020100190000006002200270000000f50020019d000000f502200197000000400300043d0000001f0420018f00000005052002720000024f0000613d000000000600001900000005076002100000000008730019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000002470000413d000000000604004b0000025e0000613d0000000505500210000000000151034f00000000055300190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000000f501000041000000f50430009c0000000003018019000000f50420009c000000000201801900000060012002100000004002300210000000000112019f000003cf0001043000000107020000410000000000200439000000fa01100197000b00000001001d0000000400100443000000f5010000410000000002000414000000f50320009c0000000002018019000000c00120021000000108011001c7000080020200003903cd03c80000040f0000000102200190000003640000613d000000000101043b000000000101004b0000000d0200002900000005030000290000014a0000613d000000400400043d0000002401400039000000000021043500000109010000410000000001140436000900000001001d000000040140003900000020020000390000000000210435000a00000004001d000000440140003900000001023003670000000406000029000000000306004b000002930000613d000000000300001900000005043002100000000005410019000000000442034f000000000404043b00000000004504350000000103300039000000000463004b0000028b0000413d000000030300006b000002a40000613d00000004030000290000000503300210000000000232034f000000000331001900000003040000290000000304400210000000000503043300000000054501cf000000000545022f000000000202043b0000010004400089000000000242022f00000000024201cf000000000252019f00000000002304350000000d01100029000000000001043500000000010004140000000b02000029000000040220008c000002c50000613d0000000d020000290000001f022000390000000e0220017f000000f5030000410000000a05000029000000f50450009c0000000004030019000000000405401900000040044002100000004402200039000000f50520009c00000000020380190000006002200210000000000224019f000000f50410009c0000000001038019000000c001100210000000000121019f0000000b0200002903cd03c30000040f00000000030100190000006003300270000000f50030019d000000f50330019700020000000103550000000102200190000003650000613d0000000a01000029000000fb0110009c000000040600002900000005010000290000000202000029000001980000213d0000000a03000029000000400030043f0000000904000029000000000024043500000034023000390000000101100367000000000306004b000002dc0000613d000000000300001900000005043002100000000005420019000000000441034f000000000404043b00000000004504350000000103300039000000000463004b000002d40000413d000000030300006b000002ed0000613d00000004030000290000000503300210000000000431034f000000000332001900000003050000290000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f00000000004304350000000d030000290000000002320019000000000002043500000014023000390000000a04000029000000000024043500000053023000390000000e0220017f0000000002240019000000000342004b00000000030000190000000103004039000000fb0420009c00000007040000290000000105000029000001980000213d0000000103300190000001980000c13d000000400020043f000000600320003900000000005304350000004003200039000000000043043500000020032000390000000b04000029000000000043043500000000004204350000000a080000290000000003080433000000c0042000390000000000340435000000e004200039000000000503004b000003170000613d000000000500001900000000064500190000002005500039000000000785001900000000070704330000000000760435000000000635004b000003100000413d000000000543001900000000000504350000001f033000390000000e0330017f00000000034300190000000004230049000000800520003900000000004504350000000d0400002900000000034304360000000407000029000000000407004b0000032d0000613d000000000400001900000005054002100000000006530019000000000551034f000000000505043b00000000005604350000000104400039000000000574004b000003250000413d000000030400006b0000033e0000613d00000004040000290000000504400210000000000141034f000000000443001900000003050000290000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000000d0400002900000000014300190000000000010435000000a0012000390000000c0500002900000000005104350000001f014000390000000e0110017f00000000012100490000000001310019000000f504000041000000f50320009c00000000020480190000004002200210000000f50310009c00000000010480190000006001100210000000000121019f0000000002000414000000f50320009c0000000002048019000000c002200210000000000112019f00000102011001c70000800d0200003900000001030000390000010a0400004103cd03c30000040f00000001012001900000014a0000613d000000400100043d0000000b020000290000000000210435000000f50210009c000000f50100804100000040011002100000010b011001c7000003ce0001042e000000000001042f000000400200043d0000001f0430018f0000000505300272000003720000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000036a0000413d000000000604004b000003810000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000000f501000041000000f50420009c000000000201801900000040012002100000006002300210000000000121019f000003cf00010430000000400100043d000001120210009c000003930000813d0000004002100039000000400020043f0000002002100039000000fd0300004100000000003204350000000c020000390000000000210435000000000001042d000001100100004100000000001004350000004101000039000000040010043f0000011101000041000003cf0001043000000000030104330000000002320436000000000403004b000003a50000613d000000000400001900000000052400190000002004400039000000000614001900000000060604330000000000650435000000000534004b0000039e0000413d000000000123001900000000000104350000001f01300039000000200300008a000000000131016f0000000001120019000000000001042d000000000001042f000000f503000041000000f50410009c00000000010380190000004001100210000000f50420009c00000000020380190000006002200210000000000112019f0000000002000414000000f50420009c0000000002038019000000c002200210000000000112019f00000102011001c7000080100200003903cd03c80000040f0000000102200190000003c10000613d000000000101043b000000000001042d0000000001000019000003cf00010430000003c6002104210000000102000039000000000001042d0000000002000019000000000001042d000003cb002104230000000102000039000000000001042d0000000002000019000000000001042d000003cd00000432000003ce0001042e000003cf00010430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff000000020000000000000000000000000000004000000100000000000000000000000000000000000000000000000000000000000000000000000000ffa1ad7400000000000000000000000000000000000000000000000000000000630eb20f000000000000000000000000000000000000000000000000000000004f1c32ad000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffffff8000000000000000000000000000000000000000000000000000000000000000302e362e302d7a6b73796e630000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff00000000000000c09a8a0592ac89c5ad3bc6df8224c17b485976f597df104ee20d0df415241f670b02000002000000000000000000000000000000040000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffbf000000000000000000000000000000000000000000000000ffffffffffffff7b010004410d2d3de6a7fcbe21aa0d8e9721fef6c9a39af7d1c3a3600fd3ebe6df3cda33511d41a8a5431b1770c5bc0ddd62e1cd30555d16659b89c0d60f4f9f571806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b830200000200000000000000000000000000000024000000000000000000000000a4f9edbf00000000000000000000000000000000000000000000000000000000cb6d9015e5a60155120ea0e2a88ede5648c21029e7a4214c3f44441d4f2ebd210000000000000000000000000000000000000020000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff00000000000000bf0100041dbb312c575f637f3b4ffbdf9beada863fa830a3f771b06df5a8a5c2872020dba91b30cc0006188af794c2fb30dd8520db7e2c088b7fc7c103c00ca494000000000000000000000000000000000000000000000000ffffffffffffff3f4e487b71000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffc00000000000000000000000000000000000000000000000000000000000000000213a2ef6aedc226523110e7576bcb1bb60a37c806de1adafbe5e711f287242b8", "entries": [ { "constructorArgs": [], "salt": "0x0000000000000000000000000000000000000000000000000000000000004a75", "deploymentType": "create2", "factoryDeps": [ - "0x0003000000000002000f00000000000200000000030100190000006003300270000003fe03300197000200000031035500010000000103550000000102200190000000d60000c13d0000008002000039000100000002001d000000400020043f000000040230008c000007fa0000413d000000000201043b000000e002200270000004060420009c000001a10000a13d000004070420009c000001c40000213d0000040e0420009c000002130000a13d0000040f0420009c000002ff0000613d000004100420009c000004980000613d000004110220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000402100370000000000202043b000004020420009c000007fa0000213d00000023042000390000042005000041000000000634004b000000000600001900000000060580190000042004400197000000000704004b0000000005008019000004200440009c000000000506c019000000000405004b000007fa0000c13d0000000405200039000000000451034f000000000604043b000004020460009c000007fa0000213d00000024042000390000000002460019000000000332004b000007fa0000213d000000000300041a000000ff07300190000006530000c13d0009010000000092000000090330017f00000001033001bf000000000030041b000000000306004b000001f00000613d000000400360008c000007fa0000413d0000002005500039000000000351034f000000000303043b000004020630009c000007fa0000213d00000000064300190000001f03600039000000000323004b000007fa0000813d000000000361034f000000000803043b000004020380009c000000de0000213d0000000507800210000000bf09700039000000200300008a000000000939016f000004020a90009c000000de0000213d000000400090043f000000800080043f00000020066000390000000007670019000000000927004b000007fa0000213d000000000808004b000000680000613d000000a008000039000000000961034f000000000909043b00000000089804360000002006600039000000000976004b000000620000413d0000002005500039000000000551034f000000000505043b000004020650009c000007fa0000213d00000000044500190000001f054000390000042006000041000000000725004b0000000007000019000000000706801900000420055001970000042008200197000000000985004b0000000006008019000000000585013f000004200550009c000000000607c019000000000506004b000007fa0000c13d000000000541034f000000000505043b000800000005001d000004020550009c000000de0000213d000000080500002900000005055002100000003f06500039000000000336016f000000400600043d0000000003360019000700000006001d000000000663004b00000000060000190000000106004039000004020730009c000000de0000213d0000000106600190000000de0000c13d000000400030043f000000070300002900000008060000290000000003630436000600000003001d00000020034000390000000004350019000000000224004b000007fa0000213d000000000243004b000000a60000813d0000000602000029000000000531034f000000000505043b000000020650008c000007fa0000213d00000000025204360000002003300039000000000543004b0000009b0000413d00000007010000290000000001010433000800000001001d000000800100043d000000080110006b000009610000c13d000000080100006b0000096a0000c13d000000400100043d000000400200003900000000022104360000004003100039000000800400043d00000000004304350000006003100039000000000504004b000000bb0000613d000000a0050000390000000006000019000000005705043400000000037304360000000106600039000000000746004b000000b60000413d00000000041300490000000000420435000000070200002900000000040204330000000002430436000000000304004b0000000607000029000000cb0000613d00000000030000190000000075070434000000020650008c0000054e0000213d00000000025204360000000103300039000000000543004b000000c40000413d0000000002120049000003fe03000041000003fe0410009c00000000010380190000004001100210000003fe0420009c00000000020380190000006002200210000000000112019f0000000002000414000002f60000013d000000c002000039000000400020043f0000000002000416000000000202004b000007fa0000c13d000003ff02300041000004000220009c000000e40000213d0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff600010430000000df023000390000040102200197000000400020043f0000001f0230018f0000000504300272000000f30000613d00000000050000190000000506500210000000000761034f000000000707043b000000c00660003900000000007604350000000105500039000000000645004b000000eb0000413d000000000502004b000001020000613d0000000504400210000000000141034f0000000302200210000000c004400039000000000504043300000000052501cf000000000525022f000000000101043b0000010002200089000000000121022f00000000012101cf000000000151019f0000000000140435000000600130008c000007fa0000413d000000c00400043d000004020140009c000007fa0000213d000000c003300039000000df01400039000000000131004b000007fa0000813d000000c0024000390000000001020433000004020510009c000000de0000213d0000003f05100039000000200900008a000000000595016f000000400800043d0000000005580019000000000685004b00000000060000190000000106004039000004020750009c000000de0000213d0000000106600190000000de0000c13d000900000009001d000000400050043f000a00000008001d0000000005180436000b00000005001d0000000004140019000000e004400039000000000334004b000007fa0000213d000000000301004b0000000b060000290000012f0000613d000000000300001900000000046300190000002003300039000000000523001900000000050504330000000000540435000000000413004b000001280000413d00000000011600190000000000010435000000e00100043d000800000001001d000004030110009c000007fa0000213d000001000100008a000000000200041a000000000112016f000001000400043d000000000010041b0000000a010000290000000006010433000004020160009c000000de0000213d0000000105000039000000000105041a000000010210019000000001011002700000007f0310018f000000000301c0190000001f0130008c00000000010000190000000101002039000000010110018f000000000112004b000004c20000c13d000000200130008c0000016f0000413d000400000003001d000700000006001d000500000005001d000600000004001d00000001010000390000000000100435000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000404011001c700008010020000390ff40fef0000040f0000000102200190000007fa0000613d00000007060000290000001f026000390000000502200270000000200360008c0000000002004019000000000301043b00000004010000290000001f01100039000000050110027000000000011300190000000002230019000000000312004b000000060400002900000005050000290000016f0000813d000000000002041b0000000102200039000000000312004b0000016b0000413d0000001f0160008c000007fe0000a13d000700000006001d000600000004001d000500000005001d0000000000500435000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000404011001c700008010020000390ff40fef0000040f0000000102200190000007fa0000613d000000090300002900000007033001800000002002000039000000000101043b0000000a060000290000018f0000613d0000002002000039000000000400001900000000056200190000000005050433000000000051041b000000200220003900000001011000390000002004400039000000000534004b000001870000413d0000000705000029000000000353004b0000019b0000813d0000000303500210000000f80330018f000000010400008a000000000334022f000000000343013f0000000a022000290000000002020433000000000232016f000000000021041b000000010150021000000005050000290000000002050019000000080300002900000006040000290000080a0000013d000004140420009c000001f20000a13d000004150420009c000002460000a13d000004160420009c000004a20000613d000004170420009c000004a70000613d000004180220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000400220008c000007fa0000413d0000000402100370000000000202043b000b00000002001d000004030220009c000007fa0000213d0000002401100370000000000101043b000a00000001001d0ff40af20000040f000000000101004b00000000010000190000052b0000613d0000000a010000290000000b020000290ff40ed80000040f000000000101004b0000000001000019000000010100c0390000052b0000013d000004080420009c000002540000a13d000004090420009c000004b30000613d0000040a0420009c000004c60000613d0000040b0220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000402100370000000000202043b000004020420009c000007fa0000213d00000023042000390000042005000041000000000634004b000000000600001900000000060580190000042004400197000000000704004b0000000005008019000004200440009c000000000506c019000000000405004b000007fa0000c13d0000000404200039000000000141034f000000000101043b000700000001001d000004020110009c000007fa0000213d000600240020003d000000070100002900000005011002100000000601100029000000000131004b000007fa0000213d000000070100006b000006570000c13d000000000100001900000ff50001042e0000041b0420009c000002620000213d0000041e0420009c000004da0000613d0000041f0220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000401100370000000000101043b00000000001004350000000201000039000000200010043f000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000421011001c700008010020000390ff40fef0000040f0000000102200190000007fa0000613d000000000101043b000000000101041a000000ff0110018f000000030210008c000004f00000413d0000054e0000013d000004120420009c000004e50000613d000004130220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000400220008c000007fa0000413d0000000402100370000000000202043b000b00000002001d0000002401100370000000000101043b000a00000001001d000000020110008c000007fa0000213d0000043601000041000000800010043f00000000010004110000040301100197000900000001001d000000840010043f0000000b01000029000000a40010043f00000423010000410000000000100439000000000100041200000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f0000000102200190000007ac0000613d000000000201043b00000000010004140000040302200197000000040320008c000006070000c13d0000000003000031000000200130008c00000000040300190000002004008039000006320000013d000004190420009c000004f30000613d0000041a0220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000401100370000000000101043b0ff40c230000040f000004cf0000013d0000040c0420009c000005130000613d0000040d0220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000401100370000000000101043b0ff40af20000040f000004cf0000013d0000041c0420009c0000052d0000613d0000041d0220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000400220008c000007fa0000413d0000000402100370000000000202043b000004020420009c000007fa0000213d00000023042000390000042005000041000000000634004b000000000600001900000000060580190000042004400197000000000704004b0000000005008019000004200440009c000000000506c019000000000405004b000007fa0000c13d000200040020003d0000000204100360000000000404043b000b00000004001d000004020440009c000007fa0000213d00000024042000390000000b020000290000000502200210000100000002001d000700000004001d0000000002420019000000000232004b000007fa0000213d0000002402100370000000000202043b000004020420009c000007fa0000213d00000023042000390000042005000041000000000634004b000000000600001900000000060580190000042004400197000000000704004b0000000005008019000004200440009c000000000506c019000000000405004b000007fa0000c13d0000000404200039000000000141034f000000000101043b000004020410009c000007fa0000213d000000240420003900000005021002100000000002420019000000000232004b000007fa0000213d000800000004001d0000000b0110006c000007fc0000c13d00000423010000410000000000100439000000000100041200000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f0000000102200190000007ac0000613d000000000101043b000604030010019b0000000b0100006b0000000805000029000008310000c13d000000400100043d0000004002000039000000000321043600000040021000390000000b0400002900000000004204350000043e0240009c000007fa0000213d000000010200036700000001050000290000001f0450018f0000000505500272000002d50000613d00000002060000290000002006600039000000000662034f000000600710003900000000080000190000000509800210000000000a970019000000000996034f000000000909043b00000000009a04350000000108800039000000000958004b000002cd0000413d000000000404004b000002d70000613d000000010500002900000060045000390000000000430435000000000351001900000060043000390000000b0500002900000000005404350000008003300039000000000405004b0000000807000029000002ec0000613d0000000004000019000000000572034f000000000505043b000000020650008c000007fa0000213d0000000003530436000000200770003900000001044000390000000b0540006c000002e30000413d0000000002130049000003fe03000041000003fe0410009c00000000010380190000004001100210000003fe0420009c00000000020380190000006002200210000000000112019f0000000002000414000003fe0420009c0000000002038019000000c002200210000000000121019f00000433011001c70000800d0200003900000001030000390000043404000041000007f70000013d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000400220008c000007fa0000413d0000000402100370000000000202043b000004020420009c000007fa0000213d00000023042000390000042005000041000000000634004b000000000600001900000000060580190000042004400197000000000704004b0000000005008019000004200440009c000000000506c019000000000405004b000007fa0000c13d0000000404200039000000000441034f000000000404043b000600000004001d000004020440009c000007fa0000213d000500240020003d000000060200002900000005022002100000000502200029000000000232004b000007fa0000213d0000002402100370000000000202043b000004020420009c000007fa0000213d00000023042000390000042005000041000000000634004b000000000600001900000000060580190000042004400197000000000704004b0000000005008019000004200440009c000000000506c019000000000405004b000007fa0000c13d0000000404200039000000000141034f000000000101043b000004020410009c000007fa0000213d000400240020003d00000005021002100000000402200029000000000232004b000007fa0000213d0000000602000029000000000112004b000007fc0000c13d000000000102004b000001f00000613d000300020000003d000280100000003d000a00000000001d0000000a010000290000000502100210000900000002001d00000005012000290000000101100367000000000101043b000b00000001001d00000000001004350000000301000029000000200010043f0000000001000414000003fe0210009c000003fe01008041000000c00110021000000421011001c700000002020000290ff40fef0000040f0000000102200190000007fa0000613d000000000101043b000000000101041a000000ff0110018f000000020210008c0000054e0000213d000000020110008c000008fe0000c13d000000090200002900000004012000290000000101100367000000000101043b000900000001001d000004030110009c000007fa0000213d000000400200043d00000422010000410000000000120435000800000002001d00000004012000390000000b020000290000000000210435000004230100004100000000001004390000000001000412000700000001001d000000040010044300000024000004430000000001000414000003fe0210009c000003fe01008041000000c00110021000000424011001c700008005020000390ff40fef0000040f0000000102200190000007ac0000613d000000000201043b00000000010004140000040302200197000000040320008c000003850000c13d0000000003000031000000200130008c000000000403001900000020040080390000000809000029000003b60000013d000003fe0310009c000003fe0400004100000000010480190000000805000029000003fe0350009c000000000304001900000000030540190000004003300210000000c001100210000000000131019f00000425011001c70ff40fef0000040f000000080900002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000000505400272000003a30000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000039b0000413d0000001f06400190000003b20000613d0000000505500210000000000751034f00000000055900190000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f00020000000103550000000102200190000009270000613d0000001f01400039000000600210018f0000000001920019000000000221004b00000000020000190000000102004039000004020410009c000000de0000213d0000000102200190000000de0000c13d000000400010043f000000200230008c000007fa0000413d0000000002090433000004030420009c000007fa0000213d00000044041000390000000b05000029000000000054043500000020051000390000042604000041000000000045043500000024041000390000000906000029000000000064043500000044040000390000000000410435000004270410009c000000de0000213d0000008004100039000000400040043f00000000060104330000000001000414000000040720008c000003dd0000c13d0000000102000039000004020130009c000003f30000a13d000000de0000013d000003fe0350009c000003fe0700004100000000050780190000004003500210000003fe0460009c00000000060780190000006004600210000000000334019f000003fe0410009c0000000001078019000000c001100210000000000113019f0ff40fef0000040f00000060040000390000008005000039000000010220018f00020000000103550000006001100270000003fe0010019d000003fe031001980000041b0000613d000000400400043d0000003f01300039000000200500008a000000000551016f0000000001450019000000000551004b00000000050000190000000105004039000004020610009c000000de0000213d0000000105500190000000de0000c13d000000400010043f0000000005340436000000020100036700000005063002720000040c0000613d000000000700001900000005087002100000000009850019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b000004040000413d0000001f033001900000041b0000613d0000000506600210000000000161034f00000000066500190000000303300210000000000706043300000000073701cf000000000737022f000000000101043b0000010003300089000000000131022f00000000013101cf000000000171019f0000000000160435000000000102004b000008ed0000613d0000000001040433000000400110008c000008ed0000c13d0000000001050433000000010210008c000008ed0000213d00000040024000390000000002020433000000010320008c000008ed0000213d000000010220008c000008ed0000c13d000000010110008c000008ed0000c13d000000400300043d00000024013000390000000902000029000000000021043500000428010000410000000000130435000800000003001d00000004013000390000000b020000290000000000210435000004230100004100000000001004390000000701000029000000040010044300000024000004430000000001000414000003fe0210009c000003fe01008041000000c00110021000000424011001c700008005020000390ff40fef0000040f0000000102200190000007ac0000613d000000000201043b00000000010004140000040302200197000000040320008c0000044e0000c13d0000000003000031000000200130008c0000000004030019000000200400803900000008090000290000047f0000013d000003fe0310009c000003fe0400004100000000010480190000000805000029000003fe0350009c000000000304001900000000030540190000004003300210000000c001100210000000000131019f00000429011001c70ff40fea0000040f000000080900002900000000030100190000006003300270000003fe03300197000000200430008c0000000004030019000000200400803900000005054002720000046c0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000004640000413d0000001f064001900000047b0000613d0000000505500210000000000751034f00000000055900190000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f00020000000103550000000102200190000009440000613d0000001f01400039000000600210018f0000000001920019000000000221004b00000000020000190000000102004039000004020410009c000000de0000213d0000000102200190000000de0000c13d000000400010043f000000200130008c000007fa0000413d0000000001090433000000000201004b0000000002000019000000010200c039000000000121004b000007fa0000c13d0000000a020000290000000102200039000a00000002001d000000060120006c000003430000413d000001f00000013d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000401100370000000000101043b0ff40cb90000040f000004cf0000013d0000000001000416000000000101004b000007fa0000c13d0000000001000410000004f00000013d0000000002000416000000000202004b000007fa0000c13d0000043b02000041000000800020043f00000000040004140000000002000410000000040520008c000005520000c13d000000000131034f00000000030000310000055f0000013d0000000001000416000000000101004b000007fa0000c13d0000000103000039000000000203041a000000010420019000000001052002700000007f0150018f000000000105c0190000001f0510008c00000000050000190000000105002039000000000552013f0000000105500190000005be0000613d0000042e0100004100000000001004350000002201000039000000e10000013d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000401100370000000000101043b0ff409c10000040f000000000101004b0000000001000019000000010100c039000000400200043d0000000000120435000003fe01000041000003fe0320009c000000000201801900000040012002100000042c011001c700000ff50001042e0000000001000416000000000101004b000007fa0000c13d0000000001000412000f00000001001d000e00200000003d00000000010004150000000f0110008a00000005011002100ff40fd60000040f000004f00000013d0000000001000416000000000101004b000007fa0000c13d0000000001000412000d00000001001d000c00000000001d00000000010004150000000d0110008a00000005011002100ff40fd60000040f0000040301100197000000800010043f0000043a0100004100000ff50001042e0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000401100370000000000101043b000b00000001001d00000000001004350000000201000039000000200010043f000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000421011001c700008010020000390ff40fef0000040f0000000102200190000007fa0000613d000000000101043b000000000101041a000000ff0110018f000000020210008c0000054e0000213d000000000101004b000006490000c13d000000400100043d0000042b02000041000009000000013d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000400220008c000007fa0000413d0000000402100370000000000202043b000b00000002001d000004030220009c000007fa0000213d0000002401100370000000000101043b000a00000001001d0ff409c10000040f000000000101004b00000000010000190000052b0000613d0000000a010000290000000b020000290ff40ed80000040f000000000101004b0000000001000019000000010100c039000000010110018f000004d20000013d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000400220008c000007fa0000413d0000000402100370000000000202043b000b00000002001d0000002401100370000000000101043b000a00000001001d000004030110009c000007fa0000213d0000000b0100002900000000001004350000000201000039000000200010043f000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000421011001c700008010020000390ff40fef0000040f0000000102200190000007fa0000613d000000000101043b000000000101041a000000ff0110018f000000020210008c0000064c0000a13d0000042e0100004100000000001004350000002101000039000000e10000013d000003fe01000041000003fe0340009c0000000004018019000000c00140021000000430011001c70ff40fef0000040f00000000030100190000006003300270000003fe0030019d000003fe0330019700020000000103550000000102200190000005c80000613d0000001f0230018f00000005043002720000056b0000613d00000000050000190000000506500210000000000761034f000000000707043b000000800660003900000000007604350000000105500039000000000645004b000005630000413d000000000502004b0000057a0000613d0000000504400210000000000141034f00000003022002100000008004400039000000000504043300000000052501cf000000000525022f000000000101043b0000010002200089000000000121022f00000000012101cf000000000151019f00000000001404350000009f02300039000000200100008a000000000212016f0000043c042000410000043d0440009c000000de0000413d0000042004000041000000200530008c000000000500001900000000050440190000042006300197000000000706004b000000000400a019000004200660009c000000000405c019000000400020043f000000000404004b000007fa0000c13d000000800400043d000004020540009c000007fa0000213d00000080053000390000009f034000390000042006000041000000000753004b0000000007000019000000000706801900000420085001970000042003300197000000000983004b0000000006008019000000000383013f000004200330009c000000000607c019000000000306004b000007fa0000c13d00000080034000390000000003030433000004020630009c000000de0000213d0000003f06300039000000000116016f0000000001210019000004020610009c000000de0000213d000000400010043f0000000001320436000000a0044000390000000006430019000000000556004b000007fa0000213d000000000503004b000005b70000613d000000000500001900000000061500190000000007450019000000000707043300000000007604350000002005500039000000000635004b000005b00000413d00000000011300190000000000010435000000400100043d000b00000001001d0ff409980000040f0000000b04000029000005fd0000013d000000800010043f000000000404004b000005e50000c13d000001000300008a000000000232016f000000a00020043f000000000101004b000000c002000039000000a002006039000005f40000013d000000400200043d0000001f0430018f0000000505300272000005d50000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000005cd0000413d000000000604004b000005e40000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000007c90000013d0000000000300435000000a002000039000000000301004b000005f40000613d0000042d0200004100000000040000190000000003040019000000000402041a000000a005300039000000000045043500000001022000390000002004300039000000000514004b000005eb0000413d000000c002300039000000800220008a0000008001000039000b00000001001d0ff409ae0000040f000000400100043d000a00000001001d0000000b020000290ff409980000040f0000000a040000290000000001410049000003fe02000041000003fe0310009c0000000001028019000003fe0340009c000000000402801900000040024002100000006001100210000000000121019f00000ff50001042e000003fe03000041000003fe0410009c0000000001038019000000c00110021000000437011001c70ff40fef0000040f00000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f00000005064002720000061f0000613d00000000070000190000000508700210000000000981034f000000000909043b000000800880003900000000009804350000000107700039000000000867004b000006170000413d000000000705004b0000062e0000613d0000000506600210000000000761034f00000003055002100000008006600039000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f00020000000103550000000102200190000007ad0000613d0000001f01400039000000600210018f00000080012001bf000000400010043f000000200330008c000007fa0000413d000000800300043d000000000403004b0000000004000019000000010400c039000000000443004b000007fa0000c13d000000000303004b000007d00000c13d0000043903000041000000000031043500000084032001bf00000009040000290000000000430435000000a4022000390000000b030000290000000000320435000008240000013d00000000020004110000000b01000029000006500000013d000000020110008c000008fe0000c13d0000000b010000290000000a020000290ff40d4b0000040f000000000100001900000ff50001042e0000042f01000041000000800010043f000004300100004100000ff600010430000500020000003d000480100000003d000380050000003d000a00000000001d0000000a01000029000000050110021000000006011000290000000101100367000000000101043b000b00000001001d00000000001004350000000501000029000000200010043f0000000001000414000003fe0210009c000003fe01008041000000c00110021000000421011001c700000004020000290ff40fef0000040f0000000102200190000007fa0000613d000000000101043b000000000101041a000000ff0210018f000000020120008c0000054e0000213d000000400300043d0000000401300039000000000202004b000008270000613d0000042202000041000900000003001d00000000002304350000000b020000290000000000210435000004230100004100000000001004390000000001000412000800000001001d000000040010044300000024000004430000000001000414000003fe0210009c000003fe01008041000000c00110021000000424011001c700000003020000290ff40fef0000040f00000000060004110000000102200190000007ac0000613d000000000201043b00000000010004140000040302200197000000040320008c000006960000c13d0000000003000031000000200130008c000000000403001900000020040080390000000909000029000006c90000013d000200000006001d000003fe0310009c000003fe0400004100000000010480190000000905000029000003fe0350009c000000000304001900000000030540190000004003300210000000c001100210000000000131019f00000425011001c70ff40fef0000040f000000090900002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000000505400272000006b50000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000006ad0000413d0000001f06400190000006c40000613d0000000505500210000000000751034f00000000055900190000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f000200000001035500000001022001900000000206000029000008b30000613d0000001f01400039000000600210018f0000000001920019000000000221004b00000000020000190000000102004039000004020410009c000000de0000213d0000000102200190000000de0000c13d000000400010043f000000200230008c000007fa0000413d0000000002090433000004030420009c000007fa0000213d00000044041000390000000b05000029000000000054043500000020051000390000042604000041000000000045043500000044040000390000000000410435000004030a60019700000024041000390000000000a40435000004270410009c000000de0000213d0000008004100039000000400040043f00000000060104330000000001000414000000040720008c000006f00000c13d0000000102000039000004020130009c000007080000a13d000000de0000013d000003fe0350009c000003fe0700004100000000050780190000004003500210000003fe0460009c00000000060780190000006004600210000000000334019f000003fe0410009c0000000001078019000000c001100210000000000113019f00090000000a001d0ff40fef0000040f000000090a0000290000006004000039000000010220018f00020000000103550000006001100270000003fe0010019d000003fe031001980000000101000029000007300000613d000000400400043d0000003f01300039000000200500008a000000000551016f0000000001450019000000000551004b00000000050000190000000105004039000004020610009c000000de0000213d0000000105500190000000de0000c13d000000400010043f000000000134043600000002050003670000000506300272000007210000613d000000000700001900000005087002100000000009810019000000000885034f000000000808043b00000000008904350000000107700039000000000867004b000007190000413d0000001f03300190000007300000613d0000000506600210000000000565034f00000000066100190000000303300210000000000706043300000000073701cf000000000737022f000000000505043b0000010003300089000000000535022f00000000033501cf000000000373019f0000000000360435000000000202004b000008190000613d0000000002040433000000400220008c000008190000c13d0000000001010433000000010210008c000008190000213d00000040024000390000000002020433000000010320008c000008190000213d000000010220008c000008190000c13d000000010110008c000008190000c13d000000400200043d00000024012000390000000000a1043500000428010000410000000000120435000900000002001d00000004012000390000000b020000290000000000210435000004230100004100000000001004390000000801000029000000040010044300000024000004430000000001000414000003fe0210009c000003fe01008041000000c00110021000000424011001c700008005020000390ff40fef0000040f0000000102200190000007ac0000613d000000000201043b00000000010004140000040302200197000000040320008c000007620000c13d0000000003000031000000200130008c000000000403001900000020040080390000000909000029000007930000013d000003fe0310009c000003fe0400004100000000010480190000000905000029000003fe0350009c000000000304001900000000030540190000004003300210000000c001100210000000000131019f00000429011001c70ff40fea0000040f000000090900002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000000505400272000007800000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000007780000413d0000001f064001900000078f0000613d0000000505500210000000000751034f00000000055900190000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f00020000000103550000000102200190000008d00000613d0000001f01400039000000600210018f0000000001920019000000000221004b00000000020000190000000102004039000004020410009c000000de0000213d0000000102200190000000de0000c13d000000400010043f000000200130008c000007fa0000413d0000000001090433000000000201004b0000000002000019000000010200c039000000000121004b000007fa0000c13d0000000a020000290000000102200039000a00000002001d000000070120006c0000065b0000413d000001f00000013d000000000001042f000000400200043d0000001f0430018f0000000505300272000007ba0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000007b20000413d000000000604004b000007c90000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000003fe01000041000003fe0420009c000000000201801900000040012002100000006002300210000000000121019f00000ff6000104300000000b0100002900000000001004350000000201000039000000200010043f000003fe030000410000000001000414000003fe0210009c0000000001038019000000c00110021000000421011001c700008010020000390ff40fef0000040f0000000102200190000007fa0000613d000000000101043b000000000201041a000001000300008a000000000232016f0000000a03000029000000000232019f000000000021041b000000400100043d000000200210003900000000003204350000000b0200002900000000002104350000000002000414000003fe0320009c000003fe040000410000000002048019000003fe0310009c00000000010480190000004001100210000000c002200210000000000112019f00000421011001c70000800d02000039000000010300003900000438040000410ff40fea0000040f0000000101200190000001f00000c13d000000000100001900000ff6000104300000043101000041000006540000013d000000000106004b0000000001000019000008030000613d0000000b0100002900000000010104330000000302600210000000010300008a000000000223022f000000000232013f000000000121016f00000001026002100000000803000029000000000121019f000000000015041b0000040301300197000000800010043f000000a00040043f0000014000000443000001600010044300000020010000390000018000100443000001a000400443000001000010044300000002010000390000012000100443000004050100004100000ff50001042e000000400100043d00000024021000390000000b0300002900000000003204350000042a02000041000000000021043500000004021000390000000000a20435000003fe02000041000003fe0310009c0000000001028019000000400110021000000429011001c700000ff6000104300000042b0200004100000000002304350000000b020000290000000000210435000003fe01000041000003fe0230009c0000000003018019000000400130021000000425011001c700000ff6000104300000000001000411000504030010019b0000000002000019000a00000002001d000000050720021000000007017000290000000101100367000000000601043b000000400900043d000004360100004100000000001904350000000401900039000000050200002900000000002104350000002401900039000000000061043500000000010004140000000602000029000000040320008c0000084a0000c13d0000000003000031000000200130008c00000000040300190000002004008039000008800000013d000400000007001d000900000006001d000003fe0310009c000003fe040000410000000001048019000003fe0390009c000000000304001900000000030940190000004003300210000000c001100210000000000131019f00000429011001c7000300000009001d0ff40fef0000040f000000030900002900000000030100190000006003300270000003fe03300197000000200430008c0000000004030019000000200400803900000005054002720000086a0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000008620000413d0000001f06400190000008790000613d0000000505500210000000000751034f00000000055900190000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f000200000001035500000001022001900000000805000029000000090600002900000004070000290000090a0000613d0000001f01400039000000600210018f0000000001920019000000000221004b00000000020000190000000102004039000004020410009c000000de0000213d0000000102200190000000de0000c13d000000400010043f000000200230008c000007fa0000413d0000000002090433000000000302004b0000000003000019000000010300c039000000000332004b000007fa0000c13d000000000202004b000008f60000613d00000000015700190000000101100367000000000101043b000900000001001d000000020110008c000007fa0000213d00000000006004350000000201000039000000200010043f0000000001000414000003fe0210009c000003fe01008041000000c00110021000000421011001c700008010020000390ff40fef0000040f00000008050000290000000102200190000007fa0000613d000000000101043b000000000201041a000001000300008a000000000232016f00000009022001af000000000021041b0000000a0200002900000001022000390000000b0120006c000008340000413d000002bb0000013d000000400200043d0000001f0430018f0000000505300272000008c00000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000008b80000413d000000000604004b000008cf0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000007c90000013d000000400200043d0000001f0430018f0000000505300272000008dd0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000008d50000413d000000000604004b000008ec0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000007c90000013d000000400100043d00000024021000390000000b0300002900000000003204350000042a02000041000000000021043500000004021000390000000903000029000008fc0000013d0000002402100039000000000062043500000439020000410000000000210435000000040210003900000005030000290000000000320435000008210000013d000000400100043d0000043502000041000000000021043500000004021000390000000b030000290000000000320435000003fe02000041000003fe0310009c0000000001028019000000400110021000000425011001c700000ff600010430000000400200043d0000001f0430018f0000000505300272000009170000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000090f0000413d000000000604004b000007c90000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000007c90000013d000000400200043d0000001f0430018f0000000505300272000009340000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000092c0000413d000000000604004b000009430000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000007c90000013d000000400200043d0000001f0430018f0000000505300272000009510000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000009490000413d000000000604004b000009600000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000007c90000013d000000400100043d00000431020000410000000000210435000003fe02000041000003fe0310009c0000000001028019000000400110021000000432011001c700000ff600010430000500020000003d000480100000003d0000000003000019000000800100043d000000000131004b0000000602000029000009940000a13d00000007010000290000000001010433000000000131004b000009940000a13d000b00000003001d000000050130021000000000022100190000000002020433000a00000002001d000000020220008c0000054e0000213d000000a001100039000000000101043300000000001004350000000501000029000000200010043f0000000001000414000003fe0210009c000003fe01008041000000c00110021000000421011001c700000004020000290ff40fef0000040f0000000102200190000007fa0000613d000000000101043b000000000201041a000000090220017f0000000a022001af000000000021041b0000000b030000290000000103300039000000080130006c0000096d0000413d000000ab0000013d0000042e0100004100000000001004350000003201000039000000e10000013d00000020030000390000000004310436000000000302043300000000003404350000004001100039000000000403004b000009a70000613d000000000400001900000000051400190000002004400039000000000624001900000000060604330000000000650435000000000534004b000009a00000413d000000000213001900000000000204350000001f02300039000000200300008a000000000232016f0000000001210019000000000001042d0000001f02200039000000200300008a000000000232016f0000000001120019000000000221004b00000000020000190000000102004039000004020310009c000009bb0000213d0000000102200190000009bb0000c13d000000400010043f000000000001042d0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff6000104300004000000000002000000400300043d0000043f020000410000000000230435000400000003001d0000000402300039000300000001001d0000000000120435000004230100004100000000001004390000000001000412000200000001001d00000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000aa70000613d000000000201043b00000000010004140000040302200197000000040320008c000009e40000c13d0000000003000031000000200130008c00000000040300190000002004008039000000040a00002900000a150000013d000003fe03000041000003fe0410009c00000000010380190000000405000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000425011001c70ff40fef0000040f000000040a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000a020000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b000009fa0000413d000000000705004b00000a110000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000aae0000613d0000001f01400039000000600110018f0000000004a10019000000000114004b00000000010000190000000101004039000004020240009c00000aa80000213d000000010110019000000aa80000c13d000000400040043f0000001f0130008c00000aa50000a13d00000000010a0433000003fe0210009c00000aa50000213d000000000101004b000000000100001900000aa40000613d0000002401400039000000030200002900000000002104350000043601000041000000000014043500000000010004100000040301100197000100000004001d0000000402400039000000000012043500000423010000410000000000100439000000020100002900000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000aa70000613d000000000201043b00000000010004140000040302200197000000040320008c00000a4c0000c13d0000000003000031000000200130008c00000000040300190000002004008039000000010a00002900000a7d0000013d000003fe03000041000003fe0410009c00000000010380190000000105000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000429011001c70ff40fef0000040f000000010a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000a6a0000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000a620000413d000000000705004b00000a790000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000acf0000613d0000001f01400039000000600110018f0000000001a10019000004020210009c00000aa80000213d000000400010043f000000200130008c00000aa50000413d00000000010a0433000000000201004b0000000002000019000000010200c039000000000221004b00000aa50000c13d000000000101004b000000000100001900000aa40000613d000000030100002900000000001004350000000201000039000000200010043f000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000421011001c700008010020000390ff40fef0000040f000000010220019000000aa50000613d000000000101043b000000000101041a000000ff0110018f000000020210008c00000acb0000213d000000000101004b0000000001000019000000010100c039000000000001042d000000000100001900000ff600010430000000000001042f0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff600010430000000400200043d0000001f0430018f000000050530027200000abb0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000ab30000413d000000000604004b00000aeb0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f000000000015043500000aeb0000013d0000042e010000410000000000100435000000210100003900000aab0000013d000000400200043d0000001f0430018f000000050530027200000adc0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000ad40000413d000000000604004b00000aeb0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000003fe01000041000003fe0420009c000000000201801900000040012002100000006002300210000000000121019f00000ff6000104300004000000000002000000400300043d0000043f020000410000000000230435000400000003001d0000000402300039000300000001001d0000000000120435000004230100004100000000001004390000000001000412000200000001001d00000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000bd80000613d000000000201043b00000000010004140000040302200197000000040320008c00000b150000c13d0000000003000031000000200130008c00000000040300190000002004008039000000040a00002900000b460000013d000003fe03000041000003fe0410009c00000000010380190000000405000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000425011001c70ff40fef0000040f000000040a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000b330000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000b2b0000413d000000000705004b00000b420000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000bdf0000613d0000001f01400039000000600110018f0000000004a10019000000000114004b00000000010000190000000101004039000004020240009c00000bd90000213d000000010110019000000bd90000c13d000000400040043f0000001f0130008c00000bd60000a13d00000000010a0433000003fe0210009c00000bd60000213d000000000101004b000000000100001900000bd50000613d0000002401400039000000030200002900000000002104350000043601000041000000000014043500000000010004100000040301100197000100000004001d0000000402400039000000000012043500000423010000410000000000100439000000020100002900000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000bd80000613d000000000201043b00000000010004140000040302200197000000040320008c00000b7d0000c13d0000000003000031000000200130008c00000000040300190000002004008039000000010a00002900000bae0000013d000003fe03000041000003fe0410009c00000000010380190000000105000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000429011001c70ff40fef0000040f000000010a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000b9b0000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000b930000413d000000000705004b00000baa0000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000c000000613d0000001f01400039000000600110018f0000000001a10019000004020210009c00000bd90000213d000000400010043f000000200130008c00000bd60000413d00000000010a0433000000000201004b0000000002000019000000010200c039000000000221004b00000bd60000c13d000000000101004b000000000100001900000bd50000613d000000030100002900000000001004350000000201000039000000200010043f000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000421011001c700008010020000390ff40fef0000040f000000010220019000000bd60000613d000000000101043b000000000101041a000000ff0110018f000000020210008c00000bfc0000213d000000020110008c00000000010000190000000101006039000000000001042d000000000100001900000ff600010430000000000001042f0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff600010430000000400200043d0000001f0430018f000000050530027200000bec0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000be40000413d000000000604004b00000c1c0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f000000000015043500000c1c0000013d0000042e010000410000000000100435000000210100003900000bdc0000013d000000400200043d0000001f0430018f000000050530027200000c0d0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000c050000413d000000000604004b00000c1c0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000003fe01000041000003fe0420009c000000000201801900000040012002100000006002300210000000000121019f00000ff6000104300001000000000002000000400300043d000000240230003900000000001204350000043601000041000000000013043500000000010004100000040301100197000100000003001d0000000402300039000000000012043500000423010000410000000000100439000000000100041200000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000c8f0000613d000000000201043b00000000010004140000040302200197000000040320008c00000c480000c13d0000000003000031000000200130008c00000000040300190000002004008039000000010a00002900000c790000013d000003fe03000041000003fe0410009c00000000010380190000000105000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000429011001c70ff40fef0000040f000000010a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000c660000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000c5e0000413d000000000705004b00000c750000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000c960000613d0000001f01400039000000600210018f0000000001a20019000000000221004b00000000020000190000000102004039000004020410009c00000c900000213d000000010220019000000c900000c13d000000400010043f0000001f0130008c00000c8d0000a13d00000000010a0433000000000201004b0000000002000019000000010200c039000000000221004b00000c8d0000c13d000000000001042d000000000100001900000ff600010430000000000001042f0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff600010430000000400200043d0000001f0430018f000000050530027200000ca30000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000c9b0000413d000000000604004b00000cb20000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000003fe01000041000003fe0420009c000000000201801900000040012002100000006002300210000000000121019f00000ff6000104300001000000000002000000400300043d0000043f020000410000000000230435000100000003001d0000000402300039000000000012043500000423010000410000000000100439000000000100041200000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000d210000613d000000000201043b00000000010004140000040302200197000000040320008c00000cda0000c13d0000000003000031000000200130008c00000000040300190000002004008039000000010a00002900000d0b0000013d000003fe03000041000003fe0410009c00000000010380190000000105000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000425011001c70ff40fef0000040f000000010a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000cf80000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000cf00000413d000000000705004b00000d070000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000d280000613d0000001f01400039000000600210018f0000000001a20019000000000221004b00000000020000190000000102004039000004020410009c00000d220000213d000000010220019000000d220000c13d000000400010043f0000001f0130008c00000d1f0000a13d00000000010a0433000003fe0210009c00000d1f0000213d000000000101004b0000000001000019000000010100c039000000000001042d000000000100001900000ff600010430000000000001042f0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff600010430000000400200043d0000001f0430018f000000050530027200000d350000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000d2d0000413d000000000604004b00000d440000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000003fe01000041000003fe0420009c000000000201801900000040012002100000006002300210000000000121019f00000ff6000104300004000000000002000200000002001d000000400300043d00000422020000410000000000230435000300000003001d0000000402300039000400000001001d0000000000120435000004230100004100000000001004390000000001000412000100000001001d00000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000e970000613d000000000201043b00000000010004140000040302200197000000040320008c00000d6f0000c13d0000000003000031000000200130008c00000000040300190000002004008039000000030a00002900000da00000013d000003fe03000041000003fe0410009c00000000010380190000000305000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000425011001c70ff40fef0000040f000000030a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000d8d0000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000d850000413d000000000705004b00000d9c0000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000e980000613d0000001f01400039000000600210018f0000000001a20019000000000221004b00000000020000190000000102004039000004020410009c00000e810000213d000000010220019000000e810000c13d000000400010043f0000001f0230008c00000e950000a13d00000000020a0433000004030420009c00000e950000213d000000440410003900000004050000290000000000540435000000200510003900000426040000410000000000450435000000440400003900000000004104350000000204000029000004030a40019700000024041000390000000000a40435000004270410009c00000e810000213d0000008004100039000000400040043f00000000060104330000000001000414000000040720008c00000dc80000c13d0000000102000039000004020130009c00000de00000a13d00000e810000013d000003fe03000041000003fe0450009c00000000050380190000004004500210000003fe0560009c00000000060380190000006005600210000000000445019f000003fe0510009c0000000001038019000000c001100210000000000114019f00030000000a001d0ff40fef0000040f000000030a00002900000060040000390000008005000039000000010220018f00020000000103550000006001100270000003fe0010019d000003fe0310019800000e090000613d000000400400043d0000003f01300039000000200500008a000000000151016f0000000001140019000000000541004b00000000050000190000000105004039000004020610009c00000e810000213d000000010550019000000e810000c13d000000400010043f0000001f0130018f00000000053404360000000206000367000000050330027200000dfa0000613d000000000700001900000005087002100000000009850019000000000886034f000000000808043b00000000008904350000000107700039000000000837004b00000df20000413d000000000701004b00000e090000613d0000000503300210000000000636034f00000000033500190000000301100210000000000703043300000000071701cf000000000717022f000000000606043b0000010001100089000000000616022f00000000011601cf000000000171019f0000000000130435000000000102004b00000e870000613d0000000001040433000000400110008c00000e870000c13d0000000001050433000000010210008c00000e870000213d00000040024000390000000002020433000000010320008c00000e870000213d000000010220008c00000e870000c13d000000010110008c00000e870000c13d000000400200043d00000024012000390000000000a1043500000428010000410000000000120435000300000002001d00000004012000390000000402000029000000000021043500000423010000410000000000100439000000010100002900000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000e970000613d000000000201043b00000000010004140000040302200197000000040320008c00000e3c0000c13d0000000003000031000000200130008c00000000040300190000002004008039000000030a00002900000e6d0000013d000003fe03000041000003fe0410009c00000000010380190000000305000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000429011001c70ff40fea0000040f000000030a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000e5a0000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000e520000413d000000000705004b00000e690000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000eb50000613d0000001f01400039000000600210018f0000000001a20019000000000221004b00000000020000190000000102004039000004020410009c00000e810000213d000000010220019000000e810000c13d000000400010043f000000200130008c00000e950000413d00000000010a0433000000000201004b0000000002000019000000010200c039000000000121004b00000e950000c13d000000000001042d0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff600010430000000400100043d0000002402100039000000040300002900000000003204350000042a02000041000000000021043500000004021000390000000000a20435000003fe02000041000003fe0310009c0000000001028019000000400110021000000429011001c700000ff600010430000000000100001900000ff600010430000000000001042f000000400200043d0000001f0430018f000000050530027200000ea50000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000e9d0000413d000000000604004b00000ed10000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f000000000015043500000ed10000013d000000400200043d0000001f0430018f000000050530027200000ec20000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000eba0000413d000000000604004b00000ed10000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000003fe01000041000003fe0420009c000000000201801900000040012002100000006002300210000000000121019f00000ff6000104300003000000000002000200000002001d000000400300043d00000422020000410000000000230435000300000003001d0000000402300039000100000001001d000000000012043500000423010000410000000000100439000000000100041200000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000fb10000613d000000000201043b00000000010004140000040302200197000000040320008c00000efb0000c13d0000000003000031000000200130008c00000000040300190000002004008039000000030a00002900000f2c0000013d000003fe03000041000003fe0410009c00000000010380190000000305000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000425011001c70ff40fef0000040f000000030a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000f190000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000f110000413d000000000705004b00000f280000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000fb20000613d0000001f01400039000000600210018f0000000001a20019000000000221004b00000000020000190000000102004039000004020410009c00000fa90000213d000000010220019000000fa90000c13d000000400010043f0000001f0230008c00000faf0000a13d00000000020a0433000004030420009c00000faf0000213d000000440410003900000001050000290000000000540435000000200410003900000426050000410000000000540435000000020500002900000403055001970000002406100039000000000056043500000044050000390000000000510435000004270510009c00000fa90000213d0000008005100039000000400050043f00000000050104330000000001000414000000040620008c00000f540000c13d0000000102000039000004020130009c00000f690000a13d00000fa90000013d000003fe03000041000003fe0640009c00000000040380190000004004400210000003fe0650009c00000000050380190000006005500210000000000445019f000003fe0510009c0000000001038019000000c001100210000000000114019f0ff40fef0000040f00000060040000390000008005000039000000010220018f00020000000103550000006001100270000003fe0010019d000003fe0310019800000f930000613d0000003f01300039000000200400008a000000000141016f000000400400043d0000000001140019000000000541004b00000000050000190000000105004039000004020610009c00000fa90000213d000000010550019000000fa90000c13d000000400010043f0000001f0130018f00000000053404360000000206000367000000050330027200000f840000613d000000000700001900000005087002100000000009850019000000000886034f000000000808043b00000000008904350000000107700039000000000837004b00000f7c0000413d000000000701004b00000f930000613d0000000503300210000000000636034f00000000033500190000000301100210000000000703043300000000071701cf000000000717022f000000000606043b0000010001100089000000000616022f00000000011601cf000000000171019f0000000000130435000000000102004b000000000100001900000fa80000613d0000000001040433000000400110008c000000000100001900000fa80000c13d0000000002050433000000010120008c000000000100001900000fa80000213d00000040014000390000000003010433000000010130008c000000000100001900000fa80000213d000000010120015f000000010230015f00000000011201a000000000010000190000000101006039000000000001042d0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff600010430000000000100001900000ff600010430000000000001042f000000400200043d0000001f0430018f000000050530027200000fbf0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000fb70000413d000000000604004b00000fce0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000003fe01000041000003fe0420009c000000000201801900000040012002100000006002300210000000000112019f00000ff600010430000000000001042f0000042302000041000000000020043900000005011002700000000002010031000000040020044300000001010100310000002400100443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000fe90000613d000000000101043b000000000001042d000000000001042f00000fed002104210000000102000039000000000001042d0000000002000019000000000001042d00000ff2002104230000000102000039000000000001042d0000000002000019000000000001042d00000ff40000043200000ff50001042e00000ff600010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000dfffffffffffffffffffffffffffffffffffffffffffffffff00000000000000bf00000000000000000000000000000000000000000000000000000001ffffffe0000000000000000000000000000000000000000000000000ffffffffffffffff000000000000000000000000ffffffffffffffffffffffffffffffffffffffff020000000000000000000000000000000000002000000000000000000000000000000002000000000000000000000000000000c0000001000000000000000000000000000000000000000000000000000000000000000000000000007150ef8700000000000000000000000000000000000000000000000000000000cc9d707300000000000000000000000000000000000000000000000000000000dd1bb1fb00000000000000000000000000000000000000000000000000000000dd1bb1fc00000000000000000000000000000000000000000000000000000000efbd181f00000000000000000000000000000000000000000000000000000000fca8d7c800000000000000000000000000000000000000000000000000000000cc9d707400000000000000000000000000000000000000000000000000000000d74251a000000000000000000000000000000000000000000000000000000000890db75b00000000000000000000000000000000000000000000000000000000890db75c0000000000000000000000000000000000000000000000000000000094dc956a00000000000000000000000000000000000000000000000000000000a4f9edbf000000000000000000000000000000000000000000000000000000007150ef8800000000000000000000000000000000000000000000000000000000840ebfdf0000000000000000000000000000000000000000000000000000000030178f29000000000000000000000000000000000000000000000000000000003a4741bc000000000000000000000000000000000000000000000000000000003a4741bd0000000000000000000000000000000000000000000000000000000054fd4d5000000000000000000000000000000000000000000000000000000000686d9fa20000000000000000000000000000000000000000000000000000000030178f2a0000000000000000000000000000000000000000000000000000000031d70b66000000000000000000000000000000000000000000000000000000002afb5c51000000000000000000000000000000000000000000000000000000002afb5c52000000000000000000000000000000000000000000000000000000002fbc035f0000000000000000000000000000000000000000000000000000000007ace2b5000000000000000000000000000000000000000000000000000000001d70af85800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000400000000000000000000000008c07607700000000000000000000000000000000000000000000000000000000310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e02000002000000000000000000000000000000440000000000000000000000000000000000000000000000000000000000000024000000000000000000000000bd68387200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f641f776e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004400000000000000000000000013d4d4dd000000000000000000000000000000000000000000000000000000002cf7343d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf64e487b71000000000000000000000000000000000000000000000000000000000dc149f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000008000000000000000001132131c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000200000000000000000000000000000000000000000000000000000000000000b18604a21764a23acb45fc37d878f421c181294b251c148cd43689947f47621073d33f9100000000000000000000000000000000000000000000000000000000b56f75620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000008000000000000000003de74aa59ab1ab0255006bf14c5df84e529e14ae2122677499a5f2a2d0b815dae8ed9286000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000800000000000000000dd1bb1fc00000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000008007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb284917000000000000000000000000000000000000000000000000000000004ebee386fba0ceabd2ccccfa0575f120bd21e32ed3fa103981a02bc6d2d5b246" + "0x0003000000000002000f00000000000200000000030100190000006003300270000003fe03300197000200000031035500010000000103550000000102200190000000d60000c13d0000008002000039000100000002001d000000400020043f000000040230008c000007fa0000413d000000000201043b000000e002200270000004060420009c000001a10000a13d000004070420009c000001c40000213d0000040e0420009c000002130000a13d0000040f0420009c000002ff0000613d000004100420009c000004980000613d000004110220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000402100370000000000202043b000004020420009c000007fa0000213d00000023042000390000042005000041000000000634004b000000000600001900000000060580190000042004400197000000000704004b0000000005008019000004200440009c000000000506c019000000000405004b000007fa0000c13d0000000405200039000000000451034f000000000604043b000004020460009c000007fa0000213d00000024042000390000000002460019000000000332004b000007fa0000213d000000000300041a000000ff07300190000006530000c13d0009010000000092000000090330017f00000001033001bf000000000030041b000000000306004b000001f00000613d000000400360008c000007fa0000413d0000002005500039000000000351034f000000000303043b000004020630009c000007fa0000213d00000000064300190000001f03600039000000000323004b000007fa0000813d000000000361034f000000000803043b000004020380009c000000de0000213d0000000507800210000000bf09700039000000200300008a000000000939016f000004020a90009c000000de0000213d000000400090043f000000800080043f00000020066000390000000007670019000000000927004b000007fa0000213d000000000808004b000000680000613d000000a008000039000000000961034f000000000909043b00000000089804360000002006600039000000000976004b000000620000413d0000002005500039000000000551034f000000000505043b000004020650009c000007fa0000213d00000000044500190000001f054000390000042006000041000000000725004b0000000007000019000000000706801900000420055001970000042008200197000000000985004b0000000006008019000000000585013f000004200550009c000000000607c019000000000506004b000007fa0000c13d000000000541034f000000000505043b000800000005001d000004020550009c000000de0000213d000000080500002900000005055002100000003f06500039000000000336016f000000400600043d0000000003360019000700000006001d000000000663004b00000000060000190000000106004039000004020730009c000000de0000213d0000000106600190000000de0000c13d000000400030043f000000070300002900000008060000290000000003630436000600000003001d00000020034000390000000004350019000000000224004b000007fa0000213d000000000243004b000000a60000813d0000000602000029000000000531034f000000000505043b000000020650008c000007fa0000213d00000000025204360000002003300039000000000543004b0000009b0000413d00000007010000290000000001010433000800000001001d000000800100043d000000080110006b000009610000c13d000000080100006b0000096a0000c13d000000400100043d000000400200003900000000022104360000004003100039000000800400043d00000000004304350000006003100039000000000504004b000000bb0000613d000000a0050000390000000006000019000000005705043400000000037304360000000106600039000000000746004b000000b60000413d00000000041300490000000000420435000000070200002900000000040204330000000002430436000000000304004b0000000607000029000000cb0000613d00000000030000190000000075070434000000020650008c0000054e0000213d00000000025204360000000103300039000000000543004b000000c40000413d0000000002120049000003fe03000041000003fe0410009c00000000010380190000004001100210000003fe0420009c00000000020380190000006002200210000000000112019f0000000002000414000002f60000013d000000c002000039000000400020043f0000000002000416000000000202004b000007fa0000c13d000003ff02300041000004000220009c000000e40000213d0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff600010430000000df023000390000040102200197000000400020043f0000001f0230018f0000000504300272000000f30000613d00000000050000190000000506500210000000000761034f000000000707043b000000c00660003900000000007604350000000105500039000000000645004b000000eb0000413d000000000502004b000001020000613d0000000504400210000000000141034f0000000302200210000000c004400039000000000504043300000000052501cf000000000525022f000000000101043b0000010002200089000000000121022f00000000012101cf000000000151019f0000000000140435000000600130008c000007fa0000413d000000c00400043d000004020140009c000007fa0000213d000000c003300039000000df01400039000000000131004b000007fa0000813d000000c0024000390000000001020433000004020510009c000000de0000213d0000003f05100039000000200900008a000000000595016f000000400800043d0000000005580019000000000685004b00000000060000190000000106004039000004020750009c000000de0000213d0000000106600190000000de0000c13d000900000009001d000000400050043f000a00000008001d0000000005180436000b00000005001d0000000004140019000000e004400039000000000334004b000007fa0000213d000000000301004b0000000b060000290000012f0000613d000000000300001900000000046300190000002003300039000000000523001900000000050504330000000000540435000000000413004b000001280000413d00000000011600190000000000010435000000e00100043d000800000001001d000004030110009c000007fa0000213d000001000100008a000000000200041a000000000112016f000001000400043d000000000010041b0000000a010000290000000006010433000004020160009c000000de0000213d0000000105000039000000000105041a000000010210019000000001011002700000007f0310018f000000000301c0190000001f0130008c00000000010000190000000101002039000000010110018f000000000112004b000004c20000c13d000000200130008c0000016f0000413d000400000003001d000700000006001d000500000005001d000600000004001d00000001010000390000000000100435000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000404011001c700008010020000390ff40fef0000040f0000000102200190000007fa0000613d00000007060000290000001f026000390000000502200270000000200360008c0000000002004019000000000301043b00000004010000290000001f01100039000000050110027000000000011300190000000002230019000000000312004b000000060400002900000005050000290000016f0000813d000000000002041b0000000102200039000000000312004b0000016b0000413d0000001f0160008c000007fe0000a13d000700000006001d000600000004001d000500000005001d0000000000500435000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000404011001c700008010020000390ff40fef0000040f0000000102200190000007fa0000613d000000090300002900000007033001800000002002000039000000000101043b0000000a060000290000018f0000613d0000002002000039000000000400001900000000056200190000000005050433000000000051041b000000200220003900000001011000390000002004400039000000000534004b000001870000413d0000000705000029000000000353004b0000019b0000813d0000000303500210000000f80330018f000000010400008a000000000334022f000000000343013f0000000a022000290000000002020433000000000232016f000000000021041b000000010150021000000005050000290000000002050019000000080300002900000006040000290000080a0000013d000004140420009c000001f20000a13d000004150420009c000002460000a13d000004160420009c000004a20000613d000004170420009c000004a70000613d000004180220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000400220008c000007fa0000413d0000000402100370000000000202043b000b00000002001d000004030220009c000007fa0000213d0000002401100370000000000101043b000a00000001001d0ff40af20000040f000000000101004b00000000010000190000052b0000613d0000000a010000290000000b020000290ff40ed80000040f000000000101004b0000000001000019000000010100c0390000052b0000013d000004080420009c000002540000a13d000004090420009c000004b30000613d0000040a0420009c000004c60000613d0000040b0220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000402100370000000000202043b000004020420009c000007fa0000213d00000023042000390000042005000041000000000634004b000000000600001900000000060580190000042004400197000000000704004b0000000005008019000004200440009c000000000506c019000000000405004b000007fa0000c13d0000000404200039000000000141034f000000000101043b000700000001001d000004020110009c000007fa0000213d000600240020003d000000070100002900000005011002100000000601100029000000000131004b000007fa0000213d000000070100006b000006570000c13d000000000100001900000ff50001042e0000041b0420009c000002620000213d0000041e0420009c000004da0000613d0000041f0220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000401100370000000000101043b00000000001004350000000201000039000000200010043f000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000421011001c700008010020000390ff40fef0000040f0000000102200190000007fa0000613d000000000101043b000000000101041a000000ff0110018f000000030210008c000004f00000413d0000054e0000013d000004120420009c000004e50000613d000004130220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000400220008c000007fa0000413d0000000402100370000000000202043b000b00000002001d0000002401100370000000000101043b000a00000001001d000000020110008c000007fa0000213d0000043601000041000000800010043f00000000010004110000040301100197000900000001001d000000840010043f0000000b01000029000000a40010043f00000423010000410000000000100439000000000100041200000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f0000000102200190000007ac0000613d000000000201043b00000000010004140000040302200197000000040320008c000006070000c13d0000000003000031000000200130008c00000000040300190000002004008039000006320000013d000004190420009c000004f30000613d0000041a0220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000401100370000000000101043b0ff40c230000040f000004cf0000013d0000040c0420009c000005130000613d0000040d0220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000401100370000000000101043b0ff40af20000040f000004cf0000013d0000041c0420009c0000052d0000613d0000041d0220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000400220008c000007fa0000413d0000000402100370000000000202043b000004020420009c000007fa0000213d00000023042000390000042005000041000000000634004b000000000600001900000000060580190000042004400197000000000704004b0000000005008019000004200440009c000000000506c019000000000405004b000007fa0000c13d000200040020003d0000000204100360000000000404043b000b00000004001d000004020440009c000007fa0000213d00000024042000390000000b020000290000000502200210000100000002001d000700000004001d0000000002420019000000000232004b000007fa0000213d0000002402100370000000000202043b000004020420009c000007fa0000213d00000023042000390000042005000041000000000634004b000000000600001900000000060580190000042004400197000000000704004b0000000005008019000004200440009c000000000506c019000000000405004b000007fa0000c13d0000000404200039000000000141034f000000000101043b000004020410009c000007fa0000213d000000240420003900000005021002100000000002420019000000000232004b000007fa0000213d000800000004001d0000000b0110006c000007fc0000c13d00000423010000410000000000100439000000000100041200000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f0000000102200190000007ac0000613d000000000101043b000604030010019b0000000b0100006b0000000805000029000008310000c13d000000400100043d0000004002000039000000000321043600000040021000390000000b0400002900000000004204350000043e0240009c000007fa0000213d000000010200036700000001050000290000001f0450018f0000000505500272000002d50000613d00000002060000290000002006600039000000000662034f000000600710003900000000080000190000000509800210000000000a970019000000000996034f000000000909043b00000000009a04350000000108800039000000000958004b000002cd0000413d000000000404004b000002d70000613d000000010500002900000060045000390000000000430435000000000351001900000060043000390000000b0500002900000000005404350000008003300039000000000405004b0000000807000029000002ec0000613d0000000004000019000000000572034f000000000505043b000000020650008c000007fa0000213d0000000003530436000000200770003900000001044000390000000b0540006c000002e30000413d0000000002130049000003fe03000041000003fe0410009c00000000010380190000004001100210000003fe0420009c00000000020380190000006002200210000000000112019f0000000002000414000003fe0420009c0000000002038019000000c002200210000000000121019f00000433011001c70000800d0200003900000001030000390000043404000041000007f70000013d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000400220008c000007fa0000413d0000000402100370000000000202043b000004020420009c000007fa0000213d00000023042000390000042005000041000000000634004b000000000600001900000000060580190000042004400197000000000704004b0000000005008019000004200440009c000000000506c019000000000405004b000007fa0000c13d0000000404200039000000000441034f000000000404043b000600000004001d000004020440009c000007fa0000213d000500240020003d000000060200002900000005022002100000000502200029000000000232004b000007fa0000213d0000002402100370000000000202043b000004020420009c000007fa0000213d00000023042000390000042005000041000000000634004b000000000600001900000000060580190000042004400197000000000704004b0000000005008019000004200440009c000000000506c019000000000405004b000007fa0000c13d0000000404200039000000000141034f000000000101043b000004020410009c000007fa0000213d000400240020003d00000005021002100000000402200029000000000232004b000007fa0000213d0000000602000029000000000112004b000007fc0000c13d000000000102004b000001f00000613d000300020000003d000280100000003d000a00000000001d0000000a010000290000000502100210000900000002001d00000005012000290000000101100367000000000101043b000b00000001001d00000000001004350000000301000029000000200010043f0000000001000414000003fe0210009c000003fe01008041000000c00110021000000421011001c700000002020000290ff40fef0000040f0000000102200190000007fa0000613d000000000101043b000000000101041a000000ff0110018f000000020210008c0000054e0000213d000000020110008c000008fe0000c13d000000090200002900000004012000290000000101100367000000000101043b000900000001001d000004030110009c000007fa0000213d000000400200043d00000422010000410000000000120435000800000002001d00000004012000390000000b020000290000000000210435000004230100004100000000001004390000000001000412000700000001001d000000040010044300000024000004430000000001000414000003fe0210009c000003fe01008041000000c00110021000000424011001c700008005020000390ff40fef0000040f0000000102200190000007ac0000613d000000000201043b00000000010004140000040302200197000000040320008c000003850000c13d0000000003000031000000200130008c000000000403001900000020040080390000000809000029000003b60000013d000003fe0310009c000003fe0400004100000000010480190000000805000029000003fe0350009c000000000304001900000000030540190000004003300210000000c001100210000000000131019f00000425011001c70ff40fef0000040f000000080900002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000000505400272000003a30000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000039b0000413d0000001f06400190000003b20000613d0000000505500210000000000751034f00000000055900190000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f00020000000103550000000102200190000009270000613d0000001f01400039000000600210018f0000000001920019000000000221004b00000000020000190000000102004039000004020410009c000000de0000213d0000000102200190000000de0000c13d000000400010043f000000200230008c000007fa0000413d0000000002090433000004030420009c000007fa0000213d00000044041000390000000b05000029000000000054043500000020051000390000042604000041000000000045043500000024041000390000000906000029000000000064043500000044040000390000000000410435000004270410009c000000de0000213d0000008004100039000000400040043f00000000060104330000000001000414000000040720008c000003dd0000c13d0000000102000039000004020130009c000003f30000a13d000000de0000013d000003fe0350009c000003fe0700004100000000050780190000004003500210000003fe0460009c00000000060780190000006004600210000000000334019f000003fe0410009c0000000001078019000000c001100210000000000113019f0ff40fef0000040f00000060040000390000008005000039000000010220018f00020000000103550000006001100270000003fe0010019d000003fe031001980000041b0000613d000000400400043d0000003f01300039000000200500008a000000000551016f0000000001450019000000000551004b00000000050000190000000105004039000004020610009c000000de0000213d0000000105500190000000de0000c13d000000400010043f0000000005340436000000020100036700000005063002720000040c0000613d000000000700001900000005087002100000000009850019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b000004040000413d0000001f033001900000041b0000613d0000000506600210000000000161034f00000000066500190000000303300210000000000706043300000000073701cf000000000737022f000000000101043b0000010003300089000000000131022f00000000013101cf000000000171019f0000000000160435000000000102004b000008ed0000613d0000000001040433000000400110008c000008ed0000c13d0000000001050433000000010210008c000008ed0000213d00000040024000390000000002020433000000010320008c000008ed0000213d000000010220008c000008ed0000c13d000000010110008c000008ed0000c13d000000400300043d00000024013000390000000902000029000000000021043500000428010000410000000000130435000800000003001d00000004013000390000000b020000290000000000210435000004230100004100000000001004390000000701000029000000040010044300000024000004430000000001000414000003fe0210009c000003fe01008041000000c00110021000000424011001c700008005020000390ff40fef0000040f0000000102200190000007ac0000613d000000000201043b00000000010004140000040302200197000000040320008c0000044e0000c13d0000000003000031000000200130008c0000000004030019000000200400803900000008090000290000047f0000013d000003fe0310009c000003fe0400004100000000010480190000000805000029000003fe0350009c000000000304001900000000030540190000004003300210000000c001100210000000000131019f00000429011001c70ff40fea0000040f000000080900002900000000030100190000006003300270000003fe03300197000000200430008c0000000004030019000000200400803900000005054002720000046c0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000004640000413d0000001f064001900000047b0000613d0000000505500210000000000751034f00000000055900190000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f00020000000103550000000102200190000009440000613d0000001f01400039000000600210018f0000000001920019000000000221004b00000000020000190000000102004039000004020410009c000000de0000213d0000000102200190000000de0000c13d000000400010043f000000200130008c000007fa0000413d0000000001090433000000000201004b0000000002000019000000010200c039000000000121004b000007fa0000c13d0000000a020000290000000102200039000a00000002001d000000060120006c000003430000413d000001f00000013d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000401100370000000000101043b0ff40cb90000040f000004cf0000013d0000000001000416000000000101004b000007fa0000c13d0000000001000410000004f00000013d0000000002000416000000000202004b000007fa0000c13d0000043b02000041000000800020043f00000000040004140000000002000410000000040520008c000005520000c13d000000000131034f00000000030000310000055f0000013d0000000001000416000000000101004b000007fa0000c13d0000000103000039000000000203041a000000010420019000000001052002700000007f0150018f000000000105c0190000001f0510008c00000000050000190000000105002039000000000552013f0000000105500190000005be0000613d0000042e0100004100000000001004350000002201000039000000e10000013d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000401100370000000000101043b0ff409c10000040f000000000101004b0000000001000019000000010100c039000000400200043d0000000000120435000003fe01000041000003fe0320009c000000000201801900000040012002100000042c011001c700000ff50001042e0000000001000416000000000101004b000007fa0000c13d0000000001000412000f00000001001d000e00200000003d00000000010004150000000f0110008a00000005011002100ff40fd60000040f000004f00000013d0000000001000416000000000101004b000007fa0000c13d0000000001000412000d00000001001d000c00000000001d00000000010004150000000d0110008a00000005011002100ff40fd60000040f0000040301100197000000800010043f0000043a0100004100000ff50001042e0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000401100370000000000101043b000b00000001001d00000000001004350000000201000039000000200010043f000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000421011001c700008010020000390ff40fef0000040f0000000102200190000007fa0000613d000000000101043b000000000101041a000000ff0110018f000000020210008c0000054e0000213d000000000101004b000006490000c13d000000400100043d0000042b02000041000009000000013d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000400220008c000007fa0000413d0000000402100370000000000202043b000b00000002001d000004030220009c000007fa0000213d0000002401100370000000000101043b000a00000001001d0ff409c10000040f000000000101004b00000000010000190000052b0000613d0000000a010000290000000b020000290ff40ed80000040f000000000101004b0000000001000019000000010100c039000000010110018f000004d20000013d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000400220008c000007fa0000413d0000000402100370000000000202043b000b00000002001d0000002401100370000000000101043b000a00000001001d000004030110009c000007fa0000213d0000000b0100002900000000001004350000000201000039000000200010043f000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000421011001c700008010020000390ff40fef0000040f0000000102200190000007fa0000613d000000000101043b000000000101041a000000ff0110018f000000020210008c0000064c0000a13d0000042e0100004100000000001004350000002101000039000000e10000013d000003fe01000041000003fe0340009c0000000004018019000000c00140021000000430011001c70ff40fef0000040f00000000030100190000006003300270000003fe0030019d000003fe0330019700020000000103550000000102200190000005c80000613d0000001f0230018f00000005043002720000056b0000613d00000000050000190000000506500210000000000761034f000000000707043b000000800660003900000000007604350000000105500039000000000645004b000005630000413d000000000502004b0000057a0000613d0000000504400210000000000141034f00000003022002100000008004400039000000000504043300000000052501cf000000000525022f000000000101043b0000010002200089000000000121022f00000000012101cf000000000151019f00000000001404350000009f02300039000000200100008a000000000212016f0000043c042000410000043d0440009c000000de0000413d0000042004000041000000200530008c000000000500001900000000050440190000042006300197000000000706004b000000000400a019000004200660009c000000000405c019000000400020043f000000000404004b000007fa0000c13d000000800400043d000004020540009c000007fa0000213d00000080053000390000009f034000390000042006000041000000000753004b0000000007000019000000000706801900000420085001970000042003300197000000000983004b0000000006008019000000000383013f000004200330009c000000000607c019000000000306004b000007fa0000c13d00000080034000390000000003030433000004020630009c000000de0000213d0000003f06300039000000000116016f0000000001210019000004020610009c000000de0000213d000000400010043f0000000001320436000000a0044000390000000006430019000000000556004b000007fa0000213d000000000503004b000005b70000613d000000000500001900000000061500190000000007450019000000000707043300000000007604350000002005500039000000000635004b000005b00000413d00000000011300190000000000010435000000400100043d000b00000001001d0ff409980000040f0000000b04000029000005fd0000013d000000800010043f000000000404004b000005e50000c13d000001000300008a000000000232016f000000a00020043f000000000101004b000000c002000039000000a002006039000005f40000013d000000400200043d0000001f0430018f0000000505300272000005d50000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000005cd0000413d000000000604004b000005e40000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000007c90000013d0000000000300435000000a002000039000000000301004b000005f40000613d0000042d0200004100000000040000190000000003040019000000000402041a000000a005300039000000000045043500000001022000390000002004300039000000000514004b000005eb0000413d000000c002300039000000800220008a0000008001000039000b00000001001d0ff409ae0000040f000000400100043d000a00000001001d0000000b020000290ff409980000040f0000000a040000290000000001410049000003fe02000041000003fe0310009c0000000001028019000003fe0340009c000000000402801900000040024002100000006001100210000000000121019f00000ff50001042e000003fe03000041000003fe0410009c0000000001038019000000c00110021000000437011001c70ff40fef0000040f00000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f00000005064002720000061f0000613d00000000070000190000000508700210000000000981034f000000000909043b000000800880003900000000009804350000000107700039000000000867004b000006170000413d000000000705004b0000062e0000613d0000000506600210000000000761034f00000003055002100000008006600039000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f00020000000103550000000102200190000007ad0000613d0000001f01400039000000600210018f00000080012001bf000000400010043f000000200330008c000007fa0000413d000000800300043d000000000403004b0000000004000019000000010400c039000000000443004b000007fa0000c13d000000000303004b000007d00000c13d0000043903000041000000000031043500000084032001bf00000009040000290000000000430435000000a4022000390000000b030000290000000000320435000008240000013d00000000020004110000000b01000029000006500000013d000000020110008c000008fe0000c13d0000000b010000290000000a020000290ff40d4b0000040f000000000100001900000ff50001042e0000042f01000041000000800010043f000004300100004100000ff600010430000500020000003d000480100000003d000380050000003d000a00000000001d0000000a01000029000000050110021000000006011000290000000101100367000000000101043b000b00000001001d00000000001004350000000501000029000000200010043f0000000001000414000003fe0210009c000003fe01008041000000c00110021000000421011001c700000004020000290ff40fef0000040f0000000102200190000007fa0000613d000000000101043b000000000101041a000000ff0210018f000000020120008c0000054e0000213d000000400300043d0000000401300039000000000202004b000008270000613d0000042202000041000900000003001d00000000002304350000000b020000290000000000210435000004230100004100000000001004390000000001000412000800000001001d000000040010044300000024000004430000000001000414000003fe0210009c000003fe01008041000000c00110021000000424011001c700000003020000290ff40fef0000040f00000000060004110000000102200190000007ac0000613d000000000201043b00000000010004140000040302200197000000040320008c000006960000c13d0000000003000031000000200130008c000000000403001900000020040080390000000909000029000006c90000013d000200000006001d000003fe0310009c000003fe0400004100000000010480190000000905000029000003fe0350009c000000000304001900000000030540190000004003300210000000c001100210000000000131019f00000425011001c70ff40fef0000040f000000090900002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000000505400272000006b50000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000006ad0000413d0000001f06400190000006c40000613d0000000505500210000000000751034f00000000055900190000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f000200000001035500000001022001900000000206000029000008b30000613d0000001f01400039000000600210018f0000000001920019000000000221004b00000000020000190000000102004039000004020410009c000000de0000213d0000000102200190000000de0000c13d000000400010043f000000200230008c000007fa0000413d0000000002090433000004030420009c000007fa0000213d00000044041000390000000b05000029000000000054043500000020051000390000042604000041000000000045043500000044040000390000000000410435000004030a60019700000024041000390000000000a40435000004270410009c000000de0000213d0000008004100039000000400040043f00000000060104330000000001000414000000040720008c000006f00000c13d0000000102000039000004020130009c000007080000a13d000000de0000013d000003fe0350009c000003fe0700004100000000050780190000004003500210000003fe0460009c00000000060780190000006004600210000000000334019f000003fe0410009c0000000001078019000000c001100210000000000113019f00090000000a001d0ff40fef0000040f000000090a0000290000006004000039000000010220018f00020000000103550000006001100270000003fe0010019d000003fe031001980000000101000029000007300000613d000000400400043d0000003f01300039000000200500008a000000000551016f0000000001450019000000000551004b00000000050000190000000105004039000004020610009c000000de0000213d0000000105500190000000de0000c13d000000400010043f000000000134043600000002050003670000000506300272000007210000613d000000000700001900000005087002100000000009810019000000000885034f000000000808043b00000000008904350000000107700039000000000867004b000007190000413d0000001f03300190000007300000613d0000000506600210000000000565034f00000000066100190000000303300210000000000706043300000000073701cf000000000737022f000000000505043b0000010003300089000000000535022f00000000033501cf000000000373019f0000000000360435000000000202004b000008190000613d0000000002040433000000400220008c000008190000c13d0000000001010433000000010210008c000008190000213d00000040024000390000000002020433000000010320008c000008190000213d000000010220008c000008190000c13d000000010110008c000008190000c13d000000400200043d00000024012000390000000000a1043500000428010000410000000000120435000900000002001d00000004012000390000000b020000290000000000210435000004230100004100000000001004390000000801000029000000040010044300000024000004430000000001000414000003fe0210009c000003fe01008041000000c00110021000000424011001c700008005020000390ff40fef0000040f0000000102200190000007ac0000613d000000000201043b00000000010004140000040302200197000000040320008c000007620000c13d0000000003000031000000200130008c000000000403001900000020040080390000000909000029000007930000013d000003fe0310009c000003fe0400004100000000010480190000000905000029000003fe0350009c000000000304001900000000030540190000004003300210000000c001100210000000000131019f00000429011001c70ff40fea0000040f000000090900002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000000505400272000007800000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000007780000413d0000001f064001900000078f0000613d0000000505500210000000000751034f00000000055900190000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f00020000000103550000000102200190000008d00000613d0000001f01400039000000600210018f0000000001920019000000000221004b00000000020000190000000102004039000004020410009c000000de0000213d0000000102200190000000de0000c13d000000400010043f000000200130008c000007fa0000413d0000000001090433000000000201004b0000000002000019000000010200c039000000000121004b000007fa0000c13d0000000a020000290000000102200039000a00000002001d000000070120006c0000065b0000413d000001f00000013d000000000001042f000000400200043d0000001f0430018f0000000505300272000007ba0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000007b20000413d000000000604004b000007c90000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000003fe01000041000003fe0420009c000000000201801900000040012002100000006002300210000000000121019f00000ff6000104300000000b0100002900000000001004350000000201000039000000200010043f000003fe030000410000000001000414000003fe0210009c0000000001038019000000c00110021000000421011001c700008010020000390ff40fef0000040f0000000102200190000007fa0000613d000000000101043b000000000201041a000001000300008a000000000232016f0000000a03000029000000000232019f000000000021041b000000400100043d000000200210003900000000003204350000000b0200002900000000002104350000000002000414000003fe0320009c000003fe040000410000000002048019000003fe0310009c00000000010480190000004001100210000000c002200210000000000112019f00000421011001c70000800d02000039000000010300003900000438040000410ff40fea0000040f0000000101200190000001f00000c13d000000000100001900000ff6000104300000043101000041000006540000013d000000000106004b0000000001000019000008030000613d0000000b0100002900000000010104330000000302600210000000010300008a000000000223022f000000000232013f000000000121016f00000001026002100000000803000029000000000121019f000000000015041b0000040301300197000000800010043f000000a00040043f0000014000000443000001600010044300000020010000390000018000100443000001a000400443000001000010044300000002010000390000012000100443000004050100004100000ff50001042e000000400100043d00000024021000390000000b0300002900000000003204350000042a02000041000000000021043500000004021000390000000000a20435000003fe02000041000003fe0310009c0000000001028019000000400110021000000429011001c700000ff6000104300000042b0200004100000000002304350000000b020000290000000000210435000003fe01000041000003fe0230009c0000000003018019000000400130021000000425011001c700000ff6000104300000000001000411000504030010019b0000000002000019000a00000002001d000000050720021000000007017000290000000101100367000000000601043b000000400900043d000004360100004100000000001904350000000401900039000000050200002900000000002104350000002401900039000000000061043500000000010004140000000602000029000000040320008c0000084a0000c13d0000000003000031000000200130008c00000000040300190000002004008039000008800000013d000400000007001d000900000006001d000003fe0310009c000003fe040000410000000001048019000003fe0390009c000000000304001900000000030940190000004003300210000000c001100210000000000131019f00000429011001c7000300000009001d0ff40fef0000040f000000030900002900000000030100190000006003300270000003fe03300197000000200430008c0000000004030019000000200400803900000005054002720000086a0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000008620000413d0000001f06400190000008790000613d0000000505500210000000000751034f00000000055900190000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f000200000001035500000001022001900000000805000029000000090600002900000004070000290000090a0000613d0000001f01400039000000600210018f0000000001920019000000000221004b00000000020000190000000102004039000004020410009c000000de0000213d0000000102200190000000de0000c13d000000400010043f000000200230008c000007fa0000413d0000000002090433000000000302004b0000000003000019000000010300c039000000000332004b000007fa0000c13d000000000202004b000008f60000613d00000000015700190000000101100367000000000101043b000900000001001d000000020110008c000007fa0000213d00000000006004350000000201000039000000200010043f0000000001000414000003fe0210009c000003fe01008041000000c00110021000000421011001c700008010020000390ff40fef0000040f00000008050000290000000102200190000007fa0000613d000000000101043b000000000201041a000001000300008a000000000232016f00000009022001af000000000021041b0000000a0200002900000001022000390000000b0120006c000008340000413d000002bb0000013d000000400200043d0000001f0430018f0000000505300272000008c00000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000008b80000413d000000000604004b000008cf0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000007c90000013d000000400200043d0000001f0430018f0000000505300272000008dd0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000008d50000413d000000000604004b000008ec0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000007c90000013d000000400100043d00000024021000390000000b0300002900000000003204350000042a02000041000000000021043500000004021000390000000903000029000008fc0000013d0000002402100039000000000062043500000439020000410000000000210435000000040210003900000005030000290000000000320435000008210000013d000000400100043d0000043502000041000000000021043500000004021000390000000b030000290000000000320435000003fe02000041000003fe0310009c0000000001028019000000400110021000000425011001c700000ff600010430000000400200043d0000001f0430018f0000000505300272000009170000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000090f0000413d000000000604004b000007c90000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000007c90000013d000000400200043d0000001f0430018f0000000505300272000009340000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000092c0000413d000000000604004b000009430000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000007c90000013d000000400200043d0000001f0430018f0000000505300272000009510000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000009490000413d000000000604004b000009600000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000007c90000013d000000400100043d00000431020000410000000000210435000003fe02000041000003fe0310009c0000000001028019000000400110021000000432011001c700000ff600010430000500020000003d000480100000003d0000000003000019000000800100043d000000000131004b0000000602000029000009940000a13d00000007010000290000000001010433000000000131004b000009940000a13d000b00000003001d000000050130021000000000022100190000000002020433000a00000002001d000000020220008c0000054e0000213d000000a001100039000000000101043300000000001004350000000501000029000000200010043f0000000001000414000003fe0210009c000003fe01008041000000c00110021000000421011001c700000004020000290ff40fef0000040f0000000102200190000007fa0000613d000000000101043b000000000201041a000000090220017f0000000a022001af000000000021041b0000000b030000290000000103300039000000080130006c0000096d0000413d000000ab0000013d0000042e0100004100000000001004350000003201000039000000e10000013d00000020030000390000000004310436000000000302043300000000003404350000004001100039000000000403004b000009a70000613d000000000400001900000000051400190000002004400039000000000624001900000000060604330000000000650435000000000534004b000009a00000413d000000000213001900000000000204350000001f02300039000000200300008a000000000232016f0000000001210019000000000001042d0000001f02200039000000200300008a000000000232016f0000000001120019000000000221004b00000000020000190000000102004039000004020310009c000009bb0000213d0000000102200190000009bb0000c13d000000400010043f000000000001042d0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff6000104300004000000000002000000400300043d0000043f020000410000000000230435000400000003001d0000000402300039000300000001001d0000000000120435000004230100004100000000001004390000000001000412000200000001001d00000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000aa70000613d000000000201043b00000000010004140000040302200197000000040320008c000009e40000c13d0000000003000031000000200130008c00000000040300190000002004008039000000040a00002900000a150000013d000003fe03000041000003fe0410009c00000000010380190000000405000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000425011001c70ff40fef0000040f000000040a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000a020000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b000009fa0000413d000000000705004b00000a110000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000aae0000613d0000001f01400039000000600110018f0000000004a10019000000000114004b00000000010000190000000101004039000004020240009c00000aa80000213d000000010110019000000aa80000c13d000000400040043f0000001f0130008c00000aa50000a13d00000000010a0433000003fe0210009c00000aa50000213d000000000101004b000000000100001900000aa40000613d0000002401400039000000030200002900000000002104350000043601000041000000000014043500000000010004100000040301100197000100000004001d0000000402400039000000000012043500000423010000410000000000100439000000020100002900000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000aa70000613d000000000201043b00000000010004140000040302200197000000040320008c00000a4c0000c13d0000000003000031000000200130008c00000000040300190000002004008039000000010a00002900000a7d0000013d000003fe03000041000003fe0410009c00000000010380190000000105000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000429011001c70ff40fef0000040f000000010a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000a6a0000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000a620000413d000000000705004b00000a790000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000acf0000613d0000001f01400039000000600110018f0000000001a10019000004020210009c00000aa80000213d000000400010043f000000200130008c00000aa50000413d00000000010a0433000000000201004b0000000002000019000000010200c039000000000221004b00000aa50000c13d000000000101004b000000000100001900000aa40000613d000000030100002900000000001004350000000201000039000000200010043f000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000421011001c700008010020000390ff40fef0000040f000000010220019000000aa50000613d000000000101043b000000000101041a000000ff0110018f000000020210008c00000acb0000213d000000000101004b0000000001000019000000010100c039000000000001042d000000000100001900000ff600010430000000000001042f0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff600010430000000400200043d0000001f0430018f000000050530027200000abb0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000ab30000413d000000000604004b00000aeb0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f000000000015043500000aeb0000013d0000042e010000410000000000100435000000210100003900000aab0000013d000000400200043d0000001f0430018f000000050530027200000adc0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000ad40000413d000000000604004b00000aeb0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000003fe01000041000003fe0420009c000000000201801900000040012002100000006002300210000000000121019f00000ff6000104300004000000000002000000400300043d0000043f020000410000000000230435000400000003001d0000000402300039000300000001001d0000000000120435000004230100004100000000001004390000000001000412000200000001001d00000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000bd80000613d000000000201043b00000000010004140000040302200197000000040320008c00000b150000c13d0000000003000031000000200130008c00000000040300190000002004008039000000040a00002900000b460000013d000003fe03000041000003fe0410009c00000000010380190000000405000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000425011001c70ff40fef0000040f000000040a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000b330000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000b2b0000413d000000000705004b00000b420000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000bdf0000613d0000001f01400039000000600110018f0000000004a10019000000000114004b00000000010000190000000101004039000004020240009c00000bd90000213d000000010110019000000bd90000c13d000000400040043f0000001f0130008c00000bd60000a13d00000000010a0433000003fe0210009c00000bd60000213d000000000101004b000000000100001900000bd50000613d0000002401400039000000030200002900000000002104350000043601000041000000000014043500000000010004100000040301100197000100000004001d0000000402400039000000000012043500000423010000410000000000100439000000020100002900000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000bd80000613d000000000201043b00000000010004140000040302200197000000040320008c00000b7d0000c13d0000000003000031000000200130008c00000000040300190000002004008039000000010a00002900000bae0000013d000003fe03000041000003fe0410009c00000000010380190000000105000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000429011001c70ff40fef0000040f000000010a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000b9b0000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000b930000413d000000000705004b00000baa0000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000c000000613d0000001f01400039000000600110018f0000000001a10019000004020210009c00000bd90000213d000000400010043f000000200130008c00000bd60000413d00000000010a0433000000000201004b0000000002000019000000010200c039000000000221004b00000bd60000c13d000000000101004b000000000100001900000bd50000613d000000030100002900000000001004350000000201000039000000200010043f000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000421011001c700008010020000390ff40fef0000040f000000010220019000000bd60000613d000000000101043b000000000101041a000000ff0110018f000000020210008c00000bfc0000213d000000020110008c00000000010000190000000101006039000000000001042d000000000100001900000ff600010430000000000001042f0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff600010430000000400200043d0000001f0430018f000000050530027200000bec0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000be40000413d000000000604004b00000c1c0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f000000000015043500000c1c0000013d0000042e010000410000000000100435000000210100003900000bdc0000013d000000400200043d0000001f0430018f000000050530027200000c0d0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000c050000413d000000000604004b00000c1c0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000003fe01000041000003fe0420009c000000000201801900000040012002100000006002300210000000000121019f00000ff6000104300001000000000002000000400300043d000000240230003900000000001204350000043601000041000000000013043500000000010004100000040301100197000100000003001d0000000402300039000000000012043500000423010000410000000000100439000000000100041200000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000c8f0000613d000000000201043b00000000010004140000040302200197000000040320008c00000c480000c13d0000000003000031000000200130008c00000000040300190000002004008039000000010a00002900000c790000013d000003fe03000041000003fe0410009c00000000010380190000000105000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000429011001c70ff40fef0000040f000000010a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000c660000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000c5e0000413d000000000705004b00000c750000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000c960000613d0000001f01400039000000600210018f0000000001a20019000000000221004b00000000020000190000000102004039000004020410009c00000c900000213d000000010220019000000c900000c13d000000400010043f0000001f0130008c00000c8d0000a13d00000000010a0433000000000201004b0000000002000019000000010200c039000000000221004b00000c8d0000c13d000000000001042d000000000100001900000ff600010430000000000001042f0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff600010430000000400200043d0000001f0430018f000000050530027200000ca30000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000c9b0000413d000000000604004b00000cb20000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000003fe01000041000003fe0420009c000000000201801900000040012002100000006002300210000000000121019f00000ff6000104300001000000000002000000400300043d0000043f020000410000000000230435000100000003001d0000000402300039000000000012043500000423010000410000000000100439000000000100041200000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000d210000613d000000000201043b00000000010004140000040302200197000000040320008c00000cda0000c13d0000000003000031000000200130008c00000000040300190000002004008039000000010a00002900000d0b0000013d000003fe03000041000003fe0410009c00000000010380190000000105000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000425011001c70ff40fef0000040f000000010a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000cf80000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000cf00000413d000000000705004b00000d070000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000d280000613d0000001f01400039000000600210018f0000000001a20019000000000221004b00000000020000190000000102004039000004020410009c00000d220000213d000000010220019000000d220000c13d000000400010043f0000001f0130008c00000d1f0000a13d00000000010a0433000003fe0210009c00000d1f0000213d000000000101004b0000000001000019000000010100c039000000000001042d000000000100001900000ff600010430000000000001042f0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff600010430000000400200043d0000001f0430018f000000050530027200000d350000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000d2d0000413d000000000604004b00000d440000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000003fe01000041000003fe0420009c000000000201801900000040012002100000006002300210000000000121019f00000ff6000104300004000000000002000200000002001d000000400300043d00000422020000410000000000230435000300000003001d0000000402300039000400000001001d0000000000120435000004230100004100000000001004390000000001000412000100000001001d00000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000e970000613d000000000201043b00000000010004140000040302200197000000040320008c00000d6f0000c13d0000000003000031000000200130008c00000000040300190000002004008039000000030a00002900000da00000013d000003fe03000041000003fe0410009c00000000010380190000000305000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000425011001c70ff40fef0000040f000000030a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000d8d0000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000d850000413d000000000705004b00000d9c0000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000e980000613d0000001f01400039000000600210018f0000000001a20019000000000221004b00000000020000190000000102004039000004020410009c00000e810000213d000000010220019000000e810000c13d000000400010043f0000001f0230008c00000e950000a13d00000000020a0433000004030420009c00000e950000213d000000440410003900000004050000290000000000540435000000200510003900000426040000410000000000450435000000440400003900000000004104350000000204000029000004030a40019700000024041000390000000000a40435000004270410009c00000e810000213d0000008004100039000000400040043f00000000060104330000000001000414000000040720008c00000dc80000c13d0000000102000039000004020130009c00000de00000a13d00000e810000013d000003fe03000041000003fe0450009c00000000050380190000004004500210000003fe0560009c00000000060380190000006005600210000000000445019f000003fe0510009c0000000001038019000000c001100210000000000114019f00030000000a001d0ff40fef0000040f000000030a00002900000060040000390000008005000039000000010220018f00020000000103550000006001100270000003fe0010019d000003fe0310019800000e090000613d000000400400043d0000003f01300039000000200500008a000000000151016f0000000001140019000000000541004b00000000050000190000000105004039000004020610009c00000e810000213d000000010550019000000e810000c13d000000400010043f0000001f0130018f00000000053404360000000206000367000000050330027200000dfa0000613d000000000700001900000005087002100000000009850019000000000886034f000000000808043b00000000008904350000000107700039000000000837004b00000df20000413d000000000701004b00000e090000613d0000000503300210000000000636034f00000000033500190000000301100210000000000703043300000000071701cf000000000717022f000000000606043b0000010001100089000000000616022f00000000011601cf000000000171019f0000000000130435000000000102004b00000e870000613d0000000001040433000000400110008c00000e870000c13d0000000001050433000000010210008c00000e870000213d00000040024000390000000002020433000000010320008c00000e870000213d000000010220008c00000e870000c13d000000010110008c00000e870000c13d000000400200043d00000024012000390000000000a1043500000428010000410000000000120435000300000002001d00000004012000390000000402000029000000000021043500000423010000410000000000100439000000010100002900000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000e970000613d000000000201043b00000000010004140000040302200197000000040320008c00000e3c0000c13d0000000003000031000000200130008c00000000040300190000002004008039000000030a00002900000e6d0000013d000003fe03000041000003fe0410009c00000000010380190000000305000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000429011001c70ff40fea0000040f000000030a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000e5a0000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000e520000413d000000000705004b00000e690000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000eb50000613d0000001f01400039000000600210018f0000000001a20019000000000221004b00000000020000190000000102004039000004020410009c00000e810000213d000000010220019000000e810000c13d000000400010043f000000200130008c00000e950000413d00000000010a0433000000000201004b0000000002000019000000010200c039000000000121004b00000e950000c13d000000000001042d0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff600010430000000400100043d0000002402100039000000040300002900000000003204350000042a02000041000000000021043500000004021000390000000000a20435000003fe02000041000003fe0310009c0000000001028019000000400110021000000429011001c700000ff600010430000000000100001900000ff600010430000000000001042f000000400200043d0000001f0430018f000000050530027200000ea50000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000e9d0000413d000000000604004b00000ed10000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f000000000015043500000ed10000013d000000400200043d0000001f0430018f000000050530027200000ec20000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000eba0000413d000000000604004b00000ed10000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000003fe01000041000003fe0420009c000000000201801900000040012002100000006002300210000000000121019f00000ff6000104300003000000000002000200000002001d000000400300043d00000422020000410000000000230435000300000003001d0000000402300039000100000001001d000000000012043500000423010000410000000000100439000000000100041200000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000fb10000613d000000000201043b00000000010004140000040302200197000000040320008c00000efb0000c13d0000000003000031000000200130008c00000000040300190000002004008039000000030a00002900000f2c0000013d000003fe03000041000003fe0410009c00000000010380190000000305000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000425011001c70ff40fef0000040f000000030a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000f190000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000f110000413d000000000705004b00000f280000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000fb20000613d0000001f01400039000000600210018f0000000001a20019000000000221004b00000000020000190000000102004039000004020410009c00000fa90000213d000000010220019000000fa90000c13d000000400010043f0000001f0230008c00000faf0000a13d00000000020a0433000004030420009c00000faf0000213d000000440410003900000001050000290000000000540435000000200410003900000426050000410000000000540435000000020500002900000403055001970000002406100039000000000056043500000044050000390000000000510435000004270510009c00000fa90000213d0000008005100039000000400050043f00000000050104330000000001000414000000040620008c00000f540000c13d0000000102000039000004020130009c00000f690000a13d00000fa90000013d000003fe03000041000003fe0640009c00000000040380190000004004400210000003fe0650009c00000000050380190000006005500210000000000445019f000003fe0510009c0000000001038019000000c001100210000000000114019f0ff40fef0000040f00000060040000390000008005000039000000010220018f00020000000103550000006001100270000003fe0010019d000003fe0310019800000f930000613d0000003f01300039000000200400008a000000000141016f000000400400043d0000000001140019000000000541004b00000000050000190000000105004039000004020610009c00000fa90000213d000000010550019000000fa90000c13d000000400010043f0000001f0130018f00000000053404360000000206000367000000050330027200000f840000613d000000000700001900000005087002100000000009850019000000000886034f000000000808043b00000000008904350000000107700039000000000837004b00000f7c0000413d000000000701004b00000f930000613d0000000503300210000000000636034f00000000033500190000000301100210000000000703043300000000071701cf000000000717022f000000000606043b0000010001100089000000000616022f00000000011601cf000000000171019f0000000000130435000000000102004b000000000100001900000fa80000613d0000000001040433000000400110008c000000000100001900000fa80000c13d0000000002050433000000010120008c000000000100001900000fa80000213d00000040014000390000000003010433000000010130008c000000000100001900000fa80000213d000000010120015f000000010230015f00000000011201a000000000010000190000000101006039000000000001042d0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff600010430000000000100001900000ff600010430000000000001042f000000400200043d0000001f0430018f000000050530027200000fbf0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000fb70000413d000000000604004b00000fce0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000003fe01000041000003fe0420009c000000000201801900000040012002100000006002300210000000000112019f00000ff600010430000000000001042f0000042302000041000000000020043900000005011002700000000002010031000000040020044300000001010100310000002400100443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000fe90000613d000000000101043b000000000001042d000000000001042f00000fed002104210000000102000039000000000001042d0000000002000019000000000001042d00000ff2002104230000000102000039000000000001042d0000000002000019000000000001042d00000ff40000043200000ff50001042e00000ff600010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000dfffffffffffffffffffffffffffffffffffffffffffffffff00000000000000bf00000000000000000000000000000000000000000000000000000001ffffffe0000000000000000000000000000000000000000000000000ffffffffffffffff000000000000000000000000ffffffffffffffffffffffffffffffffffffffff020000000000000000000000000000000000002000000000000000000000000000000002000000000000000000000000000000c0000001000000000000000000000000000000000000000000000000000000000000000000000000007150ef8700000000000000000000000000000000000000000000000000000000cc9d707300000000000000000000000000000000000000000000000000000000dd1bb1fb00000000000000000000000000000000000000000000000000000000dd1bb1fc00000000000000000000000000000000000000000000000000000000efbd181f00000000000000000000000000000000000000000000000000000000fca8d7c800000000000000000000000000000000000000000000000000000000cc9d707400000000000000000000000000000000000000000000000000000000d74251a000000000000000000000000000000000000000000000000000000000890db75b00000000000000000000000000000000000000000000000000000000890db75c0000000000000000000000000000000000000000000000000000000094dc956a00000000000000000000000000000000000000000000000000000000a4f9edbf000000000000000000000000000000000000000000000000000000007150ef8800000000000000000000000000000000000000000000000000000000840ebfdf0000000000000000000000000000000000000000000000000000000030178f29000000000000000000000000000000000000000000000000000000003a4741bc000000000000000000000000000000000000000000000000000000003a4741bd0000000000000000000000000000000000000000000000000000000054fd4d5000000000000000000000000000000000000000000000000000000000686d9fa20000000000000000000000000000000000000000000000000000000030178f2a0000000000000000000000000000000000000000000000000000000031d70b66000000000000000000000000000000000000000000000000000000002afb5c51000000000000000000000000000000000000000000000000000000002afb5c52000000000000000000000000000000000000000000000000000000002fbc035f0000000000000000000000000000000000000000000000000000000007ace2b5000000000000000000000000000000000000000000000000000000001d70af85800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000400000000000000000000000008c07607700000000000000000000000000000000000000000000000000000000310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e02000002000000000000000000000000000000440000000000000000000000000000000000000000000000000000000000000024000000000000000000000000bd68387200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f641f776e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004400000000000000000000000013d4d4dd000000000000000000000000000000000000000000000000000000002cf7343d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf64e487b71000000000000000000000000000000000000000000000000000000000dc149f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000008000000000000000001132131c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000200000000000000000000000000000000000000000000000000000000000000b18604a21764a23acb45fc37d878f421c181294b251c148cd43689947f47621073d33f9100000000000000000000000000000000000000000000000000000000b56f75620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000008000000000000000003de74aa59ab1ab0255006bf14c5df84e529e14ae2122677499a5f2a2d0b815dae8ed9286000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000800000000000000000dd1bb1fc00000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000008007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb28491700000000000000000000000000000000000000000000000000000000cb90f1f6a102279d23f7223305d45735b869cb7dc64ab85741e68b61e03d5081" ], - "address": "0x1e8C2a171e5c5D92d15F5363fd136CAf3bBf86E2", - "txHash": "0xa76d928c5b68e1ff6bd00575468c6771981f3b8e3ade9a089b4547128e8a1b3c" + "address": "0x6175C315720E9Ca084414AA6A2d0abC9C74E60c0", + "txHash": "0x2e0100cbaa7d0eed6f54042321708303fa0f2c94da97868015bda8db0826086e" } ] } diff --git a/script/DeployMultiClaimsHatter.ts b/script/DeployMultiClaimsHatter.ts index 1a44b89..b5c6088 100644 --- a/script/DeployMultiClaimsHatter.ts +++ b/script/DeployMultiClaimsHatter.ts @@ -12,7 +12,7 @@ const contractName = "MultiClaimsHatter"; const HATS_ID = 1; const HATS = "0x32Ccb7600c10B4F7e678C7cbde199d98453D0e7e"; const SALT_NONCE = 1; -const FACTORY_ADDRESS = "0x1e8C2a171e5c5D92d15F5363fd136CAf3bBf86E2"; +const FACTORY_ADDRESS = "0x6175C315720E9Ca084414AA6A2d0abC9C74E60c0"; async function main() { dotEnvConfig(); From 8f69055b4a637e413b85dc2687794c019deddc48 Mon Sep 17 00:00:00 2001 From: keating Date: Tue, 23 Jul 2024 15:52:37 -0400 Subject: [PATCH 17/18] Remove comment --- src/MultiClaimsHatterFactory.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MultiClaimsHatterFactory.sol b/src/MultiClaimsHatterFactory.sol index 26d8f4f..2ec1dfe 100644 --- a/src/MultiClaimsHatterFactory.sol +++ b/src/MultiClaimsHatterFactory.sol @@ -16,7 +16,7 @@ contract MultiClaimsHatterFactory is IHatsModuleFactory { { bytes memory saltArgs = abi.encodePacked(VERSION, _hatId, _hat, _initData); bytes32 salt = _calculateSalt(saltArgs, _saltNonce); - // TODO: Test situate where contract exitsts + MultiClaimsHatter instance = new MultiClaimsHatter{ salt: salt }(VERSION, _hat, _hatId); instance.setUp(_initData); emit ModuleDeployed( From 0c8fd92cfac942f2a60ed442163c02fbbe1d63a9 Mon Sep 17 00:00:00 2001 From: Keating Date: Fri, 9 Aug 2024 16:56:53 -0400 Subject: [PATCH 18/18] Change bytecode hash --- .../MultiClaimsHatterFactory.json | 6 ++--- script/DeployMultiClaimsHatter.ts | 2 +- src/MultiClaimsHatterFactory.sol | 4 +-- test/MultiClaimsHatterFactory.t.sol | 26 ------------------- 4 files changed, 6 insertions(+), 32 deletions(-) delete mode 100644 test/MultiClaimsHatterFactory.t.sol diff --git a/deployments-zk/zkSyncLocal/src/MultiClaimsHatterFactory.sol/MultiClaimsHatterFactory.json b/deployments-zk/zkSyncLocal/src/MultiClaimsHatterFactory.sol/MultiClaimsHatterFactory.json index 3e1cf72..75be638 100644 --- a/deployments-zk/zkSyncLocal/src/MultiClaimsHatterFactory.sol/MultiClaimsHatterFactory.json +++ b/deployments-zk/zkSyncLocal/src/MultiClaimsHatterFactory.sol/MultiClaimsHatterFactory.json @@ -127,7 +127,7 @@ "type": "function" } ], - "bytecode": "0x0003000000000002000e00000000000200000000030100190000006003300270000000f503300197000200000031035500010000000103550000008004000039000000400040043f0000000102200190000001220000c13d000000040230008c0000014a0000413d000000000201043b000000e002200270000000f70420009c0000012a0000613d000000f80420009c0000013e0000613d000000f90220009c0000014a0000c13d0000000002000416000000000202004b0000014a0000c13d000000040230008a000000800220008c0000014a0000413d0000000402100370000000000802043b0000002402100370000000000902043b000000fa0290009c0000014a0000213d0000004402100370000000000202043b000000fb0420009c0000014a0000213d0000002304200039000000fc05000041000000000634004b00000000060000190000000006058019000000fc04400197000000000704004b0000000005008019000000fc0440009c000000000506c019000000000405004b0000014a0000c13d0000000404200039000000000541034f000000000a05043b000000fb05a0009c0000014a0000213d0000000002a200190000002402200039000000000232004b0000014a0000213d0000006402100370000000000b02043b000000c002000039000000400020043f0000000c07000039000000800070043f000000fd02000041000000a00020043f000000e00020043f000000ec0080043f00000060029002100000010c0020043f0000002002400039000000000121034f0000001f02a0018f0000000503a00272000000540000613d00000000040000190000000505400210000000000651034f000000000606043b000001200550003900000000006504350000000104400039000000000534004b0000004c0000413d000000000402004b000000630000613d0000000503300210000000000131034f00000003022002100000012003300039000000000403043300000000042401cf000000000424022f000000000101043b0000010002200089000000000121022f00000000012101cf000000000141019f00000000001304350000012001a0003900000000000104350000013f01a00039000000200200008a000000000321016f0000004005a00039000000c00050043f000000fe013000410000010c0110009c000001980000a13d000c0000000b001d000d0000000a001d000e00000002001d000800000007001d000600000009001d000700000008001d000000400030043f000b00000003001d000000200430003900000000010000190000000002410019000000e003100039000000000303043300000000003204350000002001100039000000000251004b000000770000413d000900000004001d0000000001540019000000000001043500000100010000410000000000100439000000f5010000410000000002000414000000f50320009c0000000002018019000000c00120021000000101011001c70000800b02000039000a00000005001d03cd03c80000040f0000000102200190000003640000613d0000000b050000290000000a02500029000000000101043b00000040032000390000000c040000290000000000430435000000200220003900000000001204350000000d0200002900000080012000390000000000150435000000bf012000390000000e0210017f0000000001520019000000000221004b00000000020000190000000102004039000000fb0310009c000001980000213d0000000102200190000001980000c13d000000400010043f000000f5010000410000000903000029000000f50230009c000000000301801900000040023002100000000003050433000000f50430009c00000000030180190000006003300210000000000223019f0000000003000414000000f50430009c0000000003018019000000c001300210000000000121019f00000102011001c7000080100200003903cd03c80000040f00000001022001900000014a0000613d000000000101043b000d00000001001d000000400300043d000001030130009c0000000804000029000001980000213d0000004001300039000000400010043f0000002001300039000000fd0200004100000000002104350000000000430435000000400100043d000000200210003900000060040000390000000000420435000000000403043300000080051000390000000000450435000000a005100039000000000604004b000000d60000613d000000000600001900000000075600190000002006600039000000000836001900000000080804330000000000870435000000000746004b000000cf0000413d000000000354001900000000000304350000006003100039000000070500002900000000005304350000000603000029000000fa03300197000000400510003900000000003504350000009f034000390000000e0330017f0000000000310435000000bf034000390000000e0430017f0000000003140019000000000443004b00000000040000190000000104004039000000fb0530009c000001980000213d0000000104400190000001980000c13d000000400030043f000000f503000041000000f50420009c000000000203801900000040022002100000000001010433000000f50410009c00000000010380190000006001100210000000000121019f0000000002000414000000f50420009c0000000002038019000000c002200210000000000112019f00000102011001c7000080100200003903cd03c80000040f00000001022001900000014a0000613d000000000101043b000000400200043d000000a003200039000000000013043500000080012000390000010d03000041000000000031043500000060012000390000000d03000029000000000031043500000040012000390000000003000410000000000031043500000020012000390000010e030000410000000000310435000000a00300003900000000003204350000010f0320009c000001980000213d000000c003200039000e00000003001d000000400030043f000000000202043303cd03ad0000040f000000fa011001970000000e030000290000000000130435000000f501000041000000f50230009c000000000301801900000040013002100000010b011001c7000003ce0001042e0000000001000416000000000101004b0000014a0000c13d000000200100003900000100001004430000012000000443000000f601000041000003ce0001042e0000000001000416000000000101004b0000014a0000c13d03cd03880000040f0000002002000039000000400300043d000e00000003001d000000000223043603cd03990000040f0000000e040000290000000001410049000000f502000041000000f50310009c0000000001028019000000f50340009c000000000402801900000040024002100000006001100210000000000121019f000003ce0001042e0000000002000416000000000202004b0000014a0000c13d000000040230008a000000800220008c0000014a0000413d0000000402100370000000000902043b0000002402100370000000000d02043b000000fa02d0009c0000014c0000a13d0000000001000019000003cf000104300000004402100370000000000202043b000000fb0420009c0000014a0000213d0000002304200039000000fc05000041000000000634004b00000000060000190000000006058019000000fc04400197000000000704004b0000000005008019000000fc0440009c000000000506c019000000000405004b0000014a0000c13d0000000404200039000000000541034f000000000605043b000000fb0560009c0000014a0000213d000000240b2000390000000002b60019000000000232004b0000014a0000213d0000006402100370000000000502043b000000c00a0000390000004000a0043f0000000c0e0000390000008000e0043f000000fd02000041000000a00020043f000000e00020043f000000ec0090043f0000002002400039000000000121034f0000001f0760018f000000600cd002100000010c00c0043f00000005086002720000017f0000613d00000000020000190000000503200210000000000431034f000000000404043b000001200330003900000000004304350000000102200039000000000382004b000001770000413d000000000207004b0000018e0000613d0000000502800210000000000121034f00000003037002100000012002200039000000000402043300000000043401cf000000000434022f000000000101043b0000010003300089000000000131022f00000000013101cf000000000141019f0000000000120435000001200160003900000000000104350000013f01600039000000200200008a000000000321016f000000400f600039000000c000f0043f000000fe01300041000000ff0110009c0000019e0000813d000001100100004100000000001004350000004101000039000000040010043f0000011101000041000003cf0001043000080000000e001d00060000000d001d00020000000c001d00050000000b001d00010000000a001d000e00000002001d000700000009001d000400000008001d000300000007001d000c00000005001d000d00000006001d000000400030043f000b00000003001d000000200430003900000000010000190000000002410019000000e0031000390000000003030433000000000032043500000020011000390000000002f1004b000001ad0000413d000900000004001d0000000001f40019000000000001043500000100010000410000000000100439000000f5010000410000000002000414000000f50320009c0000000002018019000000c00120021000000101011001c70000800b02000039000a0000000f001d03cd03c80000040f0000000102200190000003640000613d0000000b050000290000000a02500029000000000101043b00000040032000390000000c040000290000000000430435000000200220003900000000001204350000000d0200002900000080012000390000000000150435000000bf012000390000000e0210017f0000000001520019000000000221004b00000000020000190000000102004039000000fb0310009c000001980000213d0000000102200190000001980000c13d000000400010043f000000f5010000410000000903000029000000f50230009c000000000301801900000040023002100000000003050433000000f50430009c00000000030180190000006003300210000000000223019f0000000003000414000000f50430009c0000000003018019000000c001300210000000000121019f00000102011001c7000080100200003903cd03c80000040f00000001022001900000014a0000613d000000000101043b000000400300043d000001030230009c0000000805000029000001980000213d0000004002300039000000400020043f0000002002300039000000fd0400004100000000004204350000000000530435000000400200043d000001040420009c000001980000213d0000008405200039000000600400003900000000004504350000002405200039000001050600004100000000006504350000000005030433000000e40620003900000000005604350000010406200039000000000705004b000002100000613d000000000700001900000000086700190000002007700039000000000937001900000000090904330000000000980435000000000857004b000002090000413d00000000036500190000000000030435000000c403200039000000070600002900000000006304350000000603000029000000fa03300197000000a40620003900000000003604350000001f035000390000000e0330017f0000008005300039000000640620003900000000070004140000000000560435000000440520003900000000004504350000010604000041000000000042043500000004042000390000000000140435000000f501000041000000f50420009c000000000201801900000040022002100000010403300039000000f50430009c00000000030180190000006003300210000000000223019f000000f50370009c0000000007018019000000c001700210000000000121019f00000102011001c7000080060200003903cd03c30000040f00000001022001900000023d0000613d000000000101043b000000000201004b000002670000c13d00000002010003670000000002000031000002420000013d000200000001035500000000020100190000006002200270000000f50020019d000000f502200197000000400300043d0000001f0420018f00000005052002720000024f0000613d000000000600001900000005076002100000000008730019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000002470000413d000000000604004b0000025e0000613d0000000505500210000000000151034f00000000055300190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000000f501000041000000f50430009c0000000003018019000000f50420009c000000000201801900000060012002100000004002300210000000000112019f000003cf0001043000000107020000410000000000200439000000fa01100197000b00000001001d0000000400100443000000f5010000410000000002000414000000f50320009c0000000002018019000000c00120021000000108011001c7000080020200003903cd03c80000040f0000000102200190000003640000613d000000000101043b000000000101004b0000000d0200002900000005030000290000014a0000613d000000400400043d0000002401400039000000000021043500000109010000410000000001140436000900000001001d000000040140003900000020020000390000000000210435000a00000004001d000000440140003900000001023003670000000406000029000000000306004b000002930000613d000000000300001900000005043002100000000005410019000000000442034f000000000404043b00000000004504350000000103300039000000000463004b0000028b0000413d000000030300006b000002a40000613d00000004030000290000000503300210000000000232034f000000000331001900000003040000290000000304400210000000000503043300000000054501cf000000000545022f000000000202043b0000010004400089000000000242022f00000000024201cf000000000252019f00000000002304350000000d01100029000000000001043500000000010004140000000b02000029000000040220008c000002c50000613d0000000d020000290000001f022000390000000e0220017f000000f5030000410000000a05000029000000f50450009c0000000004030019000000000405401900000040044002100000004402200039000000f50520009c00000000020380190000006002200210000000000224019f000000f50410009c0000000001038019000000c001100210000000000121019f0000000b0200002903cd03c30000040f00000000030100190000006003300270000000f50030019d000000f50330019700020000000103550000000102200190000003650000613d0000000a01000029000000fb0110009c000000040600002900000005010000290000000202000029000001980000213d0000000a03000029000000400030043f0000000904000029000000000024043500000034023000390000000101100367000000000306004b000002dc0000613d000000000300001900000005043002100000000005420019000000000441034f000000000404043b00000000004504350000000103300039000000000463004b000002d40000413d000000030300006b000002ed0000613d00000004030000290000000503300210000000000431034f000000000332001900000003050000290000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f00000000004304350000000d030000290000000002320019000000000002043500000014023000390000000a04000029000000000024043500000053023000390000000e0220017f0000000002240019000000000342004b00000000030000190000000103004039000000fb0420009c00000007040000290000000105000029000001980000213d0000000103300190000001980000c13d000000400020043f000000600320003900000000005304350000004003200039000000000043043500000020032000390000000b04000029000000000043043500000000004204350000000a080000290000000003080433000000c0042000390000000000340435000000e004200039000000000503004b000003170000613d000000000500001900000000064500190000002005500039000000000785001900000000070704330000000000760435000000000635004b000003100000413d000000000543001900000000000504350000001f033000390000000e0330017f00000000034300190000000004230049000000800520003900000000004504350000000d0400002900000000034304360000000407000029000000000407004b0000032d0000613d000000000400001900000005054002100000000006530019000000000551034f000000000505043b00000000005604350000000104400039000000000574004b000003250000413d000000030400006b0000033e0000613d00000004040000290000000504400210000000000141034f000000000443001900000003050000290000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000000d0400002900000000014300190000000000010435000000a0012000390000000c0500002900000000005104350000001f014000390000000e0110017f00000000012100490000000001310019000000f504000041000000f50320009c00000000020480190000004002200210000000f50310009c00000000010480190000006001100210000000000121019f0000000002000414000000f50320009c0000000002048019000000c002200210000000000112019f00000102011001c70000800d0200003900000001030000390000010a0400004103cd03c30000040f00000001012001900000014a0000613d000000400100043d0000000b020000290000000000210435000000f50210009c000000f50100804100000040011002100000010b011001c7000003ce0001042e000000000001042f000000400200043d0000001f0430018f0000000505300272000003720000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000036a0000413d000000000604004b000003810000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000000f501000041000000f50420009c000000000201801900000040012002100000006002300210000000000121019f000003cf00010430000000400100043d000001120210009c000003930000813d0000004002100039000000400020043f0000002002100039000000fd0300004100000000003204350000000c020000390000000000210435000000000001042d000001100100004100000000001004350000004101000039000000040010043f0000011101000041000003cf0001043000000000030104330000000002320436000000000403004b000003a50000613d000000000400001900000000052400190000002004400039000000000614001900000000060604330000000000650435000000000534004b0000039e0000413d000000000123001900000000000104350000001f01300039000000200300008a000000000131016f0000000001120019000000000001042d000000000001042f000000f503000041000000f50410009c00000000010380190000004001100210000000f50420009c00000000020380190000006002200210000000000112019f0000000002000414000000f50420009c0000000002038019000000c002200210000000000112019f00000102011001c7000080100200003903cd03c80000040f0000000102200190000003c10000613d000000000101043b000000000001042d0000000001000019000003cf00010430000003c6002104210000000102000039000000000001042d0000000002000019000000000001042d000003cb002104230000000102000039000000000001042d0000000002000019000000000001042d000003cd00000432000003ce0001042e000003cf00010430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff000000020000000000000000000000000000004000000100000000000000000000000000000000000000000000000000000000000000000000000000ffa1ad7400000000000000000000000000000000000000000000000000000000630eb20f000000000000000000000000000000000000000000000000000000004f1c32ad000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffffff8000000000000000000000000000000000000000000000000000000000000000302e362e302d7a6b73796e630000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff00000000000000c09a8a0592ac89c5ad3bc6df8224c17b485976f597df104ee20d0df415241f670b02000002000000000000000000000000000000040000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffbf000000000000000000000000000000000000000000000000ffffffffffffff7b010004410d2d3de6a7fcbe21aa0d8e9721fef6c9a39af7d1c3a3600fd3ebe6df3cda33511d41a8a5431b1770c5bc0ddd62e1cd30555d16659b89c0d60f4f9f571806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b830200000200000000000000000000000000000024000000000000000000000000a4f9edbf00000000000000000000000000000000000000000000000000000000cb6d9015e5a60155120ea0e2a88ede5648c21029e7a4214c3f44441d4f2ebd210000000000000000000000000000000000000020000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff00000000000000bf0100041dbb312c575f637f3b4ffbdf9beada863fa830a3f771b06df5a8a5c2872020dba91b30cc0006188af794c2fb30dd8520db7e2c088b7fc7c103c00ca494000000000000000000000000000000000000000000000000ffffffffffffff3f4e487b71000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffc00000000000000000000000000000000000000000000000000000000000000000213a2ef6aedc226523110e7576bcb1bb60a37c806de1adafbe5e711f287242b8", + "bytecode": "0x0003000000000002000e00000000000200000000030100190000006003300270000000f503300197000200000031035500010000000103550000008004000039000000400040043f0000000102200190000001220000c13d000000040230008c0000014a0000413d000000000201043b000000e002200270000000f70420009c0000012a0000613d000000f80420009c0000013e0000613d000000f90220009c0000014a0000c13d0000000002000416000000000202004b0000014a0000c13d000000040230008a000000800220008c0000014a0000413d0000000402100370000000000802043b0000002402100370000000000902043b000000fa0290009c0000014a0000213d0000004402100370000000000202043b000000fb0420009c0000014a0000213d0000002304200039000000fc05000041000000000634004b00000000060000190000000006058019000000fc04400197000000000704004b0000000005008019000000fc0440009c000000000506c019000000000405004b0000014a0000c13d0000000404200039000000000541034f000000000a05043b000000fb05a0009c0000014a0000213d0000000002a200190000002402200039000000000232004b0000014a0000213d0000006402100370000000000b02043b000000c002000039000000400020043f0000000c07000039000000800070043f000000fd02000041000000a00020043f000000e00020043f000000ec0080043f00000060029002100000010c0020043f0000002002400039000000000121034f0000001f02a0018f0000000503a00272000000540000613d00000000040000190000000505400210000000000651034f000000000606043b000001200550003900000000006504350000000104400039000000000534004b0000004c0000413d000000000402004b000000630000613d0000000503300210000000000131034f00000003022002100000012003300039000000000403043300000000042401cf000000000424022f000000000101043b0000010002200089000000000121022f00000000012101cf000000000141019f00000000001304350000012001a0003900000000000104350000013f01a00039000000200200008a000000000321016f0000004005a00039000000c00050043f000000fe013000410000010c0110009c000001980000a13d000c0000000b001d000d0000000a001d000e00000002001d000800000007001d000600000009001d000700000008001d000000400030043f000b00000003001d000000200430003900000000010000190000000002410019000000e003100039000000000303043300000000003204350000002001100039000000000251004b000000770000413d000900000004001d0000000001540019000000000001043500000100010000410000000000100439000000f5010000410000000002000414000000f50320009c0000000002018019000000c00120021000000101011001c70000800b02000039000a00000005001d03cd03c80000040f0000000102200190000003640000613d0000000b050000290000000a02500029000000000101043b00000040032000390000000c040000290000000000430435000000200220003900000000001204350000000d0200002900000080012000390000000000150435000000bf012000390000000e0210017f0000000001520019000000000221004b00000000020000190000000102004039000000fb0310009c000001980000213d0000000102200190000001980000c13d000000400010043f000000f5010000410000000903000029000000f50230009c000000000301801900000040023002100000000003050433000000f50430009c00000000030180190000006003300210000000000223019f0000000003000414000000f50430009c0000000003018019000000c001300210000000000121019f00000102011001c7000080100200003903cd03c80000040f00000001022001900000014a0000613d000000000101043b000d00000001001d000000400300043d000001030130009c0000000804000029000001980000213d0000004001300039000000400010043f0000002001300039000000fd0200004100000000002104350000000000430435000000400100043d000000200210003900000060040000390000000000420435000000000403043300000080051000390000000000450435000000a005100039000000000604004b000000d60000613d000000000600001900000000075600190000002006600039000000000836001900000000080804330000000000870435000000000746004b000000cf0000413d000000000354001900000000000304350000006003100039000000070500002900000000005304350000000603000029000000fa03300197000000400510003900000000003504350000009f034000390000000e0330017f0000000000310435000000bf034000390000000e0430017f0000000003140019000000000443004b00000000040000190000000104004039000000fb0530009c000001980000213d0000000104400190000001980000c13d000000400030043f000000f503000041000000f50420009c000000000203801900000040022002100000000001010433000000f50410009c00000000010380190000006001100210000000000121019f0000000002000414000000f50420009c0000000002038019000000c002200210000000000112019f00000102011001c7000080100200003903cd03c80000040f00000001022001900000014a0000613d000000000101043b000000400200043d000000a003200039000000000013043500000080012000390000010503000041000000000031043500000060012000390000000d03000029000000000031043500000040012000390000000003000410000000000031043500000020012000390000010d030000410000000000310435000000a00300003900000000003204350000010e0320009c000001980000213d000000c003200039000e00000003001d000000400030043f000000000202043303cd03ad0000040f000000fa011001970000000e030000290000000000130435000000f501000041000000f50230009c000000000301801900000040013002100000010b011001c7000003ce0001042e0000000001000416000000000101004b0000014a0000c13d000000200100003900000100001004430000012000000443000000f601000041000003ce0001042e0000000001000416000000000101004b0000014a0000c13d03cd03880000040f0000002002000039000000400300043d000e00000003001d000000000223043603cd03990000040f0000000e040000290000000001410049000000f502000041000000f50310009c0000000001028019000000f50340009c000000000402801900000040024002100000006001100210000000000121019f000003ce0001042e0000000002000416000000000202004b0000014a0000c13d000000040230008a000000800220008c0000014a0000413d0000000402100370000000000902043b0000002402100370000000000d02043b000000fa02d0009c0000014c0000a13d0000000001000019000003cf000104300000004402100370000000000202043b000000fb0420009c0000014a0000213d0000002304200039000000fc05000041000000000634004b00000000060000190000000006058019000000fc04400197000000000704004b0000000005008019000000fc0440009c000000000506c019000000000405004b0000014a0000c13d0000000404200039000000000541034f000000000605043b000000fb0560009c0000014a0000213d000000240b2000390000000002b60019000000000232004b0000014a0000213d0000006402100370000000000502043b000000c00a0000390000004000a0043f0000000c0e0000390000008000e0043f000000fd02000041000000a00020043f000000e00020043f000000ec0090043f0000002002400039000000000121034f0000001f0760018f000000600cd002100000010c00c0043f00000005086002720000017f0000613d00000000020000190000000503200210000000000431034f000000000404043b000001200330003900000000004304350000000102200039000000000382004b000001770000413d000000000207004b0000018e0000613d0000000502800210000000000121034f00000003037002100000012002200039000000000402043300000000043401cf000000000434022f000000000101043b0000010003300089000000000131022f00000000013101cf000000000141019f0000000000120435000001200160003900000000000104350000013f01600039000000200200008a000000000321016f000000400f600039000000c000f0043f000000fe01300041000000ff0110009c0000019e0000813d0000010f0100004100000000001004350000004101000039000000040010043f0000011001000041000003cf0001043000080000000e001d00060000000d001d00020000000c001d00050000000b001d00010000000a001d000e00000002001d000700000009001d000400000008001d000300000007001d000c00000005001d000d00000006001d000000400030043f000b00000003001d000000200430003900000000010000190000000002410019000000e0031000390000000003030433000000000032043500000020011000390000000002f1004b000001ad0000413d000900000004001d0000000001f40019000000000001043500000100010000410000000000100439000000f5010000410000000002000414000000f50320009c0000000002018019000000c00120021000000101011001c70000800b02000039000a0000000f001d03cd03c80000040f0000000102200190000003640000613d0000000b050000290000000a02500029000000000101043b00000040032000390000000c040000290000000000430435000000200220003900000000001204350000000d0200002900000080012000390000000000150435000000bf012000390000000e0210017f0000000001520019000000000221004b00000000020000190000000102004039000000fb0310009c000001980000213d0000000102200190000001980000c13d000000400010043f000000f5010000410000000903000029000000f50230009c000000000301801900000040023002100000000003050433000000f50430009c00000000030180190000006003300210000000000223019f0000000003000414000000f50430009c0000000003018019000000c001300210000000000121019f00000102011001c7000080100200003903cd03c80000040f00000001022001900000014a0000613d000000000101043b000000400300043d000001030230009c0000000805000029000001980000213d0000004002300039000000400020043f0000002002300039000000fd0400004100000000004204350000000000530435000000400200043d000001040420009c000001980000213d0000008405200039000000600400003900000000004504350000002405200039000001050600004100000000006504350000000005030433000000e40620003900000000005604350000010406200039000000000705004b000002100000613d000000000700001900000000086700190000002007700039000000000937001900000000090904330000000000980435000000000857004b000002090000413d00000000036500190000000000030435000000c403200039000000070600002900000000006304350000000603000029000000fa03300197000000a40620003900000000003604350000001f035000390000000e0330017f0000008005300039000000640620003900000000070004140000000000560435000000440520003900000000004504350000010604000041000000000042043500000004042000390000000000140435000000f501000041000000f50420009c000000000201801900000040022002100000010403300039000000f50430009c00000000030180190000006003300210000000000223019f000000f50370009c0000000007018019000000c001700210000000000121019f00000102011001c7000080060200003903cd03c30000040f00000001022001900000023d0000613d000000000101043b000000000201004b000002670000c13d00000002010003670000000002000031000002420000013d000200000001035500000000020100190000006002200270000000f50020019d000000f502200197000000400300043d0000001f0420018f00000005052002720000024f0000613d000000000600001900000005076002100000000008730019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000002470000413d000000000604004b0000025e0000613d0000000505500210000000000151034f00000000055300190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000000f501000041000000f50430009c0000000003018019000000f50420009c000000000201801900000060012002100000004002300210000000000112019f000003cf0001043000000107020000410000000000200439000000fa01100197000b00000001001d0000000400100443000000f5010000410000000002000414000000f50320009c0000000002018019000000c00120021000000108011001c7000080020200003903cd03c80000040f0000000102200190000003640000613d000000000101043b000000000101004b0000000d0200002900000005030000290000014a0000613d000000400400043d0000002401400039000000000021043500000109010000410000000001140436000900000001001d000000040140003900000020020000390000000000210435000a00000004001d000000440140003900000001023003670000000406000029000000000306004b000002930000613d000000000300001900000005043002100000000005410019000000000442034f000000000404043b00000000004504350000000103300039000000000463004b0000028b0000413d000000030300006b000002a40000613d00000004030000290000000503300210000000000232034f000000000331001900000003040000290000000304400210000000000503043300000000054501cf000000000545022f000000000202043b0000010004400089000000000242022f00000000024201cf000000000252019f00000000002304350000000d01100029000000000001043500000000010004140000000b02000029000000040220008c000002c50000613d0000000d020000290000001f022000390000000e0220017f000000f5030000410000000a05000029000000f50450009c0000000004030019000000000405401900000040044002100000004402200039000000f50520009c00000000020380190000006002200210000000000224019f000000f50410009c0000000001038019000000c001100210000000000121019f0000000b0200002903cd03c30000040f00000000030100190000006003300270000000f50030019d000000f50330019700020000000103550000000102200190000003650000613d0000000a01000029000000fb0110009c000000040600002900000005010000290000000202000029000001980000213d0000000a03000029000000400030043f0000000904000029000000000024043500000034023000390000000101100367000000000306004b000002dc0000613d000000000300001900000005043002100000000005420019000000000441034f000000000404043b00000000004504350000000103300039000000000463004b000002d40000413d000000030300006b000002ed0000613d00000004030000290000000503300210000000000431034f000000000332001900000003050000290000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f00000000004304350000000d030000290000000002320019000000000002043500000014023000390000000a04000029000000000024043500000053023000390000000e0220017f0000000002240019000000000342004b00000000030000190000000103004039000000fb0420009c00000007040000290000000105000029000001980000213d0000000103300190000001980000c13d000000400020043f000000600320003900000000005304350000004003200039000000000043043500000020032000390000000b04000029000000000043043500000000004204350000000a080000290000000003080433000000c0042000390000000000340435000000e004200039000000000503004b000003170000613d000000000500001900000000064500190000002005500039000000000785001900000000070704330000000000760435000000000635004b000003100000413d000000000543001900000000000504350000001f033000390000000e0330017f00000000034300190000000004230049000000800520003900000000004504350000000d0400002900000000034304360000000407000029000000000407004b0000032d0000613d000000000400001900000005054002100000000006530019000000000551034f000000000505043b00000000005604350000000104400039000000000574004b000003250000413d000000030400006b0000033e0000613d00000004040000290000000504400210000000000141034f000000000443001900000003050000290000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000000d0400002900000000014300190000000000010435000000a0012000390000000c0500002900000000005104350000001f014000390000000e0110017f00000000012100490000000001310019000000f504000041000000f50320009c00000000020480190000004002200210000000f50310009c00000000010480190000006001100210000000000121019f0000000002000414000000f50320009c0000000002048019000000c002200210000000000112019f00000102011001c70000800d0200003900000001030000390000010a0400004103cd03c30000040f00000001012001900000014a0000613d000000400100043d0000000b020000290000000000210435000000f50210009c000000f50100804100000040011002100000010b011001c7000003ce0001042e000000000001042f000000400200043d0000001f0430018f0000000505300272000003720000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000036a0000413d000000000604004b000003810000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000000f501000041000000f50420009c000000000201801900000040012002100000006002300210000000000121019f000003cf00010430000000400100043d000001110210009c000003930000813d0000004002100039000000400020043f0000002002100039000000fd0300004100000000003204350000000c020000390000000000210435000000000001042d0000010f0100004100000000001004350000004101000039000000040010043f0000011001000041000003cf0001043000000000030104330000000002320436000000000403004b000003a50000613d000000000400001900000000052400190000002004400039000000000614001900000000060604330000000000650435000000000534004b0000039e0000413d000000000123001900000000000104350000001f01300039000000200300008a000000000131016f0000000001120019000000000001042d000000000001042f000000f503000041000000f50410009c00000000010380190000004001100210000000f50420009c00000000020380190000006002200210000000000112019f0000000002000414000000f50420009c0000000002038019000000c002200210000000000112019f00000102011001c7000080100200003903cd03c80000040f0000000102200190000003c10000613d000000000101043b000000000001042d0000000001000019000003cf00010430000003c6002104210000000102000039000000000001042d0000000002000019000000000001042d000003cb002104230000000102000039000000000001042d0000000002000019000000000001042d000003cd00000432000003ce0001042e000003cf00010430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff000000020000000000000000000000000000004000000100000000000000000000000000000000000000000000000000000000000000000000000000ffa1ad7400000000000000000000000000000000000000000000000000000000630eb20f000000000000000000000000000000000000000000000000000000004f1c32ad000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffffff8000000000000000000000000000000000000000000000000000000000000000302e362e302d7a6b73796e630000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff00000000000000c09a8a0592ac89c5ad3bc6df8224c17b485976f597df104ee20d0df415241f670b02000002000000000000000000000000000000040000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffbf000000000000000000000000000000000000000000000000ffffffffffffff7b010004410d2d3de6a7fcbe21aa0d8e9721fef6c9a39af7d1c3a3600fd3ebe6df3cda33511d41a8a5431b1770c5bc0ddd62e1cd30555d16659b89c0d60f4f9f571806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b830200000200000000000000000000000000000024000000000000000000000000a4f9edbf00000000000000000000000000000000000000000000000000000000cb6d9015e5a60155120ea0e2a88ede5648c21029e7a4214c3f44441d4f2ebd210000000000000000000000000000000000000020000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff00000000000000bf2020dba91b30cc0006188af794c2fb30dd8520db7e2c088b7fc7c103c00ca494000000000000000000000000000000000000000000000000ffffffffffffff3f4e487b71000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffc09605dfe80687270612a0d0bcdd941f027b0f6f2fb1fcdf6e67e71474794ce10a", "entries": [ { "constructorArgs": [], @@ -136,8 +136,8 @@ "factoryDeps": [ "0x0003000000000002000f00000000000200000000030100190000006003300270000003fe03300197000200000031035500010000000103550000000102200190000000d60000c13d0000008002000039000100000002001d000000400020043f000000040230008c000007fa0000413d000000000201043b000000e002200270000004060420009c000001a10000a13d000004070420009c000001c40000213d0000040e0420009c000002130000a13d0000040f0420009c000002ff0000613d000004100420009c000004980000613d000004110220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000402100370000000000202043b000004020420009c000007fa0000213d00000023042000390000042005000041000000000634004b000000000600001900000000060580190000042004400197000000000704004b0000000005008019000004200440009c000000000506c019000000000405004b000007fa0000c13d0000000405200039000000000451034f000000000604043b000004020460009c000007fa0000213d00000024042000390000000002460019000000000332004b000007fa0000213d000000000300041a000000ff07300190000006530000c13d0009010000000092000000090330017f00000001033001bf000000000030041b000000000306004b000001f00000613d000000400360008c000007fa0000413d0000002005500039000000000351034f000000000303043b000004020630009c000007fa0000213d00000000064300190000001f03600039000000000323004b000007fa0000813d000000000361034f000000000803043b000004020380009c000000de0000213d0000000507800210000000bf09700039000000200300008a000000000939016f000004020a90009c000000de0000213d000000400090043f000000800080043f00000020066000390000000007670019000000000927004b000007fa0000213d000000000808004b000000680000613d000000a008000039000000000961034f000000000909043b00000000089804360000002006600039000000000976004b000000620000413d0000002005500039000000000551034f000000000505043b000004020650009c000007fa0000213d00000000044500190000001f054000390000042006000041000000000725004b0000000007000019000000000706801900000420055001970000042008200197000000000985004b0000000006008019000000000585013f000004200550009c000000000607c019000000000506004b000007fa0000c13d000000000541034f000000000505043b000800000005001d000004020550009c000000de0000213d000000080500002900000005055002100000003f06500039000000000336016f000000400600043d0000000003360019000700000006001d000000000663004b00000000060000190000000106004039000004020730009c000000de0000213d0000000106600190000000de0000c13d000000400030043f000000070300002900000008060000290000000003630436000600000003001d00000020034000390000000004350019000000000224004b000007fa0000213d000000000243004b000000a60000813d0000000602000029000000000531034f000000000505043b000000020650008c000007fa0000213d00000000025204360000002003300039000000000543004b0000009b0000413d00000007010000290000000001010433000800000001001d000000800100043d000000080110006b000009610000c13d000000080100006b0000096a0000c13d000000400100043d000000400200003900000000022104360000004003100039000000800400043d00000000004304350000006003100039000000000504004b000000bb0000613d000000a0050000390000000006000019000000005705043400000000037304360000000106600039000000000746004b000000b60000413d00000000041300490000000000420435000000070200002900000000040204330000000002430436000000000304004b0000000607000029000000cb0000613d00000000030000190000000075070434000000020650008c0000054e0000213d00000000025204360000000103300039000000000543004b000000c40000413d0000000002120049000003fe03000041000003fe0410009c00000000010380190000004001100210000003fe0420009c00000000020380190000006002200210000000000112019f0000000002000414000002f60000013d000000c002000039000000400020043f0000000002000416000000000202004b000007fa0000c13d000003ff02300041000004000220009c000000e40000213d0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff600010430000000df023000390000040102200197000000400020043f0000001f0230018f0000000504300272000000f30000613d00000000050000190000000506500210000000000761034f000000000707043b000000c00660003900000000007604350000000105500039000000000645004b000000eb0000413d000000000502004b000001020000613d0000000504400210000000000141034f0000000302200210000000c004400039000000000504043300000000052501cf000000000525022f000000000101043b0000010002200089000000000121022f00000000012101cf000000000151019f0000000000140435000000600130008c000007fa0000413d000000c00400043d000004020140009c000007fa0000213d000000c003300039000000df01400039000000000131004b000007fa0000813d000000c0024000390000000001020433000004020510009c000000de0000213d0000003f05100039000000200900008a000000000595016f000000400800043d0000000005580019000000000685004b00000000060000190000000106004039000004020750009c000000de0000213d0000000106600190000000de0000c13d000900000009001d000000400050043f000a00000008001d0000000005180436000b00000005001d0000000004140019000000e004400039000000000334004b000007fa0000213d000000000301004b0000000b060000290000012f0000613d000000000300001900000000046300190000002003300039000000000523001900000000050504330000000000540435000000000413004b000001280000413d00000000011600190000000000010435000000e00100043d000800000001001d000004030110009c000007fa0000213d000001000100008a000000000200041a000000000112016f000001000400043d000000000010041b0000000a010000290000000006010433000004020160009c000000de0000213d0000000105000039000000000105041a000000010210019000000001011002700000007f0310018f000000000301c0190000001f0130008c00000000010000190000000101002039000000010110018f000000000112004b000004c20000c13d000000200130008c0000016f0000413d000400000003001d000700000006001d000500000005001d000600000004001d00000001010000390000000000100435000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000404011001c700008010020000390ff40fef0000040f0000000102200190000007fa0000613d00000007060000290000001f026000390000000502200270000000200360008c0000000002004019000000000301043b00000004010000290000001f01100039000000050110027000000000011300190000000002230019000000000312004b000000060400002900000005050000290000016f0000813d000000000002041b0000000102200039000000000312004b0000016b0000413d0000001f0160008c000007fe0000a13d000700000006001d000600000004001d000500000005001d0000000000500435000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000404011001c700008010020000390ff40fef0000040f0000000102200190000007fa0000613d000000090300002900000007033001800000002002000039000000000101043b0000000a060000290000018f0000613d0000002002000039000000000400001900000000056200190000000005050433000000000051041b000000200220003900000001011000390000002004400039000000000534004b000001870000413d0000000705000029000000000353004b0000019b0000813d0000000303500210000000f80330018f000000010400008a000000000334022f000000000343013f0000000a022000290000000002020433000000000232016f000000000021041b000000010150021000000005050000290000000002050019000000080300002900000006040000290000080a0000013d000004140420009c000001f20000a13d000004150420009c000002460000a13d000004160420009c000004a20000613d000004170420009c000004a70000613d000004180220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000400220008c000007fa0000413d0000000402100370000000000202043b000b00000002001d000004030220009c000007fa0000213d0000002401100370000000000101043b000a00000001001d0ff40af20000040f000000000101004b00000000010000190000052b0000613d0000000a010000290000000b020000290ff40ed80000040f000000000101004b0000000001000019000000010100c0390000052b0000013d000004080420009c000002540000a13d000004090420009c000004b30000613d0000040a0420009c000004c60000613d0000040b0220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000402100370000000000202043b000004020420009c000007fa0000213d00000023042000390000042005000041000000000634004b000000000600001900000000060580190000042004400197000000000704004b0000000005008019000004200440009c000000000506c019000000000405004b000007fa0000c13d0000000404200039000000000141034f000000000101043b000700000001001d000004020110009c000007fa0000213d000600240020003d000000070100002900000005011002100000000601100029000000000131004b000007fa0000213d000000070100006b000006570000c13d000000000100001900000ff50001042e0000041b0420009c000002620000213d0000041e0420009c000004da0000613d0000041f0220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000401100370000000000101043b00000000001004350000000201000039000000200010043f000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000421011001c700008010020000390ff40fef0000040f0000000102200190000007fa0000613d000000000101043b000000000101041a000000ff0110018f000000030210008c000004f00000413d0000054e0000013d000004120420009c000004e50000613d000004130220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000400220008c000007fa0000413d0000000402100370000000000202043b000b00000002001d0000002401100370000000000101043b000a00000001001d000000020110008c000007fa0000213d0000043601000041000000800010043f00000000010004110000040301100197000900000001001d000000840010043f0000000b01000029000000a40010043f00000423010000410000000000100439000000000100041200000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f0000000102200190000007ac0000613d000000000201043b00000000010004140000040302200197000000040320008c000006070000c13d0000000003000031000000200130008c00000000040300190000002004008039000006320000013d000004190420009c000004f30000613d0000041a0220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000401100370000000000101043b0ff40c230000040f000004cf0000013d0000040c0420009c000005130000613d0000040d0220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000401100370000000000101043b0ff40af20000040f000004cf0000013d0000041c0420009c0000052d0000613d0000041d0220009c000007fa0000c13d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000400220008c000007fa0000413d0000000402100370000000000202043b000004020420009c000007fa0000213d00000023042000390000042005000041000000000634004b000000000600001900000000060580190000042004400197000000000704004b0000000005008019000004200440009c000000000506c019000000000405004b000007fa0000c13d000200040020003d0000000204100360000000000404043b000b00000004001d000004020440009c000007fa0000213d00000024042000390000000b020000290000000502200210000100000002001d000700000004001d0000000002420019000000000232004b000007fa0000213d0000002402100370000000000202043b000004020420009c000007fa0000213d00000023042000390000042005000041000000000634004b000000000600001900000000060580190000042004400197000000000704004b0000000005008019000004200440009c000000000506c019000000000405004b000007fa0000c13d0000000404200039000000000141034f000000000101043b000004020410009c000007fa0000213d000000240420003900000005021002100000000002420019000000000232004b000007fa0000213d000800000004001d0000000b0110006c000007fc0000c13d00000423010000410000000000100439000000000100041200000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f0000000102200190000007ac0000613d000000000101043b000604030010019b0000000b0100006b0000000805000029000008310000c13d000000400100043d0000004002000039000000000321043600000040021000390000000b0400002900000000004204350000043e0240009c000007fa0000213d000000010200036700000001050000290000001f0450018f0000000505500272000002d50000613d00000002060000290000002006600039000000000662034f000000600710003900000000080000190000000509800210000000000a970019000000000996034f000000000909043b00000000009a04350000000108800039000000000958004b000002cd0000413d000000000404004b000002d70000613d000000010500002900000060045000390000000000430435000000000351001900000060043000390000000b0500002900000000005404350000008003300039000000000405004b0000000807000029000002ec0000613d0000000004000019000000000572034f000000000505043b000000020650008c000007fa0000213d0000000003530436000000200770003900000001044000390000000b0540006c000002e30000413d0000000002130049000003fe03000041000003fe0410009c00000000010380190000004001100210000003fe0420009c00000000020380190000006002200210000000000112019f0000000002000414000003fe0420009c0000000002038019000000c002200210000000000121019f00000433011001c70000800d0200003900000001030000390000043404000041000007f70000013d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000400220008c000007fa0000413d0000000402100370000000000202043b000004020420009c000007fa0000213d00000023042000390000042005000041000000000634004b000000000600001900000000060580190000042004400197000000000704004b0000000005008019000004200440009c000000000506c019000000000405004b000007fa0000c13d0000000404200039000000000441034f000000000404043b000600000004001d000004020440009c000007fa0000213d000500240020003d000000060200002900000005022002100000000502200029000000000232004b000007fa0000213d0000002402100370000000000202043b000004020420009c000007fa0000213d00000023042000390000042005000041000000000634004b000000000600001900000000060580190000042004400197000000000704004b0000000005008019000004200440009c000000000506c019000000000405004b000007fa0000c13d0000000404200039000000000141034f000000000101043b000004020410009c000007fa0000213d000400240020003d00000005021002100000000402200029000000000232004b000007fa0000213d0000000602000029000000000112004b000007fc0000c13d000000000102004b000001f00000613d000300020000003d000280100000003d000a00000000001d0000000a010000290000000502100210000900000002001d00000005012000290000000101100367000000000101043b000b00000001001d00000000001004350000000301000029000000200010043f0000000001000414000003fe0210009c000003fe01008041000000c00110021000000421011001c700000002020000290ff40fef0000040f0000000102200190000007fa0000613d000000000101043b000000000101041a000000ff0110018f000000020210008c0000054e0000213d000000020110008c000008fe0000c13d000000090200002900000004012000290000000101100367000000000101043b000900000001001d000004030110009c000007fa0000213d000000400200043d00000422010000410000000000120435000800000002001d00000004012000390000000b020000290000000000210435000004230100004100000000001004390000000001000412000700000001001d000000040010044300000024000004430000000001000414000003fe0210009c000003fe01008041000000c00110021000000424011001c700008005020000390ff40fef0000040f0000000102200190000007ac0000613d000000000201043b00000000010004140000040302200197000000040320008c000003850000c13d0000000003000031000000200130008c000000000403001900000020040080390000000809000029000003b60000013d000003fe0310009c000003fe0400004100000000010480190000000805000029000003fe0350009c000000000304001900000000030540190000004003300210000000c001100210000000000131019f00000425011001c70ff40fef0000040f000000080900002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000000505400272000003a30000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000039b0000413d0000001f06400190000003b20000613d0000000505500210000000000751034f00000000055900190000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f00020000000103550000000102200190000009270000613d0000001f01400039000000600210018f0000000001920019000000000221004b00000000020000190000000102004039000004020410009c000000de0000213d0000000102200190000000de0000c13d000000400010043f000000200230008c000007fa0000413d0000000002090433000004030420009c000007fa0000213d00000044041000390000000b05000029000000000054043500000020051000390000042604000041000000000045043500000024041000390000000906000029000000000064043500000044040000390000000000410435000004270410009c000000de0000213d0000008004100039000000400040043f00000000060104330000000001000414000000040720008c000003dd0000c13d0000000102000039000004020130009c000003f30000a13d000000de0000013d000003fe0350009c000003fe0700004100000000050780190000004003500210000003fe0460009c00000000060780190000006004600210000000000334019f000003fe0410009c0000000001078019000000c001100210000000000113019f0ff40fef0000040f00000060040000390000008005000039000000010220018f00020000000103550000006001100270000003fe0010019d000003fe031001980000041b0000613d000000400400043d0000003f01300039000000200500008a000000000551016f0000000001450019000000000551004b00000000050000190000000105004039000004020610009c000000de0000213d0000000105500190000000de0000c13d000000400010043f0000000005340436000000020100036700000005063002720000040c0000613d000000000700001900000005087002100000000009850019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b000004040000413d0000001f033001900000041b0000613d0000000506600210000000000161034f00000000066500190000000303300210000000000706043300000000073701cf000000000737022f000000000101043b0000010003300089000000000131022f00000000013101cf000000000171019f0000000000160435000000000102004b000008ed0000613d0000000001040433000000400110008c000008ed0000c13d0000000001050433000000010210008c000008ed0000213d00000040024000390000000002020433000000010320008c000008ed0000213d000000010220008c000008ed0000c13d000000010110008c000008ed0000c13d000000400300043d00000024013000390000000902000029000000000021043500000428010000410000000000130435000800000003001d00000004013000390000000b020000290000000000210435000004230100004100000000001004390000000701000029000000040010044300000024000004430000000001000414000003fe0210009c000003fe01008041000000c00110021000000424011001c700008005020000390ff40fef0000040f0000000102200190000007ac0000613d000000000201043b00000000010004140000040302200197000000040320008c0000044e0000c13d0000000003000031000000200130008c0000000004030019000000200400803900000008090000290000047f0000013d000003fe0310009c000003fe0400004100000000010480190000000805000029000003fe0350009c000000000304001900000000030540190000004003300210000000c001100210000000000131019f00000429011001c70ff40fea0000040f000000080900002900000000030100190000006003300270000003fe03300197000000200430008c0000000004030019000000200400803900000005054002720000046c0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000004640000413d0000001f064001900000047b0000613d0000000505500210000000000751034f00000000055900190000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f00020000000103550000000102200190000009440000613d0000001f01400039000000600210018f0000000001920019000000000221004b00000000020000190000000102004039000004020410009c000000de0000213d0000000102200190000000de0000c13d000000400010043f000000200130008c000007fa0000413d0000000001090433000000000201004b0000000002000019000000010200c039000000000121004b000007fa0000c13d0000000a020000290000000102200039000a00000002001d000000060120006c000003430000413d000001f00000013d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000401100370000000000101043b0ff40cb90000040f000004cf0000013d0000000001000416000000000101004b000007fa0000c13d0000000001000410000004f00000013d0000000002000416000000000202004b000007fa0000c13d0000043b02000041000000800020043f00000000040004140000000002000410000000040520008c000005520000c13d000000000131034f00000000030000310000055f0000013d0000000001000416000000000101004b000007fa0000c13d0000000103000039000000000203041a000000010420019000000001052002700000007f0150018f000000000105c0190000001f0510008c00000000050000190000000105002039000000000552013f0000000105500190000005be0000613d0000042e0100004100000000001004350000002201000039000000e10000013d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000401100370000000000101043b0ff409c10000040f000000000101004b0000000001000019000000010100c039000000400200043d0000000000120435000003fe01000041000003fe0320009c000000000201801900000040012002100000042c011001c700000ff50001042e0000000001000416000000000101004b000007fa0000c13d0000000001000412000f00000001001d000e00200000003d00000000010004150000000f0110008a00000005011002100ff40fd60000040f000004f00000013d0000000001000416000000000101004b000007fa0000c13d0000000001000412000d00000001001d000c00000000001d00000000010004150000000d0110008a00000005011002100ff40fd60000040f0000040301100197000000800010043f0000043a0100004100000ff50001042e0000000002000416000000000202004b000007fa0000c13d000000040230008a000000200220008c000007fa0000413d0000000401100370000000000101043b000b00000001001d00000000001004350000000201000039000000200010043f000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000421011001c700008010020000390ff40fef0000040f0000000102200190000007fa0000613d000000000101043b000000000101041a000000ff0110018f000000020210008c0000054e0000213d000000000101004b000006490000c13d000000400100043d0000042b02000041000009000000013d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000400220008c000007fa0000413d0000000402100370000000000202043b000b00000002001d000004030220009c000007fa0000213d0000002401100370000000000101043b000a00000001001d0ff409c10000040f000000000101004b00000000010000190000052b0000613d0000000a010000290000000b020000290ff40ed80000040f000000000101004b0000000001000019000000010100c039000000010110018f000004d20000013d0000000002000416000000000202004b000007fa0000c13d000000040230008a000000400220008c000007fa0000413d0000000402100370000000000202043b000b00000002001d0000002401100370000000000101043b000a00000001001d000004030110009c000007fa0000213d0000000b0100002900000000001004350000000201000039000000200010043f000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000421011001c700008010020000390ff40fef0000040f0000000102200190000007fa0000613d000000000101043b000000000101041a000000ff0110018f000000020210008c0000064c0000a13d0000042e0100004100000000001004350000002101000039000000e10000013d000003fe01000041000003fe0340009c0000000004018019000000c00140021000000430011001c70ff40fef0000040f00000000030100190000006003300270000003fe0030019d000003fe0330019700020000000103550000000102200190000005c80000613d0000001f0230018f00000005043002720000056b0000613d00000000050000190000000506500210000000000761034f000000000707043b000000800660003900000000007604350000000105500039000000000645004b000005630000413d000000000502004b0000057a0000613d0000000504400210000000000141034f00000003022002100000008004400039000000000504043300000000052501cf000000000525022f000000000101043b0000010002200089000000000121022f00000000012101cf000000000151019f00000000001404350000009f02300039000000200100008a000000000212016f0000043c042000410000043d0440009c000000de0000413d0000042004000041000000200530008c000000000500001900000000050440190000042006300197000000000706004b000000000400a019000004200660009c000000000405c019000000400020043f000000000404004b000007fa0000c13d000000800400043d000004020540009c000007fa0000213d00000080053000390000009f034000390000042006000041000000000753004b0000000007000019000000000706801900000420085001970000042003300197000000000983004b0000000006008019000000000383013f000004200330009c000000000607c019000000000306004b000007fa0000c13d00000080034000390000000003030433000004020630009c000000de0000213d0000003f06300039000000000116016f0000000001210019000004020610009c000000de0000213d000000400010043f0000000001320436000000a0044000390000000006430019000000000556004b000007fa0000213d000000000503004b000005b70000613d000000000500001900000000061500190000000007450019000000000707043300000000007604350000002005500039000000000635004b000005b00000413d00000000011300190000000000010435000000400100043d000b00000001001d0ff409980000040f0000000b04000029000005fd0000013d000000800010043f000000000404004b000005e50000c13d000001000300008a000000000232016f000000a00020043f000000000101004b000000c002000039000000a002006039000005f40000013d000000400200043d0000001f0430018f0000000505300272000005d50000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000005cd0000413d000000000604004b000005e40000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000007c90000013d0000000000300435000000a002000039000000000301004b000005f40000613d0000042d0200004100000000040000190000000003040019000000000402041a000000a005300039000000000045043500000001022000390000002004300039000000000514004b000005eb0000413d000000c002300039000000800220008a0000008001000039000b00000001001d0ff409ae0000040f000000400100043d000a00000001001d0000000b020000290ff409980000040f0000000a040000290000000001410049000003fe02000041000003fe0310009c0000000001028019000003fe0340009c000000000402801900000040024002100000006001100210000000000121019f00000ff50001042e000003fe03000041000003fe0410009c0000000001038019000000c00110021000000437011001c70ff40fef0000040f00000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f00000005064002720000061f0000613d00000000070000190000000508700210000000000981034f000000000909043b000000800880003900000000009804350000000107700039000000000867004b000006170000413d000000000705004b0000062e0000613d0000000506600210000000000761034f00000003055002100000008006600039000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f00020000000103550000000102200190000007ad0000613d0000001f01400039000000600210018f00000080012001bf000000400010043f000000200330008c000007fa0000413d000000800300043d000000000403004b0000000004000019000000010400c039000000000443004b000007fa0000c13d000000000303004b000007d00000c13d0000043903000041000000000031043500000084032001bf00000009040000290000000000430435000000a4022000390000000b030000290000000000320435000008240000013d00000000020004110000000b01000029000006500000013d000000020110008c000008fe0000c13d0000000b010000290000000a020000290ff40d4b0000040f000000000100001900000ff50001042e0000042f01000041000000800010043f000004300100004100000ff600010430000500020000003d000480100000003d000380050000003d000a00000000001d0000000a01000029000000050110021000000006011000290000000101100367000000000101043b000b00000001001d00000000001004350000000501000029000000200010043f0000000001000414000003fe0210009c000003fe01008041000000c00110021000000421011001c700000004020000290ff40fef0000040f0000000102200190000007fa0000613d000000000101043b000000000101041a000000ff0210018f000000020120008c0000054e0000213d000000400300043d0000000401300039000000000202004b000008270000613d0000042202000041000900000003001d00000000002304350000000b020000290000000000210435000004230100004100000000001004390000000001000412000800000001001d000000040010044300000024000004430000000001000414000003fe0210009c000003fe01008041000000c00110021000000424011001c700000003020000290ff40fef0000040f00000000060004110000000102200190000007ac0000613d000000000201043b00000000010004140000040302200197000000040320008c000006960000c13d0000000003000031000000200130008c000000000403001900000020040080390000000909000029000006c90000013d000200000006001d000003fe0310009c000003fe0400004100000000010480190000000905000029000003fe0350009c000000000304001900000000030540190000004003300210000000c001100210000000000131019f00000425011001c70ff40fef0000040f000000090900002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000000505400272000006b50000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000006ad0000413d0000001f06400190000006c40000613d0000000505500210000000000751034f00000000055900190000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f000200000001035500000001022001900000000206000029000008b30000613d0000001f01400039000000600210018f0000000001920019000000000221004b00000000020000190000000102004039000004020410009c000000de0000213d0000000102200190000000de0000c13d000000400010043f000000200230008c000007fa0000413d0000000002090433000004030420009c000007fa0000213d00000044041000390000000b05000029000000000054043500000020051000390000042604000041000000000045043500000044040000390000000000410435000004030a60019700000024041000390000000000a40435000004270410009c000000de0000213d0000008004100039000000400040043f00000000060104330000000001000414000000040720008c000006f00000c13d0000000102000039000004020130009c000007080000a13d000000de0000013d000003fe0350009c000003fe0700004100000000050780190000004003500210000003fe0460009c00000000060780190000006004600210000000000334019f000003fe0410009c0000000001078019000000c001100210000000000113019f00090000000a001d0ff40fef0000040f000000090a0000290000006004000039000000010220018f00020000000103550000006001100270000003fe0010019d000003fe031001980000000101000029000007300000613d000000400400043d0000003f01300039000000200500008a000000000551016f0000000001450019000000000551004b00000000050000190000000105004039000004020610009c000000de0000213d0000000105500190000000de0000c13d000000400010043f000000000134043600000002050003670000000506300272000007210000613d000000000700001900000005087002100000000009810019000000000885034f000000000808043b00000000008904350000000107700039000000000867004b000007190000413d0000001f03300190000007300000613d0000000506600210000000000565034f00000000066100190000000303300210000000000706043300000000073701cf000000000737022f000000000505043b0000010003300089000000000535022f00000000033501cf000000000373019f0000000000360435000000000202004b000008190000613d0000000002040433000000400220008c000008190000c13d0000000001010433000000010210008c000008190000213d00000040024000390000000002020433000000010320008c000008190000213d000000010220008c000008190000c13d000000010110008c000008190000c13d000000400200043d00000024012000390000000000a1043500000428010000410000000000120435000900000002001d00000004012000390000000b020000290000000000210435000004230100004100000000001004390000000801000029000000040010044300000024000004430000000001000414000003fe0210009c000003fe01008041000000c00110021000000424011001c700008005020000390ff40fef0000040f0000000102200190000007ac0000613d000000000201043b00000000010004140000040302200197000000040320008c000007620000c13d0000000003000031000000200130008c000000000403001900000020040080390000000909000029000007930000013d000003fe0310009c000003fe0400004100000000010480190000000905000029000003fe0350009c000000000304001900000000030540190000004003300210000000c001100210000000000131019f00000429011001c70ff40fea0000040f000000090900002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000000505400272000007800000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000007780000413d0000001f064001900000078f0000613d0000000505500210000000000751034f00000000055900190000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f00020000000103550000000102200190000008d00000613d0000001f01400039000000600210018f0000000001920019000000000221004b00000000020000190000000102004039000004020410009c000000de0000213d0000000102200190000000de0000c13d000000400010043f000000200130008c000007fa0000413d0000000001090433000000000201004b0000000002000019000000010200c039000000000121004b000007fa0000c13d0000000a020000290000000102200039000a00000002001d000000070120006c0000065b0000413d000001f00000013d000000000001042f000000400200043d0000001f0430018f0000000505300272000007ba0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000007b20000413d000000000604004b000007c90000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000003fe01000041000003fe0420009c000000000201801900000040012002100000006002300210000000000121019f00000ff6000104300000000b0100002900000000001004350000000201000039000000200010043f000003fe030000410000000001000414000003fe0210009c0000000001038019000000c00110021000000421011001c700008010020000390ff40fef0000040f0000000102200190000007fa0000613d000000000101043b000000000201041a000001000300008a000000000232016f0000000a03000029000000000232019f000000000021041b000000400100043d000000200210003900000000003204350000000b0200002900000000002104350000000002000414000003fe0320009c000003fe040000410000000002048019000003fe0310009c00000000010480190000004001100210000000c002200210000000000112019f00000421011001c70000800d02000039000000010300003900000438040000410ff40fea0000040f0000000101200190000001f00000c13d000000000100001900000ff6000104300000043101000041000006540000013d000000000106004b0000000001000019000008030000613d0000000b0100002900000000010104330000000302600210000000010300008a000000000223022f000000000232013f000000000121016f00000001026002100000000803000029000000000121019f000000000015041b0000040301300197000000800010043f000000a00040043f0000014000000443000001600010044300000020010000390000018000100443000001a000400443000001000010044300000002010000390000012000100443000004050100004100000ff50001042e000000400100043d00000024021000390000000b0300002900000000003204350000042a02000041000000000021043500000004021000390000000000a20435000003fe02000041000003fe0310009c0000000001028019000000400110021000000429011001c700000ff6000104300000042b0200004100000000002304350000000b020000290000000000210435000003fe01000041000003fe0230009c0000000003018019000000400130021000000425011001c700000ff6000104300000000001000411000504030010019b0000000002000019000a00000002001d000000050720021000000007017000290000000101100367000000000601043b000000400900043d000004360100004100000000001904350000000401900039000000050200002900000000002104350000002401900039000000000061043500000000010004140000000602000029000000040320008c0000084a0000c13d0000000003000031000000200130008c00000000040300190000002004008039000008800000013d000400000007001d000900000006001d000003fe0310009c000003fe040000410000000001048019000003fe0390009c000000000304001900000000030940190000004003300210000000c001100210000000000131019f00000429011001c7000300000009001d0ff40fef0000040f000000030900002900000000030100190000006003300270000003fe03300197000000200430008c0000000004030019000000200400803900000005054002720000086a0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000008620000413d0000001f06400190000008790000613d0000000505500210000000000751034f00000000055900190000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f000200000001035500000001022001900000000805000029000000090600002900000004070000290000090a0000613d0000001f01400039000000600210018f0000000001920019000000000221004b00000000020000190000000102004039000004020410009c000000de0000213d0000000102200190000000de0000c13d000000400010043f000000200230008c000007fa0000413d0000000002090433000000000302004b0000000003000019000000010300c039000000000332004b000007fa0000c13d000000000202004b000008f60000613d00000000015700190000000101100367000000000101043b000900000001001d000000020110008c000007fa0000213d00000000006004350000000201000039000000200010043f0000000001000414000003fe0210009c000003fe01008041000000c00110021000000421011001c700008010020000390ff40fef0000040f00000008050000290000000102200190000007fa0000613d000000000101043b000000000201041a000001000300008a000000000232016f00000009022001af000000000021041b0000000a0200002900000001022000390000000b0120006c000008340000413d000002bb0000013d000000400200043d0000001f0430018f0000000505300272000008c00000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000008b80000413d000000000604004b000008cf0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000007c90000013d000000400200043d0000001f0430018f0000000505300272000008dd0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000008d50000413d000000000604004b000008ec0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000007c90000013d000000400100043d00000024021000390000000b0300002900000000003204350000042a02000041000000000021043500000004021000390000000903000029000008fc0000013d0000002402100039000000000062043500000439020000410000000000210435000000040210003900000005030000290000000000320435000008210000013d000000400100043d0000043502000041000000000021043500000004021000390000000b030000290000000000320435000003fe02000041000003fe0310009c0000000001028019000000400110021000000425011001c700000ff600010430000000400200043d0000001f0430018f0000000505300272000009170000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000090f0000413d000000000604004b000007c90000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000007c90000013d000000400200043d0000001f0430018f0000000505300272000009340000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000092c0000413d000000000604004b000009430000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000007c90000013d000000400200043d0000001f0430018f0000000505300272000009510000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000009490000413d000000000604004b000009600000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000007c90000013d000000400100043d00000431020000410000000000210435000003fe02000041000003fe0310009c0000000001028019000000400110021000000432011001c700000ff600010430000500020000003d000480100000003d0000000003000019000000800100043d000000000131004b0000000602000029000009940000a13d00000007010000290000000001010433000000000131004b000009940000a13d000b00000003001d000000050130021000000000022100190000000002020433000a00000002001d000000020220008c0000054e0000213d000000a001100039000000000101043300000000001004350000000501000029000000200010043f0000000001000414000003fe0210009c000003fe01008041000000c00110021000000421011001c700000004020000290ff40fef0000040f0000000102200190000007fa0000613d000000000101043b000000000201041a000000090220017f0000000a022001af000000000021041b0000000b030000290000000103300039000000080130006c0000096d0000413d000000ab0000013d0000042e0100004100000000001004350000003201000039000000e10000013d00000020030000390000000004310436000000000302043300000000003404350000004001100039000000000403004b000009a70000613d000000000400001900000000051400190000002004400039000000000624001900000000060604330000000000650435000000000534004b000009a00000413d000000000213001900000000000204350000001f02300039000000200300008a000000000232016f0000000001210019000000000001042d0000001f02200039000000200300008a000000000232016f0000000001120019000000000221004b00000000020000190000000102004039000004020310009c000009bb0000213d0000000102200190000009bb0000c13d000000400010043f000000000001042d0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff6000104300004000000000002000000400300043d0000043f020000410000000000230435000400000003001d0000000402300039000300000001001d0000000000120435000004230100004100000000001004390000000001000412000200000001001d00000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000aa70000613d000000000201043b00000000010004140000040302200197000000040320008c000009e40000c13d0000000003000031000000200130008c00000000040300190000002004008039000000040a00002900000a150000013d000003fe03000041000003fe0410009c00000000010380190000000405000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000425011001c70ff40fef0000040f000000040a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000a020000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b000009fa0000413d000000000705004b00000a110000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000aae0000613d0000001f01400039000000600110018f0000000004a10019000000000114004b00000000010000190000000101004039000004020240009c00000aa80000213d000000010110019000000aa80000c13d000000400040043f0000001f0130008c00000aa50000a13d00000000010a0433000003fe0210009c00000aa50000213d000000000101004b000000000100001900000aa40000613d0000002401400039000000030200002900000000002104350000043601000041000000000014043500000000010004100000040301100197000100000004001d0000000402400039000000000012043500000423010000410000000000100439000000020100002900000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000aa70000613d000000000201043b00000000010004140000040302200197000000040320008c00000a4c0000c13d0000000003000031000000200130008c00000000040300190000002004008039000000010a00002900000a7d0000013d000003fe03000041000003fe0410009c00000000010380190000000105000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000429011001c70ff40fef0000040f000000010a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000a6a0000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000a620000413d000000000705004b00000a790000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000acf0000613d0000001f01400039000000600110018f0000000001a10019000004020210009c00000aa80000213d000000400010043f000000200130008c00000aa50000413d00000000010a0433000000000201004b0000000002000019000000010200c039000000000221004b00000aa50000c13d000000000101004b000000000100001900000aa40000613d000000030100002900000000001004350000000201000039000000200010043f000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000421011001c700008010020000390ff40fef0000040f000000010220019000000aa50000613d000000000101043b000000000101041a000000ff0110018f000000020210008c00000acb0000213d000000000101004b0000000001000019000000010100c039000000000001042d000000000100001900000ff600010430000000000001042f0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff600010430000000400200043d0000001f0430018f000000050530027200000abb0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000ab30000413d000000000604004b00000aeb0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f000000000015043500000aeb0000013d0000042e010000410000000000100435000000210100003900000aab0000013d000000400200043d0000001f0430018f000000050530027200000adc0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000ad40000413d000000000604004b00000aeb0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000003fe01000041000003fe0420009c000000000201801900000040012002100000006002300210000000000121019f00000ff6000104300004000000000002000000400300043d0000043f020000410000000000230435000400000003001d0000000402300039000300000001001d0000000000120435000004230100004100000000001004390000000001000412000200000001001d00000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000bd80000613d000000000201043b00000000010004140000040302200197000000040320008c00000b150000c13d0000000003000031000000200130008c00000000040300190000002004008039000000040a00002900000b460000013d000003fe03000041000003fe0410009c00000000010380190000000405000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000425011001c70ff40fef0000040f000000040a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000b330000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000b2b0000413d000000000705004b00000b420000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000bdf0000613d0000001f01400039000000600110018f0000000004a10019000000000114004b00000000010000190000000101004039000004020240009c00000bd90000213d000000010110019000000bd90000c13d000000400040043f0000001f0130008c00000bd60000a13d00000000010a0433000003fe0210009c00000bd60000213d000000000101004b000000000100001900000bd50000613d0000002401400039000000030200002900000000002104350000043601000041000000000014043500000000010004100000040301100197000100000004001d0000000402400039000000000012043500000423010000410000000000100439000000020100002900000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000bd80000613d000000000201043b00000000010004140000040302200197000000040320008c00000b7d0000c13d0000000003000031000000200130008c00000000040300190000002004008039000000010a00002900000bae0000013d000003fe03000041000003fe0410009c00000000010380190000000105000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000429011001c70ff40fef0000040f000000010a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000b9b0000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000b930000413d000000000705004b00000baa0000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000c000000613d0000001f01400039000000600110018f0000000001a10019000004020210009c00000bd90000213d000000400010043f000000200130008c00000bd60000413d00000000010a0433000000000201004b0000000002000019000000010200c039000000000221004b00000bd60000c13d000000000101004b000000000100001900000bd50000613d000000030100002900000000001004350000000201000039000000200010043f000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000421011001c700008010020000390ff40fef0000040f000000010220019000000bd60000613d000000000101043b000000000101041a000000ff0110018f000000020210008c00000bfc0000213d000000020110008c00000000010000190000000101006039000000000001042d000000000100001900000ff600010430000000000001042f0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff600010430000000400200043d0000001f0430018f000000050530027200000bec0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000be40000413d000000000604004b00000c1c0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f000000000015043500000c1c0000013d0000042e010000410000000000100435000000210100003900000bdc0000013d000000400200043d0000001f0430018f000000050530027200000c0d0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000c050000413d000000000604004b00000c1c0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000003fe01000041000003fe0420009c000000000201801900000040012002100000006002300210000000000121019f00000ff6000104300001000000000002000000400300043d000000240230003900000000001204350000043601000041000000000013043500000000010004100000040301100197000100000003001d0000000402300039000000000012043500000423010000410000000000100439000000000100041200000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000c8f0000613d000000000201043b00000000010004140000040302200197000000040320008c00000c480000c13d0000000003000031000000200130008c00000000040300190000002004008039000000010a00002900000c790000013d000003fe03000041000003fe0410009c00000000010380190000000105000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000429011001c70ff40fef0000040f000000010a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000c660000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000c5e0000413d000000000705004b00000c750000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000c960000613d0000001f01400039000000600210018f0000000001a20019000000000221004b00000000020000190000000102004039000004020410009c00000c900000213d000000010220019000000c900000c13d000000400010043f0000001f0130008c00000c8d0000a13d00000000010a0433000000000201004b0000000002000019000000010200c039000000000221004b00000c8d0000c13d000000000001042d000000000100001900000ff600010430000000000001042f0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff600010430000000400200043d0000001f0430018f000000050530027200000ca30000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000c9b0000413d000000000604004b00000cb20000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000003fe01000041000003fe0420009c000000000201801900000040012002100000006002300210000000000121019f00000ff6000104300001000000000002000000400300043d0000043f020000410000000000230435000100000003001d0000000402300039000000000012043500000423010000410000000000100439000000000100041200000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000d210000613d000000000201043b00000000010004140000040302200197000000040320008c00000cda0000c13d0000000003000031000000200130008c00000000040300190000002004008039000000010a00002900000d0b0000013d000003fe03000041000003fe0410009c00000000010380190000000105000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000425011001c70ff40fef0000040f000000010a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000cf80000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000cf00000413d000000000705004b00000d070000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000d280000613d0000001f01400039000000600210018f0000000001a20019000000000221004b00000000020000190000000102004039000004020410009c00000d220000213d000000010220019000000d220000c13d000000400010043f0000001f0130008c00000d1f0000a13d00000000010a0433000003fe0210009c00000d1f0000213d000000000101004b0000000001000019000000010100c039000000000001042d000000000100001900000ff600010430000000000001042f0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff600010430000000400200043d0000001f0430018f000000050530027200000d350000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000d2d0000413d000000000604004b00000d440000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000003fe01000041000003fe0420009c000000000201801900000040012002100000006002300210000000000121019f00000ff6000104300004000000000002000200000002001d000000400300043d00000422020000410000000000230435000300000003001d0000000402300039000400000001001d0000000000120435000004230100004100000000001004390000000001000412000100000001001d00000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000e970000613d000000000201043b00000000010004140000040302200197000000040320008c00000d6f0000c13d0000000003000031000000200130008c00000000040300190000002004008039000000030a00002900000da00000013d000003fe03000041000003fe0410009c00000000010380190000000305000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000425011001c70ff40fef0000040f000000030a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000d8d0000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000d850000413d000000000705004b00000d9c0000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000e980000613d0000001f01400039000000600210018f0000000001a20019000000000221004b00000000020000190000000102004039000004020410009c00000e810000213d000000010220019000000e810000c13d000000400010043f0000001f0230008c00000e950000a13d00000000020a0433000004030420009c00000e950000213d000000440410003900000004050000290000000000540435000000200510003900000426040000410000000000450435000000440400003900000000004104350000000204000029000004030a40019700000024041000390000000000a40435000004270410009c00000e810000213d0000008004100039000000400040043f00000000060104330000000001000414000000040720008c00000dc80000c13d0000000102000039000004020130009c00000de00000a13d00000e810000013d000003fe03000041000003fe0450009c00000000050380190000004004500210000003fe0560009c00000000060380190000006005600210000000000445019f000003fe0510009c0000000001038019000000c001100210000000000114019f00030000000a001d0ff40fef0000040f000000030a00002900000060040000390000008005000039000000010220018f00020000000103550000006001100270000003fe0010019d000003fe0310019800000e090000613d000000400400043d0000003f01300039000000200500008a000000000151016f0000000001140019000000000541004b00000000050000190000000105004039000004020610009c00000e810000213d000000010550019000000e810000c13d000000400010043f0000001f0130018f00000000053404360000000206000367000000050330027200000dfa0000613d000000000700001900000005087002100000000009850019000000000886034f000000000808043b00000000008904350000000107700039000000000837004b00000df20000413d000000000701004b00000e090000613d0000000503300210000000000636034f00000000033500190000000301100210000000000703043300000000071701cf000000000717022f000000000606043b0000010001100089000000000616022f00000000011601cf000000000171019f0000000000130435000000000102004b00000e870000613d0000000001040433000000400110008c00000e870000c13d0000000001050433000000010210008c00000e870000213d00000040024000390000000002020433000000010320008c00000e870000213d000000010220008c00000e870000c13d000000010110008c00000e870000c13d000000400200043d00000024012000390000000000a1043500000428010000410000000000120435000300000002001d00000004012000390000000402000029000000000021043500000423010000410000000000100439000000010100002900000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000e970000613d000000000201043b00000000010004140000040302200197000000040320008c00000e3c0000c13d0000000003000031000000200130008c00000000040300190000002004008039000000030a00002900000e6d0000013d000003fe03000041000003fe0410009c00000000010380190000000305000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000429011001c70ff40fea0000040f000000030a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000e5a0000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000e520000413d000000000705004b00000e690000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000eb50000613d0000001f01400039000000600210018f0000000001a20019000000000221004b00000000020000190000000102004039000004020410009c00000e810000213d000000010220019000000e810000c13d000000400010043f000000200130008c00000e950000413d00000000010a0433000000000201004b0000000002000019000000010200c039000000000121004b00000e950000c13d000000000001042d0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff600010430000000400100043d0000002402100039000000040300002900000000003204350000042a02000041000000000021043500000004021000390000000000a20435000003fe02000041000003fe0310009c0000000001028019000000400110021000000429011001c700000ff600010430000000000100001900000ff600010430000000000001042f000000400200043d0000001f0430018f000000050530027200000ea50000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000e9d0000413d000000000604004b00000ed10000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f000000000015043500000ed10000013d000000400200043d0000001f0430018f000000050530027200000ec20000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000eba0000413d000000000604004b00000ed10000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000003fe01000041000003fe0420009c000000000201801900000040012002100000006002300210000000000121019f00000ff6000104300003000000000002000200000002001d000000400300043d00000422020000410000000000230435000300000003001d0000000402300039000100000001001d000000000012043500000423010000410000000000100439000000000100041200000004001004430000002400000443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000fb10000613d000000000201043b00000000010004140000040302200197000000040320008c00000efb0000c13d0000000003000031000000200130008c00000000040300190000002004008039000000030a00002900000f2c0000013d000003fe03000041000003fe0410009c00000000010380190000000305000029000003fe0450009c00000000030540190000004003300210000000c001100210000000000131019f00000425011001c70ff40fef0000040f000000030a00002900000000030100190000006003300270000003fe03300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000f190000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000f110000413d000000000705004b00000f280000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f0002000000010355000000010220019000000fb20000613d0000001f01400039000000600210018f0000000001a20019000000000221004b00000000020000190000000102004039000004020410009c00000fa90000213d000000010220019000000fa90000c13d000000400010043f0000001f0230008c00000faf0000a13d00000000020a0433000004030420009c00000faf0000213d000000440410003900000001050000290000000000540435000000200410003900000426050000410000000000540435000000020500002900000403055001970000002406100039000000000056043500000044050000390000000000510435000004270510009c00000fa90000213d0000008005100039000000400050043f00000000050104330000000001000414000000040620008c00000f540000c13d0000000102000039000004020130009c00000f690000a13d00000fa90000013d000003fe03000041000003fe0640009c00000000040380190000004004400210000003fe0650009c00000000050380190000006005500210000000000445019f000003fe0510009c0000000001038019000000c001100210000000000114019f0ff40fef0000040f00000060040000390000008005000039000000010220018f00020000000103550000006001100270000003fe0010019d000003fe0310019800000f930000613d0000003f01300039000000200400008a000000000141016f000000400400043d0000000001140019000000000541004b00000000050000190000000105004039000004020610009c00000fa90000213d000000010550019000000fa90000c13d000000400010043f0000001f0130018f00000000053404360000000206000367000000050330027200000f840000613d000000000700001900000005087002100000000009850019000000000886034f000000000808043b00000000008904350000000107700039000000000837004b00000f7c0000413d000000000701004b00000f930000613d0000000503300210000000000636034f00000000033500190000000301100210000000000703043300000000071701cf000000000717022f000000000606043b0000010001100089000000000616022f00000000011601cf000000000171019f0000000000130435000000000102004b000000000100001900000fa80000613d0000000001040433000000400110008c000000000100001900000fa80000c13d0000000002050433000000010120008c000000000100001900000fa80000213d00000040014000390000000003010433000000010130008c000000000100001900000fa80000213d000000010120015f000000010230015f00000000011201a000000000010000190000000101006039000000000001042d0000042e0100004100000000001004350000004101000039000000040010043f000004250100004100000ff600010430000000000100001900000ff600010430000000000001042f000000400200043d0000001f0430018f000000050530027200000fbf0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000fb70000413d000000000604004b00000fce0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000003fe01000041000003fe0420009c000000000201801900000040012002100000006002300210000000000112019f00000ff600010430000000000001042f0000042302000041000000000020043900000005011002700000000002010031000000040020044300000001010100310000002400100443000003fe010000410000000002000414000003fe0320009c0000000002018019000000c00120021000000424011001c700008005020000390ff40fef0000040f000000010220019000000fe90000613d000000000101043b000000000001042d000000000001042f00000fed002104210000000102000039000000000001042d0000000002000019000000000001042d00000ff2002104230000000102000039000000000001042d0000000002000019000000000001042d00000ff40000043200000ff50001042e00000ff600010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000dfffffffffffffffffffffffffffffffffffffffffffffffff00000000000000bf00000000000000000000000000000000000000000000000000000001ffffffe0000000000000000000000000000000000000000000000000ffffffffffffffff000000000000000000000000ffffffffffffffffffffffffffffffffffffffff020000000000000000000000000000000000002000000000000000000000000000000002000000000000000000000000000000c0000001000000000000000000000000000000000000000000000000000000000000000000000000007150ef8700000000000000000000000000000000000000000000000000000000cc9d707300000000000000000000000000000000000000000000000000000000dd1bb1fb00000000000000000000000000000000000000000000000000000000dd1bb1fc00000000000000000000000000000000000000000000000000000000efbd181f00000000000000000000000000000000000000000000000000000000fca8d7c800000000000000000000000000000000000000000000000000000000cc9d707400000000000000000000000000000000000000000000000000000000d74251a000000000000000000000000000000000000000000000000000000000890db75b00000000000000000000000000000000000000000000000000000000890db75c0000000000000000000000000000000000000000000000000000000094dc956a00000000000000000000000000000000000000000000000000000000a4f9edbf000000000000000000000000000000000000000000000000000000007150ef8800000000000000000000000000000000000000000000000000000000840ebfdf0000000000000000000000000000000000000000000000000000000030178f29000000000000000000000000000000000000000000000000000000003a4741bc000000000000000000000000000000000000000000000000000000003a4741bd0000000000000000000000000000000000000000000000000000000054fd4d5000000000000000000000000000000000000000000000000000000000686d9fa20000000000000000000000000000000000000000000000000000000030178f2a0000000000000000000000000000000000000000000000000000000031d70b66000000000000000000000000000000000000000000000000000000002afb5c51000000000000000000000000000000000000000000000000000000002afb5c52000000000000000000000000000000000000000000000000000000002fbc035f0000000000000000000000000000000000000000000000000000000007ace2b5000000000000000000000000000000000000000000000000000000001d70af85800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000400000000000000000000000008c07607700000000000000000000000000000000000000000000000000000000310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e02000002000000000000000000000000000000440000000000000000000000000000000000000000000000000000000000000024000000000000000000000000bd68387200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f641f776e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004400000000000000000000000013d4d4dd000000000000000000000000000000000000000000000000000000002cf7343d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf64e487b71000000000000000000000000000000000000000000000000000000000dc149f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000008000000000000000001132131c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000200000000000000000000000000000000000000000000000000000000000000b18604a21764a23acb45fc37d878f421c181294b251c148cd43689947f47621073d33f9100000000000000000000000000000000000000000000000000000000b56f75620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000008000000000000000003de74aa59ab1ab0255006bf14c5df84e529e14ae2122677499a5f2a2d0b815dae8ed9286000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000800000000000000000dd1bb1fc00000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000008007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb28491700000000000000000000000000000000000000000000000000000000cb90f1f6a102279d23f7223305d45735b869cb7dc64ab85741e68b61e03d5081" ], - "address": "0x6175C315720E9Ca084414AA6A2d0abC9C74E60c0", - "txHash": "0x2e0100cbaa7d0eed6f54042321708303fa0f2c94da97868015bda8db0826086e" + "address": "0x3f049Dee8D91D56708066F5b9480A873a4F75ae2", + "txHash": "0x73b1f2919637d4f3b1492d86cb93f104a75075478c0c591d80888b96e94e3584" } ] } diff --git a/script/DeployMultiClaimsHatter.ts b/script/DeployMultiClaimsHatter.ts index b5c6088..b138668 100644 --- a/script/DeployMultiClaimsHatter.ts +++ b/script/DeployMultiClaimsHatter.ts @@ -12,7 +12,7 @@ const contractName = "MultiClaimsHatter"; const HATS_ID = 1; const HATS = "0x32Ccb7600c10B4F7e678C7cbde199d98453D0e7e"; const SALT_NONCE = 1; -const FACTORY_ADDRESS = "0x6175C315720E9Ca084414AA6A2d0abC9C74E60c0"; +const FACTORY_ADDRESS = "0x3f049Dee8D91D56708066F5b9480A873a4F75ae2"; async function main() { dotEnvConfig(); diff --git a/src/MultiClaimsHatterFactory.sol b/src/MultiClaimsHatterFactory.sol index 2ec1dfe..b27225c 100644 --- a/src/MultiClaimsHatterFactory.sol +++ b/src/MultiClaimsHatterFactory.sol @@ -7,8 +7,8 @@ import { L2ContractHelper } from "./lib/L2ContractHelper.sol"; contract MultiClaimsHatterFactory is IHatsModuleFactory { string public constant VERSION = "0.6.0-zksync"; - /// @dev Bytecode hash can be found in zksolc/MultiClaimsHatter.sol/MultiClaimsHatter.json under the hash key. - bytes32 constant BYTECODE_HASH = 0x0100041dbb312c575f637f3b4ffbdf9beada863fa830a3f771b06df5a8a5c287; + /// @dev Bytecode hash can be found in artifacts-zk/src/MultiClaimsHatterFactory.sol/MultiClaimsHatterFactory.json. + bytes32 constant BYTECODE_HASH = 0x010004410d2d3de6a7fcbe21aa0d8e9721fef6c9a39af7d1c3a3600fd3ebe6df; function deployModule(uint256 _hatId, address _hat, bytes calldata _initData, uint256 _saltNonce) external diff --git a/test/MultiClaimsHatterFactory.t.sol b/test/MultiClaimsHatterFactory.t.sol deleted file mode 100644 index d1f8fc4..0000000 --- a/test/MultiClaimsHatterFactory.t.sol +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.19; - -import { Test, console2, Vm } from "forge-std/Test.sol"; -import { MultiClaimsHatter } from "../src/MultiClaimsHatter.sol"; -import { MultiClaimsHatterFactory } from "../src/MultiClaimsHatterFactory.sol"; - -contract TestMultiClaimsHatterFactory is Test { - MultiClaimsHatterFactory factory; - - function setUp() public { - factory = new MultiClaimsHatterFactory(); - } - - function testFuzz_deployMultiClaimsHatter(uint256 _hatId, address _hat, uint256 _saltNonce) public { - address instance = factory.deployModule(_hatId, _hat, "", _saltNonce); - address expectedAddress = factory.getAddress(_hatId, _hat, "", _saltNonce); - assertEq(instance, expectedAddress); - } - - function testFuzz_deployMultiClaimsHatterTwice(uint256 _hatId, address _hat, uint256 _saltNonce) public { - factory.deployModule(_hatId, _hat, "", _saltNonce); - vm.expectRevert(bytes("Code hash is non-zero")); - factory.deployModule(_hatId, _hat, "", _saltNonce); - } -}