ERC-721
Overview
Max Total Supply
0 TWP
Holders
1,169
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 TWPLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TinyWolf
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-10 */ /** *Submitted for verification at Etherscan.io on 2022-04-05 */ // File: contracts/interfaces/ILayerZeroUserApplicationConfig.sol pragma solidity >=0.5.0; interface ILayerZeroUserApplicationConfig { // @notice set the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _configType - type of configuration. every messaging library has its own convention. // @param _config - configuration in the bytes. can encode arbitrary content. function setConfig( uint16 _version, uint16 _chainId, uint256 _configType, bytes calldata _config ) external; // @notice set the send() LayerZero messaging library version to _version // @param _version - new messaging library version function setSendVersion(uint16 _version) external; // @notice set the lzReceive() LayerZero messaging library version to _version // @param _version - new messaging library version function setReceiveVersion(uint16 _version) external; // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload // @param _srcChainId - the chainId of the source chain // @param _srcAddress - the contract address of the source contract at the source chain function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external; } // File: contracts/interfaces/ILayerZeroEndpoint.sol pragma solidity >=0.5.0; interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig { // @notice send a LayerZero message to the specified address at a LayerZero endpoint. // @param _dstChainId - the destination chain identifier // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains // @param _payload - a custom bytes payload to send to the destination contract // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination function send( uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams ) external payable; // @notice used by the messaging library to publish verified payload // @param _srcChainId - the source chain identifier // @param _srcAddress - the source contract (as bytes) at the source chain // @param _dstAddress - the address on destination chain // @param _nonce - the unbound message ordering nonce // @param _gasLimit - the gas limit for external contract execution // @param _payload - verified payload to send to the destination contract function receivePayload( uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint256 _gasLimit, bytes calldata _payload ) external; // @notice get the inboundNonce of a receiver from a source chain which could be EVM or non-EVM chain // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64); // @notice get the outboundNonce from this source chain which, consequently, is always an EVM // @param _srcAddress - the source chain contract address function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64); // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery // @param _dstChainId - the destination chain identifier // @param _userApplication - the user app address on this EVM chain // @param _payload - the custom message to send over LayerZero // @param _payInZRO - if false, user app pays the protocol fee in native token // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain function estimateFees( uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam ) external view returns (uint256 nativeFee, uint256 zroFee); // @notice get this Endpoint's immutable source identifier function getChainId() external view returns (uint16); // @notice the interface to retry failed message on this Endpoint destination // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address // @param _payload - the payload to be retried function retryPayload( uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload ) external; // @notice query if any STORED payload (message blocking) at the endpoint. // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool); // @notice query if the _libraryAddress is valid for sending msgs. // @param _userApplication - the user app address on this EVM chain function getSendLibraryAddress(address _userApplication) external view returns (address); // @notice query if the _libraryAddress is valid for receiving msgs. // @param _userApplication - the user app address on this EVM chain function getReceiveLibraryAddress(address _userApplication) external view returns (address); // @notice query if the non-reentrancy guard for send() is on // @return true if the guard is on. false otherwise function isSendingPayload() external view returns (bool); // @notice query if the non-reentrancy guard for receive() is on // @return true if the guard is on. false otherwise function isReceivingPayload() external view returns (bool); // @notice get the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _userApplication - the contract address of the user application // @param _configType - type of configuration. every messaging library has its own convention. function getConfig( uint16 _version, uint16 _chainId, address _userApplication, uint256 _configType ) external view returns (bytes memory); // @notice get the send() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getSendVersion(address _userApplication) external view returns (uint16); // @notice get the lzReceive() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getReceiveVersion(address _userApplication) external view returns (uint16); } // File: contracts/interfaces/ILayerZeroReceiver.sol pragma solidity >=0.5.0; interface ILayerZeroReceiver { // @notice LayerZero endpoint will invoke this function to deliver the message on the destination // @param _srcChainId - the source endpoint identifier // @param _srcAddress - the source sending contract address from the source chain // @param _nonce - the ordered message nonce // @param _payload - the signed payload is the UA bytes has encoded to be sent function lzReceive( uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload ) external; } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "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] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @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 Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @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 Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_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 { _transferOwnership(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" ); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @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://diligence.consensys.net/posts/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.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @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, it is bubbled up by this * function (like regular Solidity function calls). * * 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. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @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`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}( data ); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) 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 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); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @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 ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @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`, 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 be 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: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * 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 Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @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); /** * @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; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require( owner != address(0), "ERC721: balance query for the zero address" ); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require( owner != address(0), "ERC721: owner query for nonexistent token" ); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require( _exists(tokenId), "ERC721: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _safeTransfer(from, to, tokenId, _data); } /** * @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. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require( _exists(tokenId), "ERC721: operator query for nonexistent token" ); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require( ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own" ); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert( "ERC721: transfer to non ERC721Receiver implementer" ); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: contracts/NonblockingReceiver.sol pragma solidity ^0.8.6; abstract contract NonblockingReceiver is Ownable, ILayerZeroReceiver { ILayerZeroEndpoint internal endpoint; struct FailedMessages { uint256 payloadLength; bytes32 payloadHash; } mapping(uint16 => mapping(bytes => mapping(uint256 => FailedMessages))) public failedMessages; mapping(uint16 => bytes) public trustedRemoteLookup; event MessageFailed( uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload ); function lzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) external override { require(msg.sender == address(endpoint)); // boilerplate! lzReceive must be called by the endpoint for security require( _srcAddress.length == trustedRemoteLookup[_srcChainId].length && keccak256(_srcAddress) == keccak256(trustedRemoteLookup[_srcChainId]), "NonblockingReceiver: invalid source sending contract" ); // try-catch all errors/exceptions // having failed messages does not block messages passing try this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload) { // do nothing } catch { // error / exception failedMessages[_srcChainId][_srcAddress][_nonce] = FailedMessages( _payload.length, keccak256(_payload) ); emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload); } } function onLzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) public { // only internal transaction require( msg.sender == address(this), "NonblockingReceiver: caller must be Bridge." ); // handle incoming message _LzReceive(_srcChainId, _srcAddress, _nonce, _payload); } // abstract function function _LzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) internal virtual; function _lzSend( uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _txParam ) internal { endpoint.send{value: msg.value}( _dstChainId, trustedRemoteLookup[_dstChainId], _payload, _refundAddress, _zroPaymentAddress, _txParam ); } function retryMessage( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes calldata _payload ) external payable { // assert there is message to retry FailedMessages storage failedMsg = failedMessages[_srcChainId][ _srcAddress ][_nonce]; require( failedMsg.payloadHash != bytes32(0), "NonblockingReceiver: no stored message" ); require( _payload.length == failedMsg.payloadLength && keccak256(_payload) == failedMsg.payloadHash, "LayerZero: invalid payload" ); // clear the stored message failedMsg.payloadLength = 0; failedMsg.payloadHash = bytes32(0); // execute the message. revert if it fails again this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload); } function setTrustedRemote(uint16 _chainId, bytes calldata _trustedRemote) external onlyOwner { trustedRemoteLookup[_chainId] = _trustedRemote; } } // File: contracts/TinyWolf.sol pragma solidity ^0.8.7; contract TinyWolf is Ownable, ERC721, NonblockingReceiver { using Strings for uint256; address public _owner; string private baseURI; string public uriSuffix = ".json"; string public hiddenMetadataUri; uint256 public nextTokenId = 0; uint256 public MAX_MINT = 3333; uint256 public maxWalletLimit = 3; uint256 gasForDestinationLzReceive = 350000; bool public revealed = false; constructor() ERC721("Tiny Wolf", "TWP") { _owner = msg.sender; setHiddenMetadataUri("https://ipfs.io/ipfs/QmYFLLCxYGQX44Ye3J7oJGkveRjVcNpfnM4YBLfpi1Gw1N/hidden.json"); } // mint function // you can choose to mint 1 or 2 // mint is free, but payments are accepted function mint(uint8 numTokens) external payable { require(numTokens <= maxWalletLimit, "Tiny Wolf: Max NFTs per transaction limit reached"); require(numTokens + balanceOf(msg.sender) <= maxWalletLimit, "Tiny Wolf: Max wallet limit reached"); require( nextTokenId + numTokens <= MAX_MINT, "Mint exceeds supply" ); uint256 supply = nextTokenId; nextTokenId += numTokens; for(uint256 i = 1; i <= numTokens; i++) { _safeMint(msg.sender, supply + i); } } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require( _exists(_tokenId), "ERC721Metadata: URI query for nonexistent token" ); if (revealed == false) { return hiddenMetadataUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : ""; } function setStartingIndex(uint256 _state) public onlyOwner { require(nextTokenId == 0, "Starting index cannot be set after minting is started!"); nextTokenId = _state; } function setMaxMint(uint256 _state) public onlyOwner { require(_state > nextTokenId, "Invalid max mint number"); MAX_MINT = _state; } function setRevealed(bool _state) public onlyOwner { revealed = _state; } function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner { hiddenMetadataUri = _hiddenMetadataUri; } // This function transfers the nft from your address on the // source chain to the same address on the destination chain function traverseChains(uint16 _chainId, uint256 tokenId) public payable { require( msg.sender == ownerOf(tokenId), "You must own the token to traverse" ); require( trustedRemoteLookup[_chainId].length > 0, "This chain is currently unavailable for travel" ); // burn NFT, eliminating it from circulation on src chain _burn(tokenId); // abi.encode() the payload with the values to send bytes memory payload = abi.encode(msg.sender, tokenId); // encode adapterParams to specify more gas for the destination uint16 version = 1; bytes memory adapterParams = abi.encodePacked( version, gasForDestinationLzReceive ); // get the fees we need to pay to LayerZero + Relayer to cover message delivery // you will be refunded for extra gas paid (uint256 messageFee, ) = endpoint.estimateFees( _chainId, address(this), payload, false, adapterParams ); require( msg.value >= messageFee, "msg.value not enough to cover messageFee. Send gas for message fees" ); endpoint.send{value: msg.value}( _chainId, // destination chainId trustedRemoteLookup[_chainId], // destination address of nft contract payload, // abi.encoded()'ed bytes payable(msg.sender), // refund address address(0x0), // 'zroPaymentAddress' unused for this adapterParams // txParameters ); } function setEndpoint(address _layerZeroEndpoint) external onlyOwner { endpoint = ILayerZeroEndpoint(_layerZeroEndpoint); } function setBaseURI(string memory URI) external onlyOwner { baseURI = URI; } function setMaxLimit(uint256 _limit) external onlyOwner { maxWalletLimit = _limit; } function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } function donate() external payable { // thank you } // This allows the devs to receive kind donations function withdraw(uint256 amt) external onlyOwner { (bool sent, ) = payable(_owner).call{value: amt}(""); require(sent, "Failed to withdraw Ether"); } // just in case this fixed variable limits us from future integrations function setGasForDestinationLzReceive(uint256 newVal) external onlyOwner { gasForDestinationLzReceive = newVal; } // ------------------ // Internal Functions // ------------------ function _LzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) internal override { // decode (address toAddr, uint256 tokenId) = abi.decode( _payload, (address, uint256) ); // mint the tokens back into existence on destination chain _safeMint(toAddr, tokenId); } function _baseURI() internal view override returns (string memory) { return baseURI; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"MessageFailed","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"donate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"failedMessages","outputs":[{"internalType":"uint256","name":"payloadLength","type":"uint256"},{"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxWalletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"numTokens","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"onLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_layerZeroEndpoint","type":"address"}],"name":"setEndpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVal","type":"uint256"}],"name":"setGasForDestinationLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setMaxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"setStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"bytes","name":"_trustedRemote","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"traverseChains","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040526005608081905264173539b7b760d91b60a09081526200002891600c9190620001e7565b506000600e55610d05600f556003601055620557306011556012805460ff191690553480156200005757600080fd5b50604051806040016040528060098152602001682a34b73c902bb7b63360b91b8152506040518060400160405280600381526020016205457560ec1b815250620000b0620000aa6200011b60201b60201c565b6200011f565b8151620000c5906001906020850190620001e7565b508051620000db906002906020840190620001e7565b5050600a80546001600160a01b03191633179055506040805160808101909152604f8082526200011591906200327460208301396200016f565b620002ca565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b03163314620001ce5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b8051620001e390600d906020840190620001e7565b5050565b828054620001f5906200028d565b90600052602060002090601f01602090048101928262000219576000855562000264565b82601f106200023457805160ff191683800117855562000264565b8280016001018555821562000264579182015b828111156200026457825182559160200191906001019062000247565b506200027292915062000276565b5090565b5b8082111562000272576000815560010162000277565b600181811c90821680620002a257607f821691505b60208210811415620002c457634e487b7160e01b600052602260045260246000fd5b50919050565b612f9a80620002da6000396000f3fe6080604052600436106102505760003560e01c806375794a3c11610139578063bf8bcee4116100b6578063e0a808531161007a578063e0a80853146106f0578063e985e9c514610710578063eb8d72b714610759578063ed88c68e14610275578063f0292a0314610779578063f2fde38b1461078f57600080fd5b8063bf8bcee41461066a578063c87b56dd1461068a578063cf89fa03146106aa578063d1deba1f146106bd578063dbbb4155146106d057600080fd5b806395d89b41116100fd57806395d89b41146105e0578063a22cb465146105f5578063a45ba8e714610615578063b2bdfa7b1461062a578063b88d4fde1461064a57600080fd5b806375794a3c1461050157806388f2ebcb146105175780638da5cb5b146105375780638ee7491214610555578063943fb872146105c057600080fd5b80634fdd43cb116101d25780636352211e116101965780636352211e1461045557806366a88d96146104755780636ecd23061461049957806370a08231146104ac578063715018a6146104cc5780637533d788146104e157600080fd5b80634fdd43cb146103c657806351830227146103e6578063547520fe146104005780635503a0e81461042057806355f804b31461043557600080fd5b806316ba10e01161021957806316ba10e0146103265780631c37a8221461034657806323b872dd146103665780632e1a7d4d1461038657806342842e0e146103a657600080fd5b80621d35671461025557806301ffc9a71461027757806306fdde03146102ac578063081812fc146102ce578063095ea7b314610306575b600080fd5b34801561026157600080fd5b50610275610270366004612909565b6107af565b005b34801561028357600080fd5b50610297610292366004612739565b6109a9565b60405190151581526020015b60405180910390f35b3480156102b857600080fd5b506102c16109fb565b6040516102a39190612b4a565b3480156102da57600080fd5b506102ee6102e936600461299d565b610a8d565b6040516001600160a01b0390911681526020016102a3565b34801561031257600080fd5b506102756103213660046126f2565b610b22565b34801561033257600080fd5b50610275610341366004612773565b610c38565b34801561035257600080fd5b50610275610361366004612909565b610c79565b34801561037257600080fd5b50610275610381366004612611565b610ce8565b34801561039257600080fd5b506102756103a136600461299d565b610d19565b3480156103b257600080fd5b506102756103c1366004612611565b610de6565b3480156103d257600080fd5b506102756103e1366004612773565b610e01565b3480156103f257600080fd5b506012546102979060ff1681565b34801561040c57600080fd5b5061027561041b36600461299d565b610e3e565b34801561042c57600080fd5b506102c1610ebe565b34801561044157600080fd5b50610275610450366004612773565b610f4c565b34801561046157600080fd5b506102ee61047036600461299d565b610f89565b34801561048157600080fd5b5061048b60105481565b6040519081526020016102a3565b6102756104a73660046129da565b611000565b3480156104b857600080fd5b5061048b6104c736600461258d565b611188565b3480156104d857600080fd5b5061027561120f565b3480156104ed57600080fd5b506102c16104fc3660046127bb565b611245565b34801561050d57600080fd5b5061048b600e5481565b34801561052357600080fd5b5061027561053236600461299d565b61125e565b34801561054357600080fd5b506000546001600160a01b03166102ee565b34801561056157600080fd5b506105ab610570366004612828565b600860209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b604080519283526020830191909152016102a3565b3480156105cc57600080fd5b506102756105db36600461299d565b6112fc565b3480156105ec57600080fd5b506102c161132b565b34801561060157600080fd5b506102756106103660046126bd565b61133a565b34801561062157600080fd5b506102c1611345565b34801561063657600080fd5b50600a546102ee906001600160a01b031681565b34801561065657600080fd5b50610275610665366004612652565b611352565b34801561067657600080fd5b5061027561068536600461299d565b611384565b34801561069657600080fd5b506102c16106a536600461299d565b6113b3565b6102756106b8366004612981565b61152d565b6102756106cb36600461287e565b61180a565b3480156106dc57600080fd5b506102756106eb36600461258d565b611997565b3480156106fc57600080fd5b5061027561070b36600461271e565b6119e3565b34801561071c57600080fd5b5061029761072b3660046125d8565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561076557600080fd5b506102756107743660046127d6565b611a20565b34801561078557600080fd5b5061048b600f5481565b34801561079b57600080fd5b506102756107aa36600461258d565b611a68565b6007546001600160a01b031633146107c657600080fd5b61ffff8416600090815260096020526040902080546107e490612e77565b90508351148015610823575061ffff84166000908152600960205260409081902090516108119190612ac4565b60405180910390208380519060200120145b6108915760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f756044820152731c98d9481cd95b991a5b99c818dbdb9d1c9858dd60621b60648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a822906108ba908790879087908790600401612cea565b600060405180830381600087803b1580156108d457600080fd5b505af19250505080156108e5575060015b6109a3576040518060400160405280825181526020018280519060200120815250600860008661ffff1661ffff1681526020019081526020016000208460405161092f9190612aa8565b9081526040805191829003602090810183206001600160401b038716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d9061099a908690869086908690612cea565b60405180910390a15b50505050565b60006001600160e01b031982166380ac58cd60e01b14806109da57506001600160e01b03198216635b5e139f60e01b145b806109f557506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060018054610a0a90612e77565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3690612e77565b8015610a835780601f10610a5857610100808354040283529160200191610a83565b820191906000526020600020905b815481529060010190602001808311610a6657829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610b065760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610888565b506000908152600560205260409020546001600160a01b031690565b6000610b2d82610f89565b9050806001600160a01b0316836001600160a01b03161415610b9b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610888565b336001600160a01b0382161480610bb75750610bb7813361072b565b610c295760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610888565b610c338383611b03565b505050565b6000546001600160a01b03163314610c625760405162461bcd60e51b815260040161088890612baf565b8051610c7590600c906020840190612365565b5050565b333014610cdc5760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201526a10313290213934b233b29760a91b6064820152608401610888565b6109a384848484611b71565b610cf23382611b9e565b610d0e5760405162461bcd60e51b815260040161088890612be4565b610c33838383611c95565b6000546001600160a01b03163314610d435760405162461bcd60e51b815260040161088890612baf565b600a546040516000916001600160a01b03169083908381818185875af1925050503d8060008114610d90576040519150601f19603f3d011682016040523d82523d6000602084013e610d95565b606091505b5050905080610c755760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f20776974686472617720457468657200000000000000006044820152606401610888565b610c3383838360405180602001604052806000815250611352565b6000546001600160a01b03163314610e2b5760405162461bcd60e51b815260040161088890612baf565b8051610c7590600d906020840190612365565b6000546001600160a01b03163314610e685760405162461bcd60e51b815260040161088890612baf565b600e548111610eb95760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964206d6178206d696e74206e756d6265720000000000000000006044820152606401610888565b600f55565b600c8054610ecb90612e77565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef790612e77565b8015610f445780601f10610f1957610100808354040283529160200191610f44565b820191906000526020600020905b815481529060010190602001808311610f2757829003601f168201915b505050505081565b6000546001600160a01b03163314610f765760405162461bcd60e51b815260040161088890612baf565b8051610c7590600b906020840190612365565b6000818152600360205260408120546001600160a01b0316806109f55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610888565b6010548160ff16111561106f5760405162461bcd60e51b815260206004820152603160248201527f54696e7920576f6c663a204d6178204e46547320706572207472616e736163746044820152701a5bdb881b1a5b5a5d081c995858da1959607a1b6064820152608401610888565b60105461107b33611188565b6110889060ff8416612e08565b11156110e25760405162461bcd60e51b815260206004820152602360248201527f54696e7920576f6c663a204d61782077616c6c6574206c696d697420726561636044820152621a195960ea1b6064820152608401610888565b600f548160ff16600e546110f69190612e08565b111561113a5760405162461bcd60e51b81526020600482015260136024820152724d696e74206578636565647320737570706c7960681b6044820152606401610888565b600e80549060ff83169060006111508385612e08565b90915550600190505b8260ff168111610c3357611176336111718385612e08565b611e35565b8061118081612eb2565b915050611159565b60006001600160a01b0382166111f35760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610888565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b031633146112395760405162461bcd60e51b815260040161088890612baf565b6112436000611e4f565b565b60096020526000908152604090208054610ecb90612e77565b6000546001600160a01b031633146112885760405162461bcd60e51b815260040161088890612baf565b600e54156112f75760405162461bcd60e51b815260206004820152603660248201527f5374617274696e6720696e6465782063616e6e6f7420626520736574206166746044820152756572206d696e74696e6720697320737461727465642160501b6064820152608401610888565b600e55565b6000546001600160a01b031633146113265760405162461bcd60e51b815260040161088890612baf565b601155565b606060028054610a0a90612e77565b610c75338383611e9f565b600d8054610ecb90612e77565b61135c3383611b9e565b6113785760405162461bcd60e51b815260040161088890612be4565b6109a384848484611f6e565b6000546001600160a01b031633146113ae5760405162461bcd60e51b815260040161088890612baf565b601055565b6000818152600360205260409020546060906001600160a01b03166114325760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610888565b60125460ff166114ce57600d805461144990612e77565b80601f016020809104026020016040519081016040528092919081815260200182805461147590612e77565b80156114c25780601f10611497576101008083540402835291602001916114c2565b820191906000526020600020905b8154815290600101906020018083116114a557829003601f168201915b50505050509050919050565b60006114d8611fa1565b905060008151116114f85760405180602001604052806000815250611526565b8061150284611fb0565b600c60405160200161151693929190612ad0565b6040516020818303038152906040525b9392505050565b61153681610f89565b6001600160a01b0316336001600160a01b0316146115a15760405162461bcd60e51b815260206004820152602260248201527f596f75206d757374206f776e2074686520746f6b656e20746f20747261766572604482015261736560f01b6064820152608401610888565b61ffff8216600090815260096020526040812080546115bf90612e77565b9050116116255760405162461bcd60e51b815260206004820152602e60248201527f5468697320636861696e2069732063757272656e746c7920756e617661696c6160448201526d189b1948199bdc881d1c985d995b60921b6064820152608401610888565b61162e816120ad565b60408051336020820152808201839052815180820383018152606082018352601154600160f01b60808401526082808401919091528351808403909101815260a283019384905260075463040a7bb160e41b90945290926001926000916001600160a01b0316906340a7bb10906116b1908990309089908790899060a601612c35565b604080518083038186803b1580156116c857600080fd5b505afa1580156116dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170091906129b6565b509050803410156117855760405162461bcd60e51b815260206004820152604360248201527f6d73672e76616c7565206e6f7420656e6f75676820746f20636f766572206d6560448201527f73736167654665652e2053656e642067617320666f72206d657373616765206660648201526265657360e81b608482015260a401610888565b60075461ffff8716600090815260096020526040808220905162c5803160e81b81526001600160a01b039093169263c58031009234926117d0928c928b913391908b90600401612d28565b6000604051808303818588803b1580156117e957600080fd5b505af11580156117fd573d6000803e3d6000fd5b5050505050505050505050565b61ffff8516600090815260086020526040808220905161182b908790612aa8565b90815260408051602092819003830190206001600160401b03871660009081529252902060018101549091506118b25760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201526565737361676560d01b6064820152608401610888565b8054821480156118dc5750806001015483836040516118d2929190612a98565b6040518091039020145b6119285760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f61640000000000006044820152606401610888565b60008082556001820155604051630e1bd41160e11b81523090631c37a8229061195d9089908990899089908990600401612c89565b600060405180830381600087803b15801561197757600080fd5b505af115801561198b573d6000803e3d6000fd5b50505050505050505050565b6000546001600160a01b031633146119c15760405162461bcd60e51b815260040161088890612baf565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611a0d5760405162461bcd60e51b815260040161088890612baf565b6012805460ff1916911515919091179055565b6000546001600160a01b03163314611a4a5760405162461bcd60e51b815260040161088890612baf565b61ffff831660009081526009602052604090206109a39083836123e9565b6000546001600160a01b03163314611a925760405162461bcd60e51b815260040161088890612baf565b6001600160a01b038116611af75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610888565b611b0081611e4f565b50565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b3882610f89565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008082806020019051810190611b8891906125aa565b91509150611b968282611e35565b505050505050565b6000818152600360205260408120546001600160a01b0316611c175760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610888565b6000611c2283610f89565b9050806001600160a01b0316846001600160a01b03161480611c5d5750836001600160a01b0316611c5284610a8d565b6001600160a01b0316145b80611c8d57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611ca882610f89565b6001600160a01b031614611d105760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610888565b6001600160a01b038216611d725760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610888565b611d7d600082611b03565b6001600160a01b0383166000908152600460205260408120805460019290611da6908490612e34565b90915550506001600160a01b0382166000908152600460205260408120805460019290611dd4908490612e08565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610c75828260405180602001604052806000815250612148565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b03161415611f015760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610888565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611f79848484611c95565b611f858484848461217b565b6109a35760405162461bcd60e51b815260040161088890612b5d565b6060600b8054610a0a90612e77565b606081611fd45750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ffe5780611fe881612eb2565b9150611ff79050600a83612e20565b9150611fd8565b6000816001600160401b0381111561201857612018612f23565b6040519080825280601f01601f191660200182016040528015612042576020820181803683370190505b5090505b8415611c8d57612057600183612e34565b9150612064600a86612ecd565b61206f906030612e08565b60f81b81838151811061208457612084612f0d565b60200101906001600160f81b031916908160001a9053506120a6600a86612e20565b9450612046565b60006120b882610f89565b90506120c5600083611b03565b6001600160a01b03811660009081526004602052604081208054600192906120ee908490612e34565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6121528383612288565b61215f600084848461217b565b610c335760405162461bcd60e51b815260040161088890612b5d565b60006001600160a01b0384163b1561227d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906121bf903390899088908890600401612b0d565b602060405180830381600087803b1580156121d957600080fd5b505af1925050508015612209575060408051601f3d908101601f1916820190925261220691810190612756565b60015b612263573d808015612237576040519150601f19603f3d011682016040523d82523d6000602084013e61223c565b606091505b50805161225b5760405162461bcd60e51b815260040161088890612b5d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c8d565b506001949350505050565b6001600160a01b0382166122de5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610888565b6001600160a01b0382166000908152600460205260408120805460019290612307908490612e08565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461237190612e77565b90600052602060002090601f01602090048101928261239357600085556123d9565b82601f106123ac57805160ff19168380011785556123d9565b828001600101855582156123d9579182015b828111156123d95782518255916020019190600101906123be565b506123e592915061245d565b5090565b8280546123f590612e77565b90600052602060002090601f01602090048101928261241757600085556123d9565b82601f106124305782800160ff198235161785556123d9565b828001600101855582156123d9579182015b828111156123d9578235825591602001919060010190612442565b5b808211156123e5576000815560010161245e565b60006001600160401b038084111561248c5761248c612f23565b604051601f8501601f19908116603f011681019082821181831017156124b4576124b4612f23565b816040528093508581528686860111156124cd57600080fd5b858560208301376000602087830101525050509392505050565b803580151581146124f757600080fd5b919050565b60008083601f84011261250e57600080fd5b5081356001600160401b0381111561252557600080fd5b60208301915083602082850101111561253d57600080fd5b9250929050565b600082601f83011261255557600080fd5b61152683833560208501612472565b803561ffff811681146124f757600080fd5b80356001600160401b03811681146124f757600080fd5b60006020828403121561259f57600080fd5b813561152681612f39565b600080604083850312156125bd57600080fd5b82516125c881612f39565b6020939093015192949293505050565b600080604083850312156125eb57600080fd5b82356125f681612f39565b9150602083013561260681612f39565b809150509250929050565b60008060006060848603121561262657600080fd5b833561263181612f39565b9250602084013561264181612f39565b929592945050506040919091013590565b6000806000806080858703121561266857600080fd5b843561267381612f39565b9350602085013561268381612f39565b92506040850135915060608501356001600160401b038111156126a557600080fd5b6126b187828801612544565b91505092959194509250565b600080604083850312156126d057600080fd5b82356126db81612f39565b91506126e9602084016124e7565b90509250929050565b6000806040838503121561270557600080fd5b823561271081612f39565b946020939093013593505050565b60006020828403121561273057600080fd5b611526826124e7565b60006020828403121561274b57600080fd5b813561152681612f4e565b60006020828403121561276857600080fd5b815161152681612f4e565b60006020828403121561278557600080fd5b81356001600160401b0381111561279b57600080fd5b8201601f810184136127ac57600080fd5b611c8d84823560208401612472565b6000602082840312156127cd57600080fd5b61152682612564565b6000806000604084860312156127eb57600080fd5b6127f484612564565b925060208401356001600160401b0381111561280f57600080fd5b61281b868287016124fc565b9497909650939450505050565b60008060006060848603121561283d57600080fd5b61284684612564565b925060208401356001600160401b0381111561286157600080fd5b61286d86828701612544565b925050604084013590509250925092565b60008060008060006080868803121561289657600080fd5b61289f86612564565b945060208601356001600160401b03808211156128bb57600080fd5b6128c789838a01612544565b95506128d560408901612576565b945060608801359150808211156128eb57600080fd5b506128f8888289016124fc565b969995985093965092949392505050565b6000806000806080858703121561291f57600080fd5b61292885612564565b935060208501356001600160401b038082111561294457600080fd5b61295088838901612544565b945061295e60408801612576565b9350606087013591508082111561297457600080fd5b506126b187828801612544565b6000806040838503121561299457600080fd5b61271083612564565b6000602082840312156129af57600080fd5b5035919050565b600080604083850312156129c957600080fd5b505080516020909101519092909150565b6000602082840312156129ec57600080fd5b813560ff8116811461152657600080fd5b60008151808452612a15816020860160208601612e4b565b601f01601f19169290920160200192915050565b60008154612a3681612e77565b60018281168015612a4e5760018114612a5f57612a8e565b60ff19841687528287019450612a8e565b8560005260208060002060005b85811015612a855781548a820152908401908201612a6c565b50505082870194505b5050505092915050565b8183823760009101908152919050565b60008251612aba818460208701612e4b565b9190910192915050565b60006115268284612a29565b60008451612ae2818460208901612e4b565b845190830190612af6818360208901612e4b565b612b0281830186612a29565b979650505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b40908301846129fd565b9695505050505050565b60208152600061152660208301846129fd565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b61ffff861681526001600160a01b038516602082015260a060408201819052600090612c63908301866129fd565b84151560608401528281036080840152612c7d81856129fd565b98975050505050505050565b61ffff86168152608060208201526000612ca660808301876129fd565b6001600160401b03861660408401528281036060840152838152838560208301376000602085830101526020601f19601f8601168201019150509695505050505050565b61ffff85168152608060208201526000612d0760808301866129fd565b6001600160401b03851660408401528281036060840152612b0281856129fd565b61ffff871681526000602060c08184015260008854612d4681612e77565b8060c087015260e0600180841660008114612d685760018114612d7d57612dab565b60ff1985168984015261010089019550612dab565b8d6000528660002060005b85811015612da35781548b8201860152908301908801612d88565b8a0184019650505b50505050508381036040850152612dc281896129fd565b915050612dda60608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a0840152612dfb81856129fd565b9998505050505050505050565b60008219821115612e1b57612e1b612ee1565b500190565b600082612e2f57612e2f612ef7565b500490565b600082821015612e4657612e46612ee1565b500390565b60005b83811015612e66578181015183820152602001612e4e565b838111156109a35750506000910152565b600181811c90821680612e8b57607f821691505b60208210811415612eac57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612ec657612ec6612ee1565b5060010190565b600082612edc57612edc612ef7565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611b0057600080fd5b6001600160e01b031981168114611b0057600080fdfea26469706673582212205075c32fd39f53a040297e94c926cf12e30c4061dc3c4dc39552da147dd311c264736f6c6343000807003368747470733a2f2f697066732e696f2f697066732f516d59464c4c43785947515834345965334a376f4a476b7665526a56634e70666e4d3459424c667069314777314e2f68696464656e2e6a736f6e
Deployed Bytecode
0x6080604052600436106102505760003560e01c806375794a3c11610139578063bf8bcee4116100b6578063e0a808531161007a578063e0a80853146106f0578063e985e9c514610710578063eb8d72b714610759578063ed88c68e14610275578063f0292a0314610779578063f2fde38b1461078f57600080fd5b8063bf8bcee41461066a578063c87b56dd1461068a578063cf89fa03146106aa578063d1deba1f146106bd578063dbbb4155146106d057600080fd5b806395d89b41116100fd57806395d89b41146105e0578063a22cb465146105f5578063a45ba8e714610615578063b2bdfa7b1461062a578063b88d4fde1461064a57600080fd5b806375794a3c1461050157806388f2ebcb146105175780638da5cb5b146105375780638ee7491214610555578063943fb872146105c057600080fd5b80634fdd43cb116101d25780636352211e116101965780636352211e1461045557806366a88d96146104755780636ecd23061461049957806370a08231146104ac578063715018a6146104cc5780637533d788146104e157600080fd5b80634fdd43cb146103c657806351830227146103e6578063547520fe146104005780635503a0e81461042057806355f804b31461043557600080fd5b806316ba10e01161021957806316ba10e0146103265780631c37a8221461034657806323b872dd146103665780632e1a7d4d1461038657806342842e0e146103a657600080fd5b80621d35671461025557806301ffc9a71461027757806306fdde03146102ac578063081812fc146102ce578063095ea7b314610306575b600080fd5b34801561026157600080fd5b50610275610270366004612909565b6107af565b005b34801561028357600080fd5b50610297610292366004612739565b6109a9565b60405190151581526020015b60405180910390f35b3480156102b857600080fd5b506102c16109fb565b6040516102a39190612b4a565b3480156102da57600080fd5b506102ee6102e936600461299d565b610a8d565b6040516001600160a01b0390911681526020016102a3565b34801561031257600080fd5b506102756103213660046126f2565b610b22565b34801561033257600080fd5b50610275610341366004612773565b610c38565b34801561035257600080fd5b50610275610361366004612909565b610c79565b34801561037257600080fd5b50610275610381366004612611565b610ce8565b34801561039257600080fd5b506102756103a136600461299d565b610d19565b3480156103b257600080fd5b506102756103c1366004612611565b610de6565b3480156103d257600080fd5b506102756103e1366004612773565b610e01565b3480156103f257600080fd5b506012546102979060ff1681565b34801561040c57600080fd5b5061027561041b36600461299d565b610e3e565b34801561042c57600080fd5b506102c1610ebe565b34801561044157600080fd5b50610275610450366004612773565b610f4c565b34801561046157600080fd5b506102ee61047036600461299d565b610f89565b34801561048157600080fd5b5061048b60105481565b6040519081526020016102a3565b6102756104a73660046129da565b611000565b3480156104b857600080fd5b5061048b6104c736600461258d565b611188565b3480156104d857600080fd5b5061027561120f565b3480156104ed57600080fd5b506102c16104fc3660046127bb565b611245565b34801561050d57600080fd5b5061048b600e5481565b34801561052357600080fd5b5061027561053236600461299d565b61125e565b34801561054357600080fd5b506000546001600160a01b03166102ee565b34801561056157600080fd5b506105ab610570366004612828565b600860209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b604080519283526020830191909152016102a3565b3480156105cc57600080fd5b506102756105db36600461299d565b6112fc565b3480156105ec57600080fd5b506102c161132b565b34801561060157600080fd5b506102756106103660046126bd565b61133a565b34801561062157600080fd5b506102c1611345565b34801561063657600080fd5b50600a546102ee906001600160a01b031681565b34801561065657600080fd5b50610275610665366004612652565b611352565b34801561067657600080fd5b5061027561068536600461299d565b611384565b34801561069657600080fd5b506102c16106a536600461299d565b6113b3565b6102756106b8366004612981565b61152d565b6102756106cb36600461287e565b61180a565b3480156106dc57600080fd5b506102756106eb36600461258d565b611997565b3480156106fc57600080fd5b5061027561070b36600461271e565b6119e3565b34801561071c57600080fd5b5061029761072b3660046125d8565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561076557600080fd5b506102756107743660046127d6565b611a20565b34801561078557600080fd5b5061048b600f5481565b34801561079b57600080fd5b506102756107aa36600461258d565b611a68565b6007546001600160a01b031633146107c657600080fd5b61ffff8416600090815260096020526040902080546107e490612e77565b90508351148015610823575061ffff84166000908152600960205260409081902090516108119190612ac4565b60405180910390208380519060200120145b6108915760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f756044820152731c98d9481cd95b991a5b99c818dbdb9d1c9858dd60621b60648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a822906108ba908790879087908790600401612cea565b600060405180830381600087803b1580156108d457600080fd5b505af19250505080156108e5575060015b6109a3576040518060400160405280825181526020018280519060200120815250600860008661ffff1661ffff1681526020019081526020016000208460405161092f9190612aa8565b9081526040805191829003602090810183206001600160401b038716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d9061099a908690869086908690612cea565b60405180910390a15b50505050565b60006001600160e01b031982166380ac58cd60e01b14806109da57506001600160e01b03198216635b5e139f60e01b145b806109f557506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060018054610a0a90612e77565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3690612e77565b8015610a835780601f10610a5857610100808354040283529160200191610a83565b820191906000526020600020905b815481529060010190602001808311610a6657829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610b065760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610888565b506000908152600560205260409020546001600160a01b031690565b6000610b2d82610f89565b9050806001600160a01b0316836001600160a01b03161415610b9b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610888565b336001600160a01b0382161480610bb75750610bb7813361072b565b610c295760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610888565b610c338383611b03565b505050565b6000546001600160a01b03163314610c625760405162461bcd60e51b815260040161088890612baf565b8051610c7590600c906020840190612365565b5050565b333014610cdc5760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201526a10313290213934b233b29760a91b6064820152608401610888565b6109a384848484611b71565b610cf23382611b9e565b610d0e5760405162461bcd60e51b815260040161088890612be4565b610c33838383611c95565b6000546001600160a01b03163314610d435760405162461bcd60e51b815260040161088890612baf565b600a546040516000916001600160a01b03169083908381818185875af1925050503d8060008114610d90576040519150601f19603f3d011682016040523d82523d6000602084013e610d95565b606091505b5050905080610c755760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f20776974686472617720457468657200000000000000006044820152606401610888565b610c3383838360405180602001604052806000815250611352565b6000546001600160a01b03163314610e2b5760405162461bcd60e51b815260040161088890612baf565b8051610c7590600d906020840190612365565b6000546001600160a01b03163314610e685760405162461bcd60e51b815260040161088890612baf565b600e548111610eb95760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964206d6178206d696e74206e756d6265720000000000000000006044820152606401610888565b600f55565b600c8054610ecb90612e77565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef790612e77565b8015610f445780601f10610f1957610100808354040283529160200191610f44565b820191906000526020600020905b815481529060010190602001808311610f2757829003601f168201915b505050505081565b6000546001600160a01b03163314610f765760405162461bcd60e51b815260040161088890612baf565b8051610c7590600b906020840190612365565b6000818152600360205260408120546001600160a01b0316806109f55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610888565b6010548160ff16111561106f5760405162461bcd60e51b815260206004820152603160248201527f54696e7920576f6c663a204d6178204e46547320706572207472616e736163746044820152701a5bdb881b1a5b5a5d081c995858da1959607a1b6064820152608401610888565b60105461107b33611188565b6110889060ff8416612e08565b11156110e25760405162461bcd60e51b815260206004820152602360248201527f54696e7920576f6c663a204d61782077616c6c6574206c696d697420726561636044820152621a195960ea1b6064820152608401610888565b600f548160ff16600e546110f69190612e08565b111561113a5760405162461bcd60e51b81526020600482015260136024820152724d696e74206578636565647320737570706c7960681b6044820152606401610888565b600e80549060ff83169060006111508385612e08565b90915550600190505b8260ff168111610c3357611176336111718385612e08565b611e35565b8061118081612eb2565b915050611159565b60006001600160a01b0382166111f35760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610888565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b031633146112395760405162461bcd60e51b815260040161088890612baf565b6112436000611e4f565b565b60096020526000908152604090208054610ecb90612e77565b6000546001600160a01b031633146112885760405162461bcd60e51b815260040161088890612baf565b600e54156112f75760405162461bcd60e51b815260206004820152603660248201527f5374617274696e6720696e6465782063616e6e6f7420626520736574206166746044820152756572206d696e74696e6720697320737461727465642160501b6064820152608401610888565b600e55565b6000546001600160a01b031633146113265760405162461bcd60e51b815260040161088890612baf565b601155565b606060028054610a0a90612e77565b610c75338383611e9f565b600d8054610ecb90612e77565b61135c3383611b9e565b6113785760405162461bcd60e51b815260040161088890612be4565b6109a384848484611f6e565b6000546001600160a01b031633146113ae5760405162461bcd60e51b815260040161088890612baf565b601055565b6000818152600360205260409020546060906001600160a01b03166114325760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610888565b60125460ff166114ce57600d805461144990612e77565b80601f016020809104026020016040519081016040528092919081815260200182805461147590612e77565b80156114c25780601f10611497576101008083540402835291602001916114c2565b820191906000526020600020905b8154815290600101906020018083116114a557829003601f168201915b50505050509050919050565b60006114d8611fa1565b905060008151116114f85760405180602001604052806000815250611526565b8061150284611fb0565b600c60405160200161151693929190612ad0565b6040516020818303038152906040525b9392505050565b61153681610f89565b6001600160a01b0316336001600160a01b0316146115a15760405162461bcd60e51b815260206004820152602260248201527f596f75206d757374206f776e2074686520746f6b656e20746f20747261766572604482015261736560f01b6064820152608401610888565b61ffff8216600090815260096020526040812080546115bf90612e77565b9050116116255760405162461bcd60e51b815260206004820152602e60248201527f5468697320636861696e2069732063757272656e746c7920756e617661696c6160448201526d189b1948199bdc881d1c985d995b60921b6064820152608401610888565b61162e816120ad565b60408051336020820152808201839052815180820383018152606082018352601154600160f01b60808401526082808401919091528351808403909101815260a283019384905260075463040a7bb160e41b90945290926001926000916001600160a01b0316906340a7bb10906116b1908990309089908790899060a601612c35565b604080518083038186803b1580156116c857600080fd5b505afa1580156116dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170091906129b6565b509050803410156117855760405162461bcd60e51b815260206004820152604360248201527f6d73672e76616c7565206e6f7420656e6f75676820746f20636f766572206d6560448201527f73736167654665652e2053656e642067617320666f72206d657373616765206660648201526265657360e81b608482015260a401610888565b60075461ffff8716600090815260096020526040808220905162c5803160e81b81526001600160a01b039093169263c58031009234926117d0928c928b913391908b90600401612d28565b6000604051808303818588803b1580156117e957600080fd5b505af11580156117fd573d6000803e3d6000fd5b5050505050505050505050565b61ffff8516600090815260086020526040808220905161182b908790612aa8565b90815260408051602092819003830190206001600160401b03871660009081529252902060018101549091506118b25760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201526565737361676560d01b6064820152608401610888565b8054821480156118dc5750806001015483836040516118d2929190612a98565b6040518091039020145b6119285760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f61640000000000006044820152606401610888565b60008082556001820155604051630e1bd41160e11b81523090631c37a8229061195d9089908990899089908990600401612c89565b600060405180830381600087803b15801561197757600080fd5b505af115801561198b573d6000803e3d6000fd5b50505050505050505050565b6000546001600160a01b031633146119c15760405162461bcd60e51b815260040161088890612baf565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611a0d5760405162461bcd60e51b815260040161088890612baf565b6012805460ff1916911515919091179055565b6000546001600160a01b03163314611a4a5760405162461bcd60e51b815260040161088890612baf565b61ffff831660009081526009602052604090206109a39083836123e9565b6000546001600160a01b03163314611a925760405162461bcd60e51b815260040161088890612baf565b6001600160a01b038116611af75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610888565b611b0081611e4f565b50565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b3882610f89565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008082806020019051810190611b8891906125aa565b91509150611b968282611e35565b505050505050565b6000818152600360205260408120546001600160a01b0316611c175760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610888565b6000611c2283610f89565b9050806001600160a01b0316846001600160a01b03161480611c5d5750836001600160a01b0316611c5284610a8d565b6001600160a01b0316145b80611c8d57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611ca882610f89565b6001600160a01b031614611d105760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610888565b6001600160a01b038216611d725760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610888565b611d7d600082611b03565b6001600160a01b0383166000908152600460205260408120805460019290611da6908490612e34565b90915550506001600160a01b0382166000908152600460205260408120805460019290611dd4908490612e08565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610c75828260405180602001604052806000815250612148565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b03161415611f015760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610888565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611f79848484611c95565b611f858484848461217b565b6109a35760405162461bcd60e51b815260040161088890612b5d565b6060600b8054610a0a90612e77565b606081611fd45750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ffe5780611fe881612eb2565b9150611ff79050600a83612e20565b9150611fd8565b6000816001600160401b0381111561201857612018612f23565b6040519080825280601f01601f191660200182016040528015612042576020820181803683370190505b5090505b8415611c8d57612057600183612e34565b9150612064600a86612ecd565b61206f906030612e08565b60f81b81838151811061208457612084612f0d565b60200101906001600160f81b031916908160001a9053506120a6600a86612e20565b9450612046565b60006120b882610f89565b90506120c5600083611b03565b6001600160a01b03811660009081526004602052604081208054600192906120ee908490612e34565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6121528383612288565b61215f600084848461217b565b610c335760405162461bcd60e51b815260040161088890612b5d565b60006001600160a01b0384163b1561227d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906121bf903390899088908890600401612b0d565b602060405180830381600087803b1580156121d957600080fd5b505af1925050508015612209575060408051601f3d908101601f1916820190925261220691810190612756565b60015b612263573d808015612237576040519150601f19603f3d011682016040523d82523d6000602084013e61223c565b606091505b50805161225b5760405162461bcd60e51b815260040161088890612b5d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c8d565b506001949350505050565b6001600160a01b0382166122de5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610888565b6001600160a01b0382166000908152600460205260408120805460019290612307908490612e08565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461237190612e77565b90600052602060002090601f01602090048101928261239357600085556123d9565b82601f106123ac57805160ff19168380011785556123d9565b828001600101855582156123d9579182015b828111156123d95782518255916020019190600101906123be565b506123e592915061245d565b5090565b8280546123f590612e77565b90600052602060002090601f01602090048101928261241757600085556123d9565b82601f106124305782800160ff198235161785556123d9565b828001600101855582156123d9579182015b828111156123d9578235825591602001919060010190612442565b5b808211156123e5576000815560010161245e565b60006001600160401b038084111561248c5761248c612f23565b604051601f8501601f19908116603f011681019082821181831017156124b4576124b4612f23565b816040528093508581528686860111156124cd57600080fd5b858560208301376000602087830101525050509392505050565b803580151581146124f757600080fd5b919050565b60008083601f84011261250e57600080fd5b5081356001600160401b0381111561252557600080fd5b60208301915083602082850101111561253d57600080fd5b9250929050565b600082601f83011261255557600080fd5b61152683833560208501612472565b803561ffff811681146124f757600080fd5b80356001600160401b03811681146124f757600080fd5b60006020828403121561259f57600080fd5b813561152681612f39565b600080604083850312156125bd57600080fd5b82516125c881612f39565b6020939093015192949293505050565b600080604083850312156125eb57600080fd5b82356125f681612f39565b9150602083013561260681612f39565b809150509250929050565b60008060006060848603121561262657600080fd5b833561263181612f39565b9250602084013561264181612f39565b929592945050506040919091013590565b6000806000806080858703121561266857600080fd5b843561267381612f39565b9350602085013561268381612f39565b92506040850135915060608501356001600160401b038111156126a557600080fd5b6126b187828801612544565b91505092959194509250565b600080604083850312156126d057600080fd5b82356126db81612f39565b91506126e9602084016124e7565b90509250929050565b6000806040838503121561270557600080fd5b823561271081612f39565b946020939093013593505050565b60006020828403121561273057600080fd5b611526826124e7565b60006020828403121561274b57600080fd5b813561152681612f4e565b60006020828403121561276857600080fd5b815161152681612f4e565b60006020828403121561278557600080fd5b81356001600160401b0381111561279b57600080fd5b8201601f810184136127ac57600080fd5b611c8d84823560208401612472565b6000602082840312156127cd57600080fd5b61152682612564565b6000806000604084860312156127eb57600080fd5b6127f484612564565b925060208401356001600160401b0381111561280f57600080fd5b61281b868287016124fc565b9497909650939450505050565b60008060006060848603121561283d57600080fd5b61284684612564565b925060208401356001600160401b0381111561286157600080fd5b61286d86828701612544565b925050604084013590509250925092565b60008060008060006080868803121561289657600080fd5b61289f86612564565b945060208601356001600160401b03808211156128bb57600080fd5b6128c789838a01612544565b95506128d560408901612576565b945060608801359150808211156128eb57600080fd5b506128f8888289016124fc565b969995985093965092949392505050565b6000806000806080858703121561291f57600080fd5b61292885612564565b935060208501356001600160401b038082111561294457600080fd5b61295088838901612544565b945061295e60408801612576565b9350606087013591508082111561297457600080fd5b506126b187828801612544565b6000806040838503121561299457600080fd5b61271083612564565b6000602082840312156129af57600080fd5b5035919050565b600080604083850312156129c957600080fd5b505080516020909101519092909150565b6000602082840312156129ec57600080fd5b813560ff8116811461152657600080fd5b60008151808452612a15816020860160208601612e4b565b601f01601f19169290920160200192915050565b60008154612a3681612e77565b60018281168015612a4e5760018114612a5f57612a8e565b60ff19841687528287019450612a8e565b8560005260208060002060005b85811015612a855781548a820152908401908201612a6c565b50505082870194505b5050505092915050565b8183823760009101908152919050565b60008251612aba818460208701612e4b565b9190910192915050565b60006115268284612a29565b60008451612ae2818460208901612e4b565b845190830190612af6818360208901612e4b565b612b0281830186612a29565b979650505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b40908301846129fd565b9695505050505050565b60208152600061152660208301846129fd565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b61ffff861681526001600160a01b038516602082015260a060408201819052600090612c63908301866129fd565b84151560608401528281036080840152612c7d81856129fd565b98975050505050505050565b61ffff86168152608060208201526000612ca660808301876129fd565b6001600160401b03861660408401528281036060840152838152838560208301376000602085830101526020601f19601f8601168201019150509695505050505050565b61ffff85168152608060208201526000612d0760808301866129fd565b6001600160401b03851660408401528281036060840152612b0281856129fd565b61ffff871681526000602060c08184015260008854612d4681612e77565b8060c087015260e0600180841660008114612d685760018114612d7d57612dab565b60ff1985168984015261010089019550612dab565b8d6000528660002060005b85811015612da35781548b8201860152908301908801612d88565b8a0184019650505b50505050508381036040850152612dc281896129fd565b915050612dda60608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a0840152612dfb81856129fd565b9998505050505050505050565b60008219821115612e1b57612e1b612ee1565b500190565b600082612e2f57612e2f612ef7565b500490565b600082821015612e4657612e46612ee1565b500390565b60005b83811015612e66578181015183820152602001612e4e565b838111156109a35750506000910152565b600181811c90821680612e8b57607f821691505b60208210811415612eac57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612ec657612ec6612ee1565b5060010190565b600082612edc57612edc612ef7565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611b0057600080fd5b6001600160e01b031981168114611b0057600080fdfea26469706673582212205075c32fd39f53a040297e94c926cf12e30c4061dc3c4dc39552da147dd311c264736f6c63430008070033
Deployed Bytecode Sourcemap
50201:5916:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46826:1098;;;;;;;;;;-1:-1:-1;46826:1098:0;;;;;:::i;:::-;;:::i;:::-;;32891:355;;;;;;;;;;-1:-1:-1;32891:355:0;;;;;:::i;:::-;;:::i;:::-;;;13210:14:1;;13203:22;13185:41;;13173:2;13158:18;32891:355:0;;;;;;;;34060:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;35753:308::-;;;;;;;;;;-1:-1:-1;35753:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;12229:32:1;;;12211:51;;12199:2;12184:18;35753:308:0;12065:203:1;35276:411:0;;;;;;;;;;-1:-1:-1;35276:411:0;;;;;:::i;:::-;;:::i;54864:106::-;;;;;;;;;;-1:-1:-1;54864:106:0;;;;;:::i;:::-;;:::i;47932:435::-;;;;;;;;;;-1:-1:-1;47932:435:0;;;;;:::i;:::-;;:::i;36672:376::-;;;;;;;;;;-1:-1:-1;36672:376:0;;;;;:::i;:::-;;:::i;55106:173::-;;;;;;;;;;-1:-1:-1;55106:173:0;;;;;:::i;:::-;;:::i;37119:185::-;;;;;;;;;;-1:-1:-1;37119:185:0;;;;;:::i;:::-;;:::i;52543:138::-;;;;;;;;;;-1:-1:-1;52543:138:0;;;;;:::i;:::-;;:::i;50603:28::-;;;;;;;;;;-1:-1:-1;50603:28:0;;;;;;;;52284:156;;;;;;;;;;-1:-1:-1;52284:156:0;;;;;:::i;:::-;;:::i;50355:33::-;;;;;;;;;;;;;:::i;54660:90::-;;;;;;;;;;-1:-1:-1;54660:90:0;;;;;:::i;:::-;;:::i;33667:326::-;;;;;;;;;;-1:-1:-1;33667:326:0;;;;;:::i;:::-;;:::i;50509:33::-;;;;;;;;;;;;;;;;;;;28471:25:1;;;28459:2;28444:18;50509:33:0;28325:177:1;50963:565:0;;;;;;:::i;:::-;;:::i;33310:295::-;;;;;;;;;;-1:-1:-1;33310:295:0;;;;;:::i;:::-;;:::i;13203:103::-;;;;;;;;;;;;;:::i;46625:51::-;;;;;;;;;;-1:-1:-1;46625:51:0;;;;;:::i;:::-;;:::i;50435:30::-;;;;;;;;;;;;;;;;52084:192;;;;;;;;;;-1:-1:-1;52084:192:0;;;;;:::i;:::-;;:::i;12552:87::-;;;;;;;;;;-1:-1:-1;12598:7:0;12625:6;-1:-1:-1;;;;;12625:6:0;12552:87;;46516:102;;;;;;;;;;-1:-1:-1;46516:102:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28681:25:1;;;28737:2;28722:18;;28715:34;;;;28654:18;46516:102:0;28507:248:1;55363:128:0;;;;;;;;;;-1:-1:-1;55363:128:0;;;;;:::i;:::-;;:::i;34229:104::-;;;;;;;;;;;;;:::i;36133:187::-;;;;;;;;;;-1:-1:-1;36133:187:0;;;;;:::i;:::-;;:::i;50395:31::-;;;;;;;;;;;;;:::i;50298:21::-;;;;;;;;;;-1:-1:-1;50298:21:0;;;;-1:-1:-1;;;;;50298:21:0;;;37375:365;;;;;;;;;;-1:-1:-1;37375:365:0;;;;;:::i;:::-;;:::i;54758:98::-;;;;;;;;;;-1:-1:-1;54758:98:0;;;;;:::i;:::-;;:::i;51536:540::-;;;;;;;;;;-1:-1:-1;51536:540:0;;;;;:::i;:::-;;:::i;52820:1688::-;;;;;;:::i;:::-;;:::i;49027:916::-;;;;;;:::i;:::-;;:::i;54516:136::-;;;;;;;;;;-1:-1:-1;54516:136:0;;;;;:::i;:::-;;:::i;52448:87::-;;;;;;;;;;-1:-1:-1;52448:87:0;;;;;:::i;:::-;;:::i;36391:214::-;;;;;;;;;;-1:-1:-1;36391:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;36562:25:0;;;36533:4;36562:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;36391:214;49951:181;;;;;;;;;;-1:-1:-1;49951:181:0;;;;;:::i;:::-;;:::i;50472:30::-;;;;;;;;;;;;;;;;13461:238;;;;;;;;;;-1:-1:-1;13461:238:0;;;;;:::i;:::-;;:::i;46826:1098::-;47031:8;;-1:-1:-1;;;;;47031:8:0;47009:10;:31;47001:40;;;;;;47166:32;;;;;;;:19;:32;;;;;:39;;;;;:::i;:::-;;;47144:11;:18;:61;:168;;;;-1:-1:-1;47279:32:0;;;;;;;:19;:32;;;;;;;47269:43;;;;47279:32;47269:43;:::i;:::-;;;;;;;;47236:11;47226:22;;;;;;:86;47144:168;47122:270;;;;-1:-1:-1;;;47122:270:0;;21429:2:1;47122:270:0;;;21411:21:1;21468:2;21448:18;;;21441:30;21507:34;21487:18;;;21480:62;-1:-1:-1;;;21558:18:1;;;21551:50;21618:19;;47122:270:0;;;;;;;;;47520:60;;-1:-1:-1;;;47520:60:0;;:4;;:16;;:60;;47537:11;;47550;;47563:6;;47571:8;;47520:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47516:401;;47727:101;;;;;;;;47760:8;:15;47727:101;;;;47804:8;47794:19;;;;;;47727:101;;;47676:14;:27;47691:11;47676:27;;;;;;;;;;;;;;;47704:11;47676:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47676:48:0;;;;;;;;;;;;;:152;;;;;;;;;;;;;;;47848:57;;;;47862:11;;47875;;47717:6;;47896:8;;47848:57;:::i;:::-;;;;;;;;47516:401;46826:1098;;;;:::o;32891:355::-;33038:4;-1:-1:-1;;;;;;33080:40:0;;-1:-1:-1;;;33080:40:0;;:105;;-1:-1:-1;;;;;;;33137:48:0;;-1:-1:-1;;;33137:48:0;33080:105;:158;;;-1:-1:-1;;;;;;;;;;25637:40:0;;;33202:36;33060:178;32891:355;-1:-1:-1;;32891:355:0:o;34060:100::-;34114:13;34147:5;34140:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34060:100;:::o;35753:308::-;35874:7;39376:16;;;:7;:16;;;;;;-1:-1:-1;;;;;39376:16:0;35899:110;;;;-1:-1:-1;;;35899:110:0;;20655:2:1;35899:110:0;;;20637:21:1;20694:2;20674:18;;;20667:30;20733:34;20713:18;;;20706:62;-1:-1:-1;;;20784:18:1;;;20777:42;20836:19;;35899:110:0;20453:408:1;35899:110:0;-1:-1:-1;36029:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;36029:24:0;;35753:308::o;35276:411::-;35357:13;35373:23;35388:7;35373:14;:23::i;:::-;35357:39;;35421:5;-1:-1:-1;;;;;35415:11:0;:2;-1:-1:-1;;;;;35415:11:0;;;35407:57;;;;-1:-1:-1;;;35407:57:0;;23447:2:1;35407:57:0;;;23429:21:1;23486:2;23466:18;;;23459:30;23525:34;23505:18;;;23498:62;-1:-1:-1;;;23576:18:1;;;23569:31;23617:19;;35407:57:0;23245:397:1;35407:57:0;11335:10;-1:-1:-1;;;;;35499:21:0;;;;:62;;-1:-1:-1;35524:37:0;35541:5;11335:10;36391:214;:::i;35524:37::-;35477:168;;;;-1:-1:-1;;;35477:168:0;;18636:2:1;35477:168:0;;;18618:21:1;18675:2;18655:18;;;18648:30;18714:34;18694:18;;;18687:62;18785:26;18765:18;;;18758:54;18829:19;;35477:168:0;18434:420:1;35477:168:0;35658:21;35667:2;35671:7;35658:8;:21::i;:::-;35346:341;35276:411;;:::o;54864:106::-;12598:7;12625:6;-1:-1:-1;;;;;12625:6:0;11335:10;12772:23;12764:68;;;;-1:-1:-1;;;12764:68:0;;;;;;;:::i;:::-;54940:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;54864:106:::0;:::o;47932:435::-;48158:10;48180:4;48158:27;48136:120;;;;-1:-1:-1;;;48136:120:0;;19882:2:1;48136:120:0;;;19864:21:1;19921:2;19901:18;;;19894:30;19960:34;19940:18;;;19933:62;-1:-1:-1;;;20011:18:1;;;20004:41;20062:19;;48136:120:0;19680:407:1;48136:120:0;48305:54;48316:11;48329;48342:6;48350:8;48305:10;:54::i;36672:376::-;36881:41;11335:10;36914:7;36881:18;:41::i;:::-;36859:140;;;;-1:-1:-1;;;36859:140:0;;;;;;;:::i;:::-;37012:28;37022:4;37028:2;37032:7;37012:9;:28::i;55106:173::-;12598:7;12625:6;-1:-1:-1;;;;;12625:6:0;11335:10;12772:23;12764:68;;;;-1:-1:-1;;;12764:68:0;;;;;;;:::i;:::-;55191:6:::1;::::0;55183:36:::1;::::0;55168:9:::1;::::0;-1:-1:-1;;;;;55191:6:0::1;::::0;55211:3;;55168:9;55183:36;55168:9;55183:36;55211:3;55191:6;55183:36:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55167:52;;;55238:4;55230:41;;;::::0;-1:-1:-1;;;55230:41:0;;23094:2:1;55230:41:0::1;::::0;::::1;23076:21:1::0;23133:2;23113:18;;;23106:30;23172:26;23152:18;;;23145:54;23216:18;;55230:41:0::1;22892:348:1::0;37119:185:0;37257:39;37274:4;37280:2;37284:7;37257:39;;;;;;;;;;;;:16;:39::i;52543:138::-;12598:7;12625:6;-1:-1:-1;;;;;12625:6:0;11335:10;12772:23;12764:68;;;;-1:-1:-1;;;12764:68:0;;;;;;;:::i;:::-;52635:38;;::::1;::::0;:17:::1;::::0;:38:::1;::::0;::::1;::::0;::::1;:::i;52284:156::-:0;12598:7;12625:6;-1:-1:-1;;;;;12625:6:0;11335:10;12772:23;12764:68;;;;-1:-1:-1;;;12764:68:0;;;;;;;:::i;:::-;52365:11:::1;;52356:6;:20;52348:56;;;::::0;-1:-1:-1;;;52348:56:0;;18284:2:1;52348:56:0::1;::::0;::::1;18266:21:1::0;18323:2;18303:18;;;18296:30;18362:25;18342:18;;;18335:53;18405:18;;52348:56:0::1;18082:347:1::0;52348:56:0::1;52415:8;:17:::0;52284:156::o;50355:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54660:90::-;12598:7;12625:6;-1:-1:-1;;;;;12625:6:0;11335:10;12772:23;12764:68;;;;-1:-1:-1;;;12764:68:0;;;;;;;:::i;:::-;54729:13;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;33667:326::-:0;33784:7;33825:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33825:16:0;33874:19;33852:110;;;;-1:-1:-1;;;33852:110:0;;19472:2:1;33852:110:0;;;19454:21:1;19511:2;19491:18;;;19484:30;19550:34;19530:18;;;19523:62;-1:-1:-1;;;19601:18:1;;;19594:39;19650:19;;33852:110:0;19270:405:1;50963:565:0;51043:14;;51030:9;:27;;;;51022:89;;;;-1:-1:-1;;;51022:89:0;;22676:2:1;51022:89:0;;;22658:21:1;22715:2;22695:18;;;22688:30;22754:34;22734:18;;;22727:62;-1:-1:-1;;;22805:18:1;;;22798:47;22862:19;;51022:89:0;22474:413:1;51022:89:0;51167:14;;51142:21;51152:10;51142:9;:21::i;:::-;51130:33;;;;;;:::i;:::-;:51;;51122:99;;;;-1:-1:-1;;;51122:99:0;;15187:2:1;51122:99:0;;;15169:21:1;15226:2;15206:18;;;15199:30;15265:34;15245:18;;;15238:62;-1:-1:-1;;;15316:18:1;;;15309:33;15359:19;;51122:99:0;14985:399:1;51122:99:0;51281:8;;51268:9;51254:23;;:11;;:23;;;;:::i;:::-;:35;;51232:104;;;;-1:-1:-1;;;51232:104:0;;17523:2:1;51232:104:0;;;17505:21:1;17562:2;17542:18;;;17535:30;-1:-1:-1;;;17581:18:1;;;17574:49;17640:18;;51232:104:0;17321:343:1;51232:104:0;51364:11;;;;51386:24;;;;51347:14;51386:24;;51364:11;51386:24;:::i;:::-;;;;-1:-1:-1;51437:1:0;;-1:-1:-1;51421:100:0;51445:9;51440:14;;:1;:14;51421:100;;51476:33;51486:10;51498;51507:1;51498:6;:10;:::i;:::-;51476:9;:33::i;:::-;51456:3;;;;:::i;:::-;;;;51421:100;;33310:295;33427:7;-1:-1:-1;;;;;33474:19:0;;33452:111;;;;-1:-1:-1;;;33452:111:0;;19061:2:1;33452:111:0;;;19043:21:1;19100:2;19080:18;;;19073:30;19139:34;19119:18;;;19112:62;-1:-1:-1;;;19190:18:1;;;19183:40;19240:19;;33452:111:0;18859:406:1;33452:111:0;-1:-1:-1;;;;;;33581:16:0;;;;;:9;:16;;;;;;;33310:295::o;13203:103::-;12598:7;12625:6;-1:-1:-1;;;;;12625:6:0;11335:10;12772:23;12764:68;;;;-1:-1:-1;;;12764:68:0;;;;;;;:::i;:::-;13268:30:::1;13295:1;13268:18;:30::i;:::-;13203:103::o:0;46625:51::-;;;;;;;;;;;;;;;;:::i;52084:192::-;12598:7;12625:6;-1:-1:-1;;;;;12625:6:0;11335:10;12772:23;12764:68;;;;-1:-1:-1;;;12764:68:0;;;;;;;:::i;:::-;52162:11:::1;::::0;:16;52154:83:::1;;;::::0;-1:-1:-1;;;52154:83:0;;24674:2:1;52154:83:0::1;::::0;::::1;24656:21:1::0;24713:2;24693:18;;;24686:30;24752:34;24732:18;;;24725:62;-1:-1:-1;;;24803:18:1;;;24796:52;24865:19;;52154:83:0::1;24472:418:1::0;52154:83:0::1;52248:11;:20:::0;52084:192::o;55363:128::-;12598:7;12625:6;-1:-1:-1;;;;;12625:6:0;11335:10;12772:23;12764:68;;;;-1:-1:-1;;;12764:68:0;;;;;;;:::i;:::-;55448:26:::1;:35:::0;55363:128::o;34229:104::-;34285:13;34318:7;34311:14;;;;;:::i;36133:187::-;36260:52;11335:10;36293:8;36303;36260:18;:52::i;50395:31::-;;;;;;;:::i;37375:365::-;37564:41;11335:10;37597:7;37564:18;:41::i;:::-;37542:140;;;;-1:-1:-1;;;37542:140:0;;;;;;;:::i;:::-;37693:39;37707:4;37713:2;37717:7;37726:5;37693:13;:39::i;54758:98::-;12598:7;12625:6;-1:-1:-1;;;;;12625:6:0;11335:10;12772:23;12764:68;;;;-1:-1:-1;;;12764:68:0;;;;;;;:::i;:::-;54825:14:::1;:23:::0;54758:98::o;51536:540::-;39352:4;39376:16;;;:7;:16;;;;;;51635:13;;-1:-1:-1;;;;;39376:16:0;51666:106;;;;-1:-1:-1;;;51666:106:0;;22260:2:1;51666:106:0;;;22242:21:1;22299:2;22279:18;;;22272:30;22338:34;22318:18;;;22311:62;-1:-1:-1;;;22389:18:1;;;22382:45;22444:19;;51666:106:0;22058:411:1;51666:106:0;51789:8;;;;51785:74;;51830:17;51823:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51536:540;;;:::o;51785:74::-;51871:28;51902:10;:8;:10::i;:::-;51871:41;;51961:1;51936:14;51930:28;:32;:138;;;;;;;;;;;;;;;;;52002:14;52018:19;:8;:17;:19::i;:::-;52039:9;51985:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51930:138;51923:145;51536:540;-1:-1:-1;;;51536:540:0:o;52820:1688::-;52940:16;52948:7;52940;:16::i;:::-;-1:-1:-1;;;;;52926:30:0;:10;-1:-1:-1;;;;;52926:30:0;;52904:114;;;;-1:-1:-1;;;52904:114:0;;17120:2:1;52904:114:0;;;17102:21:1;17159:2;17139:18;;;17132:30;17198:34;17178:18;;;17171:62;-1:-1:-1;;;17249:18:1;;;17242:32;17291:19;;52904:114:0;16918:398:1;52904:114:0;53051:29;;;53090:1;53051:29;;;:19;:29;;;;;:36;;;;;:::i;:::-;;;:40;53029:136;;;;-1:-1:-1;;;53029:136:0;;16350:2:1;53029:136:0;;;16332:21:1;16389:2;16369:18;;;16362:30;16428:34;16408:18;;;16401:62;-1:-1:-1;;;16479:18:1;;;16472:44;16533:19;;53029:136:0;16148:410:1;53029:136:0;53245:14;53251:7;53245:5;:14::i;:::-;53356:31;;;53367:10;53356:31;;;12940:51:1;13007:18;;;13000:34;;;53356:31:0;;;;;;;;;12913:18:1;;;53356:31:0;;53584:26;;-1:-1:-1;;;53531:90:0;;;11939:51:1;12006:11;;;;11999:27;;;;53531:90:0;;;;;;;;;;12042:12:1;;;53531:90:0;;;;53800:8;;-1:-1:-1;;;53800:153:0;;;53356:31;;53490:1;;-1:-1:-1;;;;;;;53800:8:0;;:21;;:153;;53836:8;;53867:4;;53356:31;;-1:-1:-1;;53531:90:0;;53800:153;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53775:178;;;54001:10;53988:9;:23;;53966:140;;;;-1:-1:-1;;;53966:140:0;;13885:2:1;53966:140:0;;;13867:21:1;13924:2;13904:18;;;13897:30;13963:34;13943:18;;;13936:62;14034:34;14014:18;;;14007:62;-1:-1:-1;;;14085:19:1;;;14078:34;14129:19;;53966:140:0;13683:471:1;53966:140:0;54119:8;;54211:29;;;54119:8;54211:29;;;:19;:29;;;;;;54119:381;;-1:-1:-1;;;54119:381:0;;-1:-1:-1;;;;;54119:8:0;;;;:13;;54140:9;;54119:381;;54165:8;;54294:7;;54350:10;;54119:8;54460:13;;54119:381;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52893:1615;;;;52820:1688;;:::o;49027:916::-;49286:27;;;49251:32;49286:27;;;:14;:27;;;;;;:64;;;;49328:11;;49286:64;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49286:72:0;;;;;;;;;;49391:21;;;;49286:72;;-1:-1:-1;49369:123:0;;;;-1:-1:-1;;;49369:123:0;;24267:2:1;49369:123:0;;;24249:21:1;24306:2;24286:18;;;24279:30;24345:34;24325:18;;;24318:62;-1:-1:-1;;;24396:18:1;;;24389:36;24442:19;;49369:123:0;24065:402:1;49369:123:0;49544:23;;49525:42;;:107;;;;;49611:9;:21;;;49598:8;;49588:19;;;;;;;:::i;:::-;;;;;;;;:44;49525:107;49503:183;;;;-1:-1:-1;;;49503:183:0;;16765:2:1;49503:183:0;;;16747:21:1;16804:2;16784:18;;;16777:30;16843:28;16823:18;;;16816:56;16889:18;;49503:183:0;16563:350:1;49503:183:0;49760:1;49734:27;;;49772:21;;;:34;49875:60;;-1:-1:-1;;;49875:60:0;;:4;;:16;;:60;;49892:11;;49905;;49918:6;;49926:8;;;;49875:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49195:748;49027:916;;;;;:::o;54516:136::-;12598:7;12625:6;-1:-1:-1;;;;;12625:6:0;11335:10;12772:23;12764:68;;;;-1:-1:-1;;;12764:68:0;;;;;;;:::i;:::-;54595:8:::1;:49:::0;;-1:-1:-1;;;;;;54595:49:0::1;-1:-1:-1::0;;;;;54595:49:0;;;::::1;::::0;;;::::1;::::0;;54516:136::o;52448:87::-;12598:7;12625:6;-1:-1:-1;;;;;12625:6:0;11335:10;12772:23;12764:68;;;;-1:-1:-1;;;12764:68:0;;;;;;;:::i;:::-;52510:8:::1;:17:::0;;-1:-1:-1;;52510:17:0::1;::::0;::::1;;::::0;;;::::1;::::0;;52448:87::o;49951:181::-;12598:7;12625:6;-1:-1:-1;;;;;12625:6:0;11335:10;12772:23;12764:68;;;;-1:-1:-1;;;12764:68:0;;;;;;;:::i;:::-;50078:29:::1;::::0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:46:::1;::::0;50110:14;;50078:46:::1;:::i;13461:238::-:0;12598:7;12625:6;-1:-1:-1;;;;;12625:6:0;11335:10;12772:23;12764:68;;;;-1:-1:-1;;;12764:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13564:22:0;::::1;13542:110;;;::::0;-1:-1:-1;;;13542:110:0;;14780:2:1;13542:110:0::1;::::0;::::1;14762:21:1::0;14819:2;14799:18;;;14792:30;14858:34;14838:18;;;14831:62;-1:-1:-1;;;14909:18:1;;;14902:36;14955:19;;13542:110:0::1;14578:402:1::0;13542:110:0::1;13663:28;13682:8;13663:18;:28::i;:::-;13461:238:::0;:::o;43341:174::-;43416:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;43416:29:0;-1:-1:-1;;;;;43416:29:0;;;;;;;;:24;;43470:23;43416:24;43470:14;:23::i;:::-;-1:-1:-1;;;;;43461:46:0;;;;;;;;;;;43341:174;;:::o;55582:424::-;55778:14;55794:15;55838:8;55813:77;;;;;;;;;;;;:::i;:::-;55777:113;;;;55972:26;55982:6;55990:7;55972:9;:26::i;:::-;55747:259;;55582:424;;;;:::o;39581:452::-;39710:4;39376:16;;;:7;:16;;;;;;-1:-1:-1;;;;;39376:16:0;39732:110;;;;-1:-1:-1;;;39732:110:0;;17871:2:1;39732:110:0;;;17853:21:1;17910:2;17890:18;;;17883:30;17949:34;17929:18;;;17922:62;-1:-1:-1;;;18000:18:1;;;17993:42;18052:19;;39732:110:0;17669:408:1;39732:110:0;39853:13;39869:23;39884:7;39869:14;:23::i;:::-;39853:39;;39922:5;-1:-1:-1;;;;;39911:16:0;:7;-1:-1:-1;;;;;39911:16:0;;:64;;;;39968:7;-1:-1:-1;;;;;39944:31:0;:20;39956:7;39944:11;:20::i;:::-;-1:-1:-1;;;;;39944:31:0;;39911:64;:113;;;-1:-1:-1;;;;;;36562:25:0;;;36533:4;36562:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;39992:32;39903:122;39581:452;-1:-1:-1;;;;39581:452:0:o;42608:615::-;42781:4;-1:-1:-1;;;;;42754:31:0;:23;42769:7;42754:14;:23::i;:::-;-1:-1:-1;;;;;42754:31:0;;42732:122;;;;-1:-1:-1;;;42732:122:0;;21850:2:1;42732:122:0;;;21832:21:1;21889:2;21869:18;;;21862:30;21928:34;21908:18;;;21901:62;-1:-1:-1;;;21979:18:1;;;21972:39;22028:19;;42732:122:0;21648:405:1;42732:122:0;-1:-1:-1;;;;;42873:16:0;;42865:65;;;;-1:-1:-1;;;42865:65:0;;15591:2:1;42865:65:0;;;15573:21:1;15630:2;15610:18;;;15603:30;15669:34;15649:18;;;15642:62;-1:-1:-1;;;15720:18:1;;;15713:34;15764:19;;42865:65:0;15389:400:1;42865:65:0;43047:29;43064:1;43068:7;43047:8;:29::i;:::-;-1:-1:-1;;;;;43089:15:0;;;;;;:9;:15;;;;;:20;;43108:1;;43089:15;:20;;43108:1;;43089:20;:::i;:::-;;;;-1:-1:-1;;;;;;;43120:13:0;;;;;;:9;:13;;;;;:18;;43137:1;;43120:13;:18;;43137:1;;43120:18;:::i;:::-;;;;-1:-1:-1;;43149:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;43149:21:0;-1:-1:-1;;;;;43149:21:0;;;;;;;;;43188:27;;43149:16;;43188:27;;;;;;;42608:615;;;:::o;40375:110::-;40451:26;40461:2;40465:7;40451:26;;;;;;;;;;;;:9;:26::i;13859:191::-;13933:16;13952:6;;-1:-1:-1;;;;;13969:17:0;;;-1:-1:-1;;;;;;13969:17:0;;;;;;14002:40;;13952:6;;;;;;;14002:40;;13933:16;14002:40;13922:128;13859:191;:::o;43657:315::-;43812:8;-1:-1:-1;;;;;43803:17:0;:5;-1:-1:-1;;;;;43803:17:0;;;43795:55;;;;-1:-1:-1;;;43795:55:0;;15996:2:1;43795:55:0;;;15978:21:1;16035:2;16015:18;;;16008:30;16074:27;16054:18;;;16047:55;16119:18;;43795:55:0;15794:349:1;43795:55:0;-1:-1:-1;;;;;43861:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;43861:46:0;;;;;;;;;;43923:41;;13185::1;;;43923::0;;13158:18:1;43923:41:0;;;;;;;43657:315;;;:::o;38622:352::-;38779:28;38789:4;38795:2;38799:7;38779:9;:28::i;:::-;38840:48;38863:4;38869:2;38873:7;38882:5;38840:22;:48::i;:::-;38818:148;;;;-1:-1:-1;;;38818:148:0;;;;;;;:::i;56014:100::-;56066:13;56099:7;56092:14;;;;;:::i;8787:723::-;8843:13;9064:10;9060:53;;-1:-1:-1;;9091:10:0;;;;;;;;;;;;-1:-1:-1;;;9091:10:0;;;;;8787:723::o;9060:53::-;9138:5;9123:12;9179:78;9186:9;;9179:78;;9212:8;;;;:::i;:::-;;-1:-1:-1;9235:10:0;;-1:-1:-1;9243:2:0;9235:10;;:::i;:::-;;;9179:78;;;9267:19;9299:6;-1:-1:-1;;;;;9289:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9289:17:0;;9267:39;;9317:154;9324:10;;9317:154;;9351:11;9361:1;9351:11;;:::i;:::-;;-1:-1:-1;9420:10:0;9428:2;9420:5;:10;:::i;:::-;9407:24;;:2;:24;:::i;:::-;9394:39;;9377:6;9384;9377:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;9377:56:0;;;;;;;;-1:-1:-1;9448:11:0;9457:2;9448:11;;:::i;:::-;;;9317:154;;41911:360;41971:13;41987:23;42002:7;41987:14;:23::i;:::-;41971:39;;42112:29;42129:1;42133:7;42112:8;:29::i;:::-;-1:-1:-1;;;;;42154:16:0;;;;;;:9;:16;;;;;:21;;42174:1;;42154:16;:21;;42174:1;;42154:21;:::i;:::-;;;;-1:-1:-1;;42193:16:0;;;;:7;:16;;;;;;42186:23;;-1:-1:-1;;;;;;42186:23:0;;;42227:36;42201:7;;42193:16;-1:-1:-1;;;;;42227:36:0;;;;;42193:16;;42227:36;41960:311;41911:360;:::o;40712:321::-;40842:18;40848:2;40852:7;40842:5;:18::i;:::-;40893:54;40924:1;40928:2;40932:7;40941:5;40893:22;:54::i;:::-;40871:154;;;;-1:-1:-1;;;40871:154:0;;;;;;;:::i;44537:980::-;44692:4;-1:-1:-1;;;;;44713:13:0;;15198:20;15246:8;44709:801;;44766:175;;-1:-1:-1;;;44766:175:0;;-1:-1:-1;;;;;44766:36:0;;;;;:175;;11335:10;;44860:4;;44887:7;;44917:5;;44766:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44766:175:0;;;;;;;;-1:-1:-1;;44766:175:0;;;;;;;;;;;;:::i;:::-;;;44745:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45124:13:0;;45120:320;;45167:108;;-1:-1:-1;;;45167:108:0;;;;;;;:::i;45120:320::-;45390:6;45384:13;45375:6;45371:2;45367:15;45360:38;44745:710;-1:-1:-1;;;;;;45005:51:0;-1:-1:-1;;;45005:51:0;;-1:-1:-1;44998:58:0;;44709:801;-1:-1:-1;45494:4:0;44537:980;;;;;;:::o;41369:313::-;-1:-1:-1;;;;;41449:16:0;;41441:61;;;;-1:-1:-1;;;41441:61:0;;20294:2:1;41441:61:0;;;20276:21:1;;;20313:18;;;20306:30;20372:34;20352:18;;;20345:62;20424:18;;41441:61:0;20092:356:1;41441:61:0;-1:-1:-1;;;;;41573:13:0;;;;;;:9;:13;;;;;:18;;41590:1;;41573:13;:18;;41590:1;;41573:18;:::i;:::-;;;;-1:-1:-1;;41602:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;41602:21:0;-1:-1:-1;;;;;41602:21:0;;;;;;;;41641:33;;41602:16;;;41641:33;;41602:16;;41641:33;41369:313;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;-1:-1:-1;;;;;149:2:1;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:160::-;715:20;;771:13;;764:21;754:32;;744:60;;800:1;797;790:12;744:60;650:160;;;:::o;815:347::-;866:8;876:6;930:3;923:4;915:6;911:17;907:27;897:55;;948:1;945;938:12;897:55;-1:-1:-1;971:20:1;;-1:-1:-1;;;;;1003:30:1;;1000:50;;;1046:1;1043;1036:12;1000:50;1083:4;1075:6;1071:17;1059:29;;1135:3;1128:4;1119:6;1111;1107:19;1103:30;1100:39;1097:59;;;1152:1;1149;1142:12;1097:59;815:347;;;;;:::o;1167:220::-;1209:5;1262:3;1255:4;1247:6;1243:17;1239:27;1229:55;;1280:1;1277;1270:12;1229:55;1302:79;1377:3;1368:6;1355:20;1348:4;1340:6;1336:17;1302:79;:::i;1392:159::-;1459:20;;1519:6;1508:18;;1498:29;;1488:57;;1541:1;1538;1531:12;1556:171;1623:20;;-1:-1:-1;;;;;1672:30:1;;1662:41;;1652:69;;1717:1;1714;1707:12;1732:247;1791:6;1844:2;1832:9;1823:7;1819:23;1815:32;1812:52;;;1860:1;1857;1850:12;1812:52;1899:9;1886:23;1918:31;1943:5;1918:31;:::i;1984:320::-;2071:6;2079;2132:2;2120:9;2111:7;2107:23;2103:32;2100:52;;;2148:1;2145;2138:12;2100:52;2180:9;2174:16;2199:31;2224:5;2199:31;:::i;:::-;2294:2;2279:18;;;;2273:25;2249:5;;2273:25;;-1:-1:-1;;;1984:320:1:o;2309:388::-;2377:6;2385;2438:2;2426:9;2417:7;2413:23;2409:32;2406:52;;;2454:1;2451;2444:12;2406:52;2493:9;2480:23;2512:31;2537:5;2512:31;:::i;:::-;2562:5;-1:-1:-1;2619:2:1;2604:18;;2591:32;2632:33;2591:32;2632:33;:::i;:::-;2684:7;2674:17;;;2309:388;;;;;:::o;2702:456::-;2779:6;2787;2795;2848:2;2836:9;2827:7;2823:23;2819:32;2816:52;;;2864:1;2861;2854:12;2816:52;2903:9;2890:23;2922:31;2947:5;2922:31;:::i;:::-;2972:5;-1:-1:-1;3029:2:1;3014:18;;3001:32;3042:33;3001:32;3042:33;:::i;:::-;2702:456;;3094:7;;-1:-1:-1;;;3148:2:1;3133:18;;;;3120:32;;2702:456::o;3163:665::-;3258:6;3266;3274;3282;3335:3;3323:9;3314:7;3310:23;3306:33;3303:53;;;3352:1;3349;3342:12;3303:53;3391:9;3378:23;3410:31;3435:5;3410:31;:::i;:::-;3460:5;-1:-1:-1;3517:2:1;3502:18;;3489:32;3530:33;3489:32;3530:33;:::i;:::-;3582:7;-1:-1:-1;3636:2:1;3621:18;;3608:32;;-1:-1:-1;3691:2:1;3676:18;;3663:32;-1:-1:-1;;;;;3707:30:1;;3704:50;;;3750:1;3747;3740:12;3704:50;3773:49;3814:7;3805:6;3794:9;3790:22;3773:49;:::i;:::-;3763:59;;;3163:665;;;;;;;:::o;3833:315::-;3898:6;3906;3959:2;3947:9;3938:7;3934:23;3930:32;3927:52;;;3975:1;3972;3965:12;3927:52;4014:9;4001:23;4033:31;4058:5;4033:31;:::i;:::-;4083:5;-1:-1:-1;4107:35:1;4138:2;4123:18;;4107:35;:::i;:::-;4097:45;;3833:315;;;;;:::o;4153:::-;4221:6;4229;4282:2;4270:9;4261:7;4257:23;4253:32;4250:52;;;4298:1;4295;4288:12;4250:52;4337:9;4324:23;4356:31;4381:5;4356:31;:::i;:::-;4406:5;4458:2;4443:18;;;;4430:32;;-1:-1:-1;;;4153:315:1:o;4473:180::-;4529:6;4582:2;4570:9;4561:7;4557:23;4553:32;4550:52;;;4598:1;4595;4588:12;4550:52;4621:26;4637:9;4621:26;:::i;4658:245::-;4716:6;4769:2;4757:9;4748:7;4744:23;4740:32;4737:52;;;4785:1;4782;4775:12;4737:52;4824:9;4811:23;4843:30;4867:5;4843:30;:::i;4908:249::-;4977:6;5030:2;5018:9;5009:7;5005:23;5001:32;4998:52;;;5046:1;5043;5036:12;4998:52;5078:9;5072:16;5097:30;5121:5;5097:30;:::i;5162:450::-;5231:6;5284:2;5272:9;5263:7;5259:23;5255:32;5252:52;;;5300:1;5297;5290:12;5252:52;5340:9;5327:23;-1:-1:-1;;;;;5365:6:1;5362:30;5359:50;;;5405:1;5402;5395:12;5359:50;5428:22;;5481:4;5473:13;;5469:27;-1:-1:-1;5459:55:1;;5510:1;5507;5500:12;5459:55;5533:73;5598:7;5593:2;5580:16;5575:2;5571;5567:11;5533:73;:::i;5617:184::-;5675:6;5728:2;5716:9;5707:7;5703:23;5699:32;5696:52;;;5744:1;5741;5734:12;5696:52;5767:28;5785:9;5767:28;:::i;5806:481::-;5884:6;5892;5900;5953:2;5941:9;5932:7;5928:23;5924:32;5921:52;;;5969:1;5966;5959:12;5921:52;5992:28;6010:9;5992:28;:::i;:::-;5982:38;;6071:2;6060:9;6056:18;6043:32;-1:-1:-1;;;;;6090:6:1;6087:30;6084:50;;;6130:1;6127;6120:12;6084:50;6169:58;6219:7;6210:6;6199:9;6195:22;6169:58;:::i;:::-;5806:481;;6246:8;;-1:-1:-1;6143:84:1;;-1:-1:-1;;;;5806:481:1:o;6292:460::-;6377:6;6385;6393;6446:2;6434:9;6425:7;6421:23;6417:32;6414:52;;;6462:1;6459;6452:12;6414:52;6485:28;6503:9;6485:28;:::i;:::-;6475:38;;6564:2;6553:9;6549:18;6536:32;-1:-1:-1;;;;;6583:6:1;6580:30;6577:50;;;6623:1;6620;6613:12;6577:50;6646:49;6687:7;6678:6;6667:9;6663:22;6646:49;:::i;:::-;6636:59;;;6742:2;6731:9;6727:18;6714:32;6704:42;;6292:460;;;;;:::o;6757:773::-;6861:6;6869;6877;6885;6893;6946:3;6934:9;6925:7;6921:23;6917:33;6914:53;;;6963:1;6960;6953:12;6914:53;6986:28;7004:9;6986:28;:::i;:::-;6976:38;;7065:2;7054:9;7050:18;7037:32;-1:-1:-1;;;;;7129:2:1;7121:6;7118:14;7115:34;;;7145:1;7142;7135:12;7115:34;7168:49;7209:7;7200:6;7189:9;7185:22;7168:49;:::i;:::-;7158:59;;7236:37;7269:2;7258:9;7254:18;7236:37;:::i;:::-;7226:47;;7326:2;7315:9;7311:18;7298:32;7282:48;;7355:2;7345:8;7342:16;7339:36;;;7371:1;7368;7361:12;7339:36;;7410:60;7462:7;7451:8;7440:9;7436:24;7410:60;:::i;:::-;6757:773;;;;-1:-1:-1;6757:773:1;;-1:-1:-1;7489:8:1;;7384:86;6757:773;-1:-1:-1;;;6757:773:1:o;7535:684::-;7637:6;7645;7653;7661;7714:3;7702:9;7693:7;7689:23;7685:33;7682:53;;;7731:1;7728;7721:12;7682:53;7754:28;7772:9;7754:28;:::i;:::-;7744:38;;7833:2;7822:9;7818:18;7805:32;-1:-1:-1;;;;;7897:2:1;7889:6;7886:14;7883:34;;;7913:1;7910;7903:12;7883:34;7936:49;7977:7;7968:6;7957:9;7953:22;7936:49;:::i;:::-;7926:59;;8004:37;8037:2;8026:9;8022:18;8004:37;:::i;:::-;7994:47;;8094:2;8083:9;8079:18;8066:32;8050:48;;8123:2;8113:8;8110:16;8107:36;;;8139:1;8136;8129:12;8107:36;;8162:51;8205:7;8194:8;8183:9;8179:24;8162:51;:::i;8224:252::-;8291:6;8299;8352:2;8340:9;8331:7;8327:23;8323:32;8320:52;;;8368:1;8365;8358:12;8320:52;8391:28;8409:9;8391:28;:::i;8481:180::-;8540:6;8593:2;8581:9;8572:7;8568:23;8564:32;8561:52;;;8609:1;8606;8599:12;8561:52;-1:-1:-1;8632:23:1;;8481:180;-1:-1:-1;8481:180:1:o;8666:245::-;8745:6;8753;8806:2;8794:9;8785:7;8781:23;8777:32;8774:52;;;8822:1;8819;8812:12;8774:52;-1:-1:-1;;8845:16:1;;8901:2;8886:18;;;8880:25;8845:16;;8880:25;;-1:-1:-1;8666:245:1:o;8916:269::-;8973:6;9026:2;9014:9;9005:7;9001:23;8997:32;8994:52;;;9042:1;9039;9032:12;8994:52;9081:9;9068:23;9131:4;9124:5;9120:16;9113:5;9110:27;9100:55;;9151:1;9148;9141:12;9307:257;9348:3;9386:5;9380:12;9413:6;9408:3;9401:19;9429:63;9485:6;9478:4;9473:3;9469:14;9462:4;9455:5;9451:16;9429:63;:::i;:::-;9546:2;9525:15;-1:-1:-1;;9521:29:1;9512:39;;;;9553:4;9508:50;;9307:257;-1:-1:-1;;9307:257:1:o;9569:692::-;9618:3;9659:5;9653:12;9688:36;9714:9;9688:36;:::i;:::-;9743:1;9760:18;;;9787:104;;;;9905:1;9900:355;;;;9753:502;;9787:104;-1:-1:-1;;9820:24:1;;9808:37;;9865:16;;;;-1:-1:-1;9787:104:1;;9900:355;9931:5;9928:1;9921:16;9960:4;10005:2;10002:1;9992:16;10030:1;10044:165;10058:6;10055:1;10052:13;10044:165;;;10136:14;;10123:11;;;10116:35;10179:16;;;;10073:10;;10044:165;;;10048:3;;;10238:6;10233:3;10229:16;10222:23;;9753:502;;;;;9569:692;;;;:::o;10266:271::-;10449:6;10441;10436:3;10423:33;10405:3;10475:16;;10500:13;;;10475:16;10266:271;-1:-1:-1;10266:271:1:o;10542:274::-;10671:3;10709:6;10703:13;10725:53;10771:6;10766:3;10759:4;10751:6;10747:17;10725:53;:::i;:::-;10794:16;;;;;10542:274;-1:-1:-1;;10542:274:1:o;10821:194::-;10947:3;10972:37;11005:3;10997:6;10972:37;:::i;11020:549::-;11244:3;11282:6;11276:13;11298:53;11344:6;11339:3;11332:4;11324:6;11320:17;11298:53;:::i;:::-;11414:13;;11373:16;;;;11436:57;11414:13;11373:16;11470:4;11458:17;;11436:57;:::i;:::-;11509:54;11553:8;11546:5;11542:20;11534:6;11509:54;:::i;:::-;11502:61;11020:549;-1:-1:-1;;;;;;;11020:549:1:o;12273:488::-;-1:-1:-1;;;;;12542:15:1;;;12524:34;;12594:15;;12589:2;12574:18;;12567:43;12641:2;12626:18;;12619:34;;;12689:3;12684:2;12669:18;;12662:31;;;12467:4;;12710:45;;12735:19;;12727:6;12710:45;:::i;:::-;12702:53;12273:488;-1:-1:-1;;;;;;12273:488:1:o;13237:217::-;13384:2;13373:9;13366:21;13347:4;13404:44;13444:2;13433:9;13429:18;13421:6;13404:44;:::i;14159:414::-;14361:2;14343:21;;;14400:2;14380:18;;;14373:30;14439:34;14434:2;14419:18;;14412:62;-1:-1:-1;;;14505:2:1;14490:18;;14483:48;14563:3;14548:19;;14159:414::o;20866:356::-;21068:2;21050:21;;;21087:18;;;21080:30;21146:34;21141:2;21126:18;;21119:62;21213:2;21198:18;;20866:356::o;23647:413::-;23849:2;23831:21;;;23888:2;23868:18;;;23861:30;23927:34;23922:2;23907:18;;23900:62;-1:-1:-1;;;23993:2:1;23978:18;;23971:47;24050:3;24035:19;;23647:413::o;24895:640::-;25176:6;25164:19;;25146:38;;-1:-1:-1;;;;;25220:32:1;;25215:2;25200:18;;25193:60;25240:3;25284:2;25269:18;;25262:31;;;-1:-1:-1;;25316:45:1;;25341:19;;25333:6;25316:45;:::i;:::-;25411:6;25404:14;25397:22;25392:2;25381:9;25377:18;25370:50;25469:9;25461:6;25457:22;25451:3;25440:9;25436:19;25429:51;25497:32;25522:6;25514;25497:32;:::i;:::-;25489:40;24895:640;-1:-1:-1;;;;;;;;24895:640:1:o;25540:717::-;25807:6;25799;25795:19;25784:9;25777:38;25851:3;25846:2;25835:9;25831:18;25824:31;25758:4;25878:45;25918:3;25907:9;25903:19;25895:6;25878:45;:::i;:::-;-1:-1:-1;;;;;25963:6:1;25959:31;25954:2;25943:9;25939:18;25932:59;26039:9;26031:6;26027:22;26022:2;26011:9;26007:18;26000:50;26074:6;26066;26059:22;26128:6;26120;26115:2;26107:6;26103:15;26090:45;26181:1;26176:2;26167:6;26159;26155:19;26151:28;26144:39;26248:2;26241;26237:7;26232:2;26224:6;26220:15;26216:29;26208:6;26204:42;26200:51;26192:59;;;25540:717;;;;;;;;:::o;26262:555::-;26519:6;26511;26507:19;26496:9;26489:38;26563:3;26558:2;26547:9;26543:18;26536:31;26470:4;26590:45;26630:3;26619:9;26615:19;26607:6;26590:45;:::i;:::-;-1:-1:-1;;;;;26675:6:1;26671:31;26666:2;26655:9;26651:18;26644:59;26751:9;26743:6;26739:22;26734:2;26723:9;26719:18;26712:50;26779:32;26804:6;26796;26779:32;:::i;26822:1498::-;27168:6;27160;27156:19;27145:9;27138:38;27119:4;27195:2;27233:3;27228:2;27217:9;27213:18;27206:31;27257:1;27290:6;27284:13;27320:36;27346:9;27320:36;:::i;:::-;27393:6;27387:3;27376:9;27372:19;27365:35;27419:3;27441:1;27473:2;27462:9;27458:18;27490:1;27485:122;;;;27621:1;27616:354;;;;27451:519;;27485:122;-1:-1:-1;;27533:24:1;;27513:18;;;27506:52;27593:3;27578:19;;;-1:-1:-1;27485:122:1;;27616:354;27647:6;27644:1;27637:17;27695:2;27692:1;27682:16;27720:1;27734:180;27748:6;27745:1;27742:13;27734:180;;;27841:14;;27817:17;;;27813:26;;27806:50;27884:16;;;;27763:10;;27734:180;;;27938:17;;27934:26;;;-1:-1:-1;;27451:519:1;;;;;;28015:9;28010:3;28006:19;28001:2;27990:9;27986:18;27979:47;28049:29;28074:3;28066:6;28049:29;:::i;:::-;28035:43;;;28087:54;28137:2;28126:9;28122:18;28114:6;-1:-1:-1;;;;;9264:31:1;9252:44;;9190:112;28087:54;-1:-1:-1;;;;;9264:31:1;;28200:3;28185:19;;9252:44;28254:9;28246:6;28242:22;28236:3;28225:9;28221:19;28214:51;28282:32;28307:6;28299;28282:32;:::i;:::-;28274:40;26822:1498;-1:-1:-1;;;;;;;;;26822:1498:1:o;28760:128::-;28800:3;28831:1;28827:6;28824:1;28821:13;28818:39;;;28837:18;;:::i;:::-;-1:-1:-1;28873:9:1;;28760:128::o;28893:120::-;28933:1;28959;28949:35;;28964:18;;:::i;:::-;-1:-1:-1;28998:9:1;;28893:120::o;29018:125::-;29058:4;29086:1;29083;29080:8;29077:34;;;29091:18;;:::i;:::-;-1:-1:-1;29128:9:1;;29018:125::o;29148:258::-;29220:1;29230:113;29244:6;29241:1;29238:13;29230:113;;;29320:11;;;29314:18;29301:11;;;29294:39;29266:2;29259:10;29230:113;;;29361:6;29358:1;29355:13;29352:48;;;-1:-1:-1;;29396:1:1;29378:16;;29371:27;29148:258::o;29411:380::-;29490:1;29486:12;;;;29533;;;29554:61;;29608:4;29600:6;29596:17;29586:27;;29554:61;29661:2;29653:6;29650:14;29630:18;29627:38;29624:161;;;29707:10;29702:3;29698:20;29695:1;29688:31;29742:4;29739:1;29732:15;29770:4;29767:1;29760:15;29624:161;;29411:380;;;:::o;29796:135::-;29835:3;-1:-1:-1;;29856:17:1;;29853:43;;;29876:18;;:::i;:::-;-1:-1:-1;29923:1:1;29912:13;;29796:135::o;29936:112::-;29968:1;29994;29984:35;;29999:18;;:::i;:::-;-1:-1:-1;30033:9:1;;29936:112::o;30053:127::-;30114:10;30109:3;30105:20;30102:1;30095:31;30145:4;30142:1;30135:15;30169:4;30166:1;30159:15;30185:127;30246:10;30241:3;30237:20;30234:1;30227:31;30277:4;30274:1;30267:15;30301:4;30298:1;30291:15;30317:127;30378:10;30373:3;30369:20;30366:1;30359:31;30409:4;30406:1;30399:15;30433:4;30430:1;30423:15;30449:127;30510:10;30505:3;30501:20;30498:1;30491:31;30541:4;30538:1;30531:15;30565:4;30562:1;30555:15;30581:131;-1:-1:-1;;;;;30656:31:1;;30646:42;;30636:70;;30702:1;30699;30692:12;30717:131;-1:-1:-1;;;;;;30791:32:1;;30781:43;;30771:71;;30838:1;30835;30828:12
Swarm Source
ipfs://5075c32fd39f53a040297e94c926cf12e30c4061dc3c4dc39552da147dd311c2
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.