diff --git a/contracts/prebuilts/account/dynamic/DynamicAccount.sol b/contracts/prebuilts/account/dynamic/DynamicAccount.sol index 04b638086..49301309d 100644 --- a/contracts/prebuilts/account/dynamic/DynamicAccount.sol +++ b/contracts/prebuilts/account/dynamic/DynamicAccount.sol @@ -24,23 +24,16 @@ contract DynamicAccount is AccountCore, BaseRouter { //////////////////////////////////////////////////////////////*/ constructor(IEntryPoint _entrypoint, Extension[] memory _defaultExtensions) - AccountCore(_entrypoint) + AccountCore(_entrypoint, msg.sender) BaseRouter(_defaultExtensions) { _disableInitializers(); } /// @notice Initializes the smart contract wallet. - function initialize( - address _defaultAdmin, - address _factory, - bytes calldata _data - ) public override initializer { + function initialize(address _defaultAdmin, bytes calldata _data) public override initializer { __BaseRouter_init(); - - // This is passed as data in the `_registerOnFactory()` call in `AccountExtension` / `Account`. AccountCoreStorage.data().creationSalt = _generateSalt(_defaultAdmin, _data); - AccountCoreStorage.data().factory = _factory; _setAdmin(_defaultAdmin, true); } diff --git a/contracts/prebuilts/account/dynamic/DynamicAccountFactory.sol b/contracts/prebuilts/account/dynamic/DynamicAccountFactory.sol index 79e2fb537..ea5c320da 100644 --- a/contracts/prebuilts/account/dynamic/DynamicAccountFactory.sol +++ b/contracts/prebuilts/account/dynamic/DynamicAccountFactory.sol @@ -4,11 +4,10 @@ pragma solidity ^0.8.12; // Utils import "../utils/BaseAccountFactory.sol"; import "@thirdweb-dev/dynamic-contracts/src/interface/IExtension.sol"; -import "../../../extension/upgradeable/Initializable.sol"; // Extensions -import "../../../extension/upgradeable/PermissionsEnumerable.sol"; -import "../../../extension/upgradeable/ContractMetadata.sol"; +import "../../../extension/upgradeable//PermissionsEnumerable.sol"; +import "../../../extension/upgradeable//ContractMetadata.sol"; // Smart wallet implementation import { DynamicAccount, IEntryPoint } from "./DynamicAccount.sol"; @@ -22,26 +21,20 @@ import { DynamicAccount, IEntryPoint } from "./DynamicAccount.sol"; // \$$$$ |$$ | $$ |$$ |$$ | \$$$$$$$ |\$$$$$\$$$$ |\$$$$$$$\ $$$$$$$ | // \____/ \__| \__|\__|\__| \_______| \_____\____/ \_______|\_______/ -contract DynamicAccountFactory is Initializable, BaseAccountFactory, ContractMetadata, PermissionsEnumerable { +contract DynamicAccountFactory is BaseAccountFactory, ContractMetadata, PermissionsEnumerable { address public constant ENTRYPOINT_ADDRESS = 0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789; /*/////////////////////////////////////////////////////////////// Constructor //////////////////////////////////////////////////////////////*/ - constructor(IExtension.Extension[] memory _defaultExtensions) + constructor(address _defaultAdmin, IExtension.Extension[] memory _defaultExtensions) BaseAccountFactory( - address(new DynamicAccount(IEntryPoint(ENTRYPOINT_ADDRESS), _defaultExtensions)), + payable(address(new DynamicAccount(IEntryPoint(ENTRYPOINT_ADDRESS), _defaultExtensions))), ENTRYPOINT_ADDRESS ) { - _disableInitializers(); - } - - /// @notice Initializes the factory contract. - function initialize(address _defaultAdmin, string memory _contractURI) external initializer { _setupRole(DEFAULT_ADMIN_ROLE, _defaultAdmin); - _setupContractURI(_contractURI); } /*/////////////////////////////////////////////////////////////// @@ -54,7 +47,7 @@ contract DynamicAccountFactory is Initializable, BaseAccountFactory, ContractMet address _admin, bytes calldata _data ) internal override { - DynamicAccount(payable(_account)).initialize(_admin, address(this), _data); + DynamicAccount(payable(_account)).initialize(_admin, _data); } /// @dev Returns whether contract metadata can be set in the given execution context. diff --git a/contracts/prebuilts/account/managed/ManagedAccount.sol b/contracts/prebuilts/account/managed/ManagedAccount.sol index 5ba01c850..4e70bb605 100644 --- a/contracts/prebuilts/account/managed/ManagedAccount.sol +++ b/contracts/prebuilts/account/managed/ManagedAccount.sol @@ -19,15 +19,15 @@ import "@thirdweb-dev/dynamic-contracts/src/core/Router.sol"; import "@thirdweb-dev/dynamic-contracts/src/interface/IRouterState.sol"; contract ManagedAccount is AccountCore, Router, IRouterState { - constructor(IEntryPoint _entrypoint) AccountCore(_entrypoint) {} + constructor(IEntryPoint _entrypoint, address _factory) AccountCore(_entrypoint, _factory) {} /// @notice Returns the implementation contract address for a given function signature. function getImplementationForFunction(bytes4 _functionSelector) public view virtual override returns (address) { - return Router(payable(AccountCoreStorage.data().factory)).getImplementationForFunction(_functionSelector); + return Router(payable(factory)).getImplementationForFunction(_functionSelector); } /// @notice Returns all extensions of the Router. function getAllExtensions() external view returns (Extension[] memory) { - return IRouterState(payable(AccountCoreStorage.data().factory)).getAllExtensions(); + return IRouterState(payable(factory)).getAllExtensions(); } } diff --git a/contracts/prebuilts/account/managed/ManagedAccountFactory.sol b/contracts/prebuilts/account/managed/ManagedAccountFactory.sol index 01a642179..f46e1f2dd 100644 --- a/contracts/prebuilts/account/managed/ManagedAccountFactory.sol +++ b/contracts/prebuilts/account/managed/ManagedAccountFactory.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.12; // Utils import "@thirdweb-dev/dynamic-contracts/src/presets/BaseRouter.sol"; import "../utils/BaseAccountFactory.sol"; -import "../../../extension/upgradeable/Initializable.sol"; // Extensions import "../../../extension/upgradeable//PermissionsEnumerable.sol"; @@ -22,35 +21,25 @@ import { ManagedAccount, IEntryPoint } from "./ManagedAccount.sol"; // \$$$$ |$$ | $$ |$$ |$$ | \$$$$$$$ |\$$$$$\$$$$ |\$$$$$$$\ $$$$$$$ | // \____/ \__| \__|\__|\__| \_______| \_____\____/ \_______|\_______/ -contract ManagedAccountFactory is - Initializable, - BaseAccountFactory, - ContractMetadata, - PermissionsEnumerable, - BaseRouter -{ +contract ManagedAccountFactory is BaseAccountFactory, ContractMetadata, PermissionsEnumerable, BaseRouter { /*/////////////////////////////////////////////////////////////// Constructor //////////////////////////////////////////////////////////////*/ - constructor(IEntryPoint _entrypoint, Extension[] memory _defaultExtensions) + constructor( + address _defaultAdmin, + IEntryPoint _entrypoint, + Extension[] memory _defaultExtensions + ) BaseRouter(_defaultExtensions) - BaseAccountFactory(address(new ManagedAccount(_entrypoint)), address(_entrypoint)) + BaseAccountFactory(payable(address(new ManagedAccount(_entrypoint, address(this)))), address(_entrypoint)) { - _disableInitializers(); - } - - /// @notice Initializes the factory contract. - function initialize(address _defaultAdmin, string memory _contractURI) external initializer { __BaseRouter_init(); - _setupRole(DEFAULT_ADMIN_ROLE, _defaultAdmin); bytes32 _extensionRole = keccak256("EXTENSION_ROLE"); _setupRole(_extensionRole, _defaultAdmin); _setRoleAdmin(_extensionRole, _extensionRole); - - _setupContractURI(_contractURI); } /*/////////////////////////////////////////////////////////////// @@ -63,7 +52,7 @@ contract ManagedAccountFactory is address _admin, bytes calldata _data ) internal override { - ManagedAccount(payable(_account)).initialize(_admin, address(this), _data); + ManagedAccount(payable(_account)).initialize(_admin, _data); } /// @dev Returns whether all relevant permission and other checks are met before any upgrade. diff --git a/contracts/prebuilts/account/non-upgradeable/Account.sol b/contracts/prebuilts/account/non-upgradeable/Account.sol index 5a34fdef0..f934c86d0 100644 --- a/contracts/prebuilts/account/non-upgradeable/Account.sol +++ b/contracts/prebuilts/account/non-upgradeable/Account.sol @@ -39,7 +39,7 @@ contract Account is AccountCore, ContractMetadata, ERC1271, ERC721Holder, ERC115 Constructor, Initializer, Modifiers //////////////////////////////////////////////////////////////*/ - constructor(IEntryPoint _entrypoint) AccountCore(_entrypoint) {} + constructor(IEntryPoint _entrypoint, address _factory) AccountCore(_entrypoint, _factory) {} /// @notice Checks whether the caller is the EntryPoint contract or the admin. modifier onlyAdminOrEntrypoint() virtual { @@ -145,7 +145,7 @@ contract Account is AccountCore, ContractMetadata, ERC1271, ERC721Holder, ERC115 /// @dev Registers the account on the factory if it hasn't been registered yet. function _registerOnFactory() internal virtual { - BaseAccountFactory factoryContract = BaseAccountFactory(AccountCoreStorage.data().factory); + BaseAccountFactory factoryContract = BaseAccountFactory(factory); if (!factoryContract.isRegistered(address(this))) { factoryContract.onRegister(AccountCoreStorage.data().creationSalt); } diff --git a/contracts/prebuilts/account/non-upgradeable/AccountFactory.sol b/contracts/prebuilts/account/non-upgradeable/AccountFactory.sol index 235557072..e570f0b4b 100644 --- a/contracts/prebuilts/account/non-upgradeable/AccountFactory.sol +++ b/contracts/prebuilts/account/non-upgradeable/AccountFactory.sol @@ -5,7 +5,6 @@ pragma solidity ^0.8.12; import "../utils/BaseAccountFactory.sol"; import "../utils/BaseAccount.sol"; import "../../../external-deps/openzeppelin/proxy/Clones.sol"; -import "../../../extension/upgradeable/Initializable.sol"; // Extensions import "../../../extension/upgradeable//PermissionsEnumerable.sol"; @@ -26,19 +25,15 @@ import { Account } from "./Account.sol"; // \$$$$ |$$ | $$ |$$ |$$ | \$$$$$$$ |\$$$$$\$$$$ |\$$$$$$$\ $$$$$$$ | // \____/ \__| \__|\__|\__| \_______| \_____\____/ \_______|\_______/ -contract AccountFactory is Initializable, BaseAccountFactory, ContractMetadata, PermissionsEnumerable { +contract AccountFactory is BaseAccountFactory, ContractMetadata, PermissionsEnumerable { /*/////////////////////////////////////////////////////////////// Constructor //////////////////////////////////////////////////////////////*/ - constructor(IEntryPoint _entrypoint) BaseAccountFactory(address(new Account(_entrypoint)), address(_entrypoint)) { - _disableInitializers(); - } - - /// @notice Initializes the factory contract. - function initialize(address _defaultAdmin, string memory _contractURI) external initializer { + constructor(address _defaultAdmin, IEntryPoint _entrypoint) + BaseAccountFactory(address(new Account(_entrypoint, address(this))), address(_entrypoint)) + { _setupRole(DEFAULT_ADMIN_ROLE, _defaultAdmin); - _setupContractURI(_contractURI); } /*/////////////////////////////////////////////////////////////// @@ -51,7 +46,7 @@ contract AccountFactory is Initializable, BaseAccountFactory, ContractMetadata, address _admin, bytes calldata _data ) internal override { - Account(payable(_account)).initialize(_admin, address(this), _data); + Account(payable(_account)).initialize(_admin, _data); } /// @dev Returns whether contract metadata can be set in the given execution context. diff --git a/contracts/prebuilts/account/utils/AccountCore.sol b/contracts/prebuilts/account/utils/AccountCore.sol index 77b9c58ff..79b31ec37 100644 --- a/contracts/prebuilts/account/utils/AccountCore.sol +++ b/contracts/prebuilts/account/utils/AccountCore.sol @@ -39,6 +39,9 @@ contract AccountCore is IAccountCore, Initializable, Multicall, BaseAccount, Acc State //////////////////////////////////////////////////////////////*/ + /// @notice EIP 4337 factory for this contract. + address public immutable factory; + /// @notice EIP 4337 Entrypoint contract. IEntryPoint private immutable entrypointContract; @@ -46,20 +49,16 @@ contract AccountCore is IAccountCore, Initializable, Multicall, BaseAccount, Acc Constructor, Initializer, Modifiers //////////////////////////////////////////////////////////////*/ - constructor(IEntryPoint _entrypoint) EIP712("Account", "1") { + constructor(IEntryPoint _entrypoint, address _factory) EIP712("Account", "1") { _disableInitializers(); + factory = _factory; entrypointContract = _entrypoint; } /// @notice Initializes the smart contract wallet. - function initialize( - address _defaultAdmin, - address _factory, - bytes calldata _data - ) public virtual initializer { + function initialize(address _defaultAdmin, bytes calldata _data) public virtual initializer { // This is passed as data in the `_registerOnFactory()` call in `AccountExtension` / `Account`. AccountCoreStorage.data().creationSalt = _generateSalt(_defaultAdmin, _data); - AccountCoreStorage.data().factory = _factory; _setAdmin(_defaultAdmin, true); } @@ -67,11 +66,6 @@ contract AccountCore is IAccountCore, Initializable, Multicall, BaseAccount, Acc View functions //////////////////////////////////////////////////////////////*/ - /// @notice Returns the address of the account factory. - function factory() public view virtual override returns (address) { - return AccountCoreStorage.data().factory; - } - /// @notice Returns the EIP 4337 entrypoint contract. function entryPoint() public view virtual override returns (IEntryPoint) { address entrypointOverride = AccountCoreStorage.data().entrypointOverride; @@ -241,22 +235,19 @@ contract AccountCore is IAccountCore, Initializable, Multicall, BaseAccount, Acc /// @notice Makes the given account an admin. function _setAdmin(address _account, bool _isAdmin) internal virtual override { super._setAdmin(_account, _isAdmin); - - address factoryAddr = factory(); - if (factoryAddr.code.length > 0) { + if (factory.code.length > 0) { if (_isAdmin) { - BaseAccountFactory(factoryAddr).onSignerAdded(_account, AccountCoreStorage.data().creationSalt); + BaseAccountFactory(factory).onSignerAdded(_account, AccountCoreStorage.data().creationSalt); } else { - BaseAccountFactory(factoryAddr).onSignerRemoved(_account, AccountCoreStorage.data().creationSalt); + BaseAccountFactory(factory).onSignerRemoved(_account, AccountCoreStorage.data().creationSalt); } } } /// @notice Runs after every `changeRole` run. function _afterSignerPermissionsUpdate(SignerPermissionRequest calldata _req) internal virtual override { - address factoryAddr = factory(); - if (factoryAddr.code.length > 0) { - BaseAccountFactory(factoryAddr).onSignerAdded(_req.signer, AccountCoreStorage.data().creationSalt); + if (factory.code.length > 0) { + BaseAccountFactory(factory).onSignerAdded(_req.signer, AccountCoreStorage.data().creationSalt); } } } diff --git a/contracts/prebuilts/account/utils/AccountCoreStorage.sol b/contracts/prebuilts/account/utils/AccountCoreStorage.sol index 8a3f4899f..4356ef94a 100644 --- a/contracts/prebuilts/account/utils/AccountCoreStorage.sol +++ b/contracts/prebuilts/account/utils/AccountCoreStorage.sol @@ -9,7 +9,6 @@ library AccountCoreStorage { struct Data { address entrypointOverride; - address factory; bytes32 creationSalt; } diff --git a/contracts/prebuilts/account/utils/BaseAccountFactory.sol b/contracts/prebuilts/account/utils/BaseAccountFactory.sol index 23e2c4952..5f462b770 100644 --- a/contracts/prebuilts/account/utils/BaseAccountFactory.sol +++ b/contracts/prebuilts/account/utils/BaseAccountFactory.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.12; // Utils -import "./BaseAccountFactoryStorage.sol"; import "../../../extension/Multicall.sol"; import "../../../external-deps/openzeppelin/proxy/Clones.sol"; import "../../../external-deps/openzeppelin/utils/structs/EnumerableSet.sol"; @@ -33,6 +32,9 @@ abstract contract BaseAccountFactory is IAccountFactory, Multicall { address public immutable accountImplementation; address public immutable entrypoint; + EnumerableSet.AddressSet private allAccounts; + mapping(address => EnumerableSet.AddressSet) internal accountsOfSigner; + /*/////////////////////////////////////////////////////////////// Constructor //////////////////////////////////////////////////////////////*/ @@ -59,10 +61,7 @@ abstract contract BaseAccountFactory is IAccountFactory, Multicall { account = Clones.cloneDeterministic(impl, salt); if (msg.sender != entrypoint) { - require( - _baseAccountFactoryStorage().allAccounts.add(account), - "AccountFactory: account already registered" - ); + require(allAccounts.add(account), "AccountFactory: account already registered"); } _initializeAccount(account, _admin, _data); @@ -77,14 +76,14 @@ abstract contract BaseAccountFactory is IAccountFactory, Multicall { address account = msg.sender; require(_isAccountOfFactory(account, _salt), "AccountFactory: not an account."); - require(_baseAccountFactoryStorage().allAccounts.add(account), "AccountFactory: account already registered"); + require(allAccounts.add(account), "AccountFactory: account already registered"); } function onSignerAdded(address _signer, bytes32 _salt) external { address account = msg.sender; require(_isAccountOfFactory(account, _salt), "AccountFactory: not an account."); - bool isNewSigner = _baseAccountFactoryStorage().accountsOfSigner[_signer].add(account); + bool isNewSigner = accountsOfSigner[_signer].add(account); if (isNewSigner) { emit SignerAdded(account, _signer); @@ -96,7 +95,7 @@ abstract contract BaseAccountFactory is IAccountFactory, Multicall { address account = msg.sender; require(_isAccountOfFactory(account, _salt), "AccountFactory: not an account."); - bool isAccount = _baseAccountFactoryStorage().accountsOfSigner[_signer].remove(account); + bool isAccount = accountsOfSigner[_signer].remove(account); if (isAccount) { emit SignerRemoved(account, _signer); @@ -109,32 +108,29 @@ abstract contract BaseAccountFactory is IAccountFactory, Multicall { /// @notice Returns whether an account is registered on this factory. function isRegistered(address _account) external view returns (bool) { - return _baseAccountFactoryStorage().allAccounts.contains(_account); + return allAccounts.contains(_account); } /// @notice Returns the total number of accounts. function totalAccounts() external view returns (uint256) { - return _baseAccountFactoryStorage().allAccounts.length(); + return allAccounts.length(); } /// @notice Returns all accounts between the given indices. function getAccounts(uint256 _start, uint256 _end) external view returns (address[] memory accounts) { - require( - _start < _end && _end <= _baseAccountFactoryStorage().allAccounts.length(), - "BaseAccountFactory: invalid indices" - ); + require(_start < _end && _end <= allAccounts.length(), "BaseAccountFactory: invalid indices"); uint256 len = _end - _start; accounts = new address[](_end - _start); for (uint256 i = 0; i < len; i += 1) { - accounts[i] = _baseAccountFactoryStorage().allAccounts.at(i + _start); + accounts[i] = allAccounts.at(i + _start); } } /// @notice Returns all accounts created on the factory. function getAllAccounts() external view returns (address[] memory) { - return _baseAccountFactoryStorage().allAccounts.values(); + return allAccounts.values(); } /// @notice Returns the address of an Account that would be deployed with the given admin signer. @@ -145,7 +141,7 @@ abstract contract BaseAccountFactory is IAccountFactory, Multicall { /// @notice Returns all accounts that the given address is a signer of. function getAccountsOfSigner(address signer) external view returns (address[] memory accounts) { - return _baseAccountFactoryStorage().accountsOfSigner[signer].values(); + return accountsOfSigner[signer].values(); } /*/////////////////////////////////////////////////////////////// @@ -168,11 +164,6 @@ abstract contract BaseAccountFactory is IAccountFactory, Multicall { return keccak256(abi.encode(_admin, _data)); } - /// @dev Returns the BaseAccountFactory contract's storage. - function _baseAccountFactoryStorage() internal pure returns (BaseAccountFactoryStorage.Data storage) { - return BaseAccountFactoryStorage.data(); - } - /// @dev Called in `createAccount`. Initializes the account contract created in `createAccount`. function _initializeAccount( address _account, diff --git a/contracts/prebuilts/account/utils/BaseAccountFactoryStorage.sol b/contracts/prebuilts/account/utils/BaseAccountFactoryStorage.sol deleted file mode 100644 index 10bc27c61..000000000 --- a/contracts/prebuilts/account/utils/BaseAccountFactoryStorage.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity ^0.8.11; - -import "../../../external-deps/openzeppelin/utils/structs/EnumerableSet.sol"; - -library BaseAccountFactoryStorage { - /// @custom:storage-location erc7201:base.account.factory.storage - /// @dev keccak256(abi.encode(uint256(keccak256("base.account.factory.storage")) - 1)) & ~bytes32(uint256(0xff)) - bytes32 public constant BASE_ACCOUNT_FACTORY_STORAGE_POSITION = - 0x82f5b3e5f5ca1c04b70bced106a2c3b72d9cb53ebbafb3cad0740983db742900; - - struct Data { - EnumerableSet.AddressSet allAccounts; - mapping(address => EnumerableSet.AddressSet) accountsOfSigner; - } - - function data() internal pure returns (Data storage baseAccountFactoryData) { - bytes32 position = BASE_ACCOUNT_FACTORY_STORAGE_POSITION; - assembly { - baseAccountFactoryData.slot := position - } - } -} diff --git a/src/test/benchmark/AccountBenchmark.t.sol b/src/test/benchmark/AccountBenchmark.t.sol index 82032e599..356a10d08 100644 --- a/src/test/benchmark/AccountBenchmark.t.sol +++ b/src/test/benchmark/AccountBenchmark.t.sol @@ -50,7 +50,7 @@ contract AccountBenchmarkTest is BaseTest { address private nonSigner; // UserOp terminology: `sender` is the smart wallet. - address private sender = 0xDD1d01438DcF28eb45a611c7faBD716B0dECE259; + address private sender = 0x0df2C3523703d165Aa7fA1a552f3F0B56275DfC6; address payable private beneficiary = payable(address(0x45654)); bytes32 private uidCache = bytes32("random uid"); @@ -182,17 +182,7 @@ contract AccountBenchmarkTest is BaseTest { // Setup contracts entrypoint = new EntryPoint(); // deploy account factory - address factoryImpl = address(new AccountFactory(IEntryPoint(payable(address(entrypoint))))); - accountFactory = AccountFactory( - address( - payable( - new TWProxy( - factoryImpl, - abi.encodeWithSignature("initialize(address,string)", deployer, "https://example.com") - ) - ) - ) - ); + accountFactory = new AccountFactory(deployer, IEntryPoint(payable(address(entrypoint)))); // deploy dummy contract numberContract = new Number(); } diff --git a/src/test/smart-wallet/Account.t.sol b/src/test/smart-wallet/Account.t.sol index 0961a2248..d98de9723 100644 --- a/src/test/smart-wallet/Account.t.sol +++ b/src/test/smart-wallet/Account.t.sol @@ -3,7 +3,6 @@ pragma solidity ^0.8.0; // Test utils import "../utils/BaseTest.sol"; -import { TWProxy } from "contracts/infra/TWProxy.sol"; // Account Abstraction setup for smart wallets. import { EntryPoint, IEntryPoint } from "contracts/prebuilts/account/utils/Entrypoint.sol"; @@ -50,13 +49,11 @@ contract SimpleAccountTest is BaseTest { address private nonSigner; // UserOp terminology: `sender` is the smart wallet. - address private sender = 0xDD1d01438DcF28eb45a611c7faBD716B0dECE259; + address private sender = 0x0df2C3523703d165Aa7fA1a552f3F0B56275DfC6; address payable private beneficiary = payable(address(0x45654)); bytes32 private uidCache = bytes32("random uid"); - address internal factoryImpl; - event AccountCreated(address indexed account, address indexed accountAdmin); function _prepareSignature(IAccountPermissions.SignerPermissionRequest memory _req) @@ -253,36 +250,11 @@ contract SimpleAccountTest is BaseTest { // Setup contracts entrypoint = new EntryPoint(); // deploy account factory - factoryImpl = address(new AccountFactory(IEntryPoint(payable(address(entrypoint))))); - accountFactory = AccountFactory( - address( - payable( - new TWProxy( - factoryImpl, - abi.encodeWithSignature("initialize(address,string)", deployer, "https://example.com") - ) - ) - ) - ); + accountFactory = new AccountFactory(deployer, IEntryPoint(payable(address(entrypoint)))); // deploy dummy contract numberContract = new Number(); } - /*/////////////////////////////////////////////////////////////// - Test: initial state - //////////////////////////////////////////////////////////////*/ - - function test_initialState() external { - assertEq(accountFactory.entrypoint(), address(entrypoint)); - assertEq(accountFactory.contractURI(), "https://example.com"); - assertEq(accountFactory.hasRole(0x00, deployer), true); - } - - function test_revert_initializeImplementation() public { - vm.expectRevert("Initializable: contract is already initialized"); - AccountFactory(factoryImpl).initialize(deployer, "https://example.com"); - } - /*/////////////////////////////////////////////////////////////// Test: creating an account //////////////////////////////////////////////////////////////*/ @@ -299,7 +271,7 @@ contract SimpleAccountTest is BaseTest { } /// @dev Create an account via Entrypoint. - function test_state_createAccount_viaEntrypointSingle() public { + function test_state_createAccount_viaEntrypoint() public { bytes memory initCallData = abi.encodeWithSignature("createAccount(address,bytes)", accountAdmin, bytes("")); bytes memory initCode = abi.encodePacked(abi.encodePacked(address(accountFactory)), initCallData); diff --git a/src/test/smart-wallet/AccountVulnPOC.t.sol b/src/test/smart-wallet/AccountVulnPOC.t.sol index bfcb5e4f3..9a9faf259 100644 --- a/src/test/smart-wallet/AccountVulnPOC.t.sol +++ b/src/test/smart-wallet/AccountVulnPOC.t.sol @@ -74,7 +74,7 @@ contract SimpleAccountVulnPOCTest is BaseTest { address private nonSigner; // UserOp terminology: `sender` is the smart wallet. - address private sender = 0xDD1d01438DcF28eb45a611c7faBD716B0dECE259; + address private sender = 0x0df2C3523703d165Aa7fA1a552f3F0B56275DfC6; address payable private beneficiary = payable(address(0x45654)); bytes32 private uidCache = bytes32("random uid"); @@ -213,17 +213,7 @@ contract SimpleAccountVulnPOCTest is BaseTest { // Setup contracts entrypoint = new EntryPoint(); // deploy account factory - address factoryImpl = address(new AccountFactory(IEntryPoint(payable(address(entrypoint))))); - accountFactory = AccountFactory( - address( - payable( - new TWProxy( - factoryImpl, - abi.encodeWithSignature("initialize(address,string)", deployer, "https://example.com") - ) - ) - ) - ); + accountFactory = new AccountFactory(deployer, IEntryPoint(payable(address(entrypoint)))); // deploy dummy contract numberContract = new Number(); } diff --git a/src/test/smart-wallet/DynamicAccount.t.sol b/src/test/smart-wallet/DynamicAccount.t.sol index 82e0cc9c5..bbf12aa19 100644 --- a/src/test/smart-wallet/DynamicAccount.t.sol +++ b/src/test/smart-wallet/DynamicAccount.t.sol @@ -7,7 +7,6 @@ import "@thirdweb-dev/dynamic-contracts/src/interface/IExtension.sol"; import { IAccountPermissions } from "contracts/extension/interface/IAccountPermissions.sol"; import { AccountPermissions } from "contracts/extension/upgradeable/AccountPermissions.sol"; import { AccountExtension } from "contracts/prebuilts/account/utils/AccountExtension.sol"; -import { TWProxy } from "contracts/infra/TWProxy.sol"; // Account Abstraction setup for smart wallets. import { EntryPoint, IEntryPoint } from "contracts/prebuilts/account/utils/Entrypoint.sol"; @@ -66,13 +65,11 @@ contract DynamicAccountTest is BaseTest { bytes internal data = bytes(""); // UserOp terminology: `sender` is the smart wallet. - address private sender = 0x96b1d554981298ED415f2D5788A6D093A39eECfF; + address private sender = 0x78b942FBC9126b4Ed8384Bb9dd1420Ea865be91a; address payable private beneficiary = payable(address(0x45654)); bytes32 private uidCache = bytes32("random uid"); - address internal factoryImpl; - event AccountCreated(address indexed account, address indexed accountAdmin); function _prepareSignature(IAccountPermissions.SignerPermissionRequest memory _req) @@ -322,17 +319,7 @@ contract DynamicAccountTest is BaseTest { extensions[0] = defaultExtension; // deploy account factory - factoryImpl = address(new DynamicAccountFactory(extensions)); - accountFactory = DynamicAccountFactory( - address( - payable( - new TWProxy( - factoryImpl, - abi.encodeWithSignature("initialize(address,string)", deployer, "https://example.com") - ) - ) - ) - ); + accountFactory = new DynamicAccountFactory(deployer, extensions); // deploy dummy contract numberContract = new Number(); } @@ -341,11 +328,6 @@ contract DynamicAccountTest is BaseTest { Test: creating an account //////////////////////////////////////////////////////////////*/ - function test_revert_initializeImplementation() public { - vm.expectRevert("Initializable: contract is already initialized"); - DynamicAccountFactory(factoryImpl).initialize(deployer, "https://example.com"); - } - /// @dev benchmark test for deployment gas cost function test_deploy_dynamicAccount() public { // Setting up default extension. @@ -392,17 +374,7 @@ contract DynamicAccountTest is BaseTest { extensions[0] = defaultExtension; // deploy account factory - address factoryImplementation = address(new DynamicAccountFactory(extensions)); - DynamicAccountFactory factory = DynamicAccountFactory( - address( - payable( - new TWProxy( - factoryImplementation, - abi.encodeWithSignature("initialize(address,string)", deployer, "https://example.com") - ) - ) - ) - ); + DynamicAccountFactory factory = new DynamicAccountFactory(deployer, extensions); } /// @dev Create an account by directly calling the factory. @@ -417,7 +389,7 @@ contract DynamicAccountTest is BaseTest { } /// @dev Create an account via Entrypoint. - function test_state_createAccount_viaEntrypointSingle() public { + function test_state_createAccount_viaEntrypoint() public { bytes memory initCallData = abi.encodeWithSignature("createAccount(address,bytes)", accountAdmin, data); bytes memory initCode = abi.encodePacked(abi.encodePacked(address(accountFactory)), initCallData); diff --git a/src/test/smart-wallet/ManagedAccount.t.sol b/src/test/smart-wallet/ManagedAccount.t.sol index 0ad09581b..dd53a920f 100644 --- a/src/test/smart-wallet/ManagedAccount.t.sol +++ b/src/test/smart-wallet/ManagedAccount.t.sol @@ -7,7 +7,6 @@ import "@thirdweb-dev/dynamic-contracts/src/interface/IExtension.sol"; import { IAccountPermissions } from "contracts/extension/interface/IAccountPermissions.sol"; import { AccountPermissions } from "contracts/extension/upgradeable/AccountPermissions.sol"; import { AccountExtension } from "contracts/prebuilts/account/utils/AccountExtension.sol"; -import { TWProxy } from "contracts/infra/TWProxy.sol"; // Account Abstraction setup for smart wallets. import { EntryPoint, IEntryPoint } from "contracts/prebuilts/account/utils/Entrypoint.sol"; @@ -67,13 +66,11 @@ contract ManagedAccountTest is BaseTest { address private nonSigner; // UserOp terminology: `sender` is the smart wallet. - address private sender = 0x48670c84959b8854A9036D88a020382bA89a47Ce; + address private sender = 0xbEA1Fa134A1727187A8f2e7E714B660f3a95478D; address payable private beneficiary = payable(address(0x45654)); bytes32 private uidCache = bytes32("random uid"); - address internal factoryImpl; - event AccountCreated(address indexed account, address indexed accountAdmin); function _prepareSignature(IAccountPermissions.SignerPermissionRequest memory _req) @@ -323,26 +320,15 @@ contract ManagedAccountTest is BaseTest { // deploy account factory vm.prank(factoryDeployer); - factoryImpl = address(new ManagedAccountFactory(IEntryPoint(payable(address(entrypoint))), extensions)); - accountFactory = ManagedAccountFactory( - payable( - address( - new TWProxy( - factoryImpl, - abi.encodeWithSignature("initialize(address,string)", factoryDeployer, "https://example.com") - ) - ) - ) + accountFactory = new ManagedAccountFactory( + factoryDeployer, + IEntryPoint(payable(address(entrypoint))), + extensions ); // deploy dummy contract numberContract = new Number(); } - function test_revert_initializeImplementation() public { - vm.expectRevert("Initializable: contract is already initialized"); - ManagedAccountFactory(payable(factoryImpl)).initialize(deployer, "https://example.com"); - } - /// @dev benchmark test for deployment gas cost function test_deploy_managedAccount() public { // Setting up default extension. @@ -390,16 +376,10 @@ contract ManagedAccountTest is BaseTest { // deploy account factory vm.prank(factoryDeployer); - factoryImpl = address(new ManagedAccountFactory(IEntryPoint(payable(address(entrypoint))), extensions)); - ManagedAccountFactory factory = ManagedAccountFactory( - payable( - address( - new TWProxy( - factoryImpl, - abi.encodeWithSignature("initialize(address,string)", deployer, "https://example.com") - ) - ) - ) + ManagedAccountFactory factory = new ManagedAccountFactory( + factoryDeployer, + IEntryPoint(payable(address(entrypoint))), + extensions ); assertTrue(address(factory) != address(0), "factory address should not be zero"); } @@ -420,7 +400,7 @@ contract ManagedAccountTest is BaseTest { } /// @dev Create an account via Entrypoint. - function test_state_createAccount_viaEntrypointSingle() public { + function test_state_createAccount_viaEntrypoint() public { bytes memory initCallData = abi.encodeWithSignature("createAccount(address,bytes)", accountAdmin, data); bytes memory initCode = abi.encodePacked(abi.encodePacked(address(accountFactory)), initCallData); diff --git a/src/test/smart-wallet/account-core/isValidSigner.t.sol b/src/test/smart-wallet/account-core/isValidSigner.t.sol index 8d9c45bbc..c289ca237 100644 --- a/src/test/smart-wallet/account-core/isValidSigner.t.sol +++ b/src/test/smart-wallet/account-core/isValidSigner.t.sol @@ -7,7 +7,6 @@ import "contracts/external-deps/openzeppelin/proxy/Clones.sol"; import "@thirdweb-dev/dynamic-contracts/src/interface/IExtension.sol"; import { IAccountPermissions } from "contracts/extension/interface/IAccountPermissions.sol"; import { AccountPermissions, EnumerableSet, ECDSA } from "contracts/extension/upgradeable/AccountPermissions.sol"; -import { TWProxy } from "contracts/infra/TWProxy.sol"; // Account Abstraction setup for smart wallets. import { EntryPoint, IEntryPoint } from "contracts/prebuilts/account/utils/Entrypoint.sol"; @@ -191,24 +190,14 @@ contract AccountCoreTest_isValidSigner is BaseTest { IExtension.Extension[] memory extensions; // deploy account factory - address factoryImpl = address(new DynamicAccountFactory(extensions)); - accountFactory = DynamicAccountFactory( - address( - payable( - new TWProxy( - factoryImpl, - abi.encodeWithSignature("initialize(address,string)", deployer, "https://example.com") - ) - ) - ) - ); + accountFactory = new DynamicAccountFactory(deployer, extensions); // deploy dummy contract numberContract = new Number(); address accountImpl = address(new MyDynamicAccount(IEntryPoint(payable(address(entrypoint))), extensions)); address _account = Clones.cloneDeterministic(accountImpl, "salt"); account = MyDynamicAccount(payable(_account)); - account.initialize(accountAdmin, address(this), ""); + account.initialize(accountAdmin, ""); } function test_isValidSigner_whenSignerIsAdmin() public { diff --git a/src/test/smart-wallet/account-permissions/setPermissionsForSigner.t.sol b/src/test/smart-wallet/account-permissions/setPermissionsForSigner.t.sol index 3d3adca66..96ef0d462 100644 --- a/src/test/smart-wallet/account-permissions/setPermissionsForSigner.t.sol +++ b/src/test/smart-wallet/account-permissions/setPermissionsForSigner.t.sol @@ -7,7 +7,6 @@ import "@thirdweb-dev/dynamic-contracts/src/interface/IExtension.sol"; import { IAccountPermissions } from "contracts/extension/interface/IAccountPermissions.sol"; import { AccountPermissions } from "contracts/extension/upgradeable/AccountPermissions.sol"; import { AccountExtension } from "contracts/prebuilts/account/utils/AccountExtension.sol"; -import { TWProxy } from "contracts/infra/TWProxy.sol"; // Account Abstraction setup for smart wallets. import { EntryPoint, IEntryPoint } from "contracts/prebuilts/account/utils/Entrypoint.sol"; @@ -74,7 +73,7 @@ contract AccountPermissionsTest_setPermissionsForSigner is BaseTest { bytes internal data = bytes(""); // UserOp terminology: `sender` is the smart wallet. - address private sender = 0x96b1d554981298ED415f2D5788A6D093A39eECfF; + address private sender = 0x78b942FBC9126b4Ed8384Bb9dd1420Ea865be91a; address payable private beneficiary = payable(address(0x45654)); bytes32 private uidCache = bytes32("random uid"); @@ -268,17 +267,7 @@ contract AccountPermissionsTest_setPermissionsForSigner is BaseTest { extensions[0] = defaultExtension; // deploy account factory - address factoryImpl = address(new DynamicAccountFactory(extensions)); - accountFactory = DynamicAccountFactory( - address( - payable( - new TWProxy( - factoryImpl, - abi.encodeWithSignature("initialize(address,string)", deployer, "https://example.com") - ) - ) - ) - ); + accountFactory = new DynamicAccountFactory(deployer, extensions); // deploy dummy contract numberContract = new Number(); } diff --git a/src/test/smart-wallet/utils/AABenchmarkArtifacts.sol b/src/test/smart-wallet/utils/AABenchmarkArtifacts.sol index 1a59f5bea..891c0c1d7 100644 --- a/src/test/smart-wallet/utils/AABenchmarkArtifacts.sol +++ b/src/test/smart-wallet/utils/AABenchmarkArtifacts.sol @@ -9,6 +9,6 @@ interface ThirdwebAccount { } address constant THIRDWEB_ACCOUNT_FACTORY_ADDRESS = 0x2e234DAe75C793f67A35089C9d99245E1C58470b; address constant THIRDWEB_ACCOUNT_IMPL_ADDRESS = 0xffD4505B3452Dc22f8473616d50503bA9E1710Ac; -bytes constant THIRDWEB_ACCOUNT_FACTORY_BYTECODE = hex"608060405234801561001057600080fd5b50600436106101735760003560e01c80639387a380116100de578063c3c5a54711610097578063d8fd8f4411610071578063d8fd8f4414610482578063e68a7c3b146104b2578063e8a3d485146104e2578063f399e22e1461050057610173565b8063c3c5a54714610406578063ca15c87314610436578063d547741f1461046657610173565b80639387a38014610332578063938e3d7b1461034e578063a217fddf1461036a578063a32fa5b314610388578063a65d69d4146103b8578063ac9650d8146103d657610173565b806336568abe1161013057806336568abe1461024c57806358451f971461026857806383a03f8c146102865780638878ed33146102a25780639010d07c146102d257806391d148541461030257610173565b806308e93d0a146101785780630b61e12b146101965780630e6254fd146101b257806311464fbe146101e2578063248a9ca3146102005780632f2ff15d14610230575b600080fd5b61018061051c565b60405161018d9190612888565b60405180910390f35b6101b060048036038101906101ab9190612920565b610536565b005b6101cc60048036038101906101c79190612960565b610649565b6040516101d99190612888565b60405180910390f35b6101ea6106a2565b6040516101f7919061299c565b60405180910390f35b61021a600480360381019061021591906129b7565b6106c6565b60405161022791906129f3565b60405180910390f35b61024a60048036038101906102459190612a0e565b6106ec565b005b61026660048036038101906102619190612a0e565b6107ce565b005b610270610851565b60405161027d9190612a67565b60405180910390f35b6102a0600480360381019061029b91906129b7565b61086b565b005b6102bc60048036038101906102b79190612ae7565b610919565b6040516102c9919061299c565b60405180910390f35b6102ec60048036038101906102e79190612b73565b6109a0565b6040516102f9919061299c565b60405180910390f35b61031c60048036038101906103179190612a0e565b610b76565b6040516103299190612bce565b60405180910390f35b61034c60048036038101906103479190612920565b610be7565b005b61036860048036038101906103639190612d2a565b610cfa565b005b610372610d4d565b60405161037f91906129f3565b60405180910390f35b6103a2600480360381019061039d9190612a0e565b610d54565b6040516103af9190612bce565b60405180910390f35b6103c0610e3a565b6040516103cd919061299c565b60405180910390f35b6103f060048036038101906103eb9190612dc9565b610e5e565b6040516103fd9190612f60565b60405180910390f35b610420600480360381019061041b9190612960565b610f6a565b60405161042d9190612bce565b60405180910390f35b610450600480360381019061044b91906129b7565b610f90565b60405161045d9190612a67565b60405180910390f35b610480600480360381019061047b9190612a0e565b61108f565b005b61049c60048036038101906104979190612ae7565b6110ca565b6040516104a9919061299c565b60405180910390f35b6104cc60048036038101906104c79190612f82565b6112ab565b6040516104d99190612888565b60405180910390f35b6104ea61140f565b6040516104f79190613017565b60405180910390f35b61051a60048036038101906105159190613039565b6114aa565b005b6060610531610529611659565b600001611668565b905090565b60003390506105458183611689565b610584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161057b906130e1565b60405180910390fd5b60006105e082610592611659565b60020160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206116f090919063ffffffff16565b90508015610643578373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f12146497b3b826918ec47f0cac7272a09ed06b30c16c030e99ec48ff5dd60b4760405160405180910390a35b50505050565b606061069b610656611659565b60020160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611668565b9050919050565b7f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac81565b60006106d0611720565b6001016000838152602001908152602001600020549050919050565b6107196106f7611720565b60010160008481526020019081526020016000205461071461172f565b611737565b610721611720565b600001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156107c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b79061314d565b60405180910390fd5b6107ca8282611831565b5050565b8073ffffffffffffffffffffffffffffffffffffffff166107ed61172f565b73ffffffffffffffffffffffffffffffffffffffff1614610843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083a906131b9565b60405180910390fd5b61084d8282611849565b5050565b600061086661085e611659565b600001611861565b905090565b600033905061087a8183611689565b6108b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b0906130e1565b60405180910390fd5b6108d6816108c5611659565b6000016116f090919063ffffffff16565b610915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090c9061324b565b60405180910390fd5b5050565b60008061096a8585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611876565b90506109967f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac826118a9565b9150509392505050565b6000806109ab6118be565b6000016000858152602001908152602001600020600001549050600080600090505b82811015610b6c57600073ffffffffffffffffffffffffffffffffffffffff166109f56118be565b6000016000888152602001908152602001600020600101600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ad05784821415610abc57610a696118be565b6000016000878152602001908152602001600020600101600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169350505050610b70565b600182610ac9919061329a565b9150610b58565b610adb866000610b76565b8015610b425750610aea6118be565b600001600087815260200190815260200160002060020160008073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481145b15610b5757600182610b54919061329a565b91505b5b600181610b65919061329a565b90506109cd565b5050505b92915050565b6000610b80611720565b600001600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000339050610bf68183611689565b610c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2c906130e1565b60405180910390fd5b6000610c9182610c43611659565b60020160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206118cd90919063ffffffff16565b90508015610cf4578373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f98d1ebbe00ae92a5de96a0f49742a8afa89f42363592bc2e7cfaaed68b45e7a660405160405180910390a35b50505050565b610d026118fd565b610d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d389061333c565b60405180910390fd5b610d4a81611911565b50565b6000801b81565b6000610d5e611720565b600001600084815260200190815260200160002060008073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e2f57610dc9611720565b600001600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050610e34565b600190505b92915050565b7f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d278981565b60608282905067ffffffffffffffff811115610e7d57610e7c612bff565b5b604051908082528060200260200182016040528015610eb057816020015b6060815260200190600190039081610e9b5790505b50905060005b83839050811015610f6357610f3230858584818110610ed857610ed761335c565b5b9050602002810190610eea919061339a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611a06565b828281518110610f4557610f4461335c565b5b60200260200101819052508080610f5b906133fd565b915050610eb6565b5092915050565b6000610f8982610f78611659565b600001611a3390919063ffffffff16565b9050919050565b600080610f9b6118be565b600001600084815260200190815260200160002060000154905060005b8181101561106857600073ffffffffffffffffffffffffffffffffffffffff16610fe06118be565b6000016000868152602001908152602001600020600101600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461105457600183611051919061329a565b92505b600181611061919061329a565b9050610fb8565b50611074836000610b76565b1561108957600182611086919061329a565b91505b50919050565b6110bc61109a611720565b6001016000848152602001908152602001600020546110b761172f565b611737565b6110c68282611849565b5050565b6000807f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac905060006111408686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611876565b9050600061114e83836118a9565b905060008173ffffffffffffffffffffffffffffffffffffffff163b111561117b578093505050506112a4565b6111858383611a63565b90507f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d278973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611237576111f7816111e6611659565b6000016116f090919063ffffffff16565b611236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122d9061324b565b60405180910390fd5b5b61124381888888611b20565b8673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fac631f3001b55ea1509cf3d7e74898f85392a61a76e8149181ae1259622dabc860405160405180910390a38093505050505b9392505050565b606081831080156112ce57506112ca6112c2611659565b600001611861565b8211155b61130d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611304906134b8565b60405180910390fd5b6000838361131b91906134d8565b9050838361132991906134d8565b67ffffffffffffffff81111561134257611341612bff565b5b6040519080825280602002602001820160405280156113705781602001602082028036833780820191505090505b50915060005b81811015611407576113a6858261138d919061329a565b611395611659565b600001611b9790919063ffffffff16565b8382815181106113b9576113b861335c565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181611400919061329a565b9050611376565b505092915050565b6060611419611bb1565b60000180546114279061353b565b80601f01602080910402602001604051908101604052809291908181526020018280546114539061353b565b80156114a05780601f10611475576101008083540402835291602001916114a0565b820191906000526020600020905b81548152906001019060200180831161148357829003601f168201915b5050505050905090565b60006114b4611bc0565b60000160009054906101000a900460ff16905060006114d1611bc0565b60000160019054906101000a900460ff1690506000811590508080156114fa575060018360ff16105b8061151a575061150930611bcf565b158015611519575060018360ff16145b5b611559576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611550906135df565b60405180910390fd5b6001611563611bc0565b60000160006101000a81548160ff021916908360ff16021790555080156115a957600161158e611bc0565b60000160016101000a81548160ff0219169083151502179055505b6115b66000801b86611831565b6115bf84611911565b80156116225760006115cf611bc0565b60000160016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860016040516116199190613651565b60405180910390a15b5050505050565b6000807f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee030060001b90508091505090565b6000611663611bf2565b905090565b6060600061167883600001611c22565b905060608190508092505050919050565b6000806116b67f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac846118a9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161491505092915050565b6000611718836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611c7e565b905092915050565b600061172a611cee565b905090565b600033905090565b61173f611720565b600001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661182d576117c38173ffffffffffffffffffffffffffffffffffffffff166014611d1e565b6117d18360001c6020611d1e565b6040516020016117e2929190613740565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118249190613017565b60405180910390fd5b5050565b61183b8282611f5a565b6118458282612032565b5050565b6118538282612162565b61185d828261223b565b5050565b600061186f82600001612354565b9050919050565b6000828260405160200161188b9291906137c4565b60405160208183030381529060405280519060200120905092915050565b60006118b6838330612365565b905092915050565b60006118c86123c6565b905090565b60006118f5836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61242f565b905092915050565b600061190c6000801b33610b76565b905090565b600061191b611bb1565b60000180546119299061353b565b80601f01602080910402602001604051908101604052809291908181526020018280546119559061353b565b80156119a25780601f10611977576101008083540402835291602001916119a2565b820191906000526020600020905b81548152906001019060200180831161198557829003601f168201915b50505050509050816119b2611bb1565b60000190805190602001906119c89291906126f5565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a1681836040516119fa9291906137f4565b60405180910390a15050565b6060611a2b8383604051806060016040528060278152602001613b0960279139612543565b905092915050565b6000611a5b836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612610565b905092915050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f59050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1190613877565b60405180910390fd5b92915050565b8373ffffffffffffffffffffffffffffffffffffffff1663cf7a1d77843085856040518563ffffffff1660e01b8152600401611b5f94939291906138c4565b600060405180830381600087803b158015611b7957600080fd5b505af1158015611b8d573d6000803e3d6000fd5b5050505050505050565b6000611ba68360000183612633565b60001c905092915050565b6000611bbb61265e565b905090565b6000611bca611629565b905090565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000807f82f5b3e5f5ca1c04b70bced106a2c3b72d9cb53ebbafb3cad0740983db74290060001b90508091505090565b606081600001805480602002602001604051908101604052809291908181526020018280548015611c7257602002820191906000526020600020905b815481526020019060010190808311611c5e575b50505050509050919050565b6000611c8a8383612610565b611ce3578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611ce8565b600090505b92915050565b6000807f0a7b0f5c59907924802379ebe98cdc23e2ee7820f63d30126e10b3752010e50060001b90508091505090565b606060006002836002611d319190613904565b611d3b919061329a565b67ffffffffffffffff811115611d5457611d53612bff565b5b6040519080825280601f01601f191660200182016040528015611d865781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611dbe57611dbd61335c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611e2257611e2161335c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611e629190613904565b611e6c919061329a565b90505b6001811115611f0c577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611eae57611ead61335c565b5b1a60f81b828281518110611ec557611ec461335c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611f059061395e565b9050611e6f565b5060008414611f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f47906139d4565b60405180910390fd5b8091505092915050565b6001611f64611720565b600001600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611fd461172f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600061203c6118be565b600001600084815260200190815260200160002060000154905060016120606118be565b60000160008581526020019081526020016000206000016000828254612086919061329a565b92505081905550816120966118be565b6000016000858152602001908152602001600020600101600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806121056118be565b600001600085815260200190815260200160002060020160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b61216c8282611737565b612174611720565b600001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690556121dd61172f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b60006122456118be565b600001600084815260200190815260200160002060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506122a46118be565b6000016000848152602001908152602001600020600101600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556122f76118be565b600001600084815260200190815260200160002060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055505050565b600081600001805490509050919050565b60006040518260388201526f5af43d82803e903d91602b57fd5bf3ff6024820152846014820152733d602d80600a3d3981f3363d3d373d3d3d363d7381528360588201526037600c8201206078820152605560438201209150509392505050565b60008060ff60001b1960017f0c4ba382c0009cf238e4c1ca1a52f51c61e6248a70bdfb34e5ed49d5578a5c0c60001c6123ff91906134d8565b60405160200161240f9190612a67565b604051602081830303815290604052805190602001201690508091505090565b6000808360010160008481526020019081526020016000205490506000811461253757600060018261246191906134d8565b905060006001866000018054905061247991906134d8565b90508181146124e857600086600001828154811061249a5761249961335c565b5b90600052602060002001549050808760000184815481106124be576124bd61335c565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806124fc576124fb6139f4565b5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061253d565b60009150505b92915050565b606061254e84611bcf565b61258d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258490613a95565b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516125b59190613af1565b600060405180830381855af49150503d80600081146125f0576040519150601f19603f3d011682016040523d82523d6000602084013e6125f5565b606091505b509150915061260582828661268e565b925050509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b600082600001828154811061264b5761264a61335c565b5b9060005260206000200154905092915050565b6000807f4bc804ba64359c0e35e5ed5d90ee596ecaa49a3a930ddcb1470ea0dd625da90060001b90508091505090565b6060831561269e578290506126ee565b6000835111156126b15782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e59190613017565b60405180910390fd5b9392505050565b8280546127019061353b565b90600052602060002090601f016020900481019282612723576000855561276a565b82601f1061273c57805160ff191683800117855561276a565b8280016001018555821561276a579182015b8281111561276957825182559160200191906001019061274e565b5b509050612777919061277b565b5090565b5b8082111561279457600081600090555060010161277c565b5090565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127ef826127c4565b9050919050565b6127ff816127e4565b82525050565b600061281183836127f6565b60208301905092915050565b6000602082019050919050565b600061283582612798565b61283f81856127a3565b935061284a836127b4565b8060005b8381101561287b5781516128628882612805565b975061286d8361281d565b92505060018101905061284e565b5085935050505092915050565b600060208201905081810360008301526128a2818461282a565b905092915050565b6000604051905090565b600080fd5b600080fd5b6128c7816127e4565b81146128d257600080fd5b50565b6000813590506128e4816128be565b92915050565b6000819050919050565b6128fd816128ea565b811461290857600080fd5b50565b60008135905061291a816128f4565b92915050565b60008060408385031215612937576129366128b4565b5b6000612945858286016128d5565b92505060206129568582860161290b565b9150509250929050565b600060208284031215612976576129756128b4565b5b6000612984848285016128d5565b91505092915050565b612996816127e4565b82525050565b60006020820190506129b1600083018461298d565b92915050565b6000602082840312156129cd576129cc6128b4565b5b60006129db8482850161290b565b91505092915050565b6129ed816128ea565b82525050565b6000602082019050612a0860008301846129e4565b92915050565b60008060408385031215612a2557612a246128b4565b5b6000612a338582860161290b565b9250506020612a44858286016128d5565b9150509250929050565b6000819050919050565b612a6181612a4e565b82525050565b6000602082019050612a7c6000830184612a58565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612aa757612aa6612a82565b5b8235905067ffffffffffffffff811115612ac457612ac3612a87565b5b602083019150836001820283011115612ae057612adf612a8c565b5b9250929050565b600080600060408486031215612b0057612aff6128b4565b5b6000612b0e868287016128d5565b935050602084013567ffffffffffffffff811115612b2f57612b2e6128b9565b5b612b3b86828701612a91565b92509250509250925092565b612b5081612a4e565b8114612b5b57600080fd5b50565b600081359050612b6d81612b47565b92915050565b60008060408385031215612b8a57612b896128b4565b5b6000612b988582860161290b565b9250506020612ba985828601612b5e565b9150509250929050565b60008115159050919050565b612bc881612bb3565b82525050565b6000602082019050612be36000830184612bbf565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612c3782612bee565b810181811067ffffffffffffffff82111715612c5657612c55612bff565b5b80604052505050565b6000612c696128aa565b9050612c758282612c2e565b919050565b600067ffffffffffffffff821115612c9557612c94612bff565b5b612c9e82612bee565b9050602081019050919050565b82818337600083830152505050565b6000612ccd612cc884612c7a565b612c5f565b905082815260208101848484011115612ce957612ce8612be9565b5b612cf4848285612cab565b509392505050565b600082601f830112612d1157612d10612a82565b5b8135612d21848260208601612cba565b91505092915050565b600060208284031215612d4057612d3f6128b4565b5b600082013567ffffffffffffffff811115612d5e57612d5d6128b9565b5b612d6a84828501612cfc565b91505092915050565b60008083601f840112612d8957612d88612a82565b5b8235905067ffffffffffffffff811115612da657612da5612a87565b5b602083019150836020820283011115612dc257612dc1612a8c565b5b9250929050565b60008060208385031215612de057612ddf6128b4565b5b600083013567ffffffffffffffff811115612dfe57612dfd6128b9565b5b612e0a85828601612d73565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e7c578082015181840152602081019050612e61565b83811115612e8b576000848401525b50505050565b6000612e9c82612e42565b612ea68185612e4d565b9350612eb6818560208601612e5e565b612ebf81612bee565b840191505092915050565b6000612ed68383612e91565b905092915050565b6000602082019050919050565b6000612ef682612e16565b612f008185612e21565b935083602082028501612f1285612e32565b8060005b85811015612f4e5784840389528151612f2f8582612eca565b9450612f3a83612ede565b925060208a01995050600181019050612f16565b50829750879550505050505092915050565b60006020820190508181036000830152612f7a8184612eeb565b905092915050565b60008060408385031215612f9957612f986128b4565b5b6000612fa785828601612b5e565b9250506020612fb885828601612b5e565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000612fe982612fc2565b612ff38185612fcd565b9350613003818560208601612e5e565b61300c81612bee565b840191505092915050565b600060208201905081810360008301526130318184612fde565b905092915050565b600080604083850312156130505761304f6128b4565b5b600061305e858286016128d5565b925050602083013567ffffffffffffffff81111561307f5761307e6128b9565b5b61308b85828601612cfc565b9150509250929050565b7f4163636f756e74466163746f72793a206e6f7420616e206163636f756e742e00600082015250565b60006130cb601f83612fcd565b91506130d682613095565b602082019050919050565b600060208201905081810360008301526130fa816130be565b9050919050565b7f43616e206f6e6c79206772616e7420746f206e6f6e20686f6c64657273000000600082015250565b6000613137601d83612fcd565b915061314282613101565b602082019050919050565b600060208201905081810360008301526131668161312a565b9050919050565b7f43616e206f6e6c792072656e6f756e636520666f722073656c66000000000000600082015250565b60006131a3601a83612fcd565b91506131ae8261316d565b602082019050919050565b600060208201905081810360008301526131d281613196565b9050919050565b7f4163636f756e74466163746f72793a206163636f756e7420616c72656164792060008201527f7265676973746572656400000000000000000000000000000000000000000000602082015250565b6000613235602a83612fcd565b9150613240826131d9565b604082019050919050565b6000602082019050818103600083015261326481613228565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006132a582612a4e565b91506132b083612a4e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132e5576132e461326b565b5b828201905092915050565b7f4e6f7420617574686f72697a6564000000000000000000000000000000000000600082015250565b6000613326600e83612fcd565b9150613331826132f0565b602082019050919050565b6000602082019050818103600083015261335581613319565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126133b7576133b661338b565b5b80840192508235915067ffffffffffffffff8211156133d9576133d8613390565b5b6020830192506001820236038313156133f5576133f4613395565b5b509250929050565b600061340882612a4e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561343b5761343a61326b565b5b600182019050919050565b7f426173654163636f756e74466163746f72793a20696e76616c696420696e646960008201527f6365730000000000000000000000000000000000000000000000000000000000602082015250565b60006134a2602383612fcd565b91506134ad82613446565b604082019050919050565b600060208201905081810360008301526134d181613495565b9050919050565b60006134e382612a4e565b91506134ee83612a4e565b9250828210156135015761350061326b565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061355357607f821691505b602082108114156135675761356661350c565b5b50919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b60006135c9602e83612fcd565b91506135d48261356d565b604082019050919050565b600060208201905081810360008301526135f8816135bc565b9050919050565b6000819050919050565b600060ff82169050919050565b6000819050919050565b600061363b613636613631846135ff565b613616565b613609565b9050919050565b61364b81613620565b82525050565b60006020820190506136666000830184613642565b92915050565b600081905092915050565b7f5065726d697373696f6e733a206163636f756e74200000000000000000000000600082015250565b60006136ad60158361366c565b91506136b882613677565b601582019050919050565b60006136ce82612fc2565b6136d8818561366c565b93506136e8818560208601612e5e565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b600061372a60118361366c565b9150613735826136f4565b601182019050919050565b600061374b826136a0565b915061375782856136c3565b91506137628261371d565b915061376e82846136c3565b91508190509392505050565b600082825260208201905092915050565b600061379682612e42565b6137a0818561377a565b93506137b0818560208601612e5e565b6137b981612bee565b840191505092915050565b60006040820190506137d9600083018561298d565b81810360208301526137eb818461378b565b90509392505050565b6000604082019050818103600083015261380e8185612fde565b905081810360208301526138228184612fde565b90509392505050565b7f455243313136373a2063726561746532206661696c6564000000000000000000600082015250565b6000613861601783612fcd565b915061386c8261382b565b602082019050919050565b6000602082019050818103600083015261389081613854565b9050919050565b60006138a3838561377a565b93506138b0838584612cab565b6138b983612bee565b840190509392505050565b60006060820190506138d9600083018761298d565b6138e6602083018661298d565b81810360408301526138f9818486613897565b905095945050505050565b600061390f82612a4e565b915061391a83612a4e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139535761395261326b565b5b828202905092915050565b600061396982612a4e565b9150600082141561397d5761397c61326b565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006139be602083612fcd565b91506139c982613988565b602082019050919050565b600060208201905081810360008301526139ed816139b1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60008201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b6000613a7f602683612fcd565b9150613a8a82613a23565b604082019050919050565b60006020820190508181036000830152613aae81613a72565b9050919050565b600081905092915050565b6000613acb82612e42565b613ad58185613ab5565b9350613ae5818560208601612e5e565b80840191505092915050565b6000613afd8284613ac0565b91508190509291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c0ef9945b017bc21a75c7486c027607288c2e1f8c96abf80075e371b5012e59164736f6c634300080c0033"; -bytes constant THIRDWEB_ACCOUNT_IMPL_BYTECODE = hex"6080604052600436106101bb5760003560e01c8063a9082d84116100ec578063cf7a1d771161008a578063e8a3d48511610064578063e8a3d48514610667578063e9523c9714610692578063f15d424e146106bd578063f23a6e61146106fa576101c2565b8063cf7a1d77146105e8578063d087d28814610611578063d42f2f351461063c576101c2565b8063b61d27f6116100c6578063b61d27f61461052e578063b76464d514610557578063bc197c8114610580578063c45a0155146105bd576101c2565b8063a9082d8414610488578063ac9650d8146104c6578063b0d691fe14610503576101c2565b806347e1da2a116101595780635892e236116101335780635892e236146103ce5780637dff5a79146103f75780638b52d72314610434578063938e3d7b1461045f576101c2565b806347e1da2a146103725780634a58db191461039b5780634d44560d146103a5576101c2565b80631626ba7e116101955780631626ba7e1461027e5780631dd756c5146102bb57806324d7806c146102f85780633a871cdd14610335576101c2565b806301ffc9a7146101c75780630a1028c414610204578063150b7a0214610241576101c2565b366101c257005b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e9919061415d565b610737565b6040516101fb91906141a5565b60405180910390f35b34801561021057600080fd5b5061022b60048036038101906102269190614306565b610819565b6040516102389190614368565b60405180910390f35b34801561024d57600080fd5b5061026860048036038101906102639190614417565b6108a6565b60405161027591906144a9565b60405180910390f35b34801561028a57600080fd5b506102a560048036038101906102a091906144f0565b6108ba565b6040516102b291906144a9565b60405180910390f35b3480156102c757600080fd5b506102e260048036038101906102dd9190614571565b610a42565b6040516102ef91906141a5565b60405180910390f35b34801561030457600080fd5b5061031f600480360381019061031a91906145cd565b610ec5565b60405161032c91906141a5565b60405180910390f35b34801561034157600080fd5b5061035c600480360381019061035791906145fa565b610f24565b6040516103699190614678565b60405180910390f35b34801561037e57600080fd5b506103996004803603810190610394919061479f565b610f57565b005b6103a361111a565b005b3480156103b157600080fd5b506103cc60048036038101906103c79190614891565b61118f565b005b3480156103da57600080fd5b506103f560048036038101906103f09190614947565b61120f565b005b34801561040357600080fd5b5061041e600480360381019061041991906145cd565b611763565b60405161042b91906141a5565b60405180910390f35b34801561044057600080fd5b506104496118f7565b6040516104569190614bf3565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190614cb6565b611c8b565b005b34801561049457600080fd5b506104af60048036038101906104aa9190614947565b611cde565b6040516104bd929190614d0e565b60405180910390f35b3480156104d257600080fd5b506104ed60048036038101906104e89190614d37565b611d41565b6040516104fa9190614ece565b60405180910390f35b34801561050f57600080fd5b50610518611e4d565b6040516105259190614f4f565b60405180910390f35b34801561053a57600080fd5b5061055560048036038101906105509190614f6a565b611ee3565b005b34801561056357600080fd5b5061057e6004803603810190610579919061501c565b611fc6565b005b34801561058c57600080fd5b506105a760048036038101906105a2919061510c565b61201b565b6040516105b491906144a9565b60405180910390f35b3480156105c957600080fd5b506105d2612030565b6040516105df91906151db565b60405180910390f35b3480156105f457600080fd5b5061060f600480360381019061060a91906151f6565b612063565b005b34801561061d57600080fd5b50610626612280565b6040516106339190614678565b60405180910390f35b34801561064857600080fd5b5061065161230b565b60405161065e9190614bf3565b60405180910390f35b34801561067357600080fd5b5061067c612595565b60405161068991906152bf565b60405180910390f35b34801561069e57600080fd5b506106a7612630565b6040516106b49190615350565b60405180910390f35b3480156106c957600080fd5b506106e460048036038101906106df91906145cd565b61264a565b6040516106f191906153e8565b60405180910390f35b34801561070657600080fd5b50610721600480360381019061071c919061540a565b61280b565b60405161072e91906144a9565b60405180910390f35b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061080257507f150b7a02000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610812575061081182612850565b5b9050919050565b6000807f82cac545155fcbf147f2a9013809613677ac7d65498556e6d19ce43bcbf6c28483805190602001206040516020016108569291906154a1565b6040516020818303038152906040528051906020012090506108766128ca565b81604051602001610888929190615542565b60405160208183030381529060405280519060200120915050919050565b600063150b7a0260e01b9050949350505050565b6000806108e5846040516020016108d19190614368565b604051602081830303815290604052610819565b905060006108fc84836129e490919063ffffffff16565b905061090781610ec5565b1561091d57631626ba7e60e01b92505050610a3c565b6000339050600061092c612a0b565b60060160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506109818282612a1a90919063ffffffff16565b806109df5750600161099282612a4a565b1480156109de5750600073ffffffffffffffffffffffffffffffffffffffff166109c6600083612a5f90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16145b5b610a1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a15906155eb565b60405180910390fd5b610a2783611763565b15610a3757631626ba7e60e01b94505b505050505b92915050565b6000610a4c612a0b565b60040160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610aa85760019050610ebf565b6000610ab2612a0b565b60050160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806060016040529081600082015481526020016001820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506000610ba7612a0b565b60060160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090504282602001516fffffffffffffffffffffffffffffffff161180610c23575081604001516fffffffffffffffffffffffffffffffff164210155b80610c3657506000610c3482612a4a565b145b15610c4657600092505050610ebf565b6000610c60858060600190610c5b919061561a565b612a79565b905060006001610c6f84612a4a565b148015610cbb5750600073ffffffffffffffffffffffffffffffffffffffff16610ca3600085612a5f90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16145b905063b61d27f660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610d7757600080610d25888060600190610d20919061561a565b612ae9565b9150915082610d5557610d418286612a1a90919063ffffffff16565b610d545760009650505050505050610ebf565b5b8086600001511015610d705760009650505050505050610ebf565b5050610eb6565b6347e1da2a60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610ea857600080610ddf888060600190610dda919061561a565b612b80565b509150915082610e4b5760005b8251811015610e4957610e22838281518110610e0b57610e0a61567d565b5b602002602001015187612a1a90919063ffffffff16565b610e36576000975050505050505050610ebf565b8080610e41906156db565b915050610dec565b505b60005b8251811015610ea057818181518110610e6a57610e6961567d565b5b602002602001015187600001511015610e8d576000975050505050505050610ebf565b8080610e98906156db565b915050610e4e565b505050610eb5565b6000945050505050610ebf565b5b60019450505050505b92915050565b6000610ecf612a0b565b60040160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000610f2e612bff565b610f388484612c76565b9050610f478460200135612e66565b610f5082612e69565b9392505050565b610f5f611e4d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610f9d5750610f9c33610ec5565b5b610fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd390615796565b60405180910390fd5b610fe4612f05565b8181905086869050148015610ffe57508383905086869050145b61103d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103490615802565b60405180910390fd5b60005b86869050811015611111576110fd8787838181106110615761106061567d565b5b905060200201602081019061107691906145cd565b8686848181106110895761108861567d565b5b905060200201358585858181106110a3576110a261567d565b5b90506020028101906110b5919061561a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061302d565b508080611109906156db565b915050611040565b50505050505050565b611122611e4d565b73ffffffffffffffffffffffffffffffffffffffff1663b760faf934306040518363ffffffff1660e01b815260040161115b91906151db565b6000604051808303818588803b15801561117457600080fd5b505af1158015611188573d6000803e3d6000fd5b5050505050565b6111976130b7565b61119f611e4d565b73ffffffffffffffffffffffffffffffffffffffff1663205c287883836040518363ffffffff1660e01b81526004016111d9929190615831565b600060405180830381600087803b1580156111f357600080fd5b505af1158015611207573d6000803e3d6000fd5b505050505050565b600083600001602081019061122491906145cd565b9050428460c001602081019061123a9190615886565b6fffffffffffffffffffffffffffffffff161115801561127d57508360e00160208101906112689190615886565b6fffffffffffffffffffffffffffffffff1642105b6112bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b3906158ff565b60405180910390fd5b6000806112ca868686611cde565b915091508161130e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113059061596b565b60405180910390fd5b6001611318612a0b565b6007016000886101000135815260200190815260200160002060006101000a81548160ff021916908315150217905550600086602001602081019061135d91906159c4565b60ff161115611396576000600187602001602081019061137d91906159c4565b60ff1614905061138d8482613101565b5050505061175e565b61139f83610ec5565b156113df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d690615a3d565b60405180910390fd5b6113fc836113eb612a0b565b60020161323990919063ffffffff16565b506040518060600160405280876060013581526020018760800160208101906114259190615886565b6fffffffffffffffffffffffffffffffff1681526020018760a001602081019061144f9190615886565b6fffffffffffffffffffffffffffffffff1681525061146c612a0b565b60050160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055509050506000611589611544612a0b565b60060160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613269565b905060008151905060005b81811015611625576116108382815181106115b2576115b161567d565b5b60200260200101516115c2612a0b565b60060160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061328a90919063ffffffff16565b5060018161161e9190615a5d565b9050611594565b508780604001906116369190615ab3565b9050905060005b818110156116e9576116d48980604001906116589190615ab3565b838181106116695761166861567d565b5b905060200201602081019061167e91906145cd565b611686612a0b565b60060160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061323990919063ffffffff16565b506001816116e29190615a5d565b905061163d565b506116f3886132ba565b8473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167ff21d10c26e35863a8df291aca54181ee8c4a3bc8e00246c3f7a5a14b69d826a78a6040516117509190615d9c565b60405180910390a350505050505b505050565b60008061176e612a0b565b60050160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806060016040529081600082015481526020016001820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090504281602001516fffffffffffffffffffffffffffffffff1611158015611894575080604001516fffffffffffffffffffffffffffffffff1642105b80156118ef575060006118ed6118a8612a0b565b60060160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612a4a565b115b915050919050565b6060600061190e611906612a0b565b600201613269565b90506000815190506000805b828110156119c1576119458482815181106119385761193761567d565b5b6020026020010151611763565b1561195d578180611955906156db565b9250506119ad565b60008482815181106119725761197161567d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b6001816119ba9190615a5d565b905061191a565b508067ffffffffffffffff8111156119dc576119db6141db565b5b604051908082528060200260200182016040528015611a1557816020015b611a02613fe5565b8152602001906001900390816119fa5790505b5093506000805b83811015611c8357600073ffffffffffffffffffffffffffffffffffffffff16858281518110611a4f57611a4e61567d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614611c6f576000858281518110611a8757611a8661567d565b5b602002602001015190506000611a9b612a0b565b60050160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806060016040529081600082015481526020016001820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060a001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001611bfd611bb8612a0b565b60060160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613269565b81526020018260000151815260200182602001516fffffffffffffffffffffffffffffffff16815260200182604001516fffffffffffffffffffffffffffffffff16815250888580611c4e906156db565b965081518110611c6157611c6061567d565b5b602002602001018190525050505b600181611c7c9190615a5d565b9050611a1c565b505050505090565b611c93613375565b611cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc990615e0a565b60405180910390fd5b611cdb816133bb565b50565b600080611cf4611ced866134b0565b85856135b6565b9050611cfe612a0b565b6007016000866101000135815260200190815260200160002060009054906101000a900460ff16158015611d375750611d3681610ec5565b5b9150935093915050565b60608282905067ffffffffffffffff811115611d6057611d5f6141db565b5b604051908082528060200260200182016040528015611d9357816020015b6060815260200190600190039081611d7e5790505b50905060005b83839050811015611e4657611e1530858584818110611dbb57611dba61567d565b5b9050602002810190611dcd919061561a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613627565b828281518110611e2857611e2761567d565b5b60200260200101819052508080611e3e906156db565b915050611d99565b5092915050565b600080611e58613654565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611ebb5780915050611ee0565b7f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d27899150505b90565b611eeb611e4d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611f295750611f2833610ec5565b5b611f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5f90615796565b60405180910390fd5b611f70612f05565b611fbf848484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061302d565b5050505050565b611fce6130b7565b80611fd7613654565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600063bc197c8160e01b905095945050505050565b600061203a613654565b60010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061206d613684565b60000160009054906101000a900460ff169050600061208a613684565b60000160019054906101000a900460ff1690506000811590508080156120b3575060018360ff16105b806120d357506120c230613693565b1580156120d2575060018360ff16145b5b612112576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210990615e9c565b60405180910390fd5b600161211c613684565b60000160006101000a81548160ff021916908360ff1602179055508015612162576001612147613684565b60000160016101000a81548160ff0219169083151502179055505b6121b08786868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506136b6565b6121b8613654565b60020181905550856121c8613654565b60010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612214876001613101565b8015612277576000612224613684565b60000160016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498600160405161226e9190615ef7565b60405180910390a15b50505050505050565b600061228a611e4d565b73ffffffffffffffffffffffffffffffffffffffff166335567e1a3060006040518363ffffffff1660e01b81526004016122c5929190615f71565b602060405180830381865afa1580156122e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123069190615faf565b905090565b6060600061232261231a612a0b565b600201613269565b90506000815190508067ffffffffffffffff811115612344576123436141db565b5b60405190808252806020026020018201604052801561237d57816020015b61236a613fe5565b8152602001906001900390816123625790505b50925060005b8181101561258f5760008382815181106123a05761239f61567d565b5b6020026020010151905060006123b4612a0b565b60050160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806060016040529081600082015481526020016001820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060a001604052808373ffffffffffffffffffffffffffffffffffffffff1681526020016125166124d1612a0b565b60060160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613269565b81526020018260000151815260200182602001516fffffffffffffffffffffffffffffffff16815260200182604001516fffffffffffffffffffffffffffffffff1681525086848151811061256e5761256d61567d565b5b602002602001018190525050506001816125889190615a5d565b9050612383565b50505090565b606061259f6136e9565b60000180546125ad9061600b565b80601f01602080910402602001604051908101604052809291908181526020018280546125d99061600b565b80156126265780601f106125fb57610100808354040283529160200191612626565b820191906000526020600020905b81548152906001019060200180831161260957829003601f168201915b5050505050905090565b606061264561263d612a0b565b600001613269565b905090565b612652613fe5565b600061265c612a0b565b60050160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806060016040529081600082015481526020016001820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060a001604052808473ffffffffffffffffffffffffffffffffffffffff1681526020016127be612779612a0b565b60060160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613269565b81526020018260000151815260200182602001516fffffffffffffffffffffffffffffffff16815260200182604001516fffffffffffffffffffffffffffffffff16815250915050919050565b600063f23a6e6160e01b905095945050505050565b6000807f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee030060001b90508091505090565b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128c357506128c2826136f8565b5b9050919050565b60007f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561294657507f0000000000000000000000000000000000000000000000000000000000007a6946145b15612973577fbcdadf6444930a967ffda04923d78c49b3dd65df3ed39abb04a1e3eb1190553790506129e1565b6129de7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7ff0729608244859f656d32ae4cbc6b0367695d68d8e941a28f5e2d33c6d5182dd7fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6613762565b90505b90565b60008060006129f3858561379c565b91509150612a00816137ee565b819250505092915050565b6000612a1561395c565b905090565b6000612a42836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61398c565b905092915050565b6000612a58826000016139af565b9050919050565b6000612a6e83600001836139c0565b60001c905092915050565b60006004838390501015612ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab990616089565b60405180910390fd5b8282600090600492612ad6939291906160b3565b90612ae19190616106565b905092915050565b6000806044848490501015612b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2a90616089565b60405180910390fd5b8383600490602492612b47939291906160b3565b810190612b549190616165565b91508383602490604492612b6a939291906160b3565b810190612b779190616192565b90509250929050565b60608060606064858590501015612bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc390616089565b60405180910390fd5b84846004908092612bdf939291906160b3565b810190612bec9190616363565b8093508194508295505050509250925092565b612c07611e4d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612c74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6b90616456565b60405180910390fd5b565b600080612c82836139eb565b90506000612cec85806101400190612c9a919061561a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050836129e490919063ffffffff16565b9050612cf88186610a42565b612d0757600192505050612e60565b6000612d11612a0b565b60050160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806060016040529081600082015481526020016001820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050600081602001519050600082604001519050612e586040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020018465ffffffffffff1681526020018365ffffffffffff16815250613a21565b955050505050505b92915050565b50565b60008114612f025760003373ffffffffffffffffffffffffffffffffffffffff16827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90604051612eb9906164a7565b600060405180830381858888f193505050503d8060008114612ef7576040519150601f19603f3d011682016040523d82523d6000602084013e612efc565b606091505b50509050505b50565b6000612f0f613654565b60010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663c3c5a547306040518263ffffffff1660e01b8152600401612f6e91906151db565b602060405180830381865afa158015612f8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612faf91906164e8565b61302a578073ffffffffffffffffffffffffffffffffffffffff166383a03f8c612fd7613654565b600201546040518263ffffffff1660e01b8152600401612ff79190614368565b600060405180830381600087803b15801561301157600080fd5b505af1158015613025573d6000803e3d6000fd5b505050505b50565b606060008473ffffffffffffffffffffffffffffffffffffffff1684846040516130579190616546565b60006040518083038185875af1925050503d8060008114613094576040519150601f19603f3d011682016040523d82523d6000602084013e613099565b606091505b508093508192505050806130af57815160208301fd5b509392505050565b6130c033610ec5565b6130ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f6906165a9565b60405180910390fd5b565b61310b8282613a69565b6000613115612030565b905060008173ffffffffffffffffffffffffffffffffffffffff163b11156132345781156131ba578073ffffffffffffffffffffffffffffffffffffffff16630b61e12b84613162613654565b600201546040518363ffffffff1660e01b81526004016131839291906165c9565b600060405180830381600087803b15801561319d57600080fd5b505af11580156131b1573d6000803e3d6000fd5b50505050613233565b8073ffffffffffffffffffffffffffffffffffffffff16639387a380846131df613654565b600201546040518363ffffffff1660e01b81526004016132009291906165c9565b600060405180830381600087803b15801561321a57600080fd5b505af115801561322e573d6000803e3d6000fd5b505050505b5b505050565b6000613261836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613b63565b905092915050565b6060600061327983600001613bd3565b905060608190508092505050919050565b60006132b2836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613c2f565b905092915050565b60006132c4612030565b905060008173ffffffffffffffffffffffffffffffffffffffff163b1115613371578073ffffffffffffffffffffffffffffffffffffffff16630b61e12b83600001602081019061331591906145cd565b61331d613654565b600201546040518363ffffffff1660e01b815260040161333e9291906165c9565b600060405180830381600087803b15801561335857600080fd5b505af115801561336c573d6000803e3d6000fd5b505050505b5050565b600061338033610ec5565b806133b657503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b905090565b60006133c56136e9565b60000180546133d39061600b565b80601f01602080910402602001604051908101604052809291908181526020018280546133ff9061600b565b801561344c5780601f106134215761010080835404028352916020019161344c565b820191906000526020600020905b81548152906001019060200180831161342f57829003601f168201915b505050505090508161345c6136e9565b600001908051906020019061347292919061404e565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a1681836040516134a49291906165f2565b60405180910390a15050565b60607f3fd4a1a1a267c84185e3b7eecd57c68783c0581d538b9d6e5f23e4670497c1e98260000160208101906134e691906145cd565b8360200160208101906134f991906159c4565b8480604001906135099190615ab3565b60405160200161351a9291906166b8565b6040516020818303038152906040528051906020012085606001358660800160208101906135489190615886565b8760a001602081019061355b9190615886565b8860c001602081019061356e9190615886565b8960e00160208101906135819190615886565b8a61010001356040516020016135a09a999897969594939291906166ef565b6040516020818303038152906040529050919050565b600061361e83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506136108680519060200120613d43565b6129e490919063ffffffff16565b90509392505050565b606061364c8383604051806060016040528060278152602001616b2c60279139613d5d565b905092915050565b6000807f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b54830060001b90508091505090565b600061368e612820565b905090565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082826040516020016136cb9291906167d5565b60405160208183030381529060405280519060200120905092915050565b60006136f3613e2a565b905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000838383463060405160200161377d959493929190616805565b6040516020818303038152906040528051906020012090509392505050565b6000806041835114156137de5760008060006020860151925060408601519150606086015160001a90506137d287828585613e5a565b945094505050506137e7565b60006002915091505b9250929050565b6000600481111561380257613801616858565b5b81600481111561381557613814616858565b5b141561382057613959565b6001600481111561383457613833616858565b5b81600481111561384757613846616858565b5b1415613888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161387f906168d3565b60405180910390fd5b6002600481111561389c5761389b616858565b5b8160048111156138af576138ae616858565b5b14156138f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138e79061693f565b60405180910390fd5b6003600481111561390457613903616858565b5b81600481111561391757613916616858565b5b1415613958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161394f906169d1565b60405180910390fd5b5b50565b6000807f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0060001b90508091505090565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b60008260000182815481106139d8576139d761567d565b5b9060005260206000200154905092915050565b60007f19457468657265756d205369676e6564204d6573736167653a0a33320000000060005281601c52603c6000209050919050565b600060d0826020015165ffffffffffff16901b60a0836040015165ffffffffffff16901b836000015173ffffffffffffffffffffffffffffffffffffffff1617179050919050565b80613a72612a0b565b60040160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015613af257613aec82613adb612a0b565b60000161323990919063ffffffff16565b50613b11565b613b0f82613afe612a0b565b60000161328a90919063ffffffff16565b505b8173ffffffffffffffffffffffffffffffffffffffff167f235bc17e7930760029e9f4d860a2a8089976de5b381cf8380fc11c1d88a1113382604051613b5791906141a5565b60405180910390a25050565b6000613b6f838361398c565b613bc8578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613bcd565b600090505b92915050565b606081600001805480602002602001604051908101604052809291908181526020018280548015613c2357602002820191906000526020600020905b815481526020019060010190808311613c0f575b50505050509050919050565b60008083600101600084815260200190815260200160002054905060008114613d37576000600182613c6191906169f1565b9050600060018660000180549050613c7991906169f1565b9050818114613ce8576000866000018281548110613c9a57613c9961567d565b5b9060005260206000200154905080876000018481548110613cbe57613cbd61567d565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480613cfc57613cfb616a25565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050613d3d565b60009150505b92915050565b6000613d56613d506128ca565b83613f3d565b9050919050565b6060613d6884613693565b613da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d9e90616ac6565b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1685604051613dcf9190616546565b600060405180830381855af49150503d8060008114613e0a576040519150601f19603f3d011682016040523d82523d6000602084013e613e0f565b606091505b5091509150613e1f828286613f7e565b925050509392505050565b6000807f4bc804ba64359c0e35e5ed5d90ee596ecaa49a3a930ddcb1470ea0dd625da90060001b90508091505090565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613e95576000600391509150613f34565b600060018787878760405160008152602001604052604051613eba9493929190616ae6565b6020604051602081039080840390855afa158015613edc573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613f2b57600060019250925050613f34565b80600092509250505b94509492505050565b60006040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b60608315613f8e57829050613fde565b600083511115613fa15782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fd591906152bf565b60405180910390fd5b9392505050565b6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081526020016000815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff1681525090565b82805461405a9061600b565b90600052602060002090601f01602090048101928261407c57600085556140c3565b82601f1061409557805160ff19168380011785556140c3565b828001600101855582156140c3579182015b828111156140c25782518255916020019190600101906140a7565b5b5090506140d091906140d4565b5090565b5b808211156140ed5760008160009055506001016140d5565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61413a81614105565b811461414557600080fd5b50565b60008135905061415781614131565b92915050565b600060208284031215614173576141726140fb565b5b600061418184828501614148565b91505092915050565b60008115159050919050565b61419f8161418a565b82525050565b60006020820190506141ba6000830184614196565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614213826141ca565b810181811067ffffffffffffffff82111715614232576142316141db565b5b80604052505050565b60006142456140f1565b9050614251828261420a565b919050565b600067ffffffffffffffff821115614271576142706141db565b5b61427a826141ca565b9050602081019050919050565b82818337600083830152505050565b60006142a96142a484614256565b61423b565b9050828152602081018484840111156142c5576142c46141c5565b5b6142d0848285614287565b509392505050565b600082601f8301126142ed576142ec6141c0565b5b81356142fd848260208601614296565b91505092915050565b60006020828403121561431c5761431b6140fb565b5b600082013567ffffffffffffffff81111561433a57614339614100565b5b614346848285016142d8565b91505092915050565b6000819050919050565b6143628161434f565b82525050565b600060208201905061437d6000830184614359565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006143ae82614383565b9050919050565b6143be816143a3565b81146143c957600080fd5b50565b6000813590506143db816143b5565b92915050565b6000819050919050565b6143f4816143e1565b81146143ff57600080fd5b50565b600081359050614411816143eb565b92915050565b60008060008060808587031215614431576144306140fb565b5b600061443f878288016143cc565b9450506020614450878288016143cc565b935050604061446187828801614402565b925050606085013567ffffffffffffffff81111561448257614481614100565b5b61448e878288016142d8565b91505092959194509250565b6144a381614105565b82525050565b60006020820190506144be600083018461449a565b92915050565b6144cd8161434f565b81146144d857600080fd5b50565b6000813590506144ea816144c4565b92915050565b60008060408385031215614507576145066140fb565b5b6000614515858286016144db565b925050602083013567ffffffffffffffff81111561453657614535614100565b5b614542858286016142d8565b9150509250929050565b600080fd5b600061016082840312156145685761456761454c565b5b81905092915050565b60008060408385031215614588576145876140fb565b5b6000614596858286016143cc565b925050602083013567ffffffffffffffff8111156145b7576145b6614100565b5b6145c385828601614551565b9150509250929050565b6000602082840312156145e3576145e26140fb565b5b60006145f1848285016143cc565b91505092915050565b600080600060608486031215614613576146126140fb565b5b600084013567ffffffffffffffff81111561463157614630614100565b5b61463d86828701614551565b935050602061464e868287016144db565b925050604061465f86828701614402565b9150509250925092565b614672816143e1565b82525050565b600060208201905061468d6000830184614669565b92915050565b600080fd5b600080fd5b60008083601f8401126146b3576146b26141c0565b5b8235905067ffffffffffffffff8111156146d0576146cf614693565b5b6020830191508360208202830111156146ec576146eb614698565b5b9250929050565b60008083601f840112614709576147086141c0565b5b8235905067ffffffffffffffff81111561472657614725614693565b5b60208301915083602082028301111561474257614741614698565b5b9250929050565b60008083601f84011261475f5761475e6141c0565b5b8235905067ffffffffffffffff81111561477c5761477b614693565b5b60208301915083602082028301111561479857614797614698565b5b9250929050565b600080600080600080606087890312156147bc576147bb6140fb565b5b600087013567ffffffffffffffff8111156147da576147d9614100565b5b6147e689828a0161469d565b9650965050602087013567ffffffffffffffff81111561480957614808614100565b5b61481589828a016146f3565b9450945050604087013567ffffffffffffffff81111561483857614837614100565b5b61484489828a01614749565b92509250509295509295509295565b600061485e82614383565b9050919050565b61486e81614853565b811461487957600080fd5b50565b60008135905061488b81614865565b92915050565b600080604083850312156148a8576148a76140fb565b5b60006148b68582860161487c565b92505060206148c785828601614402565b9150509250929050565b600061012082840312156148e8576148e761454c565b5b81905092915050565b60008083601f840112614907576149066141c0565b5b8235905067ffffffffffffffff81111561492457614923614693565b5b6020830191508360018202830111156149405761493f614698565b5b9250929050565b6000806000604084860312156149605761495f6140fb565b5b600084013567ffffffffffffffff81111561497e5761497d614100565b5b61498a868287016148d1565b935050602084013567ffffffffffffffff8111156149ab576149aa614100565b5b6149b7868287016148f1565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6149f8816143a3565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000614a3683836149ef565b60208301905092915050565b6000602082019050919050565b6000614a5a826149fe565b614a648185614a09565b9350614a6f83614a1a565b8060005b83811015614aa0578151614a878882614a2a565b9750614a9283614a42565b925050600181019050614a73565b5085935050505092915050565b614ab6816143e1565b82525050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614ae181614abc565b82525050565b600060a083016000830151614aff60008601826149ef565b5060208301518482036020860152614b178282614a4f565b9150506040830151614b2c6040860182614aad565b506060830151614b3f6060860182614ad8565b506080830151614b526080860182614ad8565b508091505092915050565b6000614b698383614ae7565b905092915050565b6000602082019050919050565b6000614b89826149c3565b614b9381856149ce565b935083602082028501614ba5856149df565b8060005b85811015614be15784840389528151614bc28582614b5d565b9450614bcd83614b71565b925060208a01995050600181019050614ba9565b50829750879550505050505092915050565b60006020820190508181036000830152614c0d8184614b7e565b905092915050565b600067ffffffffffffffff821115614c3057614c2f6141db565b5b614c39826141ca565b9050602081019050919050565b6000614c59614c5484614c15565b61423b565b905082815260208101848484011115614c7557614c746141c5565b5b614c80848285614287565b509392505050565b600082601f830112614c9d57614c9c6141c0565b5b8135614cad848260208601614c46565b91505092915050565b600060208284031215614ccc57614ccb6140fb565b5b600082013567ffffffffffffffff811115614cea57614ce9614100565b5b614cf684828501614c88565b91505092915050565b614d08816143a3565b82525050565b6000604082019050614d236000830185614196565b614d306020830184614cff565b9392505050565b60008060208385031215614d4e57614d4d6140fb565b5b600083013567ffffffffffffffff811115614d6c57614d6b614100565b5b614d7885828601614749565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614dea578082015181840152602081019050614dcf565b83811115614df9576000848401525b50505050565b6000614e0a82614db0565b614e148185614dbb565b9350614e24818560208601614dcc565b614e2d816141ca565b840191505092915050565b6000614e448383614dff565b905092915050565b6000602082019050919050565b6000614e6482614d84565b614e6e8185614d8f565b935083602082028501614e8085614da0565b8060005b85811015614ebc5784840389528151614e9d8582614e38565b9450614ea883614e4c565b925060208a01995050600181019050614e84565b50829750879550505050505092915050565b60006020820190508181036000830152614ee88184614e59565b905092915050565b6000819050919050565b6000614f15614f10614f0b84614383565b614ef0565b614383565b9050919050565b6000614f2782614efa565b9050919050565b6000614f3982614f1c565b9050919050565b614f4981614f2e565b82525050565b6000602082019050614f646000830184614f40565b92915050565b60008060008060608587031215614f8457614f836140fb565b5b6000614f92878288016143cc565b9450506020614fa387828801614402565b935050604085013567ffffffffffffffff811115614fc457614fc3614100565b5b614fd0878288016148f1565b925092505092959194509250565b6000614fe9826143a3565b9050919050565b614ff981614fde565b811461500457600080fd5b50565b60008135905061501681614ff0565b92915050565b600060208284031215615032576150316140fb565b5b600061504084828501615007565b91505092915050565b600067ffffffffffffffff821115615064576150636141db565b5b602082029050602081019050919050565b600061508861508384615049565b61423b565b905080838252602082019050602084028301858111156150ab576150aa614698565b5b835b818110156150d457806150c08882614402565b8452602084019350506020810190506150ad565b5050509392505050565b600082601f8301126150f3576150f26141c0565b5b8135615103848260208601615075565b91505092915050565b600080600080600060a08688031215615128576151276140fb565b5b6000615136888289016143cc565b9550506020615147888289016143cc565b945050604086013567ffffffffffffffff81111561516857615167614100565b5b615174888289016150de565b935050606086013567ffffffffffffffff81111561519557615194614100565b5b6151a1888289016150de565b925050608086013567ffffffffffffffff8111156151c2576151c1614100565b5b6151ce888289016142d8565b9150509295509295909350565b60006020820190506151f06000830184614cff565b92915050565b600080600080606085870312156152105761520f6140fb565b5b600061521e878288016143cc565b945050602061522f878288016143cc565b935050604085013567ffffffffffffffff8111156152505761524f614100565b5b61525c878288016148f1565b925092505092959194509250565b600081519050919050565b600082825260208201905092915050565b60006152918261526a565b61529b8185615275565b93506152ab818560208601614dcc565b6152b4816141ca565b840191505092915050565b600060208201905081810360008301526152d98184615286565b905092915050565b600082825260208201905092915050565b60006152fd826149fe565b61530781856152e1565b935061531283614a1a565b8060005b8381101561534357815161532a8882614a2a565b975061533583614a42565b925050600181019050615316565b5085935050505092915050565b6000602082019050818103600083015261536a81846152f2565b905092915050565b600060a08301600083015161538a60008601826149ef565b50602083015184820360208601526153a28282614a4f565b91505060408301516153b76040860182614aad565b5060608301516153ca6060860182614ad8565b5060808301516153dd6080860182614ad8565b508091505092915050565b600060208201905081810360008301526154028184615372565b905092915050565b600080600080600060a08688031215615426576154256140fb565b5b6000615434888289016143cc565b9550506020615445888289016143cc565b945050604061545688828901614402565b935050606061546788828901614402565b925050608086013567ffffffffffffffff81111561548857615487614100565b5b615494888289016142d8565b9150509295509295909350565b60006040820190506154b66000830185614359565b6154c36020830184614359565b9392505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061550b6002836154ca565b9150615516826154d5565b600282019050919050565b6000819050919050565b61553c6155378261434f565b615521565b82525050565b600061554d826154fe565b9150615559828561552b565b602082019150615569828461552b565b6020820191508190509392505050565b7f4163636f756e743a2063616c6c6572206e6f7420617070726f7665642074617260008201527f6765742e00000000000000000000000000000000000000000000000000000000602082015250565b60006155d5602483615275565b91506155e082615579565b604082019050919050565b60006020820190508181036000830152615604816155c8565b9050919050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126156375761563661560b565b5b80840192508235915067ffffffffffffffff82111561565957615658615610565b5b60208301925060018202360383131561567557615674615615565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006156e6826143e1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615719576157186156ac565b5b600182019050919050565b7f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e7460008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000615780602183615275565b915061578b82615724565b604082019050919050565b600060208201905081810360008301526157af81615773565b9050919050565b7f4163636f756e743a2077726f6e67206172726179206c656e677468732e000000600082015250565b60006157ec601d83615275565b91506157f7826157b6565b602082019050919050565b6000602082019050818103600083015261581b816157df565b9050919050565b61582b81614853565b82525050565b60006040820190506158466000830185615822565b6158536020830184614669565b9392505050565b61586381614abc565b811461586e57600080fd5b50565b6000813590506158808161585a565b92915050565b60006020828403121561589c5761589b6140fb565b5b60006158aa84828501615871565b91505092915050565b7f21706572696f6400000000000000000000000000000000000000000000000000600082015250565b60006158e9600783615275565b91506158f4826158b3565b602082019050919050565b60006020820190508181036000830152615918816158dc565b9050919050565b7f2173696700000000000000000000000000000000000000000000000000000000600082015250565b6000615955600483615275565b91506159608261591f565b602082019050919050565b6000602082019050818103600083015261598481615948565b9050919050565b600060ff82169050919050565b6159a18161598b565b81146159ac57600080fd5b50565b6000813590506159be81615998565b92915050565b6000602082840312156159da576159d96140fb565b5b60006159e8848285016159af565b91505092915050565b7f61646d696e000000000000000000000000000000000000000000000000000000600082015250565b6000615a27600583615275565b9150615a32826159f1565b602082019050919050565b60006020820190508181036000830152615a5681615a1a565b9050919050565b6000615a68826143e1565b9150615a73836143e1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615aa857615aa76156ac565b5b828201905092915050565b60008083356001602003843603038112615ad057615acf61560b565b5b80840192508235915067ffffffffffffffff821115615af257615af1615610565b5b602083019250602082023603831315615b0e57615b0d615615565b5b509250929050565b6000615b2560208401846143cc565b905092915050565b6000615b3c60208401846159af565b905092915050565b615b4d8161598b565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112615b7f57615b7e615b5d565b5b83810192508235915060208301925067ffffffffffffffff821115615ba757615ba6615b53565b5b602082023603841315615bbd57615bbc615b58565b5b509250929050565b6000819050919050565b6000602082019050919050565b6000615be88385614a09565b9350615bf382615bc5565b8060005b85811015615c2c57615c098284615b16565b615c138882614a2a565b9750615c1e83615bcf565b925050600181019050615bf7565b5085925050509392505050565b6000615c486020840184614402565b905092915050565b6000615c5f6020840184615871565b905092915050565b6000615c7660208401846144db565b905092915050565b615c878161434f565b82525050565b60006101208301615ca16000840184615b16565b615cae60008601826149ef565b50615cbc6020840184615b2d565b615cc96020860182615b44565b50615cd76040840184615b62565b8583036040870152615cea838284615bdc565b92505050615cfb6060840184615c39565b615d086060860182614aad565b50615d166080840184615c50565b615d236080860182614ad8565b50615d3160a0840184615c50565b615d3e60a0860182614ad8565b50615d4c60c0840184615c50565b615d5960c0860182614ad8565b50615d6760e0840184615c50565b615d7460e0860182614ad8565b50615d83610100840184615c67565b615d91610100860182615c7e565b508091505092915050565b60006020820190508181036000830152615db68184615c8d565b905092915050565b7f4e6f7420617574686f72697a6564000000000000000000000000000000000000600082015250565b6000615df4600e83615275565b9150615dff82615dbe565b602082019050919050565b60006020820190508181036000830152615e2381615de7565b9050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b6000615e86602e83615275565b9150615e9182615e2a565b604082019050919050565b60006020820190508181036000830152615eb581615e79565b9050919050565b6000819050919050565b6000615ee1615edc615ed784615ebc565b614ef0565b61598b565b9050919050565b615ef181615ec6565b82525050565b6000602082019050615f0c6000830184615ee8565b92915050565b6000819050919050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b6000615f5b615f56615f5184615f12565b614ef0565b615f1c565b9050919050565b615f6b81615f40565b82525050565b6000604082019050615f866000830185614cff565b615f936020830184615f62565b9392505050565b600081519050615fa9816143eb565b92915050565b600060208284031215615fc557615fc46140fb565b5b6000615fd384828501615f9a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061602357607f821691505b6020821081141561603757616036615fdc565b5b50919050565b7f2144617461000000000000000000000000000000000000000000000000000000600082015250565b6000616073600583615275565b915061607e8261603d565b602082019050919050565b600060208201905081810360008301526160a281616066565b9050919050565b600080fd5b600080fd5b600080858511156160c7576160c66160a9565b5b838611156160d8576160d76160ae565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b600061611283836160ee565b8261611d8135614105565b9250600482101561615d576161587fffffffff00000000000000000000000000000000000000000000000000000000836004036008026160f9565b831692505b505092915050565b60006020828403121561617b5761617a6140fb565b5b60006161898482850161487c565b91505092915050565b6000602082840312156161a8576161a76140fb565b5b60006161b684828501614402565b91505092915050565b600067ffffffffffffffff8211156161da576161d96141db565b5b602082029050602081019050919050565b60006161fe6161f9846161bf565b61423b565b9050808382526020820190506020840283018581111561622157616220614698565b5b835b8181101561624a578061623688826143cc565b845260208401935050602081019050616223565b5050509392505050565b600082601f830112616269576162686141c0565b5b81356162798482602086016161eb565b91505092915050565b600067ffffffffffffffff82111561629d5761629c6141db565b5b602082029050602081019050919050565b60006162c16162bc84616282565b61423b565b905080838252602082019050602084028301858111156162e4576162e3614698565b5b835b8181101561632b57803567ffffffffffffffff811115616309576163086141c0565b5b80860161631689826142d8565b855260208501945050506020810190506162e6565b5050509392505050565b600082601f83011261634a576163496141c0565b5b813561635a8482602086016162ae565b91505092915050565b60008060006060848603121561637c5761637b6140fb565b5b600084013567ffffffffffffffff81111561639a57616399614100565b5b6163a686828701616254565b935050602084013567ffffffffffffffff8111156163c7576163c6614100565b5b6163d3868287016150de565b925050604084013567ffffffffffffffff8111156163f4576163f3614100565b5b61640086828701616335565b9150509250925092565b7f6163636f756e743a206e6f742066726f6d20456e747279506f696e7400000000600082015250565b6000616440601c83615275565b915061644b8261640a565b602082019050919050565b6000602082019050818103600083015261646f81616433565b9050919050565b600081905092915050565b50565b6000616491600083616476565b915061649c82616481565b600082019050919050565b60006164b282616484565b9150819050919050565b6164c58161418a565b81146164d057600080fd5b50565b6000815190506164e2816164bc565b92915050565b6000602082840312156164fe576164fd6140fb565b5b600061650c848285016164d3565b91505092915050565b600061652082614db0565b61652a8185616476565b935061653a818560208601614dcc565b80840191505092915050565b60006165528284616515565b915081905092915050565b7f2161646d696e0000000000000000000000000000000000000000000000000000600082015250565b6000616593600683615275565b915061659e8261655d565b602082019050919050565b600060208201905081810360008301526165c281616586565b9050919050565b60006040820190506165de6000830185614cff565b6165eb6020830184614359565b9392505050565b6000604082019050818103600083015261660c8185615286565b905081810360208301526166208184615286565b90509392505050565b600081905092915050565b61663d816143a3565b82525050565b600061664f8383616634565b60208301905092915050565b60006166678385616629565b935061667282615bc5565b8060005b858110156166ab576166888284615b16565b6166928882616643565b975061669d83615bcf565b925050600181019050616676565b5085925050509392505050565b60006166c582848661665b565b91508190509392505050565b6166da8161598b565b82525050565b6166e981614abc565b82525050565b600061014082019050616705600083018d614359565b616712602083018c614cff565b61671f604083018b6166d1565b61672c606083018a614359565b6167396080830189614669565b61674660a08301886166e0565b61675360c08301876166e0565b61676060e08301866166e0565b61676e6101008301856166e0565b61677c610120830184614359565b9b9a5050505050505050505050565b600082825260208201905092915050565b60006167a782614db0565b6167b1818561678b565b93506167c1818560208601614dcc565b6167ca816141ca565b840191505092915050565b60006040820190506167ea6000830185614cff565b81810360208301526167fc818461679c565b90509392505050565b600060a08201905061681a6000830188614359565b6168276020830187614359565b6168346040830186614359565b6168416060830185614669565b61684e6080830184614cff565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006168bd601883615275565b91506168c882616887565b602082019050919050565b600060208201905081810360008301526168ec816168b0565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000616929601f83615275565b9150616934826168f3565b602082019050919050565b600060208201905081810360008301526169588161691c565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006169bb602283615275565b91506169c68261695f565b604082019050919050565b600060208201905081810360008301526169ea816169ae565b9050919050565b60006169fc826143e1565b9150616a07836143e1565b925082821015616a1a57616a196156ac565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60008201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b6000616ab0602683615275565b9150616abb82616a54565b604082019050919050565b60006020820190508181036000830152616adf81616aa3565b9050919050565b6000608082019050616afb6000830187614359565b616b0860208301866166d1565b616b156040830185614359565b616b226060830184614359565b9594505050505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c01f45986875a650052d69ddb710a441ce161ad5c7fe9d20f876664fcbe181a564736f6c634300080c0033"; +bytes constant THIRDWEB_ACCOUNT_FACTORY_BYTECODE = hex"608060405234801561001057600080fd5b50600436106101285760003560e01c806308e93d0a1461012d5780630b61e12b1461014b5780630e6254fd1461016057806311464fbe14610173578063248a9ca3146101b25780632f2ff15d146101d357806336568abe146101e657806358451f97146101f957806383a03f8c146102015780638878ed33146102145780639010d07c1461022757806391d148541461023a5780639387a3801461025d578063938e3d7b14610270578063a217fddf14610283578063a32fa5b31461028b578063a65d69d41461029e578063ac9650d8146102c5578063c3c5a547146102e5578063ca15c873146102f8578063d547741f1461030b578063d8fd8f441461031e578063e68a7c3b14610331578063e8a3d48514610344575b600080fd5b610135610359565b6040516101429190611978565b60405180910390f35b61015e6101593660046119e1565b61036a565b005b61013561016e366004611a0b565b61040b565b61019a7f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac81565b6040516001600160a01b039091168152602001610142565b6101c56101c0366004611a26565b610435565b604051908152602001610142565b61015e6101e1366004611a3f565b610453565b61015e6101f4366004611a3f565b6104fd565b6101c561055c565b61015e61020f366004611a26565b610568565b61019a610222366004611a6b565b6105b6565b61019a610235366004611aed565b610630565b61024d610248366004611a3f565b61073f565b6040519015158152602001610142565b61015e61026b3660046119e1565b610773565b61015e61027e366004611b25565b61080a565b6101c5600081565b61024d610299366004611a3f565b61085b565b61019a7f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d278981565b6102d86102d3366004611bd5565b6108be565b6040516101429190611ca1565b61024d6102f3366004611a0b565b6109b2565b6101c5610306366004611a26565b6109be565b61015e610319366004611a3f565b610a5b565b61019a61032c366004611a6b565b610a66565b61013561033f366004611aed565b610bb1565b61034c610ce2565b6040516101429190611d03565b60606103656000610e69565b905090565b336103758183610e76565b61039a5760405162461bcd60e51b815260040161039190611d16565b60405180910390fd5b6001600160a01b03831660009081526002602052604081206103bc9083610eba565b9050801561040557836001600160a01b0316826001600160a01b03167f12146497b3b826918ec47f0cac7272a09ed06b30c16c030e99ec48ff5dd60b4760405160405180910390a35b50505050565b6001600160a01b038116600090815260026020526040902060609061042f90610e69565b92915050565b600061043f610ecf565b600092835260010160205250604090205490565b61047761045e610ecf565b6000848152600191909101602052604090205433610ed9565b61047f610ecf565b6000838152602091825260408082206001600160a01b0385168352909252205460ff16156104ef5760405162461bcd60e51b815260206004820152601d60248201527f43616e206f6e6c79206772616e7420746f206e6f6e20686f6c646572730000006044820152606401610391565b6104f98282610f5e565b5050565b336001600160a01b038216146105525760405162461bcd60e51b815260206004820152601a60248201527921b0b71037b7363c903932b737bab731b2903337b91039b2b63360311b6044820152606401610391565b6104f98282610f72565b60006103656000610f86565b336105738183610e76565b61058f5760405162461bcd60e51b815260040161039190611d16565b61059a600082610eba565b6104f95760405162461bcd60e51b815260040161039190611d4d565b6000806105f98585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610f9092505050565b90506106257f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac82610fc3565b9150505b9392505050565b60008061063b611023565b600085815260209190915260408120549150805b82811015610736576000610661611023565b60008881526020918252604080822085835260010190925220546001600160a01b0316146106da57848214156106c857610699611023565b600087815260209182526040808220938252600190930190915220546001600160a01b0316925061042f915050565b6106d3600183611dad565b9150610724565b6106e586600061073f565b801561071157506106f4611023565b600087815260209182526040808220828052600201909252205481145b1561072457610721600183611dad565b91505b61072f600182611dad565b905061064f565b50505092915050565b6000610749610ecf565b6000938452602090815260408085206001600160a01b039490941685529290525090205460ff1690565b3361077e8183610e76565b61079a5760405162461bcd60e51b815260040161039190611d16565b6001600160a01b03831660009081526002602052604081206107bc908361102d565b9050801561040557836001600160a01b0316826001600160a01b03167f98d1ebbe00ae92a5de96a0f49742a8afa89f42363592bc2e7cfaaed68b45e7a660405160405180910390a350505050565b610812611042565b61084f5760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b6044820152606401610391565b6108588161104e565b50565b6000610865610ecf565b600084815260209182526040808220828052909252205460ff166108b55761088b610ecf565b6000848152602091825260408082206001600160a01b0386168352909252205460ff16905061042f565b50600192915050565b6060816001600160401b038111156108d8576108d8611b0f565b60405190808252806020026020018201604052801561090b57816020015b60608152602001906001900390816108f65790505b50905060005b828110156109ab5761097b3085858481811061092f5761092f611dc5565b90506020028101906109419190611ddb565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061113992505050565b82828151811061098d5761098d611dc5565b602002602001018190525080806109a390611e28565b915050610911565b5092915050565b600061042f818361115e565b6000806109c9611023565b6000848152602091909152604081205491505b81811015610a365760006109ee611023565b60008681526020918252604080822085835260010190925220546001600160a01b031614610a2457610a21600184611dad565b92505b610a2f600182611dad565b90506109dc565b50610a4283600061073f565b15610a5557610a52600183611dad565b91505b50919050565b61055261045e610ecf565b6000807f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac90506000610ace8686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610f9092505050565b90506000610adc8383610fc3565b90506001600160a01b0381163b15610af8579250610629915050565b610b028383611180565b9050336001600160a01b037f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d27891614610b5b57610b3f600082610eba565b610b5b5760405162461bcd60e51b815260040161039190611d4d565b610b6781888888611217565b866001600160a01b0316816001600160a01b03167fac631f3001b55ea1509cf3d7e74898f85392a61a76e8149181ae1259622dabc860405160405180910390a39695505050505050565b60608183108015610bcb5750610bc76000610f86565b8211155b610c235760405162461bcd60e51b815260206004820152602360248201527f426173654163636f756e74466163746f72793a20696e76616c696420696e646960448201526263657360e81b6064820152608401610391565b6000610c2f8484611e43565b9050610c3b8484611e43565b6001600160401b03811115610c5257610c52611b0f565b604051908082528060200260200182016040528015610c7b578160200160208202803683370190505b50915060005b81811015610cda57610c9e610c968683611dad565b60009061127f565b838281518110610cb057610cb0611dc5565b6001600160a01b0390921660209283029190910190910152610cd3600182611dad565b9050610c81565b505092915050565b6060610cec61128b565b8054610cf790611e5a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2390611e5a565b8015610d705780601f10610d4557610100808354040283529160200191610d70565b820191906000526020600020905b815481529060010190602001808311610d5357829003601f168201915b5050505050905090565b6001610d84610ecf565b6000848152602091825260408082206001600160a01b0386168084529352808220805460ff1916941515949094179093559151339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b7f0a7b0f5c59907924802379ebe98cdc23e2ee7820f63d30126e10b3752010e50090565b60008060ff19610e3860017f0c4ba382c0009cf238e4c1ca1a52f51c61e6248a70bdfb34e5ed49d5578a5c0c611e43565b604051602001610e4a91815260200190565b60408051601f1981840301815291905280516020909101201692915050565b60606000610629836112af565b600080610ea37f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac84610fc3565b6001600160a01b0385811691161491505092915050565b6000610629836001600160a01b03841661130b565b6000610365610de3565b610ee1610ecf565b6000838152602091825260408082206001600160a01b0385168352909252205460ff166104f957610f1c816001600160a01b0316601461135a565b610f2783602061135a565b604051602001610f38929190611e8f565b60408051601f198184030181529082905262461bcd60e51b825261039191600401611d03565b610f688282610d7a565b6104f982826114f5565b610f7c82826115b4565b6104f9828261161d565b600061042f825490565b60008282604051602001610fa5929190611efc565b60405160208183030381529060405280519060200120905092915050565b6040513060388201526f5af43d82803e903d91602b57fd5bf3ff602482015260148101839052733d602d80600a3d3981f3363d3d373d3d3d363d738152605881018290526037600c82012060788201526055604390910120600090610629565b6000610365610e07565b6000610629836001600160a01b0384166116ac565b6000610365813361073f565b600061105861128b565b805461106390611e5a565b80601f016020809104026020016040519081016040528092919081815260200182805461108f90611e5a565b80156110dc5780601f106110b1576101008083540402835291602001916110dc565b820191906000526020600020905b8154815290600101906020018083116110bf57829003601f168201915b50505050509050816110ec61128b565b81516110fb92602001906118df565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a16818360405161112d929190611f28565b60405180910390a15050565b60606106298383604051806060016040528060278152602001611ff66027913961179f565b6001600160a01b03811660009081526001830160205260408120541515610629565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b03811661042f5760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b6044820152606401610391565b60405163347d5e2560e21b81526001600160a01b0385169063d1f578949061124790869086908690600401611f4d565b600060405180830381600087803b15801561126157600080fd5b505af1158015611275573d6000803e3d6000fd5b5050505050505050565b6000610629838361187c565b7f4bc804ba64359c0e35e5ed5d90ee596ecaa49a3a930ddcb1470ea0dd625da90090565b6060816000018054806020026020016040519081016040528092919081815260200182805480156112ff57602002820191906000526020600020905b8154815260200190600101908083116112eb575b50505050509050919050565b60008181526001830160205260408120546113525750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561042f565b50600061042f565b60606000611369836002611f8d565b611374906002611dad565b6001600160401b0381111561138b5761138b611b0f565b6040519080825280601f01601f1916602001820160405280156113b5576020820181803683370190505b509050600360fc1b816000815181106113d0576113d0611dc5565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106113ff576113ff611dc5565b60200101906001600160f81b031916908160001a9053506000611423846002611f8d565b61142e906001611dad565b90505b60018111156114a6576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061146257611462611dc5565b1a60f81b82828151811061147857611478611dc5565b60200101906001600160f81b031916908160001a90535060049490941c9361149f81611fac565b9050611431565b5083156106295760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610391565b60006114ff611023565b600084815260209190915260409020549050600161151b611023565b600085815260209190915260408120805490919061153a908490611dad565b90915550829050611549611023565b6000858152602091825260408082208583526001019092522080546001600160a01b0319166001600160a01b039290921691909117905580611589611023565b6000948552602090815260408086206001600160a01b03909516865260029094019052919092205550565b6115be8282610ed9565b6115c6610ecf565b6000838152602091825260408082206001600160a01b0385168084529352808220805460ff191690555133929185917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000611627611023565b6000848152602091825260408082206001600160a01b038616835260020190925220549050611654611023565b6000848152602091825260408082208483526001019092522080546001600160a01b0319169055611683611023565b6000938452602090815260408085206001600160a01b0390941685526002909301905250812055565b600081815260018301602052604081205480156117955760006116d0600183611e43565b85549091506000906116e490600190611e43565b905081811461174957600086600001828154811061170457611704611dc5565b906000526020600020015490508087600001848154811061172757611727611dc5565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061175a5761175a611fc3565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061042f565b600091505061042f565b60606001600160a01b0384163b6118075760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610391565b600080856001600160a01b0316856040516118229190611fd9565b600060405180830381855af49150503d806000811461185d576040519150601f19603f3d011682016040523d82523d6000602084013e611862565b606091505b50915091506118728282866118a6565b9695505050505050565b600082600001828154811061189357611893611dc5565b9060005260206000200154905092915050565b606083156118b5575081610629565b8251156118c55782518084602001fd5b8160405162461bcd60e51b81526004016103919190611d03565b8280546118eb90611e5a565b90600052602060002090601f01602090048101928261190d5760008555611953565b82601f1061192657805160ff1916838001178555611953565b82800160010185558215611953579182015b82811115611953578251825591602001919060010190611938565b5061195f929150611963565b5090565b5b8082111561195f5760008155600101611964565b6020808252825182820181905260009190848201906040850190845b818110156119b95783516001600160a01b031683529284019291840191600101611994565b50909695505050505050565b80356001600160a01b03811681146119dc57600080fd5b919050565b600080604083850312156119f457600080fd5b6119fd836119c5565b946020939093013593505050565b600060208284031215611a1d57600080fd5b610629826119c5565b600060208284031215611a3857600080fd5b5035919050565b60008060408385031215611a5257600080fd5b82359150611a62602084016119c5565b90509250929050565b600080600060408486031215611a8057600080fd5b611a89846119c5565b925060208401356001600160401b0380821115611aa557600080fd5b818601915086601f830112611ab957600080fd5b813581811115611ac857600080fd5b876020828501011115611ada57600080fd5b6020830194508093505050509250925092565b60008060408385031215611b0057600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600060208284031215611b3757600080fd5b81356001600160401b0380821115611b4e57600080fd5b818401915084601f830112611b6257600080fd5b813581811115611b7457611b74611b0f565b604051601f8201601f19908116603f01168101908382118183101715611b9c57611b9c611b0f565b81604052828152876020848701011115611bb557600080fd5b826020860160208301376000928101602001929092525095945050505050565b60008060208385031215611be857600080fd5b82356001600160401b0380821115611bff57600080fd5b818501915085601f830112611c1357600080fd5b813581811115611c2257600080fd5b8660208260051b8501011115611c3757600080fd5b60209290920196919550909350505050565b60005b83811015611c64578181015183820152602001611c4c565b838111156104055750506000910152565b60008151808452611c8d816020860160208601611c49565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611cf657603f19888603018452611ce4858351611c75565b94509285019290850190600101611cc8565b5092979650505050505050565b6020815260006106296020830184611c75565b6020808252601f908201527f4163636f756e74466163746f72793a206e6f7420616e206163636f756e742e00604082015260600190565b6020808252602a908201527f4163636f756e74466163746f72793a206163636f756e7420616c7265616479206040820152691c9959da5cdd195c995960b21b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611dc057611dc0611d97565b500190565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112611df257600080fd5b8301803591506001600160401b03821115611e0c57600080fd5b602001915036819003821315611e2157600080fd5b9250929050565b6000600019821415611e3c57611e3c611d97565b5060010190565b600082821015611e5557611e55611d97565b500390565b600181811c90821680611e6e57607f821691505b60208210811415610a5557634e487b7160e01b600052602260045260246000fd5b7402832b936b4b9b9b4b7b7399d1030b1b1b7bab73a1605d1b815260008351611ebf816015850160208801611c49565b7001034b99036b4b9b9b4b733903937b6329607d1b6015918401918201528351611ef0816026840160208801611c49565b01602601949350505050565b6001600160a01b0383168152604060208201819052600090611f2090830184611c75565b949350505050565b604081526000611f3b6040830185611c75565b82810360208401526106258185611c75565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6000816000190483118215151615611fa757611fa7611d97565b500290565b600081611fbb57611fbb611d97565b506000190190565b634e487b7160e01b600052603160045260246000fd5b60008251611feb818460208701611c49565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122017bb07e4fe26b99c2b76162ca9bbb9f67afe5c605b8706dca5213da06f4e0a7964736f6c634300080c0033"; +bytes constant THIRDWEB_ACCOUNT_IMPL_BYTECODE = hex"6080604052600436106101405760003560e01c806301ffc9a71461014c578063150b7a02146101815780631626ba7e146101c55780631dd756c5146101e557806324d7806c146102055780633a871cdd1461022557806347e1da2a146102535780634a58db19146102755780634d44560d1461027d5780635892e2361461029d5780637dff5a79146102bd5780638b52d723146102dd578063938e3d7b146102ff578063a9082d841461031f578063ac9650d81461035e578063b0d691fe1461038b578063b61d27f6146103ad578063b76464d5146103cd578063bc197c81146103ed578063c45a015514610419578063d087d2881461044d578063d1f5789414610462578063d42f2f3514610482578063e8a3d48514610497578063e9523c97146104b9578063f15d424e146104db578063f23a6e611461050857600080fd5b3661014757005b600080fd5b34801561015857600080fd5b5061016c610167366004612cee565b610534565b60405190151581526020015b60405180910390f35b34801561018d57600080fd5b506101ac61019c366004612dfa565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610178565b3480156101d157600080fd5b506101ac6101e0366004612e65565b61057a565b3480156101f157600080fd5b5061016c610200366004612ec4565b610689565b34801561021157600080fd5b5061016c610220366004612f09565b610963565b34801561023157600080fd5b50610245610240366004612f26565b610992565b604051908152602001610178565b34801561025f57600080fd5b5061027361026e366004612fb7565b6109b8565b005b610273610b29565b34801561028957600080fd5b50610273610298366004613050565b610b91565b3480156102a957600080fd5b506102736102b83660046130bd565b610c04565b3480156102c957600080fd5b5061016c6102d8366004612f09565b610fc1565b3480156102e957600080fd5b506102f261107a565b60405161017891906131d0565b34801561030b57600080fd5b5061027361031a366004613232565b6112c1565b34801561032b57600080fd5b5061033f61033a3660046130bd565b611312565b6040805192151583526001600160a01b03909116602083015201610178565b34801561036a57600080fd5b5061037e61037936600461327a565b611369565b6040516101789190613317565b34801561039757600080fd5b506103a061145d565b604051610178919061336c565b3480156103b957600080fd5b506102736103c8366004613380565b6114a6565b3480156103d957600080fd5b506102736103e8366004612f09565b611536565b3480156103f957600080fd5b506101ac610408366004613469565b63bc197c8160e01b95945050505050565b34801561042557600080fd5b506103a07f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b81565b34801561045957600080fd5b50610245611568565b34801561046e57600080fd5b5061027361047d366004613516565b6115e8565b34801561048e57600080fd5b506102f26117a0565b3480156104a357600080fd5b506104ac611911565b604051610178919061355d565b3480156104c557600080fd5b506104ce6119a9565b6040516101789190613570565b3480156104e757600080fd5b506104fb6104f6366004612f09565b6119bb565b60405161017891906135bd565b34801561051457600080fd5b506101ac6105233660046135d0565b63f23a6e6160e01b95945050505050565b60006001600160e01b03198216630271189760e51b148061056557506001600160e01b03198216630a85bd0160e11b145b80610574575061057482611ab7565b92915050565b6000806105878484611aec565b905061059281610963565b156105a75750630b135d3f60e11b9050610574565b3360006105b2611b10565b6001600160a01b03841660009081526006919091016020526040902090506105da8183611b34565b8061060a57506105e981611b56565b600114801561060a575060006105ff8282611b60565b6001600160a01b0316145b6106675760405162461bcd60e51b8152602060048201526024808201527f4163636f756e743a2063616c6c6572206e6f7420617070726f7665642074617260448201526333b2ba1760e11b60648201526084015b60405180910390fd5b61067083610fc1565b1561068057630b135d3f60e11b93505b50505092915050565b6000610693611b10565b6001600160a01b0384166000908152600491909101602052604090205460ff16156106c057506001610574565b60006106ca611b10565b6001600160a01b0385166000908152600591909101602090815260408083208151606081018352815481526001909101546001600160801b0380821694830194909452600160801b9004909216908201529150610725611b10565b6006016000866001600160a01b03166001600160a01b0316815260200190815260200160002090504282602001516001600160801b03161180610775575081604001516001600160801b03164210155b80610786575061078481611b56565b155b1561079657600092505050610574565b60006107ad6107a86060870187613638565b611b6c565b905060006107ba83611b56565b60011480156107db575060006107d08482611b60565b6001600160a01b0316145b90506001600160e01b03198216635b0e93fb60e11b14156108535760008061080e61080960608a018a613638565b611ba6565b9150915082610834576108218583611b34565b6108345760009650505050505050610574565b855181111561084c5760009650505050505050610574565b5050610956565b6001600160e01b031982166323f0ed1560e11b14156109495760008061088461087f60608a018a613638565b611c0b565b5091509150826108ee5760005b82518110156108ec576108c68382815181106108af576108af61367e565b602002602001015187611b3490919063ffffffff16565b6108da576000975050505050505050610574565b806108e4816136aa565b915050610891565b505b60005b82518110156109415781818151811061090c5761090c61367e565b60200260200101518760000151101561092f576000975050505050505050610574565b80610939816136aa565b9150506108f1565b505050610956565b6000945050505050610574565b5060019695505050505050565b600061096d611b10565b6001600160a01b03909216600090815260049290920160205250604090205460ff1690565b600061099c611c58565b6109a68484611cc1565b90506109b182611e06565b9392505050565b6109c061145d565b6001600160a01b0316336001600160a01b031614806109e357506109e333610963565b6109ff5760405162461bcd60e51b815260040161065e906136c5565b610a07611e53565b8481148015610a1557508483145b610a615760405162461bcd60e51b815260206004820152601d60248201527f4163636f756e743a2077726f6e67206172726179206c656e677468732e000000604482015260640161065e565b60005b85811015610b2057610b0d878783818110610a8157610a8161367e565b9050602002016020810190610a969190612f09565b868684818110610aa857610aa861367e565b90506020020135858585818110610ac157610ac161367e565b9050602002810190610ad39190613638565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f3992505050565b5080610b18816136aa565b915050610a64565b50505050505050565b610b3161145d565b6001600160a01b031663b760faf934306040518363ffffffff1660e01b8152600401610b5d919061336c565b6000604051808303818588803b158015610b7657600080fd5b505af1158015610b8a573d6000803e3d6000fd5b5050505050565b610b99611faa565b610ba161145d565b6001600160a01b031663205c287883836040518363ffffffff1660e01b8152600401610bce929190613706565b600060405180830381600087803b158015610be857600080fd5b505af1158015610bfc573d6000803e3d6000fd5b505050505050565b6000610c136020850185612f09565b905042610c2660e0860160c08701613736565b6001600160801b031611158015610c555750610c49610100850160e08601613736565b6001600160801b031642105b610c8b5760405162461bcd60e51b8152602060048201526007602482015266085c195c9a5bd960ca1b604482015260640161065e565b600080610c99868686611312565b9150915081610cd35760405162461bcd60e51b815260040161065e906020808252600490820152632173696760e01b604082015260600190565b6001610cdd611b10565b610100880135600090815260079190910160209081526040808320805460ff1916941515949094179093559091610d1991908901908901613762565b60ff161115610d46576000610d346040880160208901613762565b60ff166001149050610b208482611fe8565b610d4f83610963565b15610d845760405162461bcd60e51b815260206004820152600560248201526430b236b4b760d91b604482015260640161065e565b610d9983610d90611b10565b600201906120bd565b50604051806060016040528087606001358152602001876080016020810190610dc29190613736565b6001600160801b03168152602001610de060c0890160a08a01613736565b6001600160801b03169052610df3611b10565b6001600160a01b03851660009081526005919091016020908152604080832084518155918401519301516001600160801b03908116600160801b02931692909217600190920191909155610e69610e48611b10565b6001600160a01b0386166000908152600691909101602052604090206120d2565b805190915060005b81811015610ed357610ec0838281518110610e8e57610e8e61367e565b6020026020010151610e9e611b10565b6001600160a01b038916600090815260069190910160205260409020906120df565b50610ecc60018261377d565b9050610e71565b50610ee16040890189613795565b9050905060005b81811015610f6257610f4f610f0060408b018b613795565b83818110610f1057610f1061367e565b9050602002016020810190610f259190612f09565b610f2d611b10565b6001600160a01b038916600090815260069190910160205260409020906120bd565b50610f5b60018261377d565b9050610ee8565b50610f6c886120f4565b846001600160a01b0316836001600160a01b03167ff21d10c26e35863a8df291aca54181ee8c4a3bc8e00246c3f7a5a14b69d826a78a604051610faf919061386f565b60405180910390a35050505050505050565b600080610fcc611b10565b6001600160a01b038416600090815260059190910160209081526040918290208251606081018452815481526001909101546001600160801b03808216938301849052600160801b9091041692810192909252909150421080159061103d575080604001516001600160801b031642105b80156109b157506000611072611051611b10565b6001600160a01b038616600090815260069190910160205260409020611b56565b119392505050565b60606000611091611089611b10565b6002016120d2565b80519091506000805b82811015611122576110c48482815181106110b7576110b761367e565b6020026020010151610fc1565b156110db57816110d3816136aa565b925050611110565b60008482815181106110ef576110ef61367e565b60200260200101906001600160a01b031690816001600160a01b0316815250505b61111b60018261377d565b905061109a565b50806001600160401b0381111561113b5761113b612d3d565b60405190808252806020026020018201604052801561117457816020015b611161612c0b565b8152602001906001900390816111595790505b5093506000805b838110156112b95760006001600160a01b03168582815181106111a0576111a061367e565b60200260200101516001600160a01b0316146112a75760008582815181106111ca576111ca61367e565b6020026020010151905060006111de611b10565b6001600160a01b038316600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a081019094529183529092508101611248610e48611b10565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b0316815250888580611287906136aa565b9650815181106112995761129961367e565b602002602001018190525050505b6112b260018261377d565b905061117b565b505050505090565b6112c9612189565b6113065760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b604482015260640161065e565b61130f816121a1565b50565b6000806113286113218661228c565b85856123d0565b9050611332611b10565b6101008601356000908152600791909101602052604090205460ff1615801561135f575061135f81610963565b9150935093915050565b6060816001600160401b0381111561138357611383612d3d565b6040519080825280602002602001820160405280156113b657816020015b60608152602001906001900390816113a15790505b50905060005b8281101561145657611426308585848181106113da576113da61367e565b90506020028101906113ec9190613638565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061242a92505050565b8282815181106114385761143861367e565b6020026020010181905250808061144e906136aa565b9150506113bc565b5092915050565b60008061146861244f565b546001600160a01b03169050801561147f57919050565b7f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d278991505090565b6114ae61145d565b6001600160a01b0316336001600160a01b031614806114d157506114d133610963565b6114ed5760405162461bcd60e51b815260040161065e906136c5565b6114f5611e53565b610b8a848484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f3992505050565b61153e611faa565b8061154761244f565b80546001600160a01b0319166001600160a01b039290921691909117905550565b600061157261145d565b604051631aab3f0d60e11b8152306004820152600060248201526001600160a01b0391909116906335567e1a90604401602060405180830381865afa1580156115bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e3919061395a565b905090565b60006115f2612473565b5460ff1690506000611602612473565b54610100900460ff169050801580801561161f575060018360ff16105b8061163e575061162e3061247d565b15801561163e57508260ff166001145b6116a15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161065e565b60016116ab612473565b805460ff191660ff9290921691909117905580156116e45760016116cd612473565b80549115156101000261ff00199092169190911790555b6117248686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061248c92505050565b61172c61244f565b6001018190555061173e866001611fe8565b8015610bfc57600061174e612473565b80549115156101000261ff0019909216919091179055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b606060006117af611089611b10565b8051909150806001600160401b038111156117cc576117cc612d3d565b60405190808252806020026020018201604052801561180557816020015b6117f2612c0b565b8152602001906001900390816117ea5790505b50925060005b8181101561190b5760008382815181106118275761182761367e565b60200260200101519050600061183b611b10565b6001600160a01b038316600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a0810190945291835290925081016118a5610e48611b10565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b03168152508684815181106118ea576118ea61367e565b60200260200101819052505050600181611904919061377d565b905061180b565b50505090565b606061191b6124bf565b805461192690613973565b80601f016020809104026020016040519081016040528092919081815260200182805461195290613973565b801561199f5780601f106119745761010080835404028352916020019161199f565b820191906000526020600020905b81548152906001019060200180831161198257829003601f168201915b5050505050905090565b60606115e36119b6611b10565b6120d2565b6119c3612c0b565b60006119cd611b10565b6001600160a01b038416600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a081019094529183529092508101611a58611a37611b10565b6001600160a01b0387166000908152600691909101602052604090206120d2565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b0316815250915050919050565b7f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee030090565b60006001600160e01b03198216630271189760e51b148061057457506301ffc9a760e01b6001600160e01b0319831614610574565b6000806000611afb85856124e3565b91509150611b0881612529565b509392505050565b7f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0090565b6001600160a01b038116600090815260018301602052604081205415156109b1565b6000610574825490565b60006109b18383612672565b60006004821015611b8f5760405162461bcd60e51b815260040161065e906139a8565b611b9d6004600084866139c7565b6109b1916139f1565b6000806044831015611bca5760405162461bcd60e51b815260040161065e906139a8565b611bd86024600485876139c7565b810190611be59190612f09565b9150611bf56044602485876139c7565b810190611c029190613a21565b90509250929050565b606080806064841015611c305760405162461bcd60e51b815260040161065e906139a8565b611c3d84600481886139c7565b810190611c4a9190613ab9565b919790965090945092505050565b611c6061145d565b6001600160a01b0316336001600160a01b031614611cbf5760405162461bcd60e51b815260206004820152601c60248201527b1858d8dbdd5b9d0e881b9bdd08199c9bdb48115b9d1c9e541bda5b9d60221b604482015260640161065e565b565b7b0ca2ba3432b932bab69029b4b3b732b21026b2b9b9b0b3b29d05199960211b6000908152601c829052603c81206000611d3f611d02610140870187613638565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508693925050611aec9050565b9050611d4b8186610689565b611d5a57600192505050610574565b6000611d64611b10565b6001600160a01b03929092166000908152600590920160209081526040808420815160608082018452825482526001909201546001600160801b0380821683870152600160801b8204908116928501929092528351928301845295825265ffffffffffff8087169483019490945292831691015260d09290921b6001600160d01b03191660a09290921b65ffffffffffff60a01b169190911795945050505050565b801561130f57604051600090339060001990849084818181858888f193505050503d8060008114610b8a576040519150601f19603f3d011682016040523d82523d6000602084013e610b8a565b60405163c3c5a54760e01b81527f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b906001600160a01b0382169063c3c5a54790611ea190309060040161336c565b602060405180830381865afa158015611ebe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee29190613b9e565b61130f57806001600160a01b03166383a03f8c611efd61244f565b600101546040518263ffffffff1660e01b8152600401611f1f91815260200190565b600060405180830381600087803b158015610b7657600080fd5b60606000846001600160a01b03168484604051611f569190613bc0565b60006040518083038185875af1925050503d8060008114611f93576040519150601f19603f3d011682016040523d82523d6000602084013e611f98565b606091505b509250905080611b0857815160208301fd5b611fb333610963565b611cbf5760405162461bcd60e51b815260206004820152600660248201526510b0b236b4b760d11b604482015260640161065e565b611ff2828261269c565b6001600160a01b037f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b163b156120b9578015612081577f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b6001600160a01b0316630b61e12b8361206061244f565b600101546040518363ffffffff1660e01b8152600401610bce929190613706565b7f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b6001600160a01b0316639387a3808361206061244f565b5050565b60006109b1836001600160a01b03841661274b565b606060006109b18361279a565b60006109b1836001600160a01b0384166127f6565b6001600160a01b037f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b163b1561130f576001600160a01b037f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b16630b61e12b6121606020840184612f09565b61216861244f565b600101546040518363ffffffff1660e01b8152600401611f1f929190613706565b600061219433610963565b806115e357505030331490565b60006121ab6124bf565b80546121b690613973565b80601f01602080910402602001604051908101604052809291908181526020018280546121e290613973565b801561222f5780601f106122045761010080835404028352916020019161222f565b820191906000526020600020905b81548152906001019060200180831161221257829003601f168201915b505050505090508161223f6124bf565b815161224e9260200190612c55565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a168183604051612280929190613bdc565b60405180910390a15050565b60607f3fd4a1a1a267c84185e3b7eecd57c68783c0581d538b9d6e5f23e4670497c1e96122bc6020840184612f09565b6122cc6040850160208601613762565b6122d96040860186613795565b6040516020016122ea929190613c0a565b60408051601f198184030181529190528051602090910120606086013561231760a0880160808901613736565b61232760c0890160a08a01613736565b61233760e08a0160c08b01613736565b6123486101008b0160e08c01613736565b60408051602081019a909a526001600160a01b039098169789019790975260ff9095166060880152608087019390935260a08601919091526001600160801b0390811660c086015290811660e0850152908116610100848101919091529116610120830152830135610140820152610160016040516020818303038152906040529050919050565b600061242283838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508751602089012061241c925090506128e9565b90611aec565b949350505050565b60606109b18383604051806060016040528060278152602001613cb460279139612916565b7f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b54830090565b60006115e3611a93565b6001600160a01b03163b151590565b600082826040516020016124a1929190613c4c565b60405160208183030381529060405280519060200120905092915050565b7f4bc804ba64359c0e35e5ed5d90ee596ecaa49a3a930ddcb1470ea0dd625da90090565b60008082516041141561251a5760208301516040840151606085015160001a61250e878285856129f1565b94509450505050612522565b506000905060025b9250929050565b600081600481111561253d5761253d613c70565b14156125465750565b600181600481111561255a5761255a613c70565b14156125a35760405162461bcd60e51b815260206004820152601860248201527745434453413a20696e76616c6964207369676e617475726560401b604482015260640161065e565b60028160048111156125b7576125b7613c70565b14156126055760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161065e565b600381600481111561261957612619613c70565b141561130f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161065e565b60008260000182815481106126895761268961367e565b9060005260206000200154905092915050565b806126a5611b10565b6001600160a01b038416600090815260049190910160205260409020805460ff191691151591909117905580156126ee576126e8826126e2611b10565b906120bd565b50612702565b612700826126fa611b10565b906120df565b505b816001600160a01b03167f235bc17e7930760029e9f4d860a2a8089976de5b381cf8380fc11c1d88a111338260405161273f911515815260200190565b60405180910390a25050565b600081815260018301602052604081205461279257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610574565b506000610574565b6060816000018054806020026020016040519081016040528092919081815260200182805480156127ea57602002820191906000526020600020905b8154815260200190600101908083116127d6575b50505050509050919050565b600081815260018301602052604081205480156128df57600061281a600183613c86565b855490915060009061282e90600190613c86565b905081811461289357600086600001828154811061284e5761284e61367e565b90600052602060002001549050808760000184815481106128715761287161367e565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806128a4576128a4613c9d565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610574565b6000915050610574565b60006105746128f6612aab565b8360405161190160f01b8152600281019290925260228201526042902090565b60606129218461247d565b61297c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840161065e565b600080856001600160a01b0316856040516129979190613bc0565b600060405180830381855af49150503d80600081146129d2576040519150601f19603f3d011682016040523d82523d6000602084013e6129d7565b606091505b50915091506129e7828286612bd2565b9695505050505050565b6000806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03831115612a1e5750600090506003612aa2565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612a72573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612a9b57600060019250925050612aa2565b9150600090505b94509492505050565b6000306001600160a01b037f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac16148015612b0457507f0000000000000000000000000000000000000000000000000000000000007a6946145b15612b2e57507fbcdadf6444930a967ffda04923d78c49b3dd65df3ed39abb04a1e3eb1190553790565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527ff0729608244859f656d32ae4cbc6b0367695d68d8e941a28f5e2d33c6d5182dd828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b60608315612be15750816109b1565b825115612bf15782518084602001fd5b8160405162461bcd60e51b815260040161065e919061355d565b6040518060a0016040528060006001600160a01b03168152602001606081526020016000815260200160006001600160801b0316815260200160006001600160801b031681525090565b828054612c6190613973565b90600052602060002090601f016020900481019282612c835760008555612cc9565b82601f10612c9c57805160ff1916838001178555612cc9565b82800160010185558215612cc9579182015b82811115612cc9578251825591602001919060010190612cae565b50612cd5929150612cd9565b5090565b5b80821115612cd55760008155600101612cda565b600060208284031215612d0057600080fd5b81356001600160e01b0319811681146109b157600080fd5b6001600160a01b038116811461130f57600080fd5b8035612d3881612d18565b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612d7b57612d7b612d3d565b604052919050565b60006001600160401b03831115612d9c57612d9c612d3d565b612daf601f8401601f1916602001612d53565b9050828152838383011115612dc357600080fd5b828260208301376000602084830101529392505050565b600082601f830112612deb57600080fd5b6109b183833560208501612d83565b60008060008060808587031215612e1057600080fd5b8435612e1b81612d18565b93506020850135612e2b81612d18565b92506040850135915060608501356001600160401b03811115612e4d57600080fd5b612e5987828801612dda565b91505092959194509250565b60008060408385031215612e7857600080fd5b8235915060208301356001600160401b03811115612e9557600080fd5b612ea185828601612dda565b9150509250929050565b60006101608284031215612ebe57600080fd5b50919050565b60008060408385031215612ed757600080fd5b8235612ee281612d18565b915060208301356001600160401b03811115612efd57600080fd5b612ea185828601612eab565b600060208284031215612f1b57600080fd5b81356109b181612d18565b600080600060608486031215612f3b57600080fd5b83356001600160401b03811115612f5157600080fd5b612f5d86828701612eab565b9660208601359650604090950135949350505050565b60008083601f840112612f8557600080fd5b5081356001600160401b03811115612f9c57600080fd5b6020830191508360208260051b850101111561252257600080fd5b60008060008060008060608789031215612fd057600080fd5b86356001600160401b0380821115612fe757600080fd5b612ff38a838b01612f73565b9098509650602089013591508082111561300c57600080fd5b6130188a838b01612f73565b9096509450604089013591508082111561303157600080fd5b5061303e89828a01612f73565b979a9699509497509295939492505050565b6000806040838503121561306357600080fd5b823561306e81612d18565b946020939093013593505050565b60008083601f84011261308e57600080fd5b5081356001600160401b038111156130a557600080fd5b60208301915083602082850101111561252257600080fd5b6000806000604084860312156130d257600080fd5b83356001600160401b03808211156130e957600080fd5b9085019061012082880312156130fe57600080fd5b9093506020850135908082111561311457600080fd5b506131218682870161307c565b9497909650939450505050565b6001600160801b03169052565b80516001600160a01b03908116835260208083015160a082860181905281519086018190526000939183019290849060c08801905b8083101561319257855185168252948301946001929092019190830190613170565b5060408701516040890152606087015194506131b1606089018661312e565b608087015194506131c5608089018661312e565b979650505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561322557603f1988860301845261321385835161313b565b945092850192908501906001016131f7565b5092979650505050505050565b60006020828403121561324457600080fd5b81356001600160401b0381111561325a57600080fd5b8201601f8101841361326b57600080fd5b61242284823560208401612d83565b6000806020838503121561328d57600080fd5b82356001600160401b038111156132a357600080fd5b6132af85828601612f73565b90969095509350505050565b60005b838110156132d65781810151838201526020016132be565b838111156132e5576000848401525b50505050565b600081518084526133038160208601602086016132bb565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561322557603f1988860301845261335a8583516132eb565b9450928501929085019060010161333e565b6001600160a01b0391909116815260200190565b6000806000806060858703121561339657600080fd5b84356133a181612d18565b93506020850135925060408501356001600160401b038111156133c357600080fd5b6133cf8782880161307c565b95989497509550505050565b60006001600160401b038211156133f4576133f4612d3d565b5060051b60200190565b600082601f83011261340f57600080fd5b8135602061342461341f836133db565b612d53565b82815260059290921b8401810191818101908684111561344357600080fd5b8286015b8481101561345e5780358352918301918301613447565b509695505050505050565b600080600080600060a0868803121561348157600080fd5b853561348c81612d18565b9450602086013561349c81612d18565b935060408601356001600160401b03808211156134b857600080fd5b6134c489838a016133fe565b945060608801359150808211156134da57600080fd5b6134e689838a016133fe565b935060808801359150808211156134fc57600080fd5b5061350988828901612dda565b9150509295509295909350565b60008060006040848603121561352b57600080fd5b833561353681612d18565b925060208401356001600160401b0381111561355157600080fd5b6131218682870161307c565b6020815260006109b160208301846132eb565b6020808252825182820181905260009190848201906040850190845b818110156135b15783516001600160a01b03168352928401929184019160010161358c565b50909695505050505050565b6020815260006109b1602083018461313b565b600080600080600060a086880312156135e857600080fd5b85356135f381612d18565b9450602086013561360381612d18565b9350604086013592506060860135915060808601356001600160401b0381111561362c57600080fd5b61350988828901612dda565b6000808335601e1984360301811261364f57600080fd5b8301803591506001600160401b0382111561366957600080fd5b60200191503681900382131561252257600080fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156136be576136be613694565b5060010190565b60208082526021908201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746040820152601760f91b606082015260800190565b6001600160a01b03929092168252602082015260400190565b80356001600160801b0381168114612d3857600080fd5b60006020828403121561374857600080fd5b6109b18261371f565b803560ff81168114612d3857600080fd5b60006020828403121561377457600080fd5b6109b182613751565b6000821982111561379057613790613694565b500190565b6000808335601e198436030181126137ac57600080fd5b8301803591506001600160401b038211156137c657600080fd5b6020019150600581901b360382131561252257600080fd5b6000808335601e198436030181126137f557600080fd5b83016020810192503590506001600160401b0381111561381457600080fd5b8060051b360383131561252257600080fd5b8183526000602080850194508260005b8581101561386457813561384981612d18565b6001600160a01b031687529582019590820190600101613836565b509495945050505050565b602081526138906020820161388384612d2d565b6001600160a01b03169052565b600061389e60208401613751565b60ff81166040840152506138b560408401846137de565b6101208060608601526138cd61014086018385613826565b9250606086013560808601526138e56080870161371f565b91506138f460a086018361312e565b61390060a0870161371f565b915061390f60c086018361312e565b61391b60c0870161371f565b915061392a60e086018361312e565b61393660e0870161371f565b91506101006139478187018461312e565b9590950135939094019290925250919050565b60006020828403121561396c57600080fd5b5051919050565b600181811c9082168061398757607f821691505b60208210811415612ebe57634e487b7160e01b600052602260045260246000fd5b602080825260059082015264214461746160d81b604082015260600190565b600080858511156139d757600080fd5b838611156139e457600080fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015613a195780818660040360031b1b83161692505b505092915050565b600060208284031215613a3357600080fd5b5035919050565b600082601f830112613a4b57600080fd5b81356020613a5b61341f836133db565b82815260059290921b84018101918181019086841115613a7a57600080fd5b8286015b8481101561345e5780356001600160401b03811115613a9d5760008081fd5b613aab8986838b0101612dda565b845250918301918301613a7e565b600080600060608486031215613ace57600080fd5b83356001600160401b0380821115613ae557600080fd5b818601915086601f830112613af957600080fd5b81356020613b0961341f836133db565b82815260059290921b8401810191818101908a841115613b2857600080fd5b948201945b83861015613b4f578535613b4081612d18565b82529482019490820190613b2d565b97505087013592505080821115613b6557600080fd5b613b71878388016133fe565b93506040860135915080821115613b8757600080fd5b50613b9486828701613a3a565b9150509250925092565b600060208284031215613bb057600080fd5b815180151581146109b157600080fd5b60008251613bd28184602087016132bb565b9190910192915050565b604081526000613bef60408301856132eb565b8281036020840152613c0181856132eb565b95945050505050565b60008184825b85811015613c41578135613c2381612d18565b6001600160a01b031683526020928301929190910190600101613c10565b509095945050505050565b6001600160a01b0383168152604060208201819052600090612422908301846132eb565b634e487b7160e01b600052602160045260246000fd5b600082821015613c9857613c98613694565b500390565b634e487b7160e01b600052603160045260246000fdfe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220716b4aba2dec0a2a6990174ef5e5fb2d33cf6e1ca5e064499e3cd6f7aefa279564736f6c634300080c0033"; diff --git a/src/test/smart-wallet/utils/AABenchmarkPrepare.sol b/src/test/smart-wallet/utils/AABenchmarkPrepare.sol index 554f3b4fa..2919bd375 100644 --- a/src/test/smart-wallet/utils/AABenchmarkPrepare.sol +++ b/src/test/smart-wallet/utils/AABenchmarkPrepare.sol @@ -17,7 +17,10 @@ contract AABenchmarkPrepare is BaseTest { function setUp() public override { super.setUp(); - accountFactory = new AccountFactory(IEntryPoint(payable(address(0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789)))); + accountFactory = new AccountFactory( + deployer, + IEntryPoint(payable(address(0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789))) + ); } function test_prepareBenchmarkFile() public {