Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
7133416 | 7 days ago | Contract Creation | 0 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
NftMarket
Compiler Version
v0.8.28+commit.7893614a
ZkSolc Version
v1.5.7
Optimization Enabled:
Yes with Mode 3
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.28; import {AccessControlUpgradeable} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import {IERC2981} from "@openzeppelin/contracts/interfaces/IERC2981.sol"; import {ERC165Checker} from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import {ERC20Checker} from "./ERC20Checker.sol"; contract NftMarket is AccessControlUpgradeable, OwnableUpgradeable, PausableUpgradeable { event NFTListed( address tokenAddress, uint256 tokenId, uint256 price, address payToken, uint256 salePeriod ); event NFTListingCanceled(address tokenAddress, uint256 tokenId); event NFTSold( address tokenAddress, uint256 tokenId, address seller, address buyer, uint256 price, address payToken ); error NotApproved(); error NotOwner(); error NotListing(); error NotSeller(); error NotPayToken(); error NotSupportNFT(); error NotLowerPrice(uint256 currentPrice); struct Nft { address tokenAddress; uint256 tokenId; address seller; address payToken; uint256 price; uint256 salePeriod; } struct RoyaltyFee { address creator; uint256 fee; } /// @custom:storage-location erc7201:nft.market struct NftMarketStorage { mapping(address => mapping(uint256 => Nft)) nfts; uint256 operatorBasis; uint256 operatorDiscount; uint256 operatorCommission; address payable operatorAddress; mapping(address => bool) payableTokens; mapping(address => RoyaltyFee) royalties; } // keccak256(abi.encode(uint256(keccak256("nft.market")) - 1)) & ~bytes32(uint256(0xff)); bytes32 private constant NFT_MARKET_STORAGE_LOCATION = 0x62b0fa3591d9723f793b0f5e3da9c9ce7fdee42e011e252bff8ced736a456c00; function _getNftMarketStorage() private pure returns (NftMarketStorage storage $) { // solhint-disable-next-line no-inline-assembly assembly { $.slot := NFT_MARKET_STORAGE_LOCATION } } // solhint-disable-next-line func-name-mixedcase function __NftMarketStorage__init() internal initializer { NftMarketStorage storage $ = _getNftMarketStorage(); $.operatorBasis = 300; $.operatorCommission = 200; $.operatorDiscount = 100; } function initialize() public initializer { __Ownable_init(); __AccessControl_init(); __NftMarketStorage__init(); __Pausable_init(); _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); } function pause() external virtual onlyRole(DEFAULT_ADMIN_ROLE) { _pause(); } function unpause() external virtual onlyRole(DEFAULT_ADMIN_ROLE) { _unpause(); } function setWithdrawAddress( address payable _address ) public onlyRole(DEFAULT_ADMIN_ROLE) { NftMarketStorage storage $ = _getNftMarketStorage(); $.operatorAddress = _address; } function getWithdrawAddress() public view returns (address) { NftMarketStorage storage $ = _getNftMarketStorage(); return $.operatorAddress; } function setCreatorRoyalty( address _address, address _creator, uint256 _fee ) public onlyRole(DEFAULT_ADMIN_ROLE) { NftMarketStorage storage $ = _getNftMarketStorage(); $.royalties[_address] = RoyaltyFee(_creator, _fee); } function getCreatorRoyalty( address _address ) public view returns (RoyaltyFee memory _royalty) { NftMarketStorage storage $ = _getNftMarketStorage(); return $.royalties[_address]; } function setPayableToken( address _address, bool allowed ) public onlyRole(DEFAULT_ADMIN_ROLE) { if (!ERC20Checker.supportsInterface(_address)) revert NotPayToken(); NftMarketStorage storage $ = _getNftMarketStorage(); $.payableTokens[_address] = allowed; } modifier isPayableToken(address _payToken) { NftMarketStorage storage $ = _getNftMarketStorage(); if (!$.payableTokens[_payToken]) revert NotPayToken(); _; } function putOnSale( address tokenAddress, uint256 tokenId, address payToken, uint256 price, uint256 salePeriod ) public isPayableToken(payToken) whenNotPaused { if ( !ERC165Checker.supportsInterface( tokenAddress, type(IERC721).interfaceId ) ) revert NotSupportNFT(); if ( !IERC721(tokenAddress).isApprovedForAll(_msgSender(), address(this)) ) revert NotApproved(); if (IERC721(tokenAddress).ownerOf(tokenId) != _msgSender()) revert NotOwner(); if (salePeriod < block.timestamp) revert NotListing(); NftMarketStorage storage $ = _getNftMarketStorage(); $.nfts[tokenAddress][tokenId] = Nft( tokenAddress, tokenId, _msgSender(), payToken, price, salePeriod ); emit NFTListed(tokenAddress, tokenId, price, payToken, salePeriod); } function updateOnSale( address tokenAddress, uint256 tokenId, address payToken, uint256 price, uint256 salePeriod ) public isPayableToken(payToken) whenNotPaused { if ( !ERC165Checker.supportsInterface( tokenAddress, type(IERC721).interfaceId ) ) revert NotSupportNFT(); if ( !IERC721(tokenAddress).isApprovedForAll(_msgSender(), address(this)) ) revert NotApproved(); if (IERC721(tokenAddress).ownerOf(tokenId) != _msgSender()) revert NotOwner(); if (salePeriod < block.timestamp) revert NotListing(); NftMarketStorage storage $ = _getNftMarketStorage(); Nft memory nft = $.nfts[tokenAddress][tokenId]; if ( nft.salePeriod > block.timestamp && nft.price < price && nft.seller == _msgSender() ) revert NotLowerPrice(nft.price); $.nfts[tokenAddress][tokenId] = Nft( tokenAddress, tokenId, _msgSender(), payToken, price, salePeriod ); emit NFTListed(tokenAddress, tokenId, price, payToken, salePeriod); } function removeFromSale( address tokenAddress, uint256 tokenId ) public whenNotPaused { NftMarketStorage storage $ = _getNftMarketStorage(); if ($.nfts[tokenAddress][tokenId].tokenId == 0) revert NotListing(); if (IERC721(tokenAddress).ownerOf(tokenId) != _msgSender()) revert NotOwner(); delete $.nfts[tokenAddress][tokenId]; emit NFTListingCanceled(tokenAddress, tokenId); } function purchase( address tokenAddress, uint256 tokenId ) public whenNotPaused { NftMarketStorage storage $ = _getNftMarketStorage(); Nft memory nft = $.nfts[tokenAddress][tokenId]; if ( !ERC165Checker.supportsInterface( tokenAddress, type(IERC721).interfaceId ) ) revert NotSupportNFT(); if (nft.salePeriod < block.timestamp) revert NotListing(); if (!$.payableTokens[$.nfts[tokenAddress][tokenId].payToken]) revert NotPayToken(); if (IERC721(tokenAddress).ownerOf(tokenId) != nft.seller) revert NotSeller(); delete $.nfts[tokenAddress][tokenId]; uint256 operatorAmount = uint256((nft.price * $.operatorBasis) / 10000); uint256 sellerAmount = nft.price - operatorAmount; if ($.royalties[tokenAddress].fee > 0) { uint256 royaltyAmount = uint256( (nft.price * $.royalties[tokenAddress].fee) / 10000 ); sellerAmount -= royaltyAmount; SafeERC20.safeTransferFrom( IERC20(nft.payToken), _msgSender(), $.royalties[tokenAddress].creator, royaltyAmount ); } uint256 discount = uint256((nft.price * $.operatorDiscount) / 10000); uint256 commission = uint256( (nft.price * $.operatorCommission) / 10000 ); SafeERC20.safeTransferFrom( IERC20(nft.payToken), _msgSender(), $.operatorAddress, operatorAmount + commission - discount ); SafeERC20.safeTransferFrom( IERC20(nft.payToken), _msgSender(), nft.seller, sellerAmount + discount ); emit NFTSold( tokenAddress, tokenId, nft.seller, _msgSender(), nft.price, nft.payToken ); IERC721(tokenAddress).safeTransferFrom( nft.seller, _msgSender(), tokenId ); if (IERC721(tokenAddress).ownerOf(tokenId) != _msgSender()) revert NotOwner(); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.28; library ERC20Checker { function supportsInterface(address account) internal view returns (bool) { (bool success, bytes memory data) = account.staticcall{gas: 200000}( abi.encodeWithSignature("name()") ); if (success && data.length > 0) { return true; } return false; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../utils/StringsUpgradeable.sol"; import "../utils/introspection/ERC165Upgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControlUpgradeable { function hasRole(bytes32 role, address account) external view returns (bool); function getRoleAdmin(bytes32 role) external view returns (bytes32); function grantRole(bytes32 role, address account) external; function revokeRole(bytes32 role, address account) external; function renounceRole(bytes32 role, address account) external; } /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable { function __AccessControl_init() internal initializer { __Context_init_unchained(); __ERC165_init_unchained(); __AccessControl_init_unchained(); } function __AccessControl_init_unchained() internal initializer { } struct RoleData { mapping (address => bool) members; bytes32 adminRole; } mapping (bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/ */ function _checkRole(bytes32 role, address account) internal view { if(!hasRole(role, account)) { revert(string(abi.encodePacked( "AccessControl: account ", StringsUpgradeable.toHexString(uint160(account), 20), " is missing role ", StringsUpgradeable.toHexString(uint256(role), 32) ))); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, getRoleAdmin(role), adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.20; import {IERC165} from "../utils/introspection/IERC165.sol"; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal initializer { __Context_init_unchained(); __Pausable_init_unchained(); } function __Pausable_init_unchained() internal initializer { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.20; import {IERC165} from "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon * a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or * {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon * a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the address zero. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165Checker.sol) pragma solidity ^0.8.20; import {IERC165} from "./IERC165.sol"; /** * @dev Library used to query support of an interface declared via {IERC165}. * * Note that these functions return the actual result of the query: they do not * `revert` if an interface is not supported. It is up to the caller to decide * what to do in these cases. */ library ERC165Checker { // As per the EIP-165 spec, no interface should ever match 0xffffffff bytes4 private constant INTERFACE_ID_INVALID = 0xffffffff; /** * @dev Returns true if `account` supports the {IERC165} interface. */ function supportsERC165(address account) internal view returns (bool) { // Any contract that implements ERC165 must explicitly indicate support of // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid return supportsERC165InterfaceUnchecked(account, type(IERC165).interfaceId) && !supportsERC165InterfaceUnchecked(account, INTERFACE_ID_INVALID); } /** * @dev Returns true if `account` supports the interface defined by * `interfaceId`. Support for {IERC165} itself is queried automatically. * * See {IERC165-supportsInterface}. */ function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) { // query support of both ERC165 as per the spec and support of _interfaceId return supportsERC165(account) && supportsERC165InterfaceUnchecked(account, interfaceId); } /** * @dev Returns a boolean array where each value corresponds to the * interfaces passed in and whether they're supported or not. This allows * you to batch check interfaces for a contract where your expectation * is that some interfaces may not be supported. * * See {IERC165-supportsInterface}. */ function getSupportedInterfaces( address account, bytes4[] memory interfaceIds ) internal view returns (bool[] memory) { // an array of booleans corresponding to interfaceIds and whether they're supported or not bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length); // query support of ERC165 itself if (supportsERC165(account)) { // query support of each interface in interfaceIds for (uint256 i = 0; i < interfaceIds.length; i++) { interfaceIdsSupported[i] = supportsERC165InterfaceUnchecked(account, interfaceIds[i]); } } return interfaceIdsSupported; } /** * @dev Returns true if `account` supports all the interfaces defined in * `interfaceIds`. Support for {IERC165} itself is queried automatically. * * Batch-querying can lead to gas savings by skipping repeated checks for * {IERC165} support. * * See {IERC165-supportsInterface}. */ function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) { // query support of ERC165 itself if (!supportsERC165(account)) { return false; } // query support of each interface in interfaceIds for (uint256 i = 0; i < interfaceIds.length; i++) { if (!supportsERC165InterfaceUnchecked(account, interfaceIds[i])) { return false; } } // all interfaces supported return true; } /** * @notice Query if a contract implements an interface, does not check ERC165 support * @param account The address of the contract to query for support of an interface * @param interfaceId The interface identifier, as specified in ERC-165 * @return true if the contract at account indicates support of the interface with * identifier interfaceId, false otherwise * @dev Assumes that account contains a contract that supports ERC165, otherwise * the behavior of this method is undefined. This precondition can be checked * with {supportsERC165}. * * Some precompiled contracts will falsely indicate support for a given interface, so caution * should be exercised when using this function. * * Interface identification is specified in ERC-165. */ function supportsERC165InterfaceUnchecked(address account, bytes4 interfaceId) internal view returns (bool) { // prepare call bytes memory encodedParams = abi.encodeCall(IERC165.supportsInterface, (interfaceId)); // perform static call bool success; uint256 returnSize; uint256 returnValue; assembly { success := staticcall(30000, account, add(encodedParams, 0x20), mload(encodedParams), 0x00, 0x20) returnSize := returndatasize() returnValue := mload(0x00) } return success && returnSize >= 0x20 && returnValue > 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; import {IERC20} from "../IERC20.sol"; import {IERC20Permit} from "../extensions/IERC20Permit.sol"; import {Address} from "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // solhint-disable-next-line compiler-version pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165Upgradeable.sol"; import "../../proxy/utils/Initializable.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal initializer { __ERC165_init_unchained(); } function __ERC165_init_unchained() internal initializer { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert FailedInnerCall(); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165Upgradeable { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "optimizer": { "enabled": true, "mode": "3" }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "abi", "metadata" ], "": [ "ast" ] } }, "detectMissingLibraries": false, "forceEVMLA": false, "enableEraVMExtensions": false, "libraries": {} }
Contract ABI
API[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"NotApproved","type":"error"},{"inputs":[],"name":"NotListing","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPrice","type":"uint256"}],"name":"NotLowerPrice","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"NotPayToken","type":"error"},{"inputs":[],"name":"NotSeller","type":"error"},{"inputs":[],"name":"NotSupportNFT","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"payToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"salePeriod","type":"uint256"}],"name":"NFTListed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"NFTListingCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"payToken","type":"address"}],"name":"NFTSold","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getCreatorRoyalty","outputs":[{"components":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"fee","type":"uint256"}],"internalType":"struct NftMarket.RoyaltyFee","name":"_royalty","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWithdrawAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"purchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"payToken","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"salePeriod","type":"uint256"}],"name":"putOnSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"removeFromSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"address","name":"_creator","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setCreatorRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setPayableToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_address","type":"address"}],"name":"setWithdrawAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"payToken","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"salePeriod","type":"uint256"}],"name":"updateOnSale","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
9c4d535b000000000000000000000000000000000000000000000000000000000000000001000485eb7ecafeea0808b4d111402fe10a6569e91317a5666261ec2ce91d1e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x0004000000000002000b0000000000020000006004100270000004050340019700030000003103550002000000010355000004050040019d0000008004000039000000400040043f0000000100200190000000480000c13d000000040030008c00000c810000413d000000000201043b000000e002200270000004070020009c000000500000a13d000004080020009c0000009f0000213d000004100020009c000001240000213d000004140020009c000002f60000613d000004150020009c000002120000613d000004160020009c00000c810000c13d0000000001000416000000000001004b00000c810000c13d00000000010004110000042501100197000b00000001001d000000000010043f0000045301000041000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b000000000101041a000000ff00100190000000700000613d000000400100043d000000c902000039000000000302041a000000ff00300190000003ea0000c13d0000046f0330019700000001033001bf000000000032041b00000000020004110000000000210435000004050010009c000004050100804100000040011002100000000002000414000004050020009c0000040502008041000000c002200210000000000112019f00000454011001c70000800d02000039000000010300003900000455040000410000041c0000013d0000000001000416000000000001004b00000c810000c13d00000020010000390000010000100443000001200000044300000406010000410000100f0001042e000004170020009c000000db0000a13d000004180020009c000001660000213d0000041c0020009c000003500000613d0000041d0020009c000003310000613d0000041e0020009c00000c810000c13d0000000001000416000000000001004b00000c810000c13d00000000010004110000042501100197000b00000001001d000000000010043f0000045301000041000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b000000000101041a000000ff00100190000003df0000c13d0000000b01000029100e0f640000040f000900000001001d0000000001000019100e0fad0000040f000000400400043d000b00000004001d000000200240003900000456030000410000000000320435000a00000001001d00000009010000290000000013010434000800000003001d0000003702400039000900000002001d100e0d530000040f000000080200002900000009012000290000045702000041000000000021043500000011021000390000000a01000029100e0d600000040f0000000b030000290000000002310049000000200120008a00000000001304350000000001030019100e0cfd0000040f0000042901000041000000400200043d000a00000002001d000000000012043500000004012000390000000b02000029100e0d6e0000040f0000000a020000290000000001210049000004050010009c00000405010080410000006001100210000004050020009c00000405020080410000004002200210000000000121019f0000101000010430000004090020009c000001410000213d0000040d0020009c0000031d0000613d0000040e0020009c000002420000613d0000040f0020009c00000c810000c13d000000440030008c00000c810000413d0000000002000416000000000002004b00000c810000c13d0000000402100370000000000202043b000b00000002001d000004250020009c00000c810000213d0000002401100370000000000201043b000000c901000039000000000101041a000000ff001001900000038e0000c13d000a00000002001d0000000b01000029000000000010043f0000043f01000041000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b0000000a02000029000000000020043f000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b0000000101100039000000000101041a000000000001004b000004a10000c13d0000046901000041000000000010043f000004480100004100001010000104300000041f0020009c000001880000a13d000004200020009c000002030000613d000004210020009c000001b90000613d000004220020009c00000c810000c13d000000a40030008c00000c810000413d0000000002000416000000000002004b00000c810000c13d0000000402100370000000000202043b000b00000002001d000004250020009c00000c810000213d0000004402100370000000000202043b000a00000002001d000004250020009c00000c810000213d0000008402100370000000000202043b000800000002001d0000006402100370000000000202043b000700000002001d0000002401100370000000000101043b000900000001001d0000000a01000029000000000010043f0000042d01000041000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b000000000101041a000000ff00100190000002e10000613d000000400100043d0000002403100039000000c902000039000000000202041a000000ff00200190000004460000c13d000000200210003900000431040000410000000000420435000000000043043500000024030000390000000000310435000004660010009c000004400000813d0000006003100039000000400030043f0000000b03000029000000040030008c000006210000c13d0000000001020433000000000010043f000000010300003100000000020000190000064b0000013d000004110020009c000003230000613d000004120020009c000002570000613d000004130020009c00000c810000c13d000000440030008c00000c810000413d0000000002000416000000000002004b00000c810000c13d0000002402100370000000000202043b000b00000002001d000004250020009c00000c810000213d0000000401100370000000000101043b000000000010043f0000006501000039000000200010043f100e0ff70000040f0000000b02000029100e0d310000040f000000000101041a000000ff001001900000000001000039000000010100c0390000020b0000013d0000040a0020009c000003280000613d0000040b0020009c000002b80000613d0000040c0020009c00000c810000c13d000000240030008c00000c810000413d0000000002000416000000000002004b00000c810000c13d0000000401100370000000000101043b000b00000001001d000004250010009c00000c810000213d0000009701000039000000000101041a00000425011001970000000005000411000000000051004b000003850000c13d0000000b06000029000000000006004b000003fa0000c13d0000042901000041000000800010043f0000002001000039000000840010043f0000002601000039000000a40010043f0000042a01000041000000c40010043f0000042b01000041000000e40010043f0000042c010000410000101000010430000004190020009c000003620000613d0000041a0020009c000003450000613d0000041b0020009c00000c810000c13d0000000001000416000000000001004b00000c810000c13d0000009701000039000000000201041a00000425012001970000000005000411000000000051004b000003850000c13d000b00000002001d0000000001000414000004050010009c0000040501008041000000c00110021000000426011001c70000800d02000039000000030300003900000427040000410000000006000019100e10040000040f000000010020019000000c810000613d0000000b0100002900000428011001970000009702000039000000000012041b00000000010000190000100f0001042e000004230020009c000002e50000613d000004240020009c00000c810000c13d000000640030008c00000c810000413d0000000002000416000000000002004b00000c810000c13d0000000402100370000000000202043b000b00000002001d000004250020009c00000c810000213d0000002402100370000000000202043b000a00000002001d000004250020009c00000c810000213d0000004401100370000000000101043b000700000001001d0000000001000411100e0d830000040f000000400100043d000900000001001d100e0cf20000040f00000009030000290000002001300039000800000001001d000000070200002900000000002104350000000a0100002900000000001304350000000b01000029100e0d0f0000040f000000090200002900000000020204330000042502200197000000000301041a0000042803300197000000000223019f000000000021041b000000080200002900000000020204330000000101100039000000000021041b00000000010000190000100f0001042e000000440030008c00000c810000413d0000000002000416000000000002004b00000c810000c13d0000000402100370000000000202043b000b00000002001d0000002401100370000000000101043b000a00000001001d000004250010009c00000c810000213d0000000b01000029000000000010043f0000006501000039000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b0000000101100039000000000101041a000900000001001d000000000010043f0000006501000039000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d0000000002000411000000000101043b0000042502200197000800000002001d000000000020043f000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b000000000101041a000000ff00100190000004500000c13d0000000801000029100e0f640000040f000800000001001d0000000901000029100e0fad0000040f000000400400043d000b00000004001d000000200240003900000456030000410000000000320435000a00000001001d00000008010000290000007c0000013d000000240030008c00000c810000413d0000000002000416000000000002004b00000c810000c13d0000000401100370000000000101043b100e0d410000040f000000400200043d0000000000120435000004050020009c0000040502008041000000400120021000000445011001c70000100f0001042e0000000001000416000000000001004b00000c810000c13d000000000100041a0000ff000410019000000000050000390000000105006039000002200000c13d000000ff001001900000022e0000c13d000004580110019700000101011001bf000000000010041b00000000050000190000000100500190000002270000613d000000ff001001900000022e0000c13d000004580110019700000101011001bf000000000010041b000000ff0210018f0000ff000310019000000000060000390000000106006039000003980000c13d000000000002004b000003980000613d000000400100043d00000064021000390000045a03000041000000000032043500000044021000390000045b03000041000000000032043500000024021000390000002e03000039000000000032043500000429020000410000000000210435000000040210003900000020030000390000000000320435000004050010009c000004050100804100000040011002100000045c011001c70000101000010430000000440030008c00000c810000413d0000000002000416000000000002004b00000c810000c13d0000002402100370000000000202043b000b00000002001d000004250020009c00000c810000213d0000000401100370000000000101043b000a00000001001d100e0d410000040f0000000002000411100e0dc80000040f0000000a010000290000000b02000029100e0e1c0000040f00000000010000190000100f0001042e000000440030008c00000c810000413d0000000002000416000000000002004b00000c810000c13d0000000402100370000000000202043b000b00000002001d000004250020009c00000c810000213d0000002401100370000000000201043b000000c901000039000000000101041a000000ff001001900000038e0000c13d000a00000002001d0000000b01000029000000000010043f0000043f01000041000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b0000000a02000029000000000020043f000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000400200043d0000043e0020009c000004400000213d000000000101043b000000c003200039000000400030043f000000000301041a000004250330019700000000033204360000000104100039000000000404041a00000000004304350000000203100039000000000303041a00000425033001970000004004200039000800000004001d00000000003404350000000303100039000000000303041a00000425033001970000006004200039000600000004001d00000000003404350000000403100039000000000303041a0000008004200039000700000004001d0000000000340435000000a0022000390000000501100039000000000101041a000900000002001d00000000001204350000043103000041000000400100043d000000200210003900000000003204350000002404100039000000000034043500000024030000390000000000310435000004320010009c000004400000213d0000006003100039000000400030043f0000000b03000029000000040030008c000005970000c13d0000000001020433000000000010043f00000001030000310000000002000019000005c10000013d000000a40030008c00000c810000413d0000000002000416000000000002004b00000c810000c13d0000000402100370000000000202043b000b00000002001d000004250020009c00000c810000213d0000004402100370000000000202043b000a00000002001d000004250020009c00000c810000213d0000008402100370000000000202043b000800000002001d0000006402100370000000000202043b000700000002001d0000002401100370000000000101043b000900000001001d0000000a01000029000000000010043f0000042d01000041000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b000000000101041a000000ff00100190000004210000c13d0000046c01000041000000000010043f00000448010000410000101000010430000000240030008c00000c810000413d0000000002000416000000000002004b00000c810000c13d0000000401100370000000000101043b0000046d0010019800000c810000c13d000004310010009c000000000200003900000001020060390000046e0010009c00000001022061bf000000800020043f00000443010000410000100f0001042e000000440030008c00000c810000413d0000000002000416000000000002004b00000c810000c13d0000000402100370000000000202043b000b00000002001d000004250020009c00000c810000213d0000002401100370000000000201043b000000000002004b0000000001000039000000010100c039000a00000002001d000000000012004b00000c810000c13d00000000010004110000042501100197000900000001001d000000000010043f0000045301000041000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b000000000101041a000000ff00100190000004390000c13d0000000901000029000000710000013d0000000001000416000000000001004b00000c810000c13d000000800000043f00000443010000410000100f0001042e0000000001000416000000000001004b00000c810000c13d00000097010000390000032c0000013d0000000001000416000000000001004b00000c810000c13d0000044201000041000000000101041a0000042501100197000000800010043f00000443010000410000100f0001042e000000240030008c00000c810000413d0000000002000416000000000002004b00000c810000c13d0000000401100370000000000101043b000b00000001001d000004250010009c00000c810000213d0000000001000411100e0d830000040f0000044201000041000000000201041a00000428022001970000000b03000029000000000232019f000000000021041b00000000010000190000100f0001042e0000000001000416000000000001004b00000c810000c13d000000c901000039000000000101041a000000ff001001900000000001000039000000010100c039000000800010043f00000443010000410000100f0001042e000000440030008c00000c810000413d0000000002000416000000000002004b00000c810000c13d0000000402100370000000000302043b0000002401100370000000000101043b000004250010009c00000c810000213d0000000002000411000000000021004b000003d30000c13d0000000001030019100e0e1c0000040f00000000010000190000100f0001042e000000240030008c00000c810000413d0000000002000416000000000002004b00000c810000c13d0000000401100370000000000101043b000004250010009c00000c810000213d000000c002000039000000400020043f000000800000043f000000a00000043f100e0d0f0000040f000b00000001001d000000400100043d000a00000001001d100e0cf20000040f0000000b03000029000000000103041a00000425011001970000000a0200002900000000021204360000000103300039000000000303041a0000000000320435000000400300043d000000000113043600000000020204330000000000210435000004050030009c0000040503008041000000400130021000000461011001c70000100f0001042e0000042901000041000000800010043f0000002001000039000000840010043f000000a40010043f0000046001000041000000c40010043f000004460100004100001010000104300000042901000041000000800010043f0000002001000039000000840010043f0000001001000039000000a40010043f0000042f01000041000000c40010043f00000446010000410000101000010430000000000003004b0000039f0000c13d0000000106000039000004580110019700000001011001bf000000000010041b00000000020600190000000100600190000003a60000613d000000000002004b0000022e0000c13d000004580110019700000101011001bf000000000010041b000a00000006001d000b00000005001d000900000004001d0000009701000039000000000201041a00000428022001970000000006000411000000000262019f000000000021041b0000000001000414000004050010009c0000040501008041000000c00110021000000426011001c70000800d02000039000000030300003900000427040000410000000005000019100e10040000040f000000010020019000000c810000613d0000000a020000290000000b032001af000000000100041a00000470021001970000000100300190000000000102c019000003c30000613d000000000020041b000000ff0310018f0000ff000410019000000000020000390000000102006039000003ca0000c13d000000000003004b0000022e0000c13d000000000004004b000004b00000c13d0000000102000039000004580110019700000001011001bf000000000010041b00000000040200190000000003020019000004b10000013d0000042901000041000000800010043f0000002001000039000000840010043f0000002f01000039000000a40010043f0000046401000041000000c40010043f0000046501000041000000e40010043f0000042c010000410000101000010430000000400100043d000000c902000039000000000302041a000000ff003001900000040c0000c13d00000044021000390000046303000041000000000032043500000024021000390000001403000039000003ef0000013d00000044021000390000042f03000041000000000032043500000024021000390000001003000039000000000032043500000429020000410000000000210435000000040210003900000020030000390000000000320435000004050010009c0000040501008041000000400110021000000430011001c700001010000104300000000001000414000004050010009c0000040501008041000000c00110021000000426011001c70000800d0200003900000003030000390000042704000041100e10040000040f000000010020019000000c810000613d0000009703000039000000000103041a00000428011001970000000b011001af000000000013041b00000000010000190000100f0001042e0000046f03300197000000000032041b00000000020004110000000000210435000004050010009c000004050100804100000040011002100000000002000414000004050020009c0000040502008041000000c002200210000000000112019f00000454011001c70000800d0200003900000001030000390000046204000041100e10040000040f000000010020019000000c810000613d00000000010000190000100f0001042e000000400100043d0000002403100039000000c902000039000000000202041a000000ff00200190000004460000c13d000000200210003900000431040000410000000000420435000000000043043500000024030000390000000000310435000004320010009c000004400000213d0000006003100039000000400030043f0000000b03000029000000040030008c000005dc0000c13d0000000001020433000000000010043f00000001030000310000000002000019000006060000013d000000400100043d000000040200003900000000022104360000045d0300004100000000003204350000045e0010009c000004990000a13d0000045201000041000000000010043f0000004101000039000000040010043f0000043b010000410000101000010430000004290200004100000000002104350000000402100039000000200400003900000000004204350000001002000039000000000023043500000044021000390000042f03000041000003f40000013d0000000b01000029000000000010043f0000006501000039000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b0000000a02000029000000000020043f000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b000000000101041a000000ff001001900000041f0000c13d0000000b01000029000000000010043f0000006501000039000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b0000000a02000029000000000020043f000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b000000000201041a0000046f0220019700000001022001bf000000000021041b0000000001000414000004050010009c0000040501008041000000c00110021000000426011001c70000800d02000039000000040300003900000459040000410000000b050000290000000a0600002900000000070004110000041c0000013d0000004003100039000000400030043f0000000b03000029000000040030008c000004d90000c13d00000001020000390000000103000031000004e90000013d000000400b00043d0000043a0100004100000000001b04350000000401b000390000000a02000029000000000021043500000000010004140000000b02000029000000040020008c0000051e0000c13d0000000103000031000000200030008c000000200400003900000000040340190000054b0000013d0000000004000019000000000004004b0000022e0000c13d0000000100200190000004b90000613d0000000103000039000004580110019700000001011001bf000000000010041b0000012c020000390000044904000041000000000024041b000000c8020000390000044c04000041000000000024041b00000064020000390000044b04000041000000000024041b0000ff000210019000000000040000390000000104006039000000000003004b000004c90000613d000000000002004b0000022e0000613d000000000002004b000006820000613d0000000100400190000006870000c13d0000ff00001001900000068c0000c13d000000ff001001900000022e0000c13d000000c903000039000000000403041a0000046f04400197000000000043041b000004580110019700000001011001bf000000000010041b000006900000013d000004050020009c000004050200804100000040022002100000000001010433000004050010009c00000405010080410000006001100210000000000121019f0000045f011001c70000000b02000029100e10090000040f000000010220018f00030000000103550000006001100270000104050010019d0000040503100197000000000003004b000004f70000c13d0000006001000039000000000002004b000002e10000613d0000000001010433000000000001004b000002e10000613d0000000b01000029100e0d200000040f000000000201041a0000046f022001970000000a03000029000003410000013d0000001f0130003900000471011001970000003f011000390000047105100197000000400100043d0000000005510019000000000015004b00000000060000390000000106004039000004390050009c000004400000213d0000000100600190000004400000c13d000000400050043f000000000731043600000471043001980000001f0530018f00000000034700190000000306000367000005100000613d000000000806034f000000008908043c0000000007970436000000000037004b0000050c0000c13d000000000005004b000004ec0000613d000000000446034f0000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f0000000000430435000004ec0000013d0000040500b0009c000004050200004100000000020b40190000004002200210000004050010009c0000040501008041000000c001100210000000000121019f0000043b011001c70000000b0200002900090000000b001d100e10090000040f00000060031002700000040503300197000000200030008c000000200400003900000000040340190000001f0640018f0000002007400190000000090b00002900000009057000290000053a0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000005360000c13d000000000006004b000005470000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000006640000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000004390010009c000004400000213d0000000100200190000004400000c13d000000400010043f000000200030008c00000c810000413d00000000010b0433000004250010009c00000c810000213d0000000002000411000000000021004b00000bd80000c13d0000000b01000029000000000010043f0000043f01000041000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b0000000a02000029000000000020043f000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b000000000001041b0000000102100039000000000002041b0000000202100039000000000002041b0000000302100039000000000002041b0000000402100039000000000002041b0000000501100039000000000001041b000000400100043d00000020021000390000000a0300002900000000003204350000000b020000290000000000210435000004050010009c000004050100804100000040011002100000000002000414000004050020009c0000040502008041000000c002200210000000000112019f0000042e011001c70000800d02000039000000010300003900000444040000410000041c0000013d000004050020009c000004050200804100000040022002100000000001010433000004050010009c00000405010080410000006001100210000000000121019f00000433011001c70000000b02000029100e10090000040f00000060031002700000040503300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000005b00000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000005ac0000c13d000000000005004b000005bd0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f0003000000010355000000010220015f000000000100043d0000000100200190000008960000c13d000000200030008c000008960000413d000000000001004b000008960000613d000000400100043d00000020021000390000043104000041000000000042043500000024041000390000043405000041000000000054043500000024040000390000000000410435000004320010009c000004400000213d0000006004100039000000400040043f0000000b04000029000000040040008c000006ce0000c13d0000000001020433000000000010043f000000000001004b000006fd0000613d000008960000013d000004050020009c000004050200804100000040022002100000000001010433000004050010009c00000405010080410000006001100210000000000121019f00000433011001c70000000b02000029100e10090000040f00000060031002700000040503300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000005f50000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000005f10000c13d000000000005004b000006020000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f0003000000010355000000010220015f000000000100043d0000000100200190000008960000c13d000000200030008c000008960000413d000000000001004b000008960000613d000000400100043d00000020021000390000043104000041000000000042043500000024041000390000043405000041000000000054043500000024040000390000000000410435000004320010009c000004400000213d0000006004100039000000400040043f0000000b04000029000000040040008c000007100000c13d0000000001020433000000000010043f000000000001004b0000073f0000613d000008960000013d000004050020009c000004050200804100000040022002100000000001010433000004050010009c00000405010080410000006001100210000000000121019f00000433011001c70000000b02000029100e10090000040f00000060031002700000040503300197000000200030008c000000200400003900000000040340190000001f0540018f00000020044001900000063a0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000006360000c13d000000000005004b000006470000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f0003000000010355000000010220015f000000000100043d0000000100200190000008960000c13d000000200030008c000008960000413d000000000001004b000008960000613d000000400100043d00000020021000390000043104000041000000000042043500000024041000390000043405000041000000000054043500000024040000390000000000410435000004320010009c000004400000213d0000006004100039000000400040043f0000000b04000029000000040040008c000007520000c13d0000000001020433000000000010043f0000077f0000013d0000001f0530018f0000043806300198000000400200043d00000000046200190000066f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000066b0000c13d000000000005004b0000067c0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000004050020009c00000405020080410000004002200210000000000112019f0000101000010430000004580110019700000101011001bf000000000010041b0000000100000190000004cd0000613d000004580110019700000001011001bf000000000010041b0000ff0000100190000004cf0000613d000000c903000039000000000403041a0000046f04400197000000000043041b000000000002004b000006940000c13d0000047001100197000000000010041b00000000010004110000042501100197000b00000001001d000000000010043f0000045301000041000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b000000000101041a000000ff00100190000006c70000c13d0000000b01000029000000000010043f0000045301000041000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b000000000201041a0000046f0220019700000001022001bf000000000021041b0000000001000414000004050010009c0000040501008041000000c00110021000000426011001c70000800d020000390000000403000039000004590400004100000000050000190000000b060000290000000007000411100e10040000040f000000010020019000000c810000613d000000090000006b0000041f0000c13d000000000100041a0000047001100197000000000010041b00000000010000190000100f0001042e000004050020009c000004050200804100000040022002100000000001010433000004050010009c00000405010080410000006001100210000000000121019f00000433011001c70000000b02000029100e10090000040f00000060031002700000040503300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000006e70000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000006e30000c13d000000000005004b000006f40000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000006fd0000613d0000001f0030008c000006fd0000a13d000000000100043d000000000001004b000008960000c13d000000400100043d00000020021000390000043104000041000000000042043500000024041000390000043505000041000000000054043500000024040000390000000000410435000004320010009c000004400000213d0000006004100039000000400040043f0000000b04000029000000040040008c000007940000c13d0000000001020433000000000010043f000007bf0000013d000004050020009c000004050200804100000040022002100000000001010433000004050010009c00000405010080410000006001100210000000000121019f00000433011001c70000000b02000029100e10090000040f00000060031002700000040503300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000007290000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000007250000c13d000000000005004b000007360000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f000300000001035500000001002001900000073f0000613d0000001f0030008c0000073f0000a13d000000000100043d000000000001004b000008960000c13d000000400100043d00000020021000390000043104000041000000000042043500000024041000390000043505000041000000000054043500000024040000390000000000410435000004320010009c000004400000213d0000006004100039000000400040043f0000000b04000029000000040040008c000008120000c13d0000000001020433000000000010043f0000083d0000013d000004050020009c000004050200804100000040022002100000000001010433000004050010009c00000405010080410000006001100210000000000121019f00000433011001c70000000b02000029100e10090000040f00000060031002700000040503300197000000200030008c000000200400003900000000040340190000001f0540018f00000020044001900000076b0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000007670000c13d000000000005004b000007780000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000007810000613d0000001f0030008c000007810000a13d000000000100043d000000000001004b000008960000c13d000000400100043d00000020021000390000043104000041000000000042043500000024041000390000043505000041000000000054043500000024040000390000000000410435000004320010009c000004400000213d0000006004100039000000400040043f0000000b04000029000000040040008c000008540000c13d0000000001020433000000000010043f0000087f0000013d000004050020009c000004050200804100000040022002100000000001010433000004050010009c00000405010080410000006001100210000000000121019f00000433011001c70000000b02000029100e10090000040f00000060031002700000040503300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000007ad0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000007a90000c13d000000000005004b000007ba0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000008960000613d000000000100043d000000200030008c000008960000413d000000000001004b000008960000613d00000009010000290000000001010433000900000001001d0000043c0100004100000000001004430000000001000414000004050010009c0000040501008041000000c0011002100000043d011001c70000800b02000039100e10090000040f000000010020019000000bdc0000613d000000000101043b000000090010006b000000d70000413d0000000b01000029000000000010043f0000043f01000041000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b0000000a02000029000000000020043f000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b0000000301100039000000000101041a0000042501100197000000000010043f0000042d01000041000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b000000000101041a000000ff00100190000002e10000613d000000400200043d0000043a010000410000000000120435000900000002001d00000004012000390000000a02000029000000000021043500000000010004140000000b02000029000000040020008c00000ab30000c13d0000000103000031000000200030008c0000002004000039000000000403401900000ade0000013d000004050020009c000004050200804100000040022002100000000001010433000004050010009c00000405010080410000006001100210000000000121019f00000433011001c70000000b02000029100e10090000040f00000060031002700000040503300197000000200030008c000000200400003900000000040340190000001f0540018f00000020044001900000082b0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000008270000c13d000000000005004b000008380000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000008960000613d000000000100043d000000200030008c000008960000413d000000000001004b000008960000613d00000000010004100000042501100197000000400400043d000000240240003900000000001204350000043601000041000000000014043500000000010004110000042502100197000600000004001d0000000401400039000400000002001d000000000021043500000000010004140000000b02000029000000040020008c0000089a0000c13d0000002004000039000008c50000013d000004050020009c000004050200804100000040022002100000000001010433000004050010009c00000405010080410000006001100210000000000121019f00000433011001c70000000b02000029100e10090000040f00000060031002700000040503300197000000200030008c000000200400003900000000040340190000001f0540018f00000020044001900000086d0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000008690000c13d000000000005004b0000087a0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000008960000613d000000000100043d000000200030008c000008960000413d000000000001004b000008960000613d00000000010004100000042501100197000000400400043d000000240240003900000000001204350000043601000041000000000014043500000000010004110000042502100197000600000004001d0000000401400039000400000002001d000000000021043500000000010004140000000b02000029000000040020008c000009a50000c13d0000002004000039000009d00000013d0000046b01000041000000000010043f000004480100004100001010000104300000000602000029000004050020009c00000405020080410000004002200210000004050010009c0000040501008041000000c001100210000000000121019f00000437011001c70000000b02000029100e10090000040f00000060031002700000040503300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000605700029000008b40000613d000000000801034f0000000609000029000000008a08043c0000000009a90436000000000059004b000008b00000c13d000000000006004b000008c10000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000009ec0000613d0000001f01400039000000600110018f0000000604100029000000000014004b00000000020000390000000102004039000500000004001d000004390040009c000004400000213d0000000100200190000004400000c13d0000000502000029000000400020043f000000200030008c00000c810000413d00000006020000290000000002020433000000000002004b0000000004000039000000010400c039000000000042004b00000c810000c13d000000000002004b000009e80000613d0000043a020000410000000504000029000000000024043500000004024000390000000904000029000000000042043500000000020004140000000b04000029000000040040008c000009140000613d0000000501000029000004050010009c00000405010080410000004001100210000004050020009c0000040502008041000000c002200210000000000112019f0000043b011001c70000000b02000029100e10090000040f00000060031002700000040503300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000505700029000009010000613d000000000801034f0000000509000029000000008a08043c0000000009a90436000000000059004b000008fd0000c13d000000000006004b0000090e0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000a9b0000613d0000001f01400039000000600110018f0000000501100029000004390010009c000004400000213d000000400010043f000000200030008c00000c810000413d00000005010000290000000001010433000004250010009c00000c810000213d0000000002000411000000000021004b00000bd80000c13d0000043c0100004100000000001004430000000001000414000004050010009c0000040501008041000000c0011002100000043d011001c70000800b02000039100e10090000040f000000010020019000000bdc0000613d000000000101043b000000080010006b000000d70000413d000000400100043d000600000001001d0000043e0010009c000004400000213d0000000603000029000000c001300039000000400010043f000000a0023000390000000801000029000500000002001d000000000012043500000080023000390000000701000029000300000002001d000000000012043500000060023000390000000a01000029000200000002001d000000000012043500000040023000390000000401000029000100000002001d000000000012043500000020023000390000000901000029000400000002001d00000000001204350000000b010000290000000000130435000000000010043f0000043f01000041000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b0000000902000029000000000020043f000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000060200002900000000020204330000042502200197000000000101043b000000000301041a0000042803300197000000000223019f000000000021041b000000040200002900000000020204330000000103100039000000000023041b0000000102000029000000000202043300000425022001970000000203100039000000000403041a0000042804400197000000000224019f000000000023041b0000000202000029000000000202043300000425022001970000000303100039000000000403041a0000042804400197000000000224019f000000000023041b000000030200002900000000020204330000000403100039000000000023041b000000050110003900000005020000290000000002020433000000000021041b000000400100043d00000080021000390000000803000029000000000032043500000060021000390000000a0300002900000000003204350000004002100039000000070300002900000000003204350000002002100039000000090300002900000000003204350000000b020000290000000000210435000004050010009c000004050100804100000040011002100000000002000414000004050020009c0000040502008041000000c002200210000000000112019f00000440011001c70000800d02000039000000010300003900000441040000410000041c0000013d0000000602000029000004050020009c00000405020080410000004002200210000004050010009c0000040501008041000000c001100210000000000121019f00000437011001c70000000b02000029100e10090000040f00000060031002700000040503300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000605700029000009bf0000613d000000000801034f0000000609000029000000008a08043c0000000009a90436000000000059004b000009bb0000c13d000000000006004b000009cc0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000009f80000613d0000001f01400039000000600110018f0000000604100029000000000014004b00000000020000390000000102004039000500000004001d000004390040009c000004400000213d0000000100200190000004400000c13d0000000502000029000000400020043f000000200030008c00000c810000413d00000006020000290000000002020433000000000002004b0000000004000039000000010400c039000000000042004b00000c810000c13d000000000002004b00000a040000c13d0000046a01000041000000000010043f000004480100004100001010000104300000001f0530018f0000043806300198000000400200043d00000000046200190000066f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000009f30000c13d0000066f0000013d0000001f0530018f0000043806300198000000400200043d00000000046200190000066f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000009ff0000c13d0000066f0000013d0000043a020000410000000504000029000000000024043500000004024000390000000904000029000000000042043500000000020004140000000b04000029000000040040008c00000a3b0000613d0000000501000029000004050010009c00000405010080410000004001100210000004050020009c0000040502008041000000c002200210000000000112019f0000043b011001c70000000b02000029100e10090000040f00000060031002700000040503300197000000200030008c000000200400003900000000040340190000001f0640018f0000002007400190000000050570002900000a280000613d000000000801034f0000000509000029000000008a08043c0000000009a90436000000000059004b00000a240000c13d000000000006004b00000a350000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000aa70000613d0000001f01400039000000600110018f0000000501100029000004390010009c000004400000213d000000400010043f000000200030008c00000c810000413d00000005010000290000000001010433000004250010009c00000c810000213d0000000002000411000000000021004b00000bd80000c13d0000043c0100004100000000001004430000000001000414000004050010009c0000040501008041000000c0011002100000043d011001c70000800b02000039100e10090000040f000000010020019000000bdc0000613d000000000201043b000600000002001d000000080020006b000000d70000413d0000000b01000029000000000010043f0000043f01000041000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b0000000902000029000000000020043f000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000400200043d0000043e0020009c000004400000213d000000000401043b000000c001200039000000400010043f000000000104041a000004250110019700000000011204360000000103400039000000000303041a00000000003104350000000201400039000000000101041a0000042501100197000000400320003900000000001304350000000303400039000000000303041a0000042503300197000000600520003900000000003504350000000403400039000000000303041a00000080052000390000000000350435000000a0022000390000000504400039000000000404041a0000000000420435000000060040006c00000bdd0000a13d000000070030006c00000bdd0000813d0000000002000411000000000021004b00000bdd0000c13d0000046801000041000000000010043f000000040030043f0000043b0100004100001010000104300000001f0530018f0000043806300198000000400200043d00000000046200190000066f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000aa20000c13d0000066f0000013d0000001f0530018f0000043806300198000000400200043d00000000046200190000066f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000aae0000c13d0000066f0000013d0000000902000029000004050020009c00000405020080410000004002200210000004050010009c0000040501008041000000c001100210000000000121019f0000043b011001c70000000b02000029100e10090000040f00000060031002700000040503300197000000200030008c000000200400003900000000040340190000001f0640018f0000002007400190000000090570002900000acd0000613d000000000801034f0000000909000029000000008a08043c0000000009a90436000000000059004b00000ac90000c13d000000000006004b00000ada0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000b2e0000613d0000001f01400039000000600210018f0000000901200029000000000021004b00000000020000390000000102004039000004390010009c000004400000213d0000000100200190000004400000c13d000000400010043f000000200030008c00000c810000413d00000009010000290000000001010433000004250010009c00000c810000213d00000008020000290000000002020433000000000112013f000004250010019800000b3a0000c13d0000000b01000029000000000010043f0000043f01000041000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b0000000a02000029000000000020043f000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b000000000001041b0000000102100039000000000002041b0000000202100039000000000002041b0000000302100039000000000002041b0000000402100039000000000002041b0000000501100039000000000001041b0000044901000041000000000301041a0000000701000029000000000101043300000000021300a9000000000001004b00000b240000613d00000000041200d9000000000034004b00000b280000c13d0005271000200122000000050110006c000900000001001d00000b3e0000813d0000045201000041000000000010043f0000001101000039000000040010043f0000043b0100004100001010000104300000001f0530018f0000043806300198000000400200043d00000000046200190000066f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000b350000c13d0000066f0000013d0000044701000041000000000010043f000004480100004100001010000104300000000b01000029000000000010043f0000044a01000041000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b0000000101100039000000000101041a000000000001004b00000c4b0000c13d00000007010000290000000001010433000000000001004b00000c830000c13d000400000000001d0000000402000029000400000002001d00000005042000690000044201000041000000000201041a00000006010000290000000001010433000004250110019700000425032001970000000002000411100e0e6d0000040f0000000402000029000000090020002a00000b280000413d000000040200002900000009042000290000000801000029000000000201043300000006010000290000000001010433000004250110019700000425032001970000000002000411100e0e6d0000040f0000000801000029000000000101043300000007020000290000000002020433000000060300002900000000030304330000042503300197000000400400043d000000a00540003900000000003504350000008003400039000000000023043500000425011001970000004002400039000000000012043500000020014000390000000a0200002900000000002104350000000b010000290000000000140435000000000100041100000425021001970000006001400039000900000002001d0000000000210435000004050040009c000004050400804100000040014002100000000002000414000004050020009c0000040502008041000000c002200210000000000112019f0000044d011001c70000800d0200003900000001030000390000044e04000041100e10040000040f000000010020019000000c810000613d00000008010000290000000001010433000800000001001d0000044f0100004100000000001004430000000b0100002900000004001004430000000001000414000004050010009c0000040501008041000000c00110021000000450011001c70000800202000039100e10090000040f000000010020019000000bdc0000613d000000000101043b000000000001004b00000c810000613d00000008010000290000042501100197000000400400043d00000044024000390000000a03000029000000000032043500000024024000390000000903000029000000000032043500000451020000410000000000240435000800000004001d0000000402400039000900000002001d000000000012043500000000010004140000000b02000029000000040020008c00000c970000c13d0000000801000029000004390010009c000004400000213d0000000802000029000000400020043f0000043a0100004100000000001204350000000a01000029000000090200002900000000001204350000000103000031000000200030008c000000200400003900000000040340190000001f01400039000000600110018f0000000801100029000004390010009c000004400000213d000000400010043f000000200030008c00000c810000413d00000008010000290000000001010433000004250010009c00000c810000213d0000000002000411000000000021004b0000041f0000613d0000046701000041000000000010043f00000448010000410000101000010430000000000001042f000000400100043d000600000001001d0000043e0010009c000004400000213d0000000603000029000000c001300039000000400010043f000000a0023000390000000801000029000500000002001d000000000012043500000080023000390000000701000029000300000002001d000000000012043500000060023000390000000a01000029000200000002001d000000000012043500000040023000390000000401000029000100000002001d000000000012043500000020023000390000000901000029000400000002001d00000000001204350000000b010000290000000000130435000000000010043f0000043f01000041000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b0000000902000029000000000020043f000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000060200002900000000020204330000042502200197000000000101043b000000000301041a0000042803300197000000000223019f000000000021041b000000040200002900000000020204330000000103100039000000000023041b0000000102000029000000000202043300000425022001970000000203100039000000000403041a0000042804400197000000000224019f000000000023041b0000000202000029000000000202043300000425022001970000000303100039000000000403041a0000042804400197000000000224019f000000000023041b000000030200002900000000020204330000000403100039000000000023041b000000050110003900000005020000290000000002020433000000000021041b000000400100043d00000080021000390000000803000029000000000032043500000060021000390000000a0300002900000000003204350000004002100039000000070300002900000000003204350000002002100039000000090300002900000000003204350000000b020000290000000000210435000004050010009c0000040501008041000000400110021000000000020004140000099c0000013d00000007010000290000000001010433000400000001001d0000000b01000029000000000010043f0000044a01000041000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b0000000101100039000000000201041a00000004012000b9000000040000006b00000c640000613d00000004031000fa000000000023004b00000b280000c13d000027100210011a000400000002001d000900090020007300000b280000413d00000006010000290000000001010433000300000001001d0000000b01000029000000000010043f0000044a01000041000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000c810000613d000000000101043b000000000201041a00000003010000290000042501100197000004250320019700000000020004110000000404000029100e0e6d0000040f00000b500000013d000000000100001900001010000104300000044b02000041000000000302041a00000000021300a900000000041200d9000000000034004b00000b280000c13d0000044c03000041000000000403041a00000000031400a900000000011300d9000000000041004b00000b280000c13d000027100130011a0000000503100029000027100120011a000500000003001d000400000001001d000000000031004b00000b280000213d00000b550000013d0000000802000029000004050020009c00000405020080410007004000200218000004050010009c0000040501008041000000c00110021000000007011001af00000430011001c70000000b02000029100e10040000040f0000006003100270000104050030019d0003000000010355000000010020019000000ce50000613d0000000801000029000004390010009c000004400000213d0000000802000029000000400020043f0000043a0100004100000000001204350000000a01000029000000090200002900000000001204350000000001000414000004050010009c0000040501008041000000c00110021000000007011001af0000043b011001c70000000b02000029100e10090000040f00000060031002700000040503300197000000200030008c000000200400003900000000040340190000001f0640018f0000002007400190000000080570002900000cc80000613d000000000801034f0000000809000029000000008a08043c0000000009a90436000000000059004b00000cc40000c13d000000000006004b00000cd50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000bc90000c13d0000001f0530018f0000043806300198000000400200043d00000000046200190000066f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000ce00000c13d0000066f0000013d00000405033001970000001f0530018f0000043806300198000000400200043d00000000046200190000066f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000ced0000c13d0000066f0000013d000004720010009c00000cf70000813d0000004001100039000000400010043f000000000001042d0000045201000041000000000010043f0000004101000039000000040010043f0000043b0100004100001010000104300000001f0220003900000471022001970000000001120019000000000021004b00000000020000390000000102004039000004390010009c00000d090000213d000000010020019000000d090000c13d000000400010043f000000000001042d0000045201000041000000000010043f0000004101000039000000040010043f0000043b0100004100001010000104300000042501100197000000000010043f0000044a01000041000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000d1e0000613d000000000101043b000000000001042d000000000100001900001010000104300000042501100197000000000010043f0000042d01000041000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000d2f0000613d000000000101043b000000000001042d000000000100001900001010000104300000042502200197000000000020043f000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000d3f0000613d000000000101043b000000000001042d00000000010000190000101000010430000000000010043f0000006501000039000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000d510000613d000000000101043b0000000101100039000000000101041a000000000001042d00000000010000190000101000010430000000000003004b00000d5d0000613d000000000400001900000000052400190000000006140019000000000606043300000000006504350000002004400039000000000034004b00000d560000413d00000000012300190000000000010435000000000001042d0000000031010434000000000001004b00000d6b0000613d000000000400001900000000052400190000000006430019000000000606043300000000006504350000002004400039000000000014004b00000d640000413d00000000012100190000000000010435000000000001042d00000020030000390000000004310436000000003202043400000000002404350000004001100039000000000002004b00000d7d0000613d000000000400001900000000051400190000000006430019000000000606043300000000006504350000002004400039000000000024004b00000d760000413d000000000312001900000000000304350000001f0220003900000471022001970000000001210019000000000001042d00040000000000020000042501100197000400000001001d000000000010043f0000045301000041000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000d970000613d000000000101043b000000000101041a000000ff0010019000000d990000613d000000000001042d000000000100001900001010000104300000000401000029100e0f640000040f000200000001001d0000000001000019100e0fad0000040f000000400400043d000400000004001d000000200240003900000456030000410000000000320435000300000001001d00000002010000290000000013010434000100000003001d0000003702400039000200000002001d100e0d530000040f000000010200002900000002012000290000045702000041000000000021043500000011021000390000000301000029100e0d600000040f00000004030000290000000002310049000000200120008a00000000001304350000000001030019100e0cfd0000040f0000042901000041000000400200043d000300000002001d000000000012043500000004012000390000000402000029100e0d6e0000040f00000003020000290000000001210049000004050010009c00000405010080410000006001100210000004050020009c00000405020080410000004002200210000000000121019f00001010000104300004000000000002000400000002001d000300000001001d000000000010043f0000006501000039000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000deb0000613d000000000101043b00000004020000290000042502200197000400000002001d000000000020043f000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000deb0000613d000000000101043b000000000101041a000000ff0010019000000ded0000613d000000000001042d000000000100001900001010000104300000000401000029100e0f640000040f000200000001001d0000000301000029100e0fad0000040f000000400400043d000400000004001d000000200240003900000456030000410000000000320435000300000001001d00000002010000290000000013010434000100000003001d0000003702400039000200000002001d100e0d530000040f000000010200002900000002012000290000045702000041000000000021043500000011021000390000000301000029100e0d600000040f00000004030000290000000002310049000000200120008a00000000001304350000000001030019100e0cfd0000040f0000042901000041000000400200043d000300000002001d000000000012043500000004012000390000000402000029100e0d6e0000040f00000003020000290000000001210049000004050010009c00000405010080410000006001100210000004050020009c00000405020080410000004002200210000000000121019f00001010000104300002000000000002000100000002001d000200000001001d000000000010043f0000006501000039000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000e6b0000613d000000000101043b00000001020000290000042502200197000100000002001d000000000020043f000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000e6b0000613d000000000101043b000000000101041a000000ff0010019000000e6a0000613d0000000201000029000000000010043f0000006501000039000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000e6b0000613d000000000101043b0000000102000029000000000020043f000000200010043f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f000000010020019000000e6b0000613d000000000101043b000000000201041a0000046f02200197000000000021041b0000000001000414000004050010009c0000040501008041000000c00110021000000426011001c70000800d0200003900000004030000390000000007000411000004730400004100000002050000290000000106000029100e10040000040f000000010020019000000e6b0000613d000000000001042d000000000100001900001010000104300004000000000002000000400500043d0000006406500039000000000046043500000425033001970000004404500039000000000034043500000020035000390000047404000041000000000043043500000425022001970000002404500039000000000024043500000064020000390000000000250435000004750050009c00000f440000813d000000a00b5000390000004000b0043f00000000040504330000000002000414000004250a1001970000000400a0008c00000eae0000c13d000000010100003200000ee90000613d0000001f0310003900000471033001970000003f0330003900000471043001970000000003b40019000000000043004b00000000040000390000000104004039000004390030009c00000f440000213d000000010040019000000f440000c13d000000400030043f00000000001b043500000471021001980000001f0310018f000000c0055000390000000001250019000000030400036700000ea00000613d000000000604034f000000006706043c0000000005750436000000000015004b00000e9c0000c13d000000000003004b00000eea0000613d000000000224034f0000000303300210000000000401043300000000043401cf000000000434022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000242019f000000000021043500000eea0000013d000004050030009c00000405030080410000004001300210000004050040009c00000405040080410000006003400210000000000113019f000004050020009c0000040502008041000000c002200210000000000121019f00020000000a001d00000000020a0019100e10040000040f00030000000103550000006003100270000104050030019d000004050430019800000f0c0000613d0000001f0340003900000476033001970000003f033000390000047703300197000000400b00043d00000000033b00190000000000b3004b00000000050000390000000105004039000004390030009c000000020a00002900000f440000213d000000010050019000000f440000c13d000000400030043f0000001f0540018f00000000034b04360000043806400198000000000463001900000edb0000613d000000000701034f0000000008030019000000007907043c0000000008980436000000000048004b00000ed70000c13d000000000005004b00000f0f0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f000000000014043500000f0f0000013d000000600b0000390000000002000415000000040220008a000000050220021000000000010b0433000000000001004b00000f170000c13d00010000000b001d00020000000a001d0000044f010000410000000000100443000000040100003900000004001004430000000001000414000004050010009c0000040501008041000000c00110021000000450011001c70000800202000039100e10090000040f000000010020019000000f550000613d0000000002000415000000040220008a0000000502200210000000000101043b000000000001004b000000010b00002900000f2e0000c13d0000047901000041000000000010043f0000000401000039000000040010043f0000043b010000410000101000010430000000600b0000390000008003000039000000020a00002900000000010b0433000000010020019000000f4f0000613d0000000002000415000000030220008a0000000502200210000000000001004b00000f1a0000613d000000050220027000000000020b001f00000f340000013d00010000000b001d0000044f0100004100000000001004430000000400a004430000000001000414000004050010009c0000040501008041000000c00110021000000450011001c70000800202000039100e10090000040f000000010020019000000f550000613d0000000002000415000000030220008a0000000502200210000000000101043b000000000001004b000000010b00002900000f5e0000613d00000000010b0433000000050220027000000000020b001f000000000001004b000000020a00002900000f410000613d0000047a0010009c00000f420000213d0000001f0010008c00000f420000a13d0000002001b000390000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000f420000c13d000000000001004b00000f4a0000613d000000000001042d000000000100001900001010000104300000045201000041000000000010043f0000004101000039000000040010043f0000043b0100004100001010000104300000047b01000041000000000010043f0000000400a0043f0000043b010000410000101000010430000000000001004b00000f560000c13d0000047801000041000000000010043f00000448010000410000101000010430000000000001042f000004050030009c00000405030080410000004002300210000004050010009c00000405010080410000006001100210000000000121019f00001010000104300000047901000041000000000010043f0000000201000029000000040010043f0000043b0100004100001010000104300000000002010019000000400100043d000004660010009c00000f970000813d0000006004100039000000400040043f0000002a030000390000000003310436000000000500003100000002055003670000000006030019000000005705043c0000000006760436000000000046004b00000f6f0000c13d00000000040304330000047c044001970000047d044001c70000000000430435000000210410003900000000050404330000047c055001970000047e055001c70000000000540435000000290400003900000000050200190000000002010433000000000042004b00000f910000a13d000000000234001900000000060204330000047c066001970000000307500210000000780770018f0000047f0770021f0000048007700197000000000676019f00000000006204350000000402500270000000010440008a000000010040008c00000f7d0000213d000000100050008c00000f9d0000813d000000000001042d0000045201000041000000000010043f0000003201000039000000040010043f0000043b0100004100001010000104300000045201000041000000000010043f0000004101000039000000040010043f0000043b010000410000101000010430000000400100043d0000004402100039000004810300004100000000003204350000042902000041000000000021043500000024021000390000002003000039000000000032043500000004021000390000000000320435000004050010009c0000040501008041000000400110021000000430011001c700001010000104300000000002010019000000400100043d000004820010009c00000fe00000813d0000008004100039000000400040043f00000042030000390000000003310436000000000500003100000002055003670000000006030019000000005705043c0000000006760436000000000046004b00000fb80000c13d00000000040304330000047c044001970000047d044001c70000000000430435000000210410003900000000050404330000047c055001970000047e055001c70000000000540435000000410400003900000000050200190000000002010433000000000042004b00000fda0000a13d000000000234001900000000060204330000047c066001970000000307500210000000780770018f0000047f0770021f0000048007700197000000000676019f00000000006204350000000402500270000000010440008a000000010040008c00000fc60000213d000000100050008c00000fe60000813d000000000001042d0000045201000041000000000010043f0000003201000039000000040010043f0000043b0100004100001010000104300000045201000041000000000010043f0000004101000039000000040010043f0000043b010000410000101000010430000000400100043d0000004402100039000004810300004100000000003204350000042902000041000000000021043500000024021000390000002003000039000000000032043500000004021000390000000000320435000004050010009c0000040501008041000000400110021000000430011001c70000101000010430000000000001042f0000000001000414000004050010009c0000040501008041000000c0011002100000042e011001c70000801002000039100e10090000040f0000000100200190000010020000613d000000000101043b000000000001042d0000000001000019000010100001043000001007002104210000000102000039000000000001042d0000000002000019000000000001042d0000100c002104230000000102000039000000000001042d0000000002000019000000000001042d0000100e000004320000100f0001042e000010100001043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0000000200000000000000000000000000000040000001000000000000000000000000000000000000000000000000000000000000000000000000007c4f869c00000000000000000000000000000000000000000000000000000000a217fdde00000000000000000000000000000000000000000000000000000000e8e7f7ff00000000000000000000000000000000000000000000000000000000e8e7f80000000000000000000000000000000000000000000000000000000000ef25131f00000000000000000000000000000000000000000000000000000000f2fde38b00000000000000000000000000000000000000000000000000000000a217fddf00000000000000000000000000000000000000000000000000000000d547741f00000000000000000000000000000000000000000000000000000000d5dff21b000000000000000000000000000000000000000000000000000000008da5cb5a000000000000000000000000000000000000000000000000000000008da5cb5b000000000000000000000000000000000000000000000000000000008de932220000000000000000000000000000000000000000000000000000000091d14854000000000000000000000000000000000000000000000000000000007c4f869d000000000000000000000000000000000000000000000000000000008129fc1c000000000000000000000000000000000000000000000000000000008456cb590000000000000000000000000000000000000000000000000000000036568abd00000000000000000000000000000000000000000000000000000000534085d500000000000000000000000000000000000000000000000000000000534085d6000000000000000000000000000000000000000000000000000000005c975abb00000000000000000000000000000000000000000000000000000000715018a60000000000000000000000000000000000000000000000000000000036568abe000000000000000000000000000000000000000000000000000000003ab1a494000000000000000000000000000000000000000000000000000000003f4ba83a00000000000000000000000000000000000000000000000000000000248a9ca200000000000000000000000000000000000000000000000000000000248a9ca3000000000000000000000000000000000000000000000000000000002f2ff15d0000000000000000000000000000000000000000000000000000000030d502200000000000000000000000000000000000000000000000000000000001ffc9a700000000000000000000000000000000000000000000000000000000225be997000000000000000000000000ffffffffffffffffffffffffffffffffffffffff02000000000000000000000000000000000000000000000000000000000000008be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0ffffffffffffffffffffffff000000000000000000000000000000000000000008c379a0000000000000000000000000000000000000000000000000000000004f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008400000080000000000000000062b0fa3591d9723f793b0f5e3da9c9ce7fdee42e011e252bff8ced736a456c0502000000000000000000000000000000000000400000000000000000000000005061757361626c653a2070617573656400000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000001ffc9a700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff9f0000000000007530000000000000000000000000000000000000000000000000ffffffff0000000000000000000000000000000000000000000000000000000080ac58cd00000000000000000000000000000000000000000000000000000000e985e9c500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000000000000000000000000000ffffffffffffffff6352211e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d955391320200000200000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff3f62b0fa3591d9723f793b0f5e3da9c9ce7fdee42e011e252bff8ced736a456c0002000000000000000000000000000000000000a00000000000000000000000005da15bcf9a12716389be78c088f9d023c836ff4164b59fd775d594f0a95a40bd62b0fa3591d9723f793b0f5e3da9c9ce7fdee42e011e252bff8ced736a456c04000000000000000000000000000000000000002000000080000000000000000050efa52f6a32fbeb71d22099d876aa0560656c3a99c2c5207dbbbdb2e7875464000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000640000008000000000000000005ec8235100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000062b0fa3591d9723f793b0f5e3da9c9ce7fdee42e011e252bff8ced736a456c0162b0fa3591d9723f793b0f5e3da9c9ce7fdee42e011e252bff8ced736a456c0662b0fa3591d9723f793b0f5e3da9c9ce7fdee42e011e252bff8ced736a456c0262b0fa3591d9723f793b0f5e3da9c9ce7fdee42e011e252bff8ced736a456c0302000000000000000000000000000000000000c0000000000000000000000000bcb5c1b34d5f70186a88f62baa4e7c60ee064ee8499a598ce9c71bd0ad0acefc1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b83020000020000000000000000000000000000002400000000000000000000000042842e0e000000000000000000000000000000000000000000000000000000004e487b7100000000000000000000000000000000000000000000000000000000ffdfc1249c027f9191656349feb0761381bb32c9f557e01f419fd08754bf5a1b020000000000000000000000000000000000002000000000000000000000000062e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258416363657373436f6e74726f6c3a206163636f756e7420000000000000000000206973206d697373696e6720726f6c6520000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00002f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d647920696e697469616c697a6564000000000000000000000000000000000000496e697469616c697a61626c653a20636f6e747261637420697320616c726561000000000000000000000000000000000000008400000000000000000000000006fdde0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffbf0000000000030d400000000000000000000000000000000000000000000000004f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657200000000000000000000000000000000000000400000000000000000000000005db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa5061757361626c653a206e6f7420706175736564000000000000000000000000416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c660000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffa030cd7471000000000000000000000000000000000000000000000000000000009519898700000000000000000000000000000000000000000000000000000000b867701e00000000000000000000000000000000000000000000000000000000c19f17a900000000000000000000000000000000000000000000000000000000849083850000000000000000000000000000000000000000000000000000000042056bee0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7965db0b00000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffffc0f6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b23b872dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff6000000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000003ffffffe01425ea42000000000000000000000000000000000000000000000000000000009996b315000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5274afe70000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3000000000000000000000000000000000000000000000000000000000000000780000000000000000000000000000000000000000000000000000000000000030313233343536373839616263646566000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000537472696e67733a20686578206c656e67746820696e73756666696369656e74000000000000000000000000000000000000000000000000ffffffffffffff800000000000000000000000000000000000000000000000000000000000000000c9c6af57b3d3aebffadc61a8e85d9c56e0859d4074541e1dae96382f80956deb
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.