Polygon Sponsored slots available. Book your slot here!
ERC-1155
Overview
Max Total Supply
0 REVVM
Holders
55,529
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
REVVMotorsportInventory
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-06-29 */ // Sources flattened with hardhat v2.4.1 https://hardhat.org // File @animoca/ethereum-contracts-assets-1.0.2/contracts/token/ERC1155721/[email protected] // SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.8.0; /** * @title IERC1155721InventoryBurnable interface. * The function {IERC721Burnable-burnFrom(address,uint256)} is not provided as * {IERC1155Burnable-burnFrom(address,uint256,uint256)} can be used instead. */ interface IERC1155721InventoryBurnable { /** * Burns some token (ERC1155-compatible). * @dev Reverts if the sender is not approved. * @dev Reverts if `id` does not represent a token. * @dev Reverts if `id` represents a fungible token and `value` is 0. * @dev Reverts if `id` represents a fungible token and `value` is higher than `from`'s balance. * @dev Reverts if `id` represents a non-fungible token and `value` is not 1. * @dev Reverts if `id` represents a non-fungible token which is not owned by `from`. * @dev Emits an {IERC721-Transfer} event to the zero address if `id` represents a non-fungible token. * @dev Emits an {IERC1155-TransferSingle} event to the zero address. * @param from Address of the current token owner. * @param id Identifier of the token to burn. * @param value Amount of token to burn. */ function burnFrom( address from, uint256 id, uint256 value ) external; /** * Burns multiple tokens (ERC1155-compatible). * @dev Reverts if `ids` and `values` have different lengths. * @dev Reverts if the sender is not approved. * @dev Reverts if one of `ids` does not represent a token. * @dev Reverts if one of `ids` represents a fungible token and `value` is 0. * @dev Reverts if one of `ids` represents a fungible token and `value` is higher than `from`'s balance. * @dev Reverts if one of `ids` represents a non-fungible token and `value` is not 1. * @dev Reverts if one of `ids` represents a non-fungible token which is not owned by `from`. * @dev Emits an {IERC721-Transfer} event to the zero address for each burnt non-fungible token. * @dev Emits an {IERC1155-TransferBatch} event to the zero address. * @param from Address of the current tokens owner. * @param ids Identifiers of the tokens to burn. * @param values Amounts of tokens to burn. */ function batchBurnFrom( address from, uint256[] calldata ids, uint256[] calldata values ) external; /** * Burns a batch of Non-Fungible Tokens (ERC721-compatible). * @dev Reverts if the sender is not approved. * @dev Reverts if one of `nftIds` does not represent a non-fungible token. * @dev Reverts if one of `nftIds` is not owned by `from`. * @dev Emits an {IERC721-Transfer} event to the zero address for each of `nftIds`. * @dev Emits an {IERC1155-TransferBatch} event to the zero address. * @param from Current token owner. * @param nftIds Identifiers of the tokens to transfer. */ function batchBurnFrom(address from, uint256[] calldata nftIds) external; } // File @animoca/ethereum-contracts-assets-1.0.2/contracts/token/ERC721/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC721 Non-Fungible Token Standard, basic interface * @dev See https://eips.ethereum.org/EIPS/eip-721 * Note: The ERC-165 identifier for this interface is 0x80ac58cd. */ interface IERC721 { event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); /** * Gets the balance of the specified address * @param owner address to query the balance of * @return balance uint256 representing the amount owned by the passed address */ function balanceOf(address owner) external view returns (uint256 balance); /** * Gets the owner of the specified ID * @param tokenId uint256 ID to query the owner of * @return owner address currently marked as the owner of the given ID */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * Approves another address to transfer the given token ID * @dev The zero address indicates there is no approved address. * @dev There can only be one approved address per token at a given time. * @dev Can only be called by the token owner or an approved operator. * @param to address to be approved for the given token ID * @param tokenId uint256 ID of the token to be approved */ function approve(address to, uint256 tokenId) external; /** * Gets the approved address for a token ID, or zero if no address set * @dev Reverts if the token ID does not exist. * @param tokenId uint256 ID of the token to query the approval of * @return operator address currently approved for the given token ID */ function getApproved(uint256 tokenId) external view returns (address operator); /** * Sets or unsets the approval of a given operator * @dev An operator is allowed to transfer all tokens of the sender on their behalf * @param operator operator address to set the approval * @param approved representing the status of the approval to be set */ function setApprovalForAll(address operator, bool approved) external; /** * Tells whether an operator is approved by a given owner * @param owner owner address which you want to query the approval of * @param operator operator address which you want to query the approval of * @return bool whether the given operator is approved by the given owner */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * Transfers the ownership of a given token ID to another address * @dev Usage of this method is discouraged, use `safeTransferFrom` whenever possible * @dev Requires the msg sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * Safely transfers the ownership of a given token ID to another address * * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * * @dev Requires the msg sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * Safely transfers the ownership of a given token ID to another address * * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * * @dev Requires the msg sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred * @param data bytes data to send along with a safe transfer check */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File @animoca/ethereum-contracts-assets-1.0.2/contracts/token/ERC721/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 * Note: The ERC-165 identifier for this interface is 0x5b5e139f. */ interface IERC721Metadata { /** * @dev Gets the token name * @return string representing the token name */ function name() external view returns (string memory); /** * @dev Gets the token symbol * @return string representing the token symbol */ function symbol() external view returns (string memory); /** * @dev Returns an URI for a given token ID * Throws if the token ID does not exist. May return an empty string. * @param tokenId uint256 ID of the token to query * @return string URI of given token ID */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @animoca/ethereum-contracts-assets-1.0.2/contracts/token/ERC721/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC721 Non-Fungible Token Standard, optional unsafe batchTransfer interface * @dev See https://eips.ethereum.org/EIPS/eip-721 * Note: The ERC-165 identifier for this interface is. */ interface IERC721BatchTransfer { /** * Unsafely transfers a batch of tokens. * @dev Usage of this method is discouraged, use `safeTransferFrom` whenever possible * @dev Reverts if `to` is the zero address. * @dev Reverts if the sender is not approved. * @dev Reverts if one of `tokenIds` is not owned by `from`. * @dev Resets the token approval for each of `tokenIds`. * @dev Emits an {IERC721-Transfer} event for each of `tokenIds`. * @param from Current tokens owner. * @param to Address of the new token owner. * @param tokenIds Identifiers of the tokens to transfer. */ function batchTransferFrom( address from, address to, uint256[] calldata tokenIds ) external; } // File @animoca/ethereum-contracts-assets-1.0.2/contracts/token/ERC721/[email protected] pragma solidity >=0.7.6 <0.8.0; /** @title ERC721 Non-Fungible Token Standard, token receiver @dev See https://eips.ethereum.org/EIPS/eip-721 Interface for any contract that wants to support safeTransfers from ERC721 asset contracts. Note: The ERC-165 identifier for this interface is 0x150b7a02. */ interface IERC721Receiver { /** @notice Handle the receipt of an NFT @dev The ERC721 smart contract calls this function on the recipient after a {IERC721-safeTransferFrom}. This function MUST return the function selector, otherwise the caller will revert the transaction. The selector to be returned can be obtained as `this.onERC721Received.selector`. This function MAY throw to revert and reject the transfer. Note: the ERC721 contract address is always the message sender. @param operator The address which called `safeTransferFrom` function @param from The address which previously owned the token @param tokenId The NFT identifier which is being transferred @param data Additional data with no specified format @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @animoca/ethereum-contracts-assets-1.0.2/contracts/token/ERC1155/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC-1155 Multi Token Standard, optional Inventory extension * @dev See https://eips.ethereum.org/EIPS/eip-xxxx * Interface for fungible/non-fungible tokens management on a 1155-compliant contract. * * This interface rationalizes the co-existence of fungible and non-fungible tokens * within the same contract. As several kinds of fungible tokens can be managed under * the Multi-Token standard, we consider that non-fungible tokens can be classified * under their own specific type. We introduce the concept of non-fungible collection * and consider the usage of 3 types of identifiers: * (a) Fungible Token identifiers, each representing a set of Fungible Tokens, * (b) Non-Fungible Collection identifiers, each representing a set of Non-Fungible Tokens (this is not a token), * (c) Non-Fungible Token identifiers. * Identifiers nature * | Type | isFungible | isCollection | isToken | * | Fungible Token | true | true | true | * | Non-Fungible Collection | false | true | false | * | Non-Fungible Token | false | false | true | * * Identifiers compatibilities * | Type | transfer | balance | supply | owner | * | Fungible Token | OK | OK | OK | NOK | * | Non-Fungible Collection | NOK | OK | OK | NOK | * | Non-Fungible Token | OK | 0 or 1 | 0 or 1 | OK | * * Note: The ERC-165 identifier for this interface is 0x469bd23f. */ interface IERC1155Inventory { /** * Optional event emitted when a collection (Fungible Token or Non-Fungible Collection) is created. * This event can be used by a client application to determine which identifiers are meaningful * to track through the functions `balanceOf`, `balanceOfBatch` and `totalSupply`. * @dev This event MUST NOT be emitted twice for the same `collectionId`. */ event CollectionCreated(uint256 indexed collectionId, bool indexed fungible); /** * Retrieves the owner of a non-fungible token (ERC721-compatible). * @dev Reverts if `nftId` is owned by the zero address. * @param nftId Identifier of the token to query. * @return Address of the current owner of the token. */ function ownerOf(uint256 nftId) external view returns (address); /** * Introspects whether or not `id` represents a fungible token. * This function MUST return true even for a fungible token which is not-yet created. * @param id The identifier to query. * @return bool True if `id` represents afungible token, false otherwise. */ function isFungible(uint256 id) external pure returns (bool); /** * Introspects the non-fungible collection to which `nftId` belongs. * @dev This function MUST return a value representing a non-fungible collection. * @dev This function MUST return a value for a non-existing token, and SHOULD NOT be used to check the existence of a non-fungible token. * @dev Reverts if `nftId` does not represent a non-fungible token. * @param nftId The token identifier to query the collection of. * @return The non-fungible collection identifier to which `nftId` belongs. */ function collectionOf(uint256 nftId) external pure returns (uint256); /** * @notice this documentation overrides {IERC1155-balanceOf(address,uint256)}. * Retrieves the balance of `id` owned by account `owner`. * @param owner The account to retrieve the balance of. * @param id The identifier to retrieve the balance of. * @return * If `id` represents a collection (fungible token or non-fungible collection), the balance for this collection. * If `id` represents a non-fungible token, 1 if the token is owned by `owner`, else 0. */ // function balanceOf(address owner, uint256 id) external view returns (uint256); /** * @notice this documentation overrides {IERC1155-balanceOfBatch(address[],uint256[])}. * Retrieves the balances of `ids` owned by accounts `owners`. * @dev Reverts if `owners` and `ids` have different lengths. * @param owners The accounts to retrieve the balances of. * @param ids The identifiers to retrieve the balances of. * @return An array of elements such as for each pair `id`/`owner`: * If `id` represents a collection (fungible token or non-fungible collection), the balance for this collection. * If `id` represents a non-fungible token, 1 if the token is owned by `owner`, else 0. */ // function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory); /** * @notice this documentation overrides its {IERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}. * Safely transfers some token. * @dev Reverts if `to` is the zero address. * @dev Reverts if the sender is not approved. * @dev Reverts if `id` does not represent a token. * @dev Reverts if `id` represents a non-fungible token and `value` is not 1. * @dev Reverts if `id` represents a non-fungible token and is not owned by `from`. * @dev Reverts if `id` represents a fungible token and `value` is 0. * @dev Reverts if `id` represents a fungible token and `from` has an insufficient balance. * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155received} fails or is refused. * @dev Emits an {IERC1155-TransferSingle} event. * @param from Current token owner. * @param to Address of the new token owner. * @param id Identifier of the token to transfer. * @param value Amount of token to transfer. * @param data Optional data to pass to the receiver contract. */ // function safeTransferFrom( // address from, // address to, // uint256 id, // uint256 value, // bytes calldata data // ) external; /** * @notice this documentation overrides its {IERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}. * Safely transfers a batch of tokens. * @dev Reverts if `to` is the zero address. * @dev Reverts if the sender is not approved. * @dev Reverts if one of `ids` does not represent a token. * @dev Reverts if one of `ids` represents a non-fungible token and `value` is not 1. * @dev Reverts if one of `ids` represents a non-fungible token and is not owned by `from`. * @dev Reverts if one of `ids` represents a fungible token and `value` is 0. * @dev Reverts if one of `ids` represents a fungible token and `from` has an insufficient balance. * @dev Reverts if one of `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails or is refused. * @dev Emits an {IERC1155-TransferBatch} event. * @param from Current tokens owner. * @param to Address of the new tokens owner. * @param ids Identifiers of the tokens to transfer. * @param values Amounts of tokens to transfer. * @param data Optional data to pass to the receiver contract. */ // function safeBatchTransferFrom( // address from, // address to, // uint256[] calldata ids, // uint256[] calldata values, // bytes calldata data // ) external; } // File @animoca/ethereum-contracts-assets-1.0.2/contracts/token/ERC1155/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC-1155 Multi Token Standard, basic interface * @dev See https://eips.ethereum.org/EIPS/eip-1155 * Note: The ERC-165 identifier for this interface is 0xd9b67a26. */ interface IERC1155 { event TransferSingle(address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _value); event TransferBatch(address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _values); event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); event URI(string _value, uint256 indexed _id); /** * Safely transfers some token. * @dev Reverts if `to` is the zero address. * @dev Reverts if the sender is not approved. * @dev Reverts if `from` has an insufficient balance. * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155received} fails or is refused. * @dev Emits a `TransferSingle` event. * @param from Current token owner. * @param to Address of the new token owner. * @param id Identifier of the token to transfer. * @param value Amount of token to transfer. * @param data Optional data to send along to a receiver contract. */ function safeTransferFrom( address from, address to, uint256 id, uint256 value, bytes calldata data ) external; /** * Safely transfers a batch of tokens. * @dev Reverts if `to` is the zero address. * @dev Reverts if `ids` and `values` have different lengths. * @dev Reverts if the sender is not approved. * @dev Reverts if `from` has an insufficient balance for any of `ids`. * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails or is refused. * @dev Emits a `TransferBatch` event. * @param from Current token owner. * @param to Address of the new token owner. * @param ids Identifiers of the tokens to transfer. * @param values Amounts of tokens to transfer. * @param data Optional data to send along to a receiver contract. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external; /** * Retrieves the balance of `id` owned by account `owner`. * @param owner The account to retrieve the balance of. * @param id The identifier to retrieve the balance of. * @return The balance of `id` owned by account `owner`. */ function balanceOf(address owner, uint256 id) external view returns (uint256); /** * Retrieves the balances of `ids` owned by accounts `owners`. For each pair: * @dev Reverts if `owners` and `ids` have different lengths. * @param owners The addresses of the token holders * @param ids The identifiers to retrieve the balance of. * @return The balances of `ids` owned by accounts `owners`. */ function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory); /** * Enables or disables an operator's approval. * @dev Emits an `ApprovalForAll` event. * @param operator Address of the operator. * @param approved True to approve the operator, false to revoke an approval. */ function setApprovalForAll(address operator, bool approved) external; /** * Retrieves the approval status of an operator for a given owner. * @param owner Address of the authorisation giver. * @param operator Address of the operator. * @return True if the operator is approved, false if not. */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File @animoca/ethereum-contracts-assets-1.0.2/contracts/token/ERC1155721/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC1155721 */ interface IERC1155721 is IERC1155 { event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); /** * Gets the balance of the specified address * @param owner address to query the balance of * @return balance uint256 representing the amount owned by the passed address */ function balanceOf(address owner) external view returns (uint256 balance); /** * Gets the owner of the specified ID * @param tokenId uint256 ID to query the owner of * @return owner address currently marked as the owner of the given ID */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * Approves another address to transfer the given token ID * @dev The zero address indicates there is no approved address. * @dev There can only be one approved address per token at a given time. * @dev Can only be called by the token owner or an approved operator. * @param to address to be approved for the given token ID * @param tokenId uint256 ID of the token to be approved */ function approve(address to, uint256 tokenId) external; /** * Gets the approved address for a token ID, or zero if no address set * @dev Reverts if the token ID does not exist. * @param tokenId uint256 ID of the token to query the approval of * @return operator address currently approved for the given token ID */ function getApproved(uint256 tokenId) external view returns (address operator); /** * Transfers the ownership of a given token ID to another address * @dev Usage of this method is discouraged, use `safeTransferFrom` whenever possible * @dev Requires the msg sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * Safely transfers the ownership of a given token ID to another address * * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * * @dev Requires the msg sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * Safely transfers the ownership of a given token ID to another address * * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * * @dev Requires the msg sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred * @param data bytes data to send along with a safe transfer check */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File @animoca/ethereum-contracts-assets-1.0.2/contracts/token/ERC1155721/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title IERC1155721Inventory interface. */ interface IERC1155721Inventory is IERC1155721, IERC1155Inventory { /// @dev See {IERC721-ownerOf(uint256)} and {IERC1155Inventory-ownerOf(uint256)}. function ownerOf(uint256 nftId) external view override(IERC1155721, IERC1155Inventory) returns (address); /** * @notice this documentation overrides {IERC1155Inventory-safeTransferFrom(address,address,uint256,uint256,bytes)}. * Safely transfers some token. * @dev Reverts if `to` is the zero address. * @dev Reverts if the sender is not approved. * @dev Reverts if `id` does not represent a token. * @dev Reverts if `id` represents a non-fungible token and `value` is not 1. * @dev Reverts if `id` represents a non-fungible token and is not owned by `from`. * @dev Reverts if `id` represents a fungible token and `value` is 0. * @dev Reverts if `id` represents a fungible token and `from` has an insufficient balance. * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155received} fails or is refused. * @dev Resets the ERC721 single token approval if `id` represents a non-fungible token. * @dev Emits an {IERC721-Transfer} event if `id` represents a non-fungible token. * @dev Emits an {IERC1155-TransferSingle} event. * @param from Current token owner. * @param to Address of the new token owner. * @param id Identifier of the token to transfer. * @param value Amount of token to transfer. * @param data Optional data to pass to the receiver contract. */ // function safeTransferFrom( // address from, // address to, // uint256 id, // uint256 value, // bytes calldata data // ) external; /** * @notice this documentation overrides {IERC1155Inventory-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}. * Safely transfers a batch of tokens. * @dev Reverts if `to` is the zero address. * @dev Reverts if the sender is not approved. * @dev Reverts if one of `ids` does not represent a token. * @dev Reverts if one of `ids` represents a non-fungible token and `value` is not 1. * @dev Reverts if one of `ids` represents a non-fungible token and is not owned by `from`. * @dev Reverts if one of `ids` represents a fungible token and `value` is 0. * @dev Reverts if one of `ids` represents a fungible token and `from` has an insufficient balance. * @dev Reverts if one of `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails or is refused. * @dev Resets the ERC721 single token approval for each transferred non-fungible token. * @dev Emits an {IERC721-Transfer} event for each transferred non-fungible token. * @dev Emits an {IERC1155-TransferBatch} event. * @param from Current tokens owner. * @param to Address of the new tokens owner. * @param ids Identifiers of the tokens to transfer. * @param values Amounts of tokens to transfer. * @param data Optional data to pass to the receiver contract. */ // function safeBatchTransferFrom( // address from, // address to, // uint256[] calldata ids, // uint256[] calldata values, // bytes calldata data // ) external; /** * @notice this documentation overrides its IERC721 counterpart. * Unsafely transfers a Non-Fungible Token. * @dev Usage of this method is discouraged, use `safeTransferFrom` whenever possible * @dev Reverts if `to` is the zero address. * @dev Reverts if the sender is not approved. * @dev Reverts if `nftId` is not owned by `from`. * @dev Reverts if `to` is an IERC1155TokenReceiver contract which refuses the receiver call. * @dev Resets the ERC721 single token approval. * @dev Emits an {IERC721-Transfer} event. * @dev Emits an {IERC1155-TransferSingle} event. * @param from Current token owner. * @param to Address of the new token owner. * @param nftId Identifier of the token to transfer. */ // function transferFrom( // address from, // address to, // uint256 nftId // ) external; /** * @notice this documentation overrides its IERC721 counterpart. * Safely transfers a Non-Fungible Token. * @dev Reverts if `to` is the zero address. * @dev Reverts if the sender is not approved. * @dev Reverts if `nftId` is not owned by `from`. * @dev Reverts if `to` is a contract which does not implement IERC1155TokenReceiver or IERC721Receiver. * @dev Reverts if `to` is an IERC1155TokenReceiver or IERC721Receiver contract which refuses the transfer. * @dev Resets the ERC721 single token approval. * @dev Emits an {IERC721-Transfer} event. * @dev Emits an {IERC1155-TransferSingle} event. * @param from Current token owner. * @param to Address of the new token owner. * @param nftId Identifier of the token to transfer. */ // function safeTransferFrom( // address from, // address to, // uint256 nftId // ) external; /** * @notice this documentation overrides its IERC721 counterpart. * Safely transfers a Non-Fungible Token. * @dev Reverts if `to` is the zero address. * @dev Reverts if the sender is not approved. * @dev Reverts if `nftId` is not owned by `from`. * @dev Reverts if `to` is a contract which does not implement IERC1155TokenReceiver or IERC721Receiver. * @dev Reverts if `to` is an IERC1155TokenReceiver or IERC721Receiver contract which refuses the transfer. * @dev Resets the ERC721 single token approval. * @dev Emits an {IERC721-Transfer} event. * @dev Emits an {IERC1155-TransferSingle} event. * @param from Current token owner. * @param to Address of the new token owner. * @param nftId Identifier of the token to transfer. * @param data Optional data to pass to the receiver contract. */ // function safeTransferFrom( // address from, // address to, // uint256 nftId, // bytes calldata data // ) external; } // File @animoca/ethereum-contracts-assets-1.0.2/contracts/token/ERC1155/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC-1155 Multi Token Standard, optional metadata URI extension * @dev See https://eips.ethereum.org/EIPS/eip-1155 * Note: The ERC-165 identifier for this interface is 0x0e89341c. */ interface IERC1155MetadataURI { /** * @notice A distinct Uniform Resource Identifier (URI) for a given token. * @dev URIs are defined in RFC 3986. * @dev The URI MUST point to a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema". * @dev The uri function SHOULD be used to retrieve values if no event was emitted. * @dev The uri function MUST return the same value as the latest event for an _id if it was emitted. * @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for * an implementation to return a valid string even if the token does not exist. * @return URI string */ function uri(uint256 id) external view returns (string memory); } // File @animoca/ethereum-contracts-assets-1.0.2/contracts/token/ERC1155/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC-1155 Multi Token Standard, optional InventoryTotalSupply extension * @dev See https://eips.ethereum.org/EIPS/eip-xxxx * Note: The ERC-165 identifier for this interface is 0xTODO. */ interface IERC1155InventoryTotalSupply { /** * Retrieves the total supply of `id`. * @param id The identifier for which to retrieve the supply of. * @return * If `id` represents a collection (fungible token or non-fungible collection), the total supply for this collection. * If `id` represents a non-fungible token, 1 if the token exists, else 0. */ function totalSupply(uint256 id) external view returns (uint256); } // File @animoca/ethereum-contracts-assets-1.0.2/contracts/token/ERC1155/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC-1155 Multi Token Standard, token receiver * @dev See https://eips.ethereum.org/EIPS/eip-1155 * Interface for any contract that wants to support transfers from ERC1155 asset contracts. * Note: The ERC-165 identifier for this interface is 0x4e2312e0. */ interface IERC1155TokenReceiver { /** * @notice Handle the receipt of a single ERC1155 token type. * An ERC1155 contract MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update. * This function MUST return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61) to accept the transfer. * Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller. * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return bytes4 `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @notice Handle the receipt of multiple ERC1155 token types. * An ERC1155 contract MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates. * This function MUST return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81) if to accept the transfer(s). * Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller. * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match _values array) * @param values An array containing amounts of each token being transferred (order and length must match _ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File @animoca/ethereum-contracts-core-1.0.1/contracts/introspection/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165. */ 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 @animoca/ethereum-contracts-core-1.0.1/contracts/metatx/[email protected] pragma solidity >=0.7.6 <0.8.0; /* * 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. */ abstract contract ManagedIdentity { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File @animoca/ethereum-contracts-assets-1.0.2/contracts/token/ERC1155/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC1155InventoryIdentifiersLib, a library to introspect inventory identifiers. * @dev With N=32, representing the Non-Fungible Collection mask length, identifiers are represented as follow: * (a) a Fungible Token: * - most significant bit == 0 * (b) a Non-Fungible Collection: * - most significant bit == 1 * - (256-N) least significant bits == 0 * (c) a Non-Fungible Token: * - most significant bit == 1 * - (256-N) least significant bits != 0 */ library ERC1155InventoryIdentifiersLib { // Non-fungible bit. If an id has this bit set, it is a non-fungible (either collection or token) uint256 internal constant _NF_BIT = 1 << 255; // Mask for non-fungible collection (including the nf bit) uint256 internal constant _NF_COLLECTION_MASK = uint256(type(uint32).max) << 224; uint256 internal constant _NF_TOKEN_MASK = ~_NF_COLLECTION_MASK; function isFungibleToken(uint256 id) internal pure returns (bool) { return id & _NF_BIT == 0; } function isNonFungibleToken(uint256 id) internal pure returns (bool) { return id & _NF_BIT != 0 && id & _NF_TOKEN_MASK != 0; } function getNonFungibleCollection(uint256 nftId) internal pure returns (uint256) { return nftId & _NF_COLLECTION_MASK; } } abstract contract ERC1155InventoryBase is IERC165, IERC1155, IERC1155MetadataURI, IERC1155Inventory, IERC1155InventoryTotalSupply, ManagedIdentity { using ERC1155InventoryIdentifiersLib for uint256; // bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)")) bytes4 internal constant _ERC1155_RECEIVED = 0xf23a6e61; // bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)")) bytes4 internal constant _ERC1155_BATCH_RECEIVED = 0xbc197c81; // Burnt non-fungible token owner's magic value uint256 internal constant _BURNT_NFT_OWNER = 0xdead000000000000000000000000000000000000000000000000000000000000; /* owner => operator => approved */ mapping(address => mapping(address => bool)) internal _operators; /* collection ID => owner => balance */ mapping(uint256 => mapping(address => uint256)) internal _balances; /* collection ID => supply */ mapping(uint256 => uint256) internal _supplies; /* NFT ID => owner */ mapping(uint256 => uint256) internal _owners; /* collection ID => creator */ mapping(uint256 => address) internal _creators; /// @dev See {IERC165-supportsInterface}. function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId || interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || interfaceId == type(IERC1155Inventory).interfaceId || interfaceId == type(IERC1155InventoryTotalSupply).interfaceId; } //================================== ERC1155 =======================================/ /// @dev See {IERC1155-balanceOf(address,uint256)}. function balanceOf(address owner, uint256 id) public view virtual override returns (uint256) { require(owner != address(0), "Inventory: zero address"); if (id.isNonFungibleToken()) { return address(uint160(_owners[id])) == owner ? 1 : 0; } return _balances[id][owner]; } /// @dev See {IERC1155-balanceOfBatch(address[],uint256[])}. function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view virtual override returns (uint256[] memory) { require(owners.length == ids.length, "Inventory: inconsistent arrays"); uint256[] memory balances = new uint256[](owners.length); for (uint256 i = 0; i != owners.length; ++i) { balances[i] = balanceOf(owners[i], ids[i]); } return balances; } /// @dev See {IERC1155-setApprovalForAll(address,bool)}. function setApprovalForAll(address operator, bool approved) public virtual override { address sender = _msgSender(); require(operator != sender, "Inventory: self-approval"); _operators[sender][operator] = approved; emit ApprovalForAll(sender, operator, approved); } /// @dev See {IERC1155-isApprovedForAll(address,address)}. function isApprovedForAll(address tokenOwner, address operator) public view virtual override returns (bool) { return _operators[tokenOwner][operator]; } //================================== ERC1155Inventory =======================================/ /// @dev See {IERC1155Inventory-isFungible(uint256)}. function isFungible(uint256 id) external pure virtual override returns (bool) { return id.isFungibleToken(); } /// @dev See {IERC1155Inventory-collectionOf(uint256)}. function collectionOf(uint256 nftId) external pure virtual override returns (uint256) { require(nftId.isNonFungibleToken(), "Inventory: not an NFT"); return nftId.getNonFungibleCollection(); } /// @dev See {IERC1155Inventory-ownerOf(uint256)}. function ownerOf(uint256 nftId) public view virtual override returns (address) { address owner = address(uint160(_owners[nftId])); require(owner != address(0), "Inventory: non-existing NFT"); return owner; } /// @dev See {IERC1155Inventory-totalSupply(uint256)}. function totalSupply(uint256 id) external view virtual override returns (uint256) { if (id.isNonFungibleToken()) { return address(uint160(_owners[id])) == address(0) ? 0 : 1; } else { return _supplies[id]; } } //================================== ABI-level Internal Functions =======================================/ /** * Creates a collection (optional). * @dev Reverts if `collectionId` does not represent a collection. * @dev Reverts if `collectionId` has already been created. * @dev Emits a {IERC1155Inventory-CollectionCreated} event. * @param collectionId Identifier of the collection. */ function _createCollection(uint256 collectionId) internal virtual { require(!collectionId.isNonFungibleToken(), "Inventory: not a collection"); require(_creators[collectionId] == address(0), "Inventory: existing collection"); _creators[collectionId] = _msgSender(); emit CollectionCreated(collectionId, collectionId.isFungibleToken()); } /// @dev See {IERC1155InventoryCreator-creator(uint256)}. function _creator(uint256 collectionId) internal view virtual returns (address) { require(!collectionId.isNonFungibleToken(), "Inventory: not a collection"); return _creators[collectionId]; } //================================== Internal Helper Functions =======================================/ /** * Returns whether `sender` is authorised to make a transfer on behalf of `from`. * @param from The address to check operatibility upon. * @param sender The sender address. * @return True if sender is `from` or an operator for `from`, false otherwise. */ function _isOperatable(address from, address sender) internal view virtual returns (bool) { return (from == sender) || _operators[from][sender]; } /** * Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract. * @dev Reverts if `to` is not a contract. * @dev Reverts if the call to the target fails or is refused. * @param from Previous token owner. * @param to New token owner. * @param id Identifier of the token transferred. * @param value Amount of token transferred. * @param data Optional data to send along with the receiver contract call. */ function _callOnERC1155Received( address from, address to, uint256 id, uint256 value, bytes memory data ) internal { require(IERC1155TokenReceiver(to).onERC1155Received(_msgSender(), from, id, value, data) == _ERC1155_RECEIVED, "Inventory: transfer refused"); } /** * Calls {IERC1155TokenReceiver-onERC1155batchReceived} on a target contract. * @dev Reverts if `to` is not a contract. * @dev Reverts if the call to the target fails or is refused. * @param from Previous tokens owner. * @param to New tokens owner. * @param ids Identifiers of the tokens to transfer. * @param values Amounts of tokens to transfer. * @param data Optional data to send along with the receiver contract call. */ function _callOnERC1155BatchReceived( address from, address to, uint256[] memory ids, uint256[] memory values, bytes memory data ) internal { require( IERC1155TokenReceiver(to).onERC1155BatchReceived(_msgSender(), from, ids, values, data) == _ERC1155_BATCH_RECEIVED, "Inventory: transfer refused" ); } } // File @animoca/ethereum-contracts-core-1.0.1/contracts/utils/types/[email protected] // Partially derived from OpenZeppelin: // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/406c83649bd6169fc1b578e08506d78f0873b276/contracts/utils/Address.sol pragma solidity >=0.7.6 <0.8.0; /** * @dev Upgrades the address type to check if it is a contract. */ library AddressIsContract { /** * @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; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } } // File @animoca/ethereum-contracts-assets-1.0.2/contracts/token/ERC1155721/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC1155721Inventory, an ERC1155Inventory with additional support for ERC721. */ abstract contract ERC1155721Inventory is IERC1155721Inventory, IERC721Metadata, IERC721BatchTransfer, ERC1155InventoryBase { using ERC1155InventoryIdentifiersLib for uint256; using AddressIsContract for address; uint256 internal constant _APPROVAL_BIT_TOKEN_OWNER_ = 1 << 160; string internal _name; string internal _symbol; /* owner => NFT balance */ mapping(address => uint256) internal _nftBalances; /* NFT ID => operator */ mapping(uint256 => address) internal _nftApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /// @dev See {IERC165-supportsInterface(bytes4)}. function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721BatchTransfer).interfaceId || super.supportsInterface(interfaceId); // return interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } //===================================== ERC721 ==========================================/ /** * @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 {IERC721-balanceOf(address)}. function balanceOf(address tokenOwner) external view virtual override returns (uint256) { require(tokenOwner != address(0), "Inventory: zero address"); return _nftBalances[tokenOwner]; } /// @dev See {IERC721-ownerOf(uint256)} and {IERC1155Inventory-ownerOf(uint256)}. function ownerOf(uint256 nftId) public view virtual override(IERC1155721Inventory, ERC1155InventoryBase) returns (address) { return super.ownerOf(nftId); } /// @dev See {IERC721-approve(address,uint256)}. function approve(address to, uint256 nftId) external virtual override { address tokenOwner = ownerOf(nftId); require(to != tokenOwner, "Inventory: self-approval"); require(_isOperatable(tokenOwner, _msgSender()), "Inventory: non-approved sender"); _owners[nftId] = uint256(uint160(tokenOwner)) | _APPROVAL_BIT_TOKEN_OWNER_; _nftApprovals[nftId] = to; emit Approval(tokenOwner, to, nftId); } /// @dev See {IERC721-getApproved(uint256)}. function getApproved(uint256 nftId) external view virtual override returns (address) { uint256 tokenOwner = _owners[nftId]; require(address(uint160(tokenOwner)) != address(0), "Inventory: non-existing NFT"); if (tokenOwner & _APPROVAL_BIT_TOKEN_OWNER_ != 0) { return _nftApprovals[nftId]; } else { return address(0); } } /** * Unsafely transfers a Non-Fungible Token (ERC721-compatible). * @dev See {IERC1155721Inventory-transferFrom(address,address,uint256)}. */ function transferFrom( address from, address to, uint256 nftId ) public virtual override { _transferFrom( from, to, nftId, "", /* safe */ false ); } /** * Safely transfers a Non-Fungible Token (ERC721-compatible). * @dev See {IERC1155721Inventory-safeTransferFrom(address,address,uint256)}. */ function safeTransferFrom( address from, address to, uint256 nftId ) public virtual override { _transferFrom( from, to, nftId, "", /* safe */ true ); } /** * Safely transfers a Non-Fungible Token (ERC721-compatible). * @dev See {IERC1155721Inventory-safeTransferFrom(address,address,uint256,bytes)}. */ function safeTransferFrom( address from, address to, uint256 nftId, bytes memory data ) public virtual override { _transferFrom( from, to, nftId, data, /* safe */ true ); } /** * Unsafely transfers a batch of Non-Fungible Tokens (ERC721-compatible). * @dev See {IERC1155721BatchTransfer-batchTransferFrom(address,address,uint256[])}. */ function batchTransferFrom( address from, address to, uint256[] memory nftIds ) public virtual override { require(to != address(0), "Inventory: transfer to zero"); address sender = _msgSender(); bool operatable = _isOperatable(from, sender); uint256 length = nftIds.length; uint256[] memory values = new uint256[](length); uint256 nfCollectionId; uint256 nfCollectionCount; for (uint256 i; i != length; ++i) { uint256 nftId = nftIds[i]; values[i] = 1; _transferNFT(from, to, nftId, 1, operatable, true); emit Transfer(from, to, nftId); uint256 nextCollectionId = nftId.getNonFungibleCollection(); if (nfCollectionId == 0) { nfCollectionId = nextCollectionId; nfCollectionCount = 1; } else { if (nextCollectionId != nfCollectionId) { _transferNFTUpdateCollection(from, to, nfCollectionId, nfCollectionCount); nfCollectionId = nextCollectionId; nfCollectionCount = 1; } else { ++nfCollectionCount; } } } if (nfCollectionId != 0) { _transferNFTUpdateCollection(from, to, nfCollectionId, nfCollectionCount); _transferNFTUpdateBalances(from, to, length); } emit TransferBatch(_msgSender(), from, to, nftIds, values); if (to.isContract() && _isERC1155TokenReceiver(to)) { _callOnERC1155BatchReceived(from, to, nftIds, values, ""); } } /// @dev See {IERC721Metadata-tokenURI(uint256)}. function tokenURI(uint256 nftId) external view virtual override returns (string memory) { require(address(uint160(_owners[nftId])) != address(0), "Inventory: non-existing NFT"); return uri(nftId); } //================================== ERC1155 =======================================/ /** * Safely transfers some token (ERC1155-compatible). * @dev See {IERC1155721Inventory-safeTransferFrom(address,address,uint256,uint256,bytes)}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 value, bytes memory data ) public virtual override { address sender = _msgSender(); require(to != address(0), "Inventory: transfer to zero"); bool operatable = _isOperatable(from, sender); if (id.isFungibleToken()) { _transferFungible(from, to, id, value, operatable); } else if (id.isNonFungibleToken()) { _transferNFT(from, to, id, value, operatable, false); emit Transfer(from, to, id); } else { revert("Inventory: not a token id"); } emit TransferSingle(sender, from, to, id, value); if (to.isContract()) { _callOnERC1155Received(from, to, id, value, data); } } /** * Safely transfers a batch of tokens (ERC1155-compatible). * @dev See {IERC1155721Inventory-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory values, bytes memory data ) public virtual override { // internal function to avoid stack too deep error _safeBatchTransferFrom(from, to, ids, values, data); } //================================== ERC1155MetadataURI =======================================/ /// @dev See {IERC1155MetadataURI-uri(uint256)}. function uri(uint256) public view virtual override returns (string memory); //================================== ABI-level Internal Functions =======================================/ /** * Safely or unsafely transfers some token (ERC721-compatible). * @dev For `safe` transfer, see {IERC1155721Inventory-transferFrom(address,address,uint256)}. * @dev For un`safe` transfer, see {IERC1155721Inventory-safeTransferFrom(address,address,uint256,bytes)}. */ function _transferFrom( address from, address to, uint256 nftId, bytes memory data, bool safe ) internal { require(to != address(0), "Inventory: transfer to zero"); address sender = _msgSender(); bool operatable = _isOperatable(from, sender); _transferNFT(from, to, nftId, 1, operatable, false); emit Transfer(from, to, nftId); emit TransferSingle(sender, from, to, nftId, 1); if (to.isContract()) { if (_isERC1155TokenReceiver(to)) { _callOnERC1155Received(from, to, nftId, 1, data); } else if (safe) { _callOnERC721Received(from, to, nftId, data); } } } /** * Safely transfers a batch of tokens (ERC1155-compatible). * @dev See {IERC1155721Inventory-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory values, bytes memory data ) internal { require(to != address(0), "Inventory: transfer to zero"); uint256 length = ids.length; require(length == values.length, "Inventory: inconsistent arrays"); address sender = _msgSender(); bool operatable = _isOperatable(from, sender); uint256 nfCollectionId; uint256 nfCollectionCount; uint256 nftsCount; for (uint256 i; i != length; ++i) { uint256 id = ids[i]; if (id.isFungibleToken()) { _transferFungible(from, to, id, values[i], operatable); } else if (id.isNonFungibleToken()) { _transferNFT(from, to, id, values[i], operatable, true); emit Transfer(from, to, id); uint256 nextCollectionId = id.getNonFungibleCollection(); if (nfCollectionId == 0) { nfCollectionId = nextCollectionId; nfCollectionCount = 1; } else { if (nextCollectionId != nfCollectionId) { _transferNFTUpdateCollection(from, to, nfCollectionId, nfCollectionCount); nfCollectionId = nextCollectionId; nftsCount += nfCollectionCount; nfCollectionCount = 1; } else { ++nfCollectionCount; } } } else { revert("Inventory: not a token id"); } } if (nfCollectionId != 0) { _transferNFTUpdateCollection(from, to, nfCollectionId, nfCollectionCount); nftsCount += nfCollectionCount; _transferNFTUpdateBalances(from, to, nftsCount); } emit TransferBatch(_msgSender(), from, to, ids, values); if (to.isContract()) { _callOnERC1155BatchReceived(from, to, ids, values, data); } } /** * Safely or unsafely mints some token (ERC721-compatible). * @dev For `safe` mint, see {IERC1155721InventoryMintable-mint(address,uint256)}. * @dev For un`safe` mint, see {IERC1155721InventoryMintable-safeMint(address,uint256,bytes)}. */ function _mint( address to, uint256 nftId, bytes memory data, bool safe ) internal { require(to != address(0), "Inventory: mint to zero"); require(nftId.isNonFungibleToken(), "Inventory: not an NFT"); _mintNFT(to, nftId, 1, false); emit Transfer(address(0), to, nftId); emit TransferSingle(_msgSender(), address(0), to, nftId, 1); if (to.isContract()) { if (_isERC1155TokenReceiver(to)) { _callOnERC1155Received(address(0), to, nftId, 1, data); } else if (safe) { _callOnERC721Received(address(0), to, nftId, data); } } } /** * Unsafely mints a batch of Non-Fungible Tokens (ERC721-compatible). * @dev See {IERC1155721InventoryMintable-batchMint(address,uint256[])}. */ function _batchMint(address to, uint256[] memory nftIds) internal { require(to != address(0), "Inventory: mint to zero"); uint256 length = nftIds.length; uint256[] memory values = new uint256[](length); uint256 nfCollectionId; uint256 nfCollectionCount; for (uint256 i; i != length; ++i) { uint256 nftId = nftIds[i]; require(nftId.isNonFungibleToken(), "Inventory: not an NFT"); values[i] = 1; _mintNFT(to, nftId, 1, true); emit Transfer(address(0), to, nftId); uint256 nextCollectionId = nftId.getNonFungibleCollection(); if (nfCollectionId == 0) { nfCollectionId = nextCollectionId; nfCollectionCount = 1; } else { if (nextCollectionId != nfCollectionId) { _balances[nfCollectionId][to] += nfCollectionCount; _supplies[nfCollectionId] += nfCollectionCount; nfCollectionId = nextCollectionId; nfCollectionCount = 1; } else { ++nfCollectionCount; } } } _balances[nfCollectionId][to] += nfCollectionCount; _supplies[nfCollectionId] += nfCollectionCount; _nftBalances[to] += length; emit TransferBatch(_msgSender(), address(0), to, nftIds, values); if (to.isContract() && _isERC1155TokenReceiver(to)) { _callOnERC1155BatchReceived(address(0), to, nftIds, values, ""); } } /** * Safely mints some token (ERC1155-compatible). * @dev See {IERC1155721InventoryMintable-safeMint(address,uint256,uint256,bytes)}. */ function _safeMint( address to, uint256 id, uint256 value, bytes memory data ) internal virtual { require(to != address(0), "Inventory: mint to zero"); address sender = _msgSender(); if (id.isFungibleToken()) { _mintFungible(to, id, value); } else if (id.isNonFungibleToken()) { _mintNFT(to, id, value, false); emit Transfer(address(0), to, id); } else { revert("Inventory: not a token id"); } emit TransferSingle(sender, address(0), to, id, value); if (to.isContract()) { _callOnERC1155Received(address(0), to, id, value, data); } } /** * Safely mints a batch of tokens (ERC1155-compatible). * @dev See {IERC1155721InventoryMintable-safeBatchMint(address,uint256[],uint256[],bytes)}. */ function _safeBatchMint( address to, uint256[] memory ids, uint256[] memory values, bytes memory data ) internal virtual { require(to != address(0), "Inventory: mint to zero"); uint256 length = ids.length; require(length == values.length, "Inventory: inconsistent arrays"); uint256 nfCollectionId; uint256 nfCollectionCount; uint256 nftsCount; for (uint256 i; i != length; ++i) { uint256 id = ids[i]; uint256 value = values[i]; if (id.isFungibleToken()) { _mintFungible(to, id, value); } else if (id.isNonFungibleToken()) { _mintNFT(to, id, value, true); emit Transfer(address(0), to, id); uint256 nextCollectionId = id.getNonFungibleCollection(); if (nfCollectionId == 0) { nfCollectionId = nextCollectionId; nfCollectionCount = 1; } else { if (nextCollectionId != nfCollectionId) { _balances[nfCollectionId][to] += nfCollectionCount; _supplies[nfCollectionId] += nfCollectionCount; nfCollectionId = nextCollectionId; nftsCount += nfCollectionCount; nfCollectionCount = 1; } else { ++nfCollectionCount; } } } else { revert("Inventory: not a token id"); } } if (nfCollectionId != 0) { _balances[nfCollectionId][to] += nfCollectionCount; _supplies[nfCollectionId] += nfCollectionCount; nftsCount += nfCollectionCount; _nftBalances[to] += nftsCount; } emit TransferBatch(_msgSender(), address(0), to, ids, values); if (to.isContract()) { _callOnERC1155BatchReceived(address(0), to, ids, values, data); } } /** * Safely mints some tokens to a list of recipients. * @dev Reverts if `recipients`, `ids` and `values` have different lengths. * @dev Reverts if one of `recipients` is the zero address. * @dev Reverts if one of `ids` is not a token. * @dev Reverts if one of `ids` represents a non-fungible token and its `value` is not 1. * @dev Reverts if one of `ids` represents a non-fungible token which has already been minted. * @dev Reverts if one of `ids` represents a fungible token and its `value` is 0. * @dev Reverts if one of `ids` represents a fungible token and there is an overflow of supply. * @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} * or {IERC721Receiver-onERC721Received} fails or is refused. * @dev Emits an {IERC721-Transfer} event from the zero address for each `id` representing a non-fungible token. * @dev Emits an {IERC1155-TransferSingle} event from the zero address. * @param recipients Addresses of the new token owners. * @param ids Identifiers of the tokens to mint. * @param values Amounts of tokens to mint. * @param data Optional data to send along to the receiver contract(s), if any. All receivers receive the same data. */ function _safeDeliver( address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) internal { uint256 length = recipients.length; require(length == ids.length && length == values.length, "Inventory: inconsistent arrays"); address sender = _msgSender(); for (uint256 i; i != length; ++i) { address to = recipients[i]; require(to != address(0), "Inventory: mint to zero"); uint256 id = ids[i]; uint256 value = values[i]; if (id.isFungibleToken()) { _mintFungible(to, id, value); emit TransferSingle(sender, address(0), to, id, value); if (to.isContract()) { _callOnERC1155Received(address(0), to, id, value, data); } } else if (id.isNonFungibleToken()) { _mintNFT(to, id, value, false); emit Transfer(address(0), to, id); emit TransferSingle(sender, address(0), to, id, 1); if (to.isContract()) { if (_isERC1155TokenReceiver(to)) { _callOnERC1155Received(address(0), to, id, 1, data); } else { _callOnERC721Received(address(0), to, id, data); } } } else { revert("Inventory: not a token id"); } } } //============================== Internal Helper Functions =======================================/ function _mintFungible( address to, uint256 id, uint256 value ) internal { require(value != 0, "Inventory: zero value"); uint256 supply = _supplies[id]; uint256 newSupply = supply + value; require(newSupply > supply, "Inventory: supply overflow"); _supplies[id] = newSupply; // cannot overflow as supply cannot overflow _balances[id][to] += value; } function _mintNFT( address to, uint256 id, uint256 value, bool isBatch ) internal { require(value == 1, "Inventory: wrong NFT value"); require(_owners[id] == 0, "Inventory: existing/burnt NFT"); _owners[id] = uint256(uint160(to)); if (!isBatch) { uint256 collectionId = id.getNonFungibleCollection(); // it is virtually impossible that a non-fungible collection supply // overflows due to the cost of minting individual tokens ++_supplies[collectionId]; ++_balances[collectionId][to]; ++_nftBalances[to]; } } function _transferFungible( address from, address to, uint256 id, uint256 value, bool operatable ) internal { require(operatable, "Inventory: non-approved sender"); require(value != 0, "Inventory: zero value"); uint256 balance = _balances[id][from]; require(balance >= value, "Inventory: not enough balance"); if (from != to) { _balances[id][from] = balance - value; // cannot overflow as supply cannot overflow _balances[id][to] += value; } } function _transferNFT( address from, address to, uint256 id, uint256 value, bool operatable, bool isBatch ) internal virtual { require(value == 1, "Inventory: wrong NFT value"); uint256 owner = _owners[id]; require(from == address(uint160(owner)), "Inventory: non-owned NFT"); if (!operatable) { require((owner & _APPROVAL_BIT_TOKEN_OWNER_ != 0) && _msgSender() == _nftApprovals[id], "Inventory: non-approved sender"); } _owners[id] = uint256(uint160(to)); if (!isBatch) { _transferNFTUpdateBalances(from, to, 1); _transferNFTUpdateCollection(from, to, id.getNonFungibleCollection(), 1); } } function _transferNFTUpdateBalances( address from, address to, uint256 amount ) internal virtual { if (from != to) { // cannot underflow as balance is verified through ownership _nftBalances[from] -= amount; // cannot overflow as supply cannot overflow _nftBalances[to] += amount; } } function _transferNFTUpdateCollection( address from, address to, uint256 collectionId, uint256 amount ) internal virtual { if (from != to) { // cannot underflow as balance is verified through ownership _balances[collectionId][from] -= amount; // cannot overflow as supply cannot overflow _balances[collectionId][to] += amount; } } ///////////////////////////////////// Receiver Calls Internal ///////////////////////////////////// /** * Queries whether a contract implements ERC1155TokenReceiver. * @param _contract address of the contract. * @return wheter the given contract implements ERC1155TokenReceiver. */ function _isERC1155TokenReceiver(address _contract) internal view returns (bool) { bool success; bool result; bytes memory staticCallData = abi.encodeWithSelector(type(IERC165).interfaceId, type(IERC1155TokenReceiver).interfaceId); assembly { let call_ptr := add(0x20, staticCallData) let call_size := mload(staticCallData) let output := mload(0x40) // Find empty storage location using "free memory pointer" mstore(output, 0x0) success := staticcall(10000, _contract, call_ptr, call_size, output, 0x20) // 32 bytes result := mload(output) } // (10000 / 63) "not enough for supportsInterface(...)" // consume all gas, so caller can potentially know that there was not enough gas assert(gasleft() > 158); return success && result; } /** * Calls {IERC721Receiver-onERC721Received} on a target contract. * @dev Reverts if `to` is not a contract. * @dev Reverts if the call to the target fails or is refused. * @param from Previous token owner. * @param to New token owner. * @param nftId Identifier of the token transferred. * @param data Optional data to send along with the receiver contract call. */ function _callOnERC721Received( address from, address to, uint256 nftId, bytes memory data ) internal { require( IERC721Receiver(to).onERC721Received(_msgSender(), from, nftId, data) == type(IERC721Receiver).interfaceId, "Inventory: transfer refused" ); } } // File @animoca/ethereum-contracts-assets-1.0.2/contracts/token/ERC1155721/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC1155721InventoryBurnable, a burnable ERC1155721Inventory. */ abstract contract ERC1155721InventoryBurnable is IERC1155721InventoryBurnable, ERC1155721Inventory { using ERC1155InventoryIdentifiersLib for uint256; //================================== ERC165 =======================================/ /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC1155721InventoryBurnable).interfaceId || super.supportsInterface(interfaceId); } //============================== ERC1155721InventoryBurnable =======================================/ /** * Burns some token (ERC1155-compatible). * @dev See {IERC1155721InventoryBurnable-burnFrom(address,uint256,uint256)}. */ function burnFrom( address from, uint256 id, uint256 value ) public virtual override { address sender = _msgSender(); bool operatable = _isOperatable(from, sender); if (id.isFungibleToken()) { _burnFungible(from, id, value, operatable); } else if (id.isNonFungibleToken()) { _burnNFT(from, id, value, operatable, false); emit Transfer(from, address(0), id); } else { revert("Inventory: not a token id"); } emit TransferSingle(sender, from, address(0), id, value); } /** * Burns a batch of token (ERC1155-compatible). * @dev See {IERC1155721InventoryBurnable-batchBurnFrom(address,uint256[],uint256[])}. */ function batchBurnFrom( address from, uint256[] memory ids, uint256[] memory values ) public virtual override { uint256 length = ids.length; require(length == values.length, "Inventory: inconsistent arrays"); address sender = _msgSender(); bool operatable = _isOperatable(from, sender); uint256 nfCollectionId; uint256 nfCollectionCount; uint256 nftsCount; for (uint256 i; i != length; ++i) { uint256 id = ids[i]; if (id.isFungibleToken()) { _burnFungible(from, id, values[i], operatable); } else if (id.isNonFungibleToken()) { _burnNFT(from, id, values[i], operatable, true); emit Transfer(from, address(0), id); uint256 nextCollectionId = id.getNonFungibleCollection(); if (nfCollectionId == 0) { nfCollectionId = nextCollectionId; nfCollectionCount = 1; } else { if (nextCollectionId != nfCollectionId) { _burnNFTUpdateCollection(from, nfCollectionId, nfCollectionCount); nfCollectionId = nextCollectionId; nftsCount += nfCollectionCount; nfCollectionCount = 1; } else { ++nfCollectionCount; } } } else { revert("Inventory: not a token id"); } } if (nfCollectionId != 0) { _burnNFTUpdateCollection(from, nfCollectionId, nfCollectionCount); nftsCount += nfCollectionCount; // cannot underflow as balance is verified through ownership _nftBalances[from] -= nftsCount; } emit TransferBatch(sender, from, address(0), ids, values); } /** * Burns a batch of token (ERC721-compatible). * @dev See {IERC1155721InventoryBurnable-batchBurnFrom(address,uint256[])}. */ function batchBurnFrom(address from, uint256[] memory nftIds) public virtual override { address sender = _msgSender(); bool operatable = _isOperatable(from, sender); uint256 length = nftIds.length; uint256[] memory values = new uint256[](length); uint256 nfCollectionId; uint256 nfCollectionCount; for (uint256 i; i != length; ++i) { uint256 nftId = nftIds[i]; values[i] = 1; _burnNFT(from, nftId, values[i], operatable, true); emit Transfer(from, address(0), nftId); uint256 nextCollectionId = nftId.getNonFungibleCollection(); if (nfCollectionId == 0) { nfCollectionId = nextCollectionId; nfCollectionCount = 1; } else { if (nextCollectionId != nfCollectionId) { _burnNFTUpdateCollection(from, nfCollectionId, nfCollectionCount); nfCollectionId = nextCollectionId; nfCollectionCount = 1; } else { ++nfCollectionCount; } } } if (nfCollectionId != 0) { _burnNFTUpdateCollection(from, nfCollectionId, nfCollectionCount); _nftBalances[from] -= length; } emit TransferBatch(sender, from, address(0), nftIds, values); } //============================== Internal Helper Functions =======================================/ function _burnFungible( address from, uint256 id, uint256 value, bool operatable ) internal { require(value != 0, "Inventory: zero value"); require(operatable, "Inventory: non-approved sender"); uint256 balance = _balances[id][from]; require(balance >= value, "Inventory: not enough balance"); _balances[id][from] = balance - value; // Cannot underflow _supplies[id] -= value; } function _burnNFT( address from, uint256 id, uint256 value, bool operatable, bool isBatch ) internal virtual { require(value == 1, "Inventory: wrong NFT value"); uint256 owner = _owners[id]; require(from == address(uint160(owner)), "Inventory: non-owned NFT"); if (!operatable) { require((owner & _APPROVAL_BIT_TOKEN_OWNER_ != 0) && _msgSender() == _nftApprovals[id], "Inventory: non-approved sender"); } _owners[id] = _BURNT_NFT_OWNER; if (!isBatch) { _burnNFTUpdateCollection(from, id.getNonFungibleCollection(), 1); // cannot underflow as balance is verified through NFT ownership --_nftBalances[from]; } } function _burnNFTUpdateCollection( address from, uint256 collectionId, uint256 amount ) internal virtual { // cannot underflow as balance is verified through NFT ownership _balances[collectionId][from] -= amount; _supplies[collectionId] -= amount; } } // File @animoca/ethereum-contracts-assets-1.0.2/contracts/token/ERC1155721/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title IERC1155721InventoryMintable interface. * The function {IERC721Mintable-safeMint(address,uint256,bytes)} is not provided as * {IERC1155Mintable-safeMint(address,uint256,uint256,bytes)} can be used instead. */ interface IERC1155721InventoryMintable { /** * Safely mints some token (ERC1155-compatible). * @dev Reverts if `to` is the zero address. * @dev Reverts if `id` is not a token. * @dev Reverts if `id` represents a non-fungible token and `value` is not 1. * @dev Reverts if `id` represents a non-fungible token which has already been minted. * @dev Reverts if `id` represents a fungible token and `value` is 0. * @dev Reverts if `id` represents a fungible token and there is an overflow of supply. * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails or is refused. * @dev Emits an {IERC721-Transfer} event from the zero address if `id` represents a non-fungible token. * @dev Emits an {IERC1155-TransferSingle} event from the zero address. * @param to Address of the new token owner. * @param id Identifier of the token to mint. * @param value Amount of token to mint. * @param data Optional data to send along to a receiver contract. */ function safeMint( address to, uint256 id, uint256 value, bytes calldata data ) external; /** * Safely mints a batch of tokens (ERC1155-compatible). * @dev Reverts if `ids` and `values` have different lengths. * @dev Reverts if `to` is the zero address. * @dev Reverts if one of `ids` is not a token. * @dev Reverts if one of `ids` represents a non-fungible token and its paired value is not 1. * @dev Reverts if one of `ids` represents a non-fungible token which has already been minted. * @dev Reverts if one of `ids` represents a fungible token and its paired value is 0. * @dev Reverts if one of `ids` represents a fungible token and there is an overflow of supply. * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails or is refused. * @dev Emits an {IERC721-Transfer} event from the zero address for each non-fungible token minted. * @dev Emits an {IERC1155-TransferBatch} event from the zero address. * @param to Address of the new tokens owner. * @param ids Identifiers of the tokens to mint. * @param values Amounts of tokens to mint. * @param data Optional data to send along to a receiver contract. */ function safeBatchMint( address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external; /** * Unsafely mints a Non-Fungible Token (ERC721-compatible). * @dev Reverts if `to` is the zero address. * @dev Reverts if `nftId` does not represent a non-fungible token. * @dev Reverts if `nftId` has already been minted. * @dev Emits an {IERC721-Transfer} event from the zero address. * @dev Emits an {IERC1155-TransferSingle} event from the zero address. * @dev If `to` is a contract and supports ERC1155TokenReceiver, calls {IERC1155TokenReceiver-onERC1155Received} with empty data. * @param to Address of the new token owner. * @param nftId Identifier of the token to mint. */ function mint(address to, uint256 nftId) external; /** * Unsafely mints a batch of Non-Fungible Tokens (ERC721-compatible). * @dev Reverts if `to` is the zero address. * @dev Reverts if one of `nftIds` does not represent a non-fungible token. * @dev Reverts if one of `nftIds` has already been minted. * @dev Emits an {IERC721-Transfer} event from the zero address for each of `nftIds`. * @dev Emits an {IERC1155-TransferBatch} event from the zero address. * @dev If `to` is a contract and supports ERC1155TokenReceiver, calls {IERC1155TokenReceiver-onERC1155BatchReceived} with empty data. * @param to Address of the new token owner. * @param nftIds Identifiers of the tokens to mint. */ function batchMint(address to, uint256[] calldata nftIds) external; /** * Safely mints a token (ERC721-compatible). * @dev Reverts if `to` is the zero address. * @dev Reverts if `tokenId` has already ben minted. * @dev Reverts if `to` is a contract which does not implement IERC721Receiver or IERC1155TokenReceiver. * @dev Reverts if `to` is an IERC1155TokenReceiver or IERC721TokenReceiver contract which refuses the transfer. * @dev Emits an {IERC721-Transfer} event from the zero address. * @dev Emits an {IERC1155-TransferSingle} event from the zero address. * @param to Address of the new token owner. * @param nftId Identifier of the token to mint. * @param data Optional data to pass along to the receiver call. */ function safeMint( address to, uint256 nftId, bytes calldata data ) external; } // File @animoca/ethereum-contracts-assets-1.0.2/contracts/token/ERC1155721/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title IERC1155721InventoryDeliverable interface. */ interface IERC1155721InventoryDeliverable { /** * Safely mints some tokens to a list of recipients. * @dev Reverts if `recipients`, `ids` and `values` have different lengths. * @dev Reverts if one of `recipients` is the zero address. * @dev Reverts if one of `ids` is not a token. * @dev Reverts if one of `ids` represents a non-fungible token and its `value` is not 1. * @dev Reverts if one of `ids` represents a non-fungible token which has already been minted. * @dev Reverts if one of `ids` represents a fungible token and its `value` is 0. * @dev Reverts if one of `ids` represents a fungible token and there is an overflow of supply. * @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails or is refused. * @dev Emits an {IERC721-Transfer} event from the zero address for each `id` representing a non-fungible token. * @dev Emits an {IERC1155-TransferSingle} event from the zero address. * @param recipients Addresses of the new token owners. * @param ids Identifiers of the tokens to mint. * @param values Amounts of tokens to mint. * @param data Optional data to send along to the receiver contract(s), if any. All receivers receive the same data. */ function safeDeliver( address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external; } // File @animoca/ethereum-contracts-assets-1.0.2/contracts/token/ERC1155/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC-1155 Inventory, additional creator interface * @dev See https://eips.ethereum.org/EIPS/eip-1155 */ interface IERC1155InventoryCreator { /** * Returns the creator of a collection, or the zero address if the collection has not been created. * @dev Reverts if `collectionId` does not represent a collection. * @param collectionId Identifier of the collection. * @return The creator of a collection, or the zero address if the collection has not been created. */ function creator(uint256 collectionId) external view returns (address); } // File @animoca/ethereum-contracts-core-1.0.1/contracts/access/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC-173 Contract Ownership Standard * Note: the ERC-165 identifier for this interface is 0x7f5828d0 */ interface IERC173 { /** * Event emited when ownership of a contract changes. * @param previousOwner the previous owner. * @param newOwner the new owner. */ event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * Get the address of the owner * @return The address of the owner. */ function owner() external view returns (address); /** * Set the address of the new owner of the contract * Set newOwner to address(0) to renounce any ownership. * @dev Emits an {OwnershipTransferred} event. * @param newOwner The address of the new owner of the contract. Using the zero address means renouncing ownership. */ function transferOwnership(address newOwner) external; } // File @animoca/ethereum-contracts-core-1.0.1/contracts/access/[email protected] pragma solidity >=0.7.6 <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 ManagedIdentity, IERC173 { address internal _owner; /** * Initializes the contract, setting the deployer as the initial owner. * @dev Emits an {IERC173-OwnershipTransferred(address,address)} event. */ constructor(address owner_) { _owner = owner_; emit OwnershipTransferred(address(0), owner_); } /** * Gets the address of the current contract owner. */ function owner() public view virtual override returns (address) { return _owner; } /** * See {IERC173-transferOwnership(address)} * @dev Reverts if the sender is not the current contract owner. */ function transferOwnership(address newOwner) public virtual override { _requireOwnership(_msgSender()); _owner = newOwner; emit OwnershipTransferred(_owner, newOwner); } /** * @dev Reverts if `account` is not the contract owner. * @param account the account to test. */ function _requireOwnership(address account) internal virtual { require(account == this.owner(), "Ownable: not the owner"); } } // File @animoca/ethereum-contracts-core-1.0.1/contracts/utils/types/[email protected] // Partially derived from OpenZeppelin: // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/8b10cb38d8fedf34f2d89b0ed604f2dceb76d6a9/contracts/utils/Strings.sol pragma solidity >=0.7.6 <0.8.0; library UInt256ToDecimalString { function toDecimalString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); uint256 index = digits - 1; temp = value; while (temp != 0) { buffer[index--] = bytes1(uint8(48 + (temp % 10))); temp /= 10; } return string(buffer); } } // File @animoca/ethereum-contracts-assets-1.0.2/contracts/metadata/[email protected] pragma solidity >=0.7.6 <0.8.0; abstract contract BaseMetadataURI is ManagedIdentity, Ownable { using UInt256ToDecimalString for uint256; event BaseMetadataURISet(string baseMetadataURI); string public baseMetadataURI; function setBaseMetadataURI(string calldata baseMetadataURI_) external { _requireOwnership(_msgSender()); baseMetadataURI = baseMetadataURI_; emit BaseMetadataURISet(baseMetadataURI_); } function _uri(uint256 id) internal view virtual returns (string memory) { return string(abi.encodePacked(baseMetadataURI, id.toDecimalString())); } } // File @animoca/ethereum-contracts-core-1.0.1/contracts/access/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * Contract which allows derived contracts access control over token minting operations. */ contract MinterRole is Ownable { event MinterAdded(address indexed account); event MinterRemoved(address indexed account); mapping(address => bool) public isMinter; /** * Constructor. */ constructor(address owner_) Ownable(owner_) { _addMinter(owner_); } /** * Grants the minter role to a non-minter. * @dev reverts if the sender is not the contract owner. * @param account The account to grant the minter role to. */ function addMinter(address account) public { _requireOwnership(_msgSender()); _addMinter(account); } /** * Renounces the granted minter role. * @dev reverts if the sender is not a minter. */ function renounceMinter() public { address account = _msgSender(); _requireMinter(account); isMinter[account] = false; emit MinterRemoved(account); } function _requireMinter(address account) internal view { require(isMinter[account], "MinterRole: not a Minter"); } function _addMinter(address account) internal { isMinter[account] = true; emit MinterAdded(account); } } // File @animoca/ethereum-contracts-core-1.0.1/contracts/utils/[email protected] pragma solidity >=0.7.6 <0.8.0; abstract contract Recoverable is ManagedIdentity, Ownable { /** * Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts. * Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens * so that the extraction is limited to only amounts sent accidentally. * @dev Reverts if the sender is not the contract owner. * @dev Reverts if `accounts`, `tokens` and `amounts` do not have the same length. * @dev Reverts if one of `tokens` is does not implement the ERC20 transfer function. * @dev Reverts if one of the ERC20 transfers fail for any reason. * @param accounts the list of accounts to transfer the tokens to. * @param tokens the list of ERC20 token addresses. * @param amounts the list of token amounts to transfer. */ function recoverERC20s( address[] calldata accounts, address[] calldata tokens, uint256[] calldata amounts ) external virtual { _requireOwnership(_msgSender()); uint256 length = accounts.length; require(length == tokens.length && length == amounts.length, "Recov: inconsistent arrays"); for (uint256 i = 0; i != length; ++i) { require(RecoverableERC20(tokens[i]).transfer(accounts[i], amounts[i]), "Recov: transfer failed"); } } /** * Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts. * Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens * so that the extraction is limited to only tokens sent accidentally. * @dev Reverts if the sender is not the contract owner. * @dev Reverts if `accounts`, `contracts` and `amounts` do not have the same length. * @dev Reverts if one of `contracts` is does not implement the ERC721 transferFrom function. * @dev Reverts if one of the ERC721 transfers fail for any reason. * @param accounts the list of accounts to transfer the tokens to. * @param contracts the list of ERC721 contract addresses. * @param tokenIds the list of token ids to transfer. */ function recoverERC721s( address[] calldata accounts, address[] calldata contracts, uint256[] calldata tokenIds ) external virtual { _requireOwnership(_msgSender()); uint256 length = accounts.length; require(length == contracts.length && length == tokenIds.length, "Recov: inconsistent arrays"); for (uint256 i = 0; i != length; ++i) { RecoverableERC721(contracts[i]).transferFrom(address(this), accounts[i], tokenIds[i]); } } } interface RecoverableERC20 { /// See {IERC20-transfer(address,uint256)} function transfer(address recipient, uint256 amount) external returns (bool); } interface RecoverableERC721 { /// See {IERC721-transferFrom(address,address,uint256)} function transferFrom( address from, address to, uint256 tokenId ) external; } // File @animoca/ethereum-contracts-core-1.0.1/contracts/lifecycle/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @dev Contract which allows children to implement pausability. */ abstract contract Pausable is ManagedIdentity { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool public paused; constructor(bool paused_) { paused = paused_; } function _requireNotPaused() internal view { require(!paused, "Pausable: paused"); } function _requirePaused() internal view { require(paused, "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual { _requireNotPaused(); paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual { _requirePaused(); paused = false; emit Unpaused(_msgSender()); } } // File ethereum-universal-forwarder/src/solc_0.7/ERC2771/[email protected] pragma solidity ^0.7.0; abstract contract UsingAppendedCallData { function _lastAppendedDataAsSender() internal pure virtual returns (address payable sender) { // Copied from openzeppelin : https://github.com/OpenZeppelin/openzeppelin-contracts/blob/9d5f77db9da0604ce0b25148898a94ae2c20d70f/contracts/metatx/ERC2771Context.sol1 // The assembly code is more direct than the Solidity version using `abi.decode`. // solhint-disable-next-line no-inline-assembly assembly { sender := shr(96, calldataload(sub(calldatasize(), 20))) } } function _msgDataAssuming20BytesAppendedData() internal pure virtual returns (bytes calldata) { return msg.data[:msg.data.length - 20]; } } // File ethereum-universal-forwarder/src/solc_0.7/ERC2771/[email protected] pragma solidity ^0.7.0; interface IERC2771 { function isTrustedForwarder(address forwarder) external view returns (bool); } // File ethereum-universal-forwarder/src/solc_0.7/ERC2771/[email protected] pragma solidity ^0.7.0; interface IForwarderRegistry { function isForwarderFor(address, address) external view returns (bool); } // File ethereum-universal-forwarder/src/solc_0.7/ERC2771/[email protected] pragma solidity ^0.7.0; abstract contract UsingUniversalForwarding is UsingAppendedCallData, IERC2771 { IForwarderRegistry internal immutable _forwarderRegistry; address internal immutable _universalForwarder; constructor(IForwarderRegistry forwarderRegistry, address universalForwarder) { _universalForwarder = universalForwarder; _forwarderRegistry = forwarderRegistry; } function isTrustedForwarder(address forwarder) external view virtual override returns (bool) { return forwarder == _universalForwarder || forwarder == address(_forwarderRegistry); } function _msgSender() internal view virtual returns (address payable) { address payable msgSender = msg.sender; address payable sender = _lastAppendedDataAsSender(); if (msgSender == address(_forwarderRegistry) || msgSender == _universalForwarder) { // if forwarder use appended data return sender; } // if msg.sender is neither the registry nor the universal forwarder, // we have to check the last 20bytes of the call data intepreted as an address // and check if the msg.sender was registered as forewarder for that address // we check tx.origin to save gas in case where msg.sender == tx.origin // solhint-disable-next-line avoid-tx-origin if (msgSender != tx.origin && _forwarderRegistry.isForwarderFor(sender, msgSender)) { return sender; } return msgSender; } function _msgData() internal view virtual returns (bytes calldata) { address payable msgSender = msg.sender; if (msgSender == address(_forwarderRegistry) || msgSender == _universalForwarder) { // if forwarder use appended data return _msgDataAssuming20BytesAppendedData(); } // we check tx.origin to save gas in case where msg.sender == tx.origin // solhint-disable-next-line avoid-tx-origin if (msgSender != tx.origin && _forwarderRegistry.isForwarderFor(_lastAppendedDataAsSender(), msgSender)) { return _msgDataAssuming20BytesAppendedData(); } return msg.data; } } // File contracts/token/ERC155721/REVVMotorsportInventory.sol pragma solidity >=0.7.6 <0.8.0; // solhint-disable max-line-length // solhint-enable max-line-length contract REVVMotorsportInventory is ERC1155721InventoryBurnable, IERC1155721InventoryMintable, IERC1155721InventoryDeliverable, IERC1155InventoryCreator, BaseMetadataURI, MinterRole, Pausable, Recoverable, UsingUniversalForwarding { constructor(IForwarderRegistry forwarderRegistry, address universalForwarder) ERC1155721Inventory("REVV Motorsport Inventory", "REVVM") MinterRole(msg.sender) Pausable(false) UsingUniversalForwarding(forwarderRegistry, universalForwarder) {} // =================================================================================================== // User Public Functions // =================================================================================================== /// @dev See {IERC165-supportsInterface}. function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC1155InventoryCreator).interfaceId || super.supportsInterface(interfaceId); } //================================== ERC1155MetadataURI =======================================/ /// @dev See {IERC1155MetadataURI-uri(uint256)}. function uri(uint256 id) public view virtual override returns (string memory) { return _uri(id); } //================================== ERC1155InventoryCreator =======================================/ /// @dev See {IERC1155InventoryCreator-creator(uint256)}. function creator(uint256 collectionId) external view override returns (address) { return _creator(collectionId); } // =================================================================================================== // Admin Public Functions // =================================================================================================== // Destroys the contract function deprecate() external { _requirePaused(); address payable sender = _msgSender(); _requireOwnership(sender); selfdestruct(sender); } /** * Creates a collection. * @dev Reverts if the sender is not the contract owner. * @dev Reverts if `collectionId` does not represent a collection. * @dev Reverts if `collectionId` has already been created. * @dev Emits a {IERC1155Inventory-CollectionCreated} event. * @param collectionId Identifier of the collection. */ function createCollection(uint256 collectionId) external { _requireOwnership(_msgSender()); _createCollection(collectionId); } //================================== Pausable =======================================/ function pause() external virtual { _requireOwnership(_msgSender()); _pause(); } function unpause() external virtual { _requireOwnership(_msgSender()); _unpause(); } //================================== ERC721 =======================================/ function transferFrom( address from, address to, uint256 nftId ) public virtual override { _requireNotPaused(); super.transferFrom(from, to, nftId); } function batchTransferFrom( address from, address to, uint256[] memory nftIds ) public virtual override { _requireNotPaused(); super.batchTransferFrom(from, to, nftIds); } function safeTransferFrom( address from, address to, uint256 nftId ) public virtual override { _requireNotPaused(); super.safeTransferFrom(from, to, nftId); } function safeTransferFrom( address from, address to, uint256 nftId, bytes memory data ) public virtual override { _requireNotPaused(); super.safeTransferFrom(from, to, nftId, data); } function batchBurnFrom(address from, uint256[] memory nftIds) public virtual override { _requireNotPaused(); super.batchBurnFrom(from, nftIds); } //================================== ERC1155 =======================================/ function safeTransferFrom( address from, address to, uint256 id, uint256 value, bytes memory data ) public virtual override { _requireNotPaused(); super.safeTransferFrom(from, to, id, value, data); } function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory values, bytes memory data ) public virtual override { _requireNotPaused(); super.safeBatchTransferFrom(from, to, ids, values, data); } function burnFrom( address from, uint256 id, uint256 value ) public virtual override { _requireNotPaused(); super.burnFrom(from, id, value); } function batchBurnFrom( address from, uint256[] memory ids, uint256[] memory values ) public virtual override { _requireNotPaused(); super.batchBurnFrom(from, ids, values); } //================================== ERC1155721InventoryMintable =======================================/ /** * Unsafely mints a Non-Fungible Token (ERC721-compatible). * @dev See {IERC1155721InventoryMintable-batchMint(address,uint256)}. */ function mint(address to, uint256 nftId) public virtual override { _requireMinter(_msgSender()); _mint(to, nftId, "", false); } /** * Unsafely mints a batch of Non-Fungible Tokens (ERC721-compatible). * @dev See {IERC1155721InventoryMintable-batchMint(address,uint256[])}. */ function batchMint(address to, uint256[] memory nftIds) public virtual override { _requireMinter(_msgSender()); _batchMint(to, nftIds); } /** * Safely mints a Non-Fungible Token (ERC721-compatible). * @dev See {IERC1155721InventoryMintable-safeMint(address,uint256,bytes)}. */ function safeMint( address to, uint256 nftId, bytes memory data ) public virtual override { _requireMinter(_msgSender()); _mint(to, nftId, data, true); } /** * Safely mints some token (ERC1155-compatible). * @dev See {IERC1155721InventoryMintable-safeMint(address,uint256,uint256,bytes)}. */ function safeMint( address to, uint256 id, uint256 value, bytes memory data ) public virtual override { _requireMinter(_msgSender()); _safeMint(to, id, value, data); } /** * Safely mints a batch of tokens (ERC1155-compatible). * @dev See {IERC1155721InventoryMintable-safeBatchMint(address,uint256[],uint256[],bytes)}. */ function safeBatchMint( address to, uint256[] memory ids, uint256[] memory values, bytes memory data ) public virtual override { _requireMinter(_msgSender()); _safeBatchMint(to, ids, values, data); } /** * Safely mints tokens to recipients. * @dev See {IERC1155721InventoryDeliverable-safeDeliver(address[],uint256[],uint256[],bytes)}. */ function safeDeliver( address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external virtual override { _requireMinter(_msgSender()); _safeDeliver(recipients, ids, values, data); } function _msgSender() internal view virtual override(ManagedIdentity, UsingUniversalForwarding) returns (address payable) { return UsingUniversalForwarding._msgSender(); } function _msgData() internal view virtual override(ManagedIdentity, UsingUniversalForwarding) returns (bytes memory ret) { return UsingUniversalForwarding._msgData(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"},{"internalType":"address","name":"universalForwarder","type":"address"}],"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":"string","name":"baseMetadataURI","type":"string"}],"name":"BaseMetadataURISet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"collectionId","type":"uint256"},{"indexed":true,"internalType":"bool","name":"fungible","type":"bool"}],"name":"CollectionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"_values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_value","type":"string"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseMetadataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"collectionOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"}],"name":"createCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"}],"name":"creator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deprecate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"isFungible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"address[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeDeliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nftId","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":"nftId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","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":"baseMetadataURI_","type":"string"}],"name":"setBaseMetadataURI","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":"nftId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b5060405162005f1e38038062005f1e833981810160405260408110156200003757600080fd5b508051602091820151604080518082018252601981527f52455656204d6f746f7273706f727420496e76656e746f7279000000000000008186019081528251808401909352600580845264524556564d60d81b9684019690965281519495939486948694600094339485949193620000b292909190620001a4565b508051620000c8906006906020840190620001a4565b5050600980546001600160a01b0319166001600160a01b0384169081179091556040519091506000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620001228162000158565b50600c805460ff1916911515919091179055606090811b6001600160601b031990811660a05291901b1660805250620002509050565b6001600160a01b0381166000818152600b6020526040808220805460ff19166001179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001dc576000855562000227565b82601f10620001f757805160ff191683800117855562000227565b8280016001018555821562000227579182015b82811115620002275782518255916020019190600101906200020a565b506200023592915062000239565b5090565b5b808211156200023557600081556001016200023a565b60805160601c60a05160601c615c956200028960003980611c365280614576525080611c71528061453b52806145ce5250615c956000f3fe608060405234801561001057600080fd5b50600436106103145760003560e01c806373c8a958116101a7578063b88d4fde116100ee578063e8ab9ccc11610097578063f247296511610071578063f2472965146114e9578063f2fde38b1461159c578063f3993d11146115c257610314565b8063e8ab9ccc1461128a578063e985e9c5146113f0578063f242432a1461141e57610314565b8063c7778baa116100c8578063c7778baa14611233578063c87b56dd14611250578063d0011d9d1461126d57610314565b8063b88d4fde1461103c578063bd85b03914611102578063c3666c361461111f57610314565b806395d89b4111610150578063a22cb4651161012a578063a22cb46514610fcb578063aa271e1a14610ff9578063adebf6f21461101f57610314565b806395d89b4114610f95578063983b2d5614610f9d5780639865027514610fc357610314565b80638456cb59116101815780638456cb5914610eca5780638832e6e314610ed25780638da5cb5b14610f8d57610314565b806373c8a95814610c0f5780637e518ec814610d235780638053493414610d9357610314565b80633f4ba83a1161026b578063572b6c05116102145780635cfa9297116101ee5780635cfa929714610b0a5780636352211e14610bcc57806370a0823114610be957610314565b8063572b6c0514610ad45780635b2bd79e14610afa5780635c975abb14610b0257610314565b80634684d7e9116102455780634684d7e9146108f25780634e1273f4146109a5578063510b515814610ab757610314565b80633f4ba83a1461088857806340c10f191461089057806342842e0e146108bc57610314565b80630d6a5bbb116102cd578063124d91e5116102a7578063124d91e51461065957806323b872dd1461068b5780632eb2c2d6146106c157610314565b80630d6a5bbb146104765780630e89341c146106345780630fcc0c281461065157610314565b806306fdde03116102fe57806306fdde0314610392578063081812fc1461040f578063095ea7b31461044857610314565b8062fdd58e1461031957806301ffc9a714610357575b600080fd5b6103456004803603604081101561032f57600080fd5b506001600160a01b03813516906020013561167e565b60408051918252519081900360200190f35b61037e6004803603602081101561036d57600080fd5b50356001600160e01b031916611749565b604080519115158252519081900360200190f35b61039a61178f565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103d45781810151838201526020016103bc565b50505050905090810190601f1680156104015780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61042c6004803603602081101561042557600080fd5b5035611826565b604080516001600160a01b039092168252519081900360200190f35b6104746004803603604081101561045e57600080fd5b506001600160a01b0381351690602001356118c5565b005b6104746004803603608081101561048c57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156104b757600080fd5b8201836020820111156104c957600080fd5b803590602001918460208302840111640100000000831117156104eb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561053b57600080fd5b82018360208201111561054d57600080fd5b8035906020019184602083028401116401000000008311171561056f57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156105bf57600080fd5b8201836020820111156105d157600080fd5b803590602001918460018302840111640100000000831117156105f357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611a17945050505050565b61039a6004803603602081101561064a57600080fd5b5035611a39565b610474611a44565b6104746004803603606081101561066f57600080fd5b506001600160a01b038135169060208101359060400135611a6d565b610474600480360360608110156106a157600080fd5b506001600160a01b03813581169160208101359091169060400135611a85565b610474600480360360a08110156106d757600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561070b57600080fd5b82018360208201111561071d57600080fd5b8035906020019184602083028401116401000000008311171561073f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561078f57600080fd5b8201836020820111156107a157600080fd5b803590602001918460208302840111640100000000831117156107c357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561081357600080fd5b82018360208201111561082557600080fd5b8035906020019184600183028401116401000000008311171561084757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611a98945050505050565b610474611ab4565b610474600480360360408110156108a657600080fd5b506001600160a01b038135169060200135611ace565b610474600480360360608110156108d257600080fd5b506001600160a01b03813581169160208101359091169060400135611af9565b6104746004803603604081101561090857600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561093357600080fd5b82018360208201111561094557600080fd5b8035906020019184602083028401116401000000008311171561096757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611b0c945050505050565b610a67600480360360408110156109bb57600080fd5b8101906020810181356401000000008111156109d657600080fd5b8201836020820111156109e857600080fd5b80359060200191846020830284011164010000000083111715610a0a57600080fd5b919390929091602081019035640100000000811115610a2857600080fd5b820183602082011115610a3a57600080fd5b80359060200191846020830284011164010000000083111715610a5c57600080fd5b509092509050611b21565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610aa3578181015183820152602001610a8b565b505050509050019250505060405180910390f35b61042c60048036036020811015610acd57600080fd5b5035611c27565b61037e60048036036020811015610aea57600080fd5b50356001600160a01b0316611c32565b61039a611cab565b61037e611d39565b61047460048036036080811015610b2057600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135640100000000811115610b5757600080fd5b820183602082011115610b6957600080fd5b80359060200191846001830284011164010000000083111715610b8b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611d42945050505050565b61042c60048036036020811015610be257600080fd5b5035611d59565b61034560048036036020811015610bff57600080fd5b50356001600160a01b0316611d64565b61047460048036036060811015610c2557600080fd5b810190602081018135640100000000811115610c4057600080fd5b820183602082011115610c5257600080fd5b80359060200191846020830284011164010000000083111715610c7457600080fd5b919390929091602081019035640100000000811115610c9257600080fd5b820183602082011115610ca457600080fd5b80359060200191846020830284011164010000000083111715610cc657600080fd5b919390929091602081019035640100000000811115610ce457600080fd5b820183602082011115610cf657600080fd5b80359060200191846020830284011164010000000083111715610d1857600080fd5b509092509050611ddd565b61047460048036036020811015610d3957600080fd5b810190602081018135640100000000811115610d5457600080fd5b820183602082011115610d6657600080fd5b80359060200191846001830284011164010000000083111715610d8857600080fd5b509092509050611f80565b61047460048036036060811015610da957600080fd5b6001600160a01b038235169190810190604081016020820135640100000000811115610dd457600080fd5b820183602082011115610de657600080fd5b80359060200191846020830284011164010000000083111715610e0857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050640100000000811115610e5857600080fd5b820183602082011115610e6a57600080fd5b80359060200191846020830284011164010000000083111715610e8c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611ffc945050505050565b61047461200f565b61047460048036036060811015610ee857600080fd5b6001600160a01b0382351691602081013591810190606081016040820135640100000000811115610f1857600080fd5b820183602082011115610f2a57600080fd5b80359060200191846001830284011164010000000083111715610f4c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612022945050505050565b61042c61203a565b61039a612049565b61047460048036036020811015610fb357600080fd5b50356001600160a01b03166120aa565b6104746120c1565b61047460048036036040811015610fe157600080fd5b506001600160a01b038135169060200135151561211f565b61037e6004803603602081101561100f57600080fd5b50356001600160a01b03166121fe565b61037e6004803603602081101561103557600080fd5b5035612213565b6104746004803603608081101561105257600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561108d57600080fd5b82018360208201111561109f57600080fd5b803590602001918460018302840111640100000000831117156110c157600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061221e945050505050565b6103456004803603602081101561111857600080fd5b5035612232565b6104746004803603606081101561113557600080fd5b81019060208101813564010000000081111561115057600080fd5b82018360208201111561116257600080fd5b8035906020019184602083028401116401000000008311171561118457600080fd5b9193909290916020810190356401000000008111156111a257600080fd5b8201836020820111156111b457600080fd5b803590602001918460208302840111640100000000831117156111d657600080fd5b9193909290916020810190356401000000008111156111f457600080fd5b82018360208201111561120657600080fd5b8035906020019184602083028401116401000000008311171561122857600080fd5b509092509050612288565b6103456004803603602081101561124957600080fd5b50356123d0565b61039a6004803603602081101561126657600080fd5b5035612435565b6104746004803603602081101561128357600080fd5b50356124aa565b610474600480360360808110156112a057600080fd5b8101906020810181356401000000008111156112bb57600080fd5b8201836020820111156112cd57600080fd5b803590602001918460208302840111640100000000831117156112ef57600080fd5b91939092909160208101903564010000000081111561130d57600080fd5b82018360208201111561131f57600080fd5b8035906020019184602083028401116401000000008311171561134157600080fd5b91939092909160208101903564010000000081111561135f57600080fd5b82018360208201111561137157600080fd5b8035906020019184602083028401116401000000008311171561139357600080fd5b9193909290916020810190356401000000008111156113b157600080fd5b8201836020820111156113c357600080fd5b803590602001918460018302840111640100000000831117156113e557600080fd5b5090925090506124be565b61037e6004803603604081101561140657600080fd5b506001600160a01b03813581169160200135166124d9565b610474600480360360a081101561143457600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a08101608082013564010000000081111561147457600080fd5b82018360208201111561148657600080fd5b803590602001918460018302840111640100000000831117156114a857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612505945050505050565b610474600480360360408110156114ff57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561152a57600080fd5b82018360208201111561153c57600080fd5b8035906020019184602083028401116401000000008311171561155e57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061251a945050505050565b610474600480360360208110156115b257600080fd5b50356001600160a01b031661252c565b610474600480360360608110156115d857600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561160c57600080fd5b82018360208201111561161e57600080fd5b8035906020019184602083028401116401000000008311171561164057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612594945050505050565b60006001600160a01b0383166116db576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a207a65726f2061646472657373000000000000000000604482015290519081900360640190fd5b6116e4826125a7565b1561171e576000828152600360205260409020546001600160a01b03848116911614611711576000611714565b60015b60ff169050611743565b5060008181526001602090815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b031982167f510b51580000000000000000000000000000000000000000000000000000000014806117875750611787826125f9565b90505b919050565b60058054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561181b5780601f106117f05761010080835404028352916020019161181b565b820191906000526020600020905b8154815290600101906020018083116117fe57829003601f168201915b505050505090505b90565b6000818152600360205260408120546001600160a01b038116611890576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f6e2d6578697374696e67204e46540000000000604482015290519081900360640190fd5b600160a01b8116156118bb5750506000818152600860205260409020546001600160a01b031661178a565b600091505061178a565b60006118d082611d59565b9050806001600160a01b0316836001600160a01b03161415611939576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a2073656c662d617070726f76616c0000000000000000604482015290519081900360640190fd5b61194a81611945612637565b612646565b61199b576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b60008281526003602090815260408083206001600160a01b03808616600160a01b81179092556008909352818420805493881673ffffffffffffffffffffffffffffffffffffffff1990941684179055905185937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b611a27611a22612637565b612692565b611a33848484846126ff565b50505050565b606061178782612ab1565b611a4c612b84565b6000611a56612637565b9050611a6181612bdb565b806001600160a01b0316ff5b611a75612c9f565b611a80838383612cf7565b505050565b611a8d612c9f565b611a80838383612dea565b611aa0612c9f565b611aad8585858585612e07565b5050505050565b611ac4611abf612637565b612bdb565b611acc612e14565b565b611ad9611a22612637565b611af58282604051806020016040528060008152506000612e6c565b5050565b611b01612c9f565b611a80838383613010565b611b17611a22612637565b611af5828261302d565b6060838214611b77576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b60008467ffffffffffffffff81118015611b9057600080fd5b50604051908082528060200260200182016040528015611bba578160200160208202803683370190505b50905060005b808614611c1d57611bfe878783818110611bd657fe5b905060200201356001600160a01b0316868684818110611bf257fe5b9050602002013561167e565b828281518110611c0a57fe5b6020908102919091010152600101611bc0565b5095945050505050565b60006117878261338b565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316148061178757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316149050919050565b600a805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611d315780601f10611d0657610100808354040283529160200191611d31565b820191906000526020600020905b815481529060010190602001808311611d1457829003601f168201915b505050505081565b600c5460ff1681565b611d4d611a22612637565b611a3384848484613404565b60006117878261354f565b60006001600160a01b038216611dc1576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a207a65726f2061646472657373000000000000000000604482015290519081900360640190fd5b506001600160a01b031660009081526007602052604090205490565b611de8611abf612637565b848381148015611df757508082145b611e48576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b818114611f7657858582818110611e5e57fe5b905060200201356001600160a01b03166001600160a01b031663a9059cbb898984818110611e8857fe5b905060200201356001600160a01b0316868685818110611ea457fe5b905060200201356040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611ef157600080fd5b505af1158015611f05573d6000803e3d6000fd5b505050506040513d6020811015611f1b57600080fd5b5051611f6e576040805162461bcd60e51b815260206004820152601660248201527f5265636f763a207472616e73666572206661696c656400000000000000000000604482015290519081900360640190fd5b600101611e4b565b5050505050505050565b611f8b611abf612637565b611f97600a8383615bbe565b507f04b1dc5c136a3ce9fded8db0ce3d3366c58764ec3a8e4c2b9e52e4ddfe5ebbf7828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b612004612c9f565b611a808383836135b9565b61201a611abf612637565b611acc613856565b61202d611a22612637565b611a808383836001612e6c565b6009546001600160a01b031690565b60068054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561181b5780601f106117f05761010080835404028352916020019161181b565b6120b5611abf612637565b6120be81613894565b50565b60006120cb612637565b90506120d681612692565b6001600160a01b0381166000818152600b6020526040808220805460ff19169055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a250565b6000612129612637565b9050806001600160a01b0316836001600160a01b03161415612192576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a2073656c662d617070726f76616c0000000000000000604482015290519081900360640190fd5b6001600160a01b0381811660008181526020818152604080832094881680845294825291829020805460ff1916871515908117909155825190815291517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319281900390910190a3505050565b600b6020526000908152604090205460ff1681565b6000611787826138e0565b612226612c9f565b611a3384848484613906565b600061223d826125a7565b15612273576000828152600360205260409020546001600160a01b031615612266576001612269565b60005b60ff16905061178a565b5060008181526002602052604090205461178a565b612293611abf612637565b8483811480156122a257508082145b6122f3576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b818114611f765785858281811061230957fe5b905060200201356001600160a01b03166001600160a01b03166323b872dd308a8a8581811061233457fe5b905060200201356001600160a01b031687878681811061235057fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b1580156123ad57600080fd5b505af11580156123c1573d6000803e3d6000fd5b505050508060010190506122f6565b60006123db826125a7565b61242c576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a206e6f7420616e204e46540000000000000000000000604482015290519081900360640190fd5b61178782613914565b6000818152600360205260409020546060906001600160a01b03166124a1576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f6e2d6578697374696e67204e46540000000000604482015290519081900360640190fd5b61178782611a39565b6124b5611abf612637565b6120be81613921565b6124c9611a22612637565b611f768888888888888888613a62565b6001600160a01b0391821660009081526020818152604080832093909416825291909152205460ff1690565b61250d612c9f565b611aad8585858585613dc1565b612522612c9f565b611af58282613f3f565b612537611abf612637565b6009805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383811691821792839055604051919216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b61259c612c9f565b611a8083838361419d565b60007f80000000000000000000000000000000000000000000000000000000000000008216158015906117875750507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16151590565b60006001600160e01b031982167f6059f1b4000000000000000000000000000000000000000000000000000000001480611787575061178782614485565b600061264161452b565b905090565b6000816001600160a01b0316836001600160a01b0316148061268b57506001600160a01b038084166000908152602081815260408083209386168352929052205460ff165b9392505050565b6001600160a01b0381166000908152600b602052604090205460ff166120be576040805162461bcd60e51b815260206004820152601860248201527f4d696e746572526f6c653a206e6f742061204d696e7465720000000000000000604482015290519081900360640190fd5b6001600160a01b03841661275a576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206d696e7420746f207a65726f000000000000000000604482015290519081900360640190fd5b8251825181146127b1576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b6000806000805b84811461295f5760008882815181106127cd57fe5b6020026020010151905060008883815181106127e557fe5b602002602001015190506127f8826138e0565b1561280d576128088b838361468b565b612955565b612816826125a7565b15612908576128288b8383600161477d565b60405182906001600160a01b038d16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4600061286b83613914565b90508661287e5780965060019550612902565b8681146128fb57856001600089815260200190815260200160002060008e6001600160a01b03166001600160a01b0316815260200190815260200160002060008282540192505081905550856002600089815260200190815260200160002060008282540192505081905550809650858501945060019550612902565b8560010195505b50612955565b6040805162461bcd60e51b815260206004820152601960248201527f496e76656e746f72793a206e6f74206120746f6b656e20696400000000000000604482015290519081900360640190fd5b50506001016127b8565b5082156129b45760008381526001602090815260408083206001600160a01b038c1680855290835281842080548701905586845260028352818420805487019055835260079091529020805491830191820190555b6001600160a01b03881660006129c8612637565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a8a604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015612a38578181015183820152602001612a20565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015612a77578181015183820152602001612a5f565b5050505090500194505050505060405180910390a4612a9e886001600160a01b03166148ab565b15611f7657611f766000898989896148b1565b6060600a612abe83614ab7565b6040516020018083805460018160011615610100020316600290048015612b1c5780601f10612afa576101008083540402835291820191612b1c565b820191906000526020600020905b815481529060010190602001808311612b08575b5050825160208401908083835b60208310612b485780518252601f199092019160209182019101612b29565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529050919050565b600c5460ff16611acc576040805162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015290519081900360640190fd5b306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612c1457600080fd5b505afa158015612c28573d6000803e3d6000fd5b505050506040513d6020811015612c3e57600080fd5b50516001600160a01b038281169116146120be576040805162461bcd60e51b815260206004820152601660248201527f4f776e61626c653a206e6f7420746865206f776e657200000000000000000000604482015290519081900360640190fd5b600c5460ff1615611acc576040805162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b6000612d01612637565b90506000612d0f8583612646565b9050612d1a846138e0565b15612d3057612d2b85858584614bc6565b612d85565b612d39846125a7565b1561290857612d4c858585846000614d22565b60405184906000906001600160a01b038816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45b60006001600160a01b0316856001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a45050505050565b611a80838383604051806020016040528060008152506000614ee9565b611aad8585858585615057565b612e1c612b84565b600c805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612e4f612637565b604080516001600160a01b039092168252519081900360200190a1565b6001600160a01b038416612ec7576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206d696e7420746f207a65726f000000000000000000604482015290519081900360640190fd5b612ed0836125a7565b612f21576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a206e6f7420616e204e46540000000000000000000000604482015290519081900360640190fd5b612f2f84846001600061477d565b60405183906001600160a01b038616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46001600160a01b0384166000612f7b612637565b6001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62866001604051808381526020018281526020019250505060405180910390a4612fd6846001600160a01b03166148ab565b15611a3357612fe484615364565b15612ffd57612ff86000858560018661542c565b611a33565b8015611a3357611a33600085858561552e565b611a80838383604051806020016040528060008152506001614ee9565b6001600160a01b038216613088576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206d696e7420746f207a65726f000000000000000000604482015290519081900360640190fd5b805160008167ffffffffffffffff811180156130a357600080fd5b506040519080825280602002602001820160405280156130cd578160200160208202803683370190505b50905060008060005b8481146132275760008682815181106130eb57fe5b602002602001015190506130fe816125a7565b61314f576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a206e6f7420616e204e46540000000000000000000000604482015290519081900360640190fd5b600185838151811061315d57fe5b602002602001018181525050613176888260018061477d565b60405181906001600160a01b038a16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a460006131b982613914565b9050846131cc578094506001935061321d565b8481146132165760008581526001602081815260408084206001600160a01b038e16855282528084208054890190559783526002905295902080549094019093559192918361321d565b8360010193505b50506001016130d6565b5060008281526001602090815260408083206001600160a01b038a1680855290835281842080548601905585845260028352818420805486019055808452600790925282208054870190559061327b612637565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8887604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156132eb5781810151838201526020016132d3565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561332a578181015183820152602001613312565b5050505090500194505050505060405180910390a4613351866001600160a01b03166148ab565b8015613361575061336186615364565b15613383576133836000878786604051806020016040528060008152506148b1565b505050505050565b6000613396826125a7565b156133e8576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b506000908152600460205260409020546001600160a01b031690565b6001600160a01b03841661345f576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206d696e7420746f207a65726f000000000000000000604482015290519081900360640190fd5b6000613469612637565b9050613474846138e0565b156134895761348485858561468b565b6134dd565b613492846125a7565b15612908576134a4858585600061477d565b60405184906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45b604080518581526020810185905281516001600160a01b0380891693600093918616927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f629281900390910190a461353c856001600160a01b03166148ab565b15611aad57611aad60008686868661542c565b6000818152600360205260408120546001600160a01b038116611787576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f6e2d6578697374696e67204e46540000000000604482015290519081900360640190fd5b815181518114613610576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b600061361a612637565b905060006136288683612646565b90506000806000805b86811461373b57600089828151811061364657fe5b60200260200101519050613659816138e0565b156136825761367d8b828b858151811061366f57fe5b602002602001015189614bc6565b613732565b61368b816125a7565b15612908576136b18b828b85815181106136a157fe5b6020026020010151896001614d22565b60405181906000906001600160a01b038e16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a460006136f482613914565b9050856137075780955060019450613730565b858114613729576137198c87876156b0565b9450600193929092019184613730565b8460010194505b505b50600101613631565b5082156137715761374d8984846156b0565b6001600160a01b038916600090815260076020526040902080549183019182900390555b60006001600160a01b0316896001600160a01b0316866001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8b8b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156137f75781810151838201526020016137df565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561383657818101518382015260200161381e565b5050505090500194505050505060405180910390a4505050505050505050565b61385e612c9f565b600c805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612e4f612637565b6001600160a01b0381166000818152600b6020526040808220805460ff19166001179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b7f8000000000000000000000000000000000000000000000000000000000000000161590565b611a33848484846001614ee9565b6001600160e01b03191690565b61392a816125a7565b1561397c576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b6000818152600460205260409020546001600160a01b0316156139e6576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206578697374696e6720636f6c6c656374696f6e0000604482015290519081900360640190fd5b6139ee612637565b6000828152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055613a30816138e0565b1515817f4ebf8ad0df535ba5e487bc9cb27fe44120ca81c3a95d3eba79c0bd1df2ab2d5d60405160405180910390a350565b868581148015613a7157508084145b613ac2576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b6000613acc612637565b905060005b828114613db45760008b8b83818110613ae657fe5b905060200201356001600160a01b0316905060006001600160a01b0316816001600160a01b03161415613b60576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206d696e7420746f207a65726f000000000000000000604482015290519081900360640190fd5b60008a8a84818110613b6e57fe5b9050602002013590506000898985818110613b8557fe5b905060200201359050613b97826138e0565b15613c5457613ba783838361468b565b604080518381526020810183905281516001600160a01b0380871693600093918a16927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f629281900390910190a4613c06836001600160a01b03166148ab565b15613c4f57613c4f60008484848c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061542c92505050565b613da6565b613c5d826125a7565b1561290857613c6f838383600061477d565b60405182906001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4604080518381526001602082015281516001600160a01b0380871693600093918a16927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f629281900390910190a4613d06836001600160a01b03166148ab565b15613c4f57613d1483615364565b15613d6357613d5e6000848460018c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061542c92505050565b613c4f565b613c4f600084848b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061552e92505050565b505050806001019050613ad1565b5050505050505050505050565b6000613dcb612637565b90506001600160a01b038516613e28576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b6000613e348783612646565b9050613e3f856138e0565b15613e5657613e5187878787856156f0565b613eb5565b613e5f856125a7565b1561290857613e7387878787856000615863565b84866001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b856001600160a01b0316876001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051808381526020018281526020019250505060405180910390a4613f24866001600160a01b03166148ab565b15613f3657613f36878787878761542c565b50505050505050565b6000613f49612637565b90506000613f578483612646565b835190915060008167ffffffffffffffff81118015613f7557600080fd5b50604051908082528060200260200182016040528015613f9f578160200160208202803683370190505b50905060008060005b848114614087576000888281518110613fbd57fe5b602002602001015190506001858381518110613fd557fe5b6020026020010181815250506140028a82878581518110613ff257fe5b60200260200101518a6001614d22565b60405181906000906001600160a01b038d16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4600061404582613914565b905084614058578094506001935061407d565b8481146140765761406a8b86866156b0565b8094506001935061407d565b8360010193505b5050600101613fa8565b5081156140b9576140998883836156b0565b6001600160a01b0388166000908152600760205260409020805485900390555b60006001600160a01b0316886001600160a01b0316876001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a87604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561413f578181015183820152602001614127565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561417e578181015183820152602001614166565b5050505090500194505050505060405180910390a45050505050505050565b6001600160a01b0382166141f8576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b6000614202612637565b905060006142108583612646565b835190915060008167ffffffffffffffff8111801561422e57600080fd5b50604051908082528060200260200182016040528015614258578160200160208202803683370190505b50905060008060005b84811461433957600088828151811061427657fe5b60200260200101519050600185838151811061428e57fe5b6020026020010181815250506142aa8b8b8360018b6001615863565b808a6001600160a01b03168c6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a460006142f682613914565b905084614309578094506001935061432f565b8481146143285761431c8c8c87876159f4565b8094506001935061432f565b8360010193505b5050600101614261565b5081156143575761434c898984846159f4565b614357898986615a48565b876001600160a01b0316896001600160a01b0316614373612637565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a87604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156143e35781810151838201526020016143cb565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561442257818101518382015260200161440a565b5050505090500194505050505060405180910390a4614449886001600160a01b03166148ab565b8015614459575061445988615364565b1561447a5761447a89898986604051806020016040528060008152506148b1565b505050505050505050565b60006001600160e01b031982167f80ac58cd0000000000000000000000000000000000000000000000000000000014806144e857506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061451c57506001600160e01b031982167ff3993d1100000000000000000000000000000000000000000000000000000000145b80611787575061178782615a93565b60003381614537615b94565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614806145aa57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b156145b85791506118239050565b6001600160a01b038216321480159061467757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e60125d682846040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561464a57600080fd5b505afa15801561465e573d6000803e3d6000fd5b505050506040513d602081101561467457600080fd5b50515b156146855791506118239050565b50905090565b806146dd576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a207a65726f2076616c75650000000000000000000000604482015290519081900360640190fd5b600082815260026020526040902054818101818111614743576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a20737570706c79206f766572666c6f77000000000000604482015290519081900360640190fd5b600093845260026020908152604080862092909255600181528185206001600160a01b039096168552949094525091902080549091019055565b816001146147d2576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a2077726f6e67204e46542076616c7565000000000000604482015290519081900360640190fd5b60008381526003602052604090205415614833576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206578697374696e672f6275726e74204e4654000000604482015290519081900360640190fd5b60008381526003602052604090206001600160a01b038516905580611a3357600061485d84613914565b6000908152600260209081526040808320805460019081019091558083528184206001600160a01b038a16855283528184208054820190556007909252909120805490910190555050505050565b3b151590565b7fbc197c81000000000000000000000000000000000000000000000000000000006001600160a01b03851663bc197c816148e9612637565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561496257818101518382015260200161494a565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156149a1578181015183820152602001614989565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156149dd5781810151838201526020016149c5565b50505050905090810190601f168015614a0a5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b158015614a2f57600080fd5b505af1158015614a43573d6000803e3d6000fd5b505050506040513d6020811015614a5957600080fd5b50516001600160e01b03191614611aad576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220726566757365640000000000604482015290519081900360640190fd5b606081614af8575060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015261178a565b8160005b8115614b1057600101600a82049150614afc565b60008167ffffffffffffffff81118015614b2957600080fd5b506040519080825280601f01601f191660200182016040528015614b54576020820181803683370190505b50859350905060001982015b8315614bbd57600a840660300160f81b82828060019003935081518110614b8357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84049350614b60565b50949350505050565b81614c18576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a207a65726f2076616c75650000000000000000000000604482015290519081900360640190fd5b80614c6a576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b60008381526001602090815260408083206001600160a01b038816845290915290205482811015614ce2576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b60008481526001602090815260408083206001600160a01b0390981683529681528682209285900390925593845260029052509190208054919091039055565b82600114614d77576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a2077726f6e67204e46542076616c7565000000000000604482015290519081900360640190fd5b6000848152600360205260409020546001600160a01b0386811690821614614de6576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a206e6f6e2d6f776e6564204e46540000000000000000604482015290519081900360640190fd5b82614e7757600160a01b811615801590614e2657506000858152600860205260409020546001600160a01b0316614e1b612637565b6001600160a01b0316145b614e77576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b60008581526003602052604090207fdead00000000000000000000000000000000000000000000000000000000000090558161338357614ec186614eba87613914565b60016156b0565b6001600160a01b03861660009081526007602052604090208054600019019055505050505050565b6001600160a01b038416614f44576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b6000614f4e612637565b90506000614f5c8783612646565b9050614f6e8787876001856000615863565b84866001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4856001600160a01b0316876001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62886001604051808381526020018281526020019250505060405180910390a461501f866001600160a01b03166148ab565b15613f365761502d86615364565b156150455761504087878760018861542c565b613f36565b8215613f3657613f368787878761552e565b6001600160a01b0384166150b2576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b825182518114615109576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b6000615113612637565b905060006151218883612646565b90506000806000805b8681146152405760008a828151811061513f57fe5b60200260200101519050615152816138e0565b1561517c576151778d8d838d868151811061516957fe5b60200260200101518a6156f0565b615237565b615185816125a7565b15612908576151ac8d8d838d868151811061519c57fe5b60200260200101518a6001615863565b808c6001600160a01b03168e6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a460006151f882613914565b90508561520b5780955060019450615235565b85811461522e5761521e8e8e88886159f4565b9450600193929092019184615235565b8460010194505b505b5060010161512a565b508215615260576152538b8b85856159f4565b81016152608b8b83615a48565b896001600160a01b03168b6001600160a01b031661527c612637565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8c8c604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156152ec5781810151838201526020016152d4565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561532b578181015183820152602001615313565b5050505090500194505050505060405180910390a46153528a6001600160a01b03166148ab565b15613db457613db48b8b8b8b8b6148b1565b604080517f4e2312e0000000000000000000000000000000000000000000000000000000006024808301919091528251808303909101815260449091018252602081810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a7000000000000000000000000000000000000000000000000000000001781528251935160008082529485948594909392908183858b612710fa955080519450505050609e5a1161541957fe5b8280156154235750815b95945050505050565b7ff23a6e61000000000000000000000000000000000000000000000000000000006001600160a01b03851663f23a6e61615464612637565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156154de5781810151838201526020016154c6565b50505050905090810190601f16801561550b5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015614a2f57600080fd5b7f150b7a02000000000000000000000000000000000000000000000000000000006001600160a01b03841663150b7a02615566612637565b8786866040518563ffffffff1660e01b815260040180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156155d95781810151838201526020016155c1565b50505050905090810190601f1680156156065780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561562857600080fd5b505af115801561563c573d6000803e3d6000fd5b505050506040513d602081101561565257600080fd5b50516001600160e01b03191614611a33576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220726566757365640000000000604482015290519081900360640190fd5b60008281526001602090815260408083206001600160a01b0390961683529481528482208054849003905592815260029092529190208054919091039055565b80615742576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b81615794576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a207a65726f2076616c75650000000000000000000000604482015290519081900360640190fd5b60008381526001602090815260408083206001600160a01b03891684529091529020548281101561580c576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b846001600160a01b0316866001600160a01b0316146133835760009384526001602090815260408086206001600160a01b039889168752909152808520918490039091559390941682529190208054909101905550565b826001146158b8576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a2077726f6e67204e46542076616c7565000000000000604482015290519081900360640190fd5b6000848152600360205260409020546001600160a01b0387811690821614615927576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a206e6f6e2d6f776e6564204e46540000000000000000604482015290519081900360640190fd5b826159b857600160a01b81161580159061596757506000858152600860205260409020546001600160a01b031661595c612637565b6001600160a01b0316145b6159b8576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b60008581526003602052604090206001600160a01b038716905581613f36576159e387876001615a48565b613f3687876159f188613914565b60015b826001600160a01b0316846001600160a01b031614611a335760009182526001602090815260408084206001600160a01b039687168552909152808320805483900390559290931681522080549091019055565b816001600160a01b0316836001600160a01b031614611a80576001600160a01b0380841660009081526007602052604080822080548590039055918416815220805482019055505050565b60006001600160e01b031982167f01ffc9a7000000000000000000000000000000000000000000000000000000001480615af657506001600160e01b031982167fd9b67a2600000000000000000000000000000000000000000000000000000000145b80615b2a57506001600160e01b031982167f0e89341c00000000000000000000000000000000000000000000000000000000145b80615b5e57506001600160e01b031982167f09ce5c4600000000000000000000000000000000000000000000000000000000145b806117875750506001600160e01b0319167fbd85b039000000000000000000000000000000000000000000000000000000001490565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282615bf45760008555615c3a565b82601f10615c0d5782800160ff19823516178555615c3a565b82800160010185558215615c3a579182015b82811115615c3a578235825591602001919060010190615c1f565b50615c46929150615c4a565b5090565b5b80821115615c465760008155600101615c4b56fea2646970667358221220f15bb571a09ca2cc4fc24fb025c14fbc428a46d23fa58f2d9c182efa34bd4bd064736f6c6343000706003300000000000000000000000071bee13e92e64701b78f059801a70857e4683acd00000000000000000000000056133a31f4cd01ede8c6ee780071c021bd324ad2
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103145760003560e01c806373c8a958116101a7578063b88d4fde116100ee578063e8ab9ccc11610097578063f247296511610071578063f2472965146114e9578063f2fde38b1461159c578063f3993d11146115c257610314565b8063e8ab9ccc1461128a578063e985e9c5146113f0578063f242432a1461141e57610314565b8063c7778baa116100c8578063c7778baa14611233578063c87b56dd14611250578063d0011d9d1461126d57610314565b8063b88d4fde1461103c578063bd85b03914611102578063c3666c361461111f57610314565b806395d89b4111610150578063a22cb4651161012a578063a22cb46514610fcb578063aa271e1a14610ff9578063adebf6f21461101f57610314565b806395d89b4114610f95578063983b2d5614610f9d5780639865027514610fc357610314565b80638456cb59116101815780638456cb5914610eca5780638832e6e314610ed25780638da5cb5b14610f8d57610314565b806373c8a95814610c0f5780637e518ec814610d235780638053493414610d9357610314565b80633f4ba83a1161026b578063572b6c05116102145780635cfa9297116101ee5780635cfa929714610b0a5780636352211e14610bcc57806370a0823114610be957610314565b8063572b6c0514610ad45780635b2bd79e14610afa5780635c975abb14610b0257610314565b80634684d7e9116102455780634684d7e9146108f25780634e1273f4146109a5578063510b515814610ab757610314565b80633f4ba83a1461088857806340c10f191461089057806342842e0e146108bc57610314565b80630d6a5bbb116102cd578063124d91e5116102a7578063124d91e51461065957806323b872dd1461068b5780632eb2c2d6146106c157610314565b80630d6a5bbb146104765780630e89341c146106345780630fcc0c281461065157610314565b806306fdde03116102fe57806306fdde0314610392578063081812fc1461040f578063095ea7b31461044857610314565b8062fdd58e1461031957806301ffc9a714610357575b600080fd5b6103456004803603604081101561032f57600080fd5b506001600160a01b03813516906020013561167e565b60408051918252519081900360200190f35b61037e6004803603602081101561036d57600080fd5b50356001600160e01b031916611749565b604080519115158252519081900360200190f35b61039a61178f565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103d45781810151838201526020016103bc565b50505050905090810190601f1680156104015780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61042c6004803603602081101561042557600080fd5b5035611826565b604080516001600160a01b039092168252519081900360200190f35b6104746004803603604081101561045e57600080fd5b506001600160a01b0381351690602001356118c5565b005b6104746004803603608081101561048c57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156104b757600080fd5b8201836020820111156104c957600080fd5b803590602001918460208302840111640100000000831117156104eb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561053b57600080fd5b82018360208201111561054d57600080fd5b8035906020019184602083028401116401000000008311171561056f57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156105bf57600080fd5b8201836020820111156105d157600080fd5b803590602001918460018302840111640100000000831117156105f357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611a17945050505050565b61039a6004803603602081101561064a57600080fd5b5035611a39565b610474611a44565b6104746004803603606081101561066f57600080fd5b506001600160a01b038135169060208101359060400135611a6d565b610474600480360360608110156106a157600080fd5b506001600160a01b03813581169160208101359091169060400135611a85565b610474600480360360a08110156106d757600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561070b57600080fd5b82018360208201111561071d57600080fd5b8035906020019184602083028401116401000000008311171561073f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561078f57600080fd5b8201836020820111156107a157600080fd5b803590602001918460208302840111640100000000831117156107c357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561081357600080fd5b82018360208201111561082557600080fd5b8035906020019184600183028401116401000000008311171561084757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611a98945050505050565b610474611ab4565b610474600480360360408110156108a657600080fd5b506001600160a01b038135169060200135611ace565b610474600480360360608110156108d257600080fd5b506001600160a01b03813581169160208101359091169060400135611af9565b6104746004803603604081101561090857600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561093357600080fd5b82018360208201111561094557600080fd5b8035906020019184602083028401116401000000008311171561096757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611b0c945050505050565b610a67600480360360408110156109bb57600080fd5b8101906020810181356401000000008111156109d657600080fd5b8201836020820111156109e857600080fd5b80359060200191846020830284011164010000000083111715610a0a57600080fd5b919390929091602081019035640100000000811115610a2857600080fd5b820183602082011115610a3a57600080fd5b80359060200191846020830284011164010000000083111715610a5c57600080fd5b509092509050611b21565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610aa3578181015183820152602001610a8b565b505050509050019250505060405180910390f35b61042c60048036036020811015610acd57600080fd5b5035611c27565b61037e60048036036020811015610aea57600080fd5b50356001600160a01b0316611c32565b61039a611cab565b61037e611d39565b61047460048036036080811015610b2057600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135640100000000811115610b5757600080fd5b820183602082011115610b6957600080fd5b80359060200191846001830284011164010000000083111715610b8b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611d42945050505050565b61042c60048036036020811015610be257600080fd5b5035611d59565b61034560048036036020811015610bff57600080fd5b50356001600160a01b0316611d64565b61047460048036036060811015610c2557600080fd5b810190602081018135640100000000811115610c4057600080fd5b820183602082011115610c5257600080fd5b80359060200191846020830284011164010000000083111715610c7457600080fd5b919390929091602081019035640100000000811115610c9257600080fd5b820183602082011115610ca457600080fd5b80359060200191846020830284011164010000000083111715610cc657600080fd5b919390929091602081019035640100000000811115610ce457600080fd5b820183602082011115610cf657600080fd5b80359060200191846020830284011164010000000083111715610d1857600080fd5b509092509050611ddd565b61047460048036036020811015610d3957600080fd5b810190602081018135640100000000811115610d5457600080fd5b820183602082011115610d6657600080fd5b80359060200191846001830284011164010000000083111715610d8857600080fd5b509092509050611f80565b61047460048036036060811015610da957600080fd5b6001600160a01b038235169190810190604081016020820135640100000000811115610dd457600080fd5b820183602082011115610de657600080fd5b80359060200191846020830284011164010000000083111715610e0857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050640100000000811115610e5857600080fd5b820183602082011115610e6a57600080fd5b80359060200191846020830284011164010000000083111715610e8c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611ffc945050505050565b61047461200f565b61047460048036036060811015610ee857600080fd5b6001600160a01b0382351691602081013591810190606081016040820135640100000000811115610f1857600080fd5b820183602082011115610f2a57600080fd5b80359060200191846001830284011164010000000083111715610f4c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612022945050505050565b61042c61203a565b61039a612049565b61047460048036036020811015610fb357600080fd5b50356001600160a01b03166120aa565b6104746120c1565b61047460048036036040811015610fe157600080fd5b506001600160a01b038135169060200135151561211f565b61037e6004803603602081101561100f57600080fd5b50356001600160a01b03166121fe565b61037e6004803603602081101561103557600080fd5b5035612213565b6104746004803603608081101561105257600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561108d57600080fd5b82018360208201111561109f57600080fd5b803590602001918460018302840111640100000000831117156110c157600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061221e945050505050565b6103456004803603602081101561111857600080fd5b5035612232565b6104746004803603606081101561113557600080fd5b81019060208101813564010000000081111561115057600080fd5b82018360208201111561116257600080fd5b8035906020019184602083028401116401000000008311171561118457600080fd5b9193909290916020810190356401000000008111156111a257600080fd5b8201836020820111156111b457600080fd5b803590602001918460208302840111640100000000831117156111d657600080fd5b9193909290916020810190356401000000008111156111f457600080fd5b82018360208201111561120657600080fd5b8035906020019184602083028401116401000000008311171561122857600080fd5b509092509050612288565b6103456004803603602081101561124957600080fd5b50356123d0565b61039a6004803603602081101561126657600080fd5b5035612435565b6104746004803603602081101561128357600080fd5b50356124aa565b610474600480360360808110156112a057600080fd5b8101906020810181356401000000008111156112bb57600080fd5b8201836020820111156112cd57600080fd5b803590602001918460208302840111640100000000831117156112ef57600080fd5b91939092909160208101903564010000000081111561130d57600080fd5b82018360208201111561131f57600080fd5b8035906020019184602083028401116401000000008311171561134157600080fd5b91939092909160208101903564010000000081111561135f57600080fd5b82018360208201111561137157600080fd5b8035906020019184602083028401116401000000008311171561139357600080fd5b9193909290916020810190356401000000008111156113b157600080fd5b8201836020820111156113c357600080fd5b803590602001918460018302840111640100000000831117156113e557600080fd5b5090925090506124be565b61037e6004803603604081101561140657600080fd5b506001600160a01b03813581169160200135166124d9565b610474600480360360a081101561143457600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a08101608082013564010000000081111561147457600080fd5b82018360208201111561148657600080fd5b803590602001918460018302840111640100000000831117156114a857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612505945050505050565b610474600480360360408110156114ff57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561152a57600080fd5b82018360208201111561153c57600080fd5b8035906020019184602083028401116401000000008311171561155e57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061251a945050505050565b610474600480360360208110156115b257600080fd5b50356001600160a01b031661252c565b610474600480360360608110156115d857600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561160c57600080fd5b82018360208201111561161e57600080fd5b8035906020019184602083028401116401000000008311171561164057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612594945050505050565b60006001600160a01b0383166116db576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a207a65726f2061646472657373000000000000000000604482015290519081900360640190fd5b6116e4826125a7565b1561171e576000828152600360205260409020546001600160a01b03848116911614611711576000611714565b60015b60ff169050611743565b5060008181526001602090815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b031982167f510b51580000000000000000000000000000000000000000000000000000000014806117875750611787826125f9565b90505b919050565b60058054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561181b5780601f106117f05761010080835404028352916020019161181b565b820191906000526020600020905b8154815290600101906020018083116117fe57829003601f168201915b505050505090505b90565b6000818152600360205260408120546001600160a01b038116611890576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f6e2d6578697374696e67204e46540000000000604482015290519081900360640190fd5b600160a01b8116156118bb5750506000818152600860205260409020546001600160a01b031661178a565b600091505061178a565b60006118d082611d59565b9050806001600160a01b0316836001600160a01b03161415611939576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a2073656c662d617070726f76616c0000000000000000604482015290519081900360640190fd5b61194a81611945612637565b612646565b61199b576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b60008281526003602090815260408083206001600160a01b03808616600160a01b81179092556008909352818420805493881673ffffffffffffffffffffffffffffffffffffffff1990941684179055905185937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b611a27611a22612637565b612692565b611a33848484846126ff565b50505050565b606061178782612ab1565b611a4c612b84565b6000611a56612637565b9050611a6181612bdb565b806001600160a01b0316ff5b611a75612c9f565b611a80838383612cf7565b505050565b611a8d612c9f565b611a80838383612dea565b611aa0612c9f565b611aad8585858585612e07565b5050505050565b611ac4611abf612637565b612bdb565b611acc612e14565b565b611ad9611a22612637565b611af58282604051806020016040528060008152506000612e6c565b5050565b611b01612c9f565b611a80838383613010565b611b17611a22612637565b611af5828261302d565b6060838214611b77576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b60008467ffffffffffffffff81118015611b9057600080fd5b50604051908082528060200260200182016040528015611bba578160200160208202803683370190505b50905060005b808614611c1d57611bfe878783818110611bd657fe5b905060200201356001600160a01b0316868684818110611bf257fe5b9050602002013561167e565b828281518110611c0a57fe5b6020908102919091010152600101611bc0565b5095945050505050565b60006117878261338b565b60007f00000000000000000000000056133a31f4cd01ede8c6ee780071c021bd324ad26001600160a01b0316826001600160a01b0316148061178757507f00000000000000000000000071bee13e92e64701b78f059801a70857e4683acd6001600160a01b0316826001600160a01b0316149050919050565b600a805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611d315780601f10611d0657610100808354040283529160200191611d31565b820191906000526020600020905b815481529060010190602001808311611d1457829003601f168201915b505050505081565b600c5460ff1681565b611d4d611a22612637565b611a3384848484613404565b60006117878261354f565b60006001600160a01b038216611dc1576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a207a65726f2061646472657373000000000000000000604482015290519081900360640190fd5b506001600160a01b031660009081526007602052604090205490565b611de8611abf612637565b848381148015611df757508082145b611e48576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b818114611f7657858582818110611e5e57fe5b905060200201356001600160a01b03166001600160a01b031663a9059cbb898984818110611e8857fe5b905060200201356001600160a01b0316868685818110611ea457fe5b905060200201356040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611ef157600080fd5b505af1158015611f05573d6000803e3d6000fd5b505050506040513d6020811015611f1b57600080fd5b5051611f6e576040805162461bcd60e51b815260206004820152601660248201527f5265636f763a207472616e73666572206661696c656400000000000000000000604482015290519081900360640190fd5b600101611e4b565b5050505050505050565b611f8b611abf612637565b611f97600a8383615bbe565b507f04b1dc5c136a3ce9fded8db0ce3d3366c58764ec3a8e4c2b9e52e4ddfe5ebbf7828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b612004612c9f565b611a808383836135b9565b61201a611abf612637565b611acc613856565b61202d611a22612637565b611a808383836001612e6c565b6009546001600160a01b031690565b60068054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561181b5780601f106117f05761010080835404028352916020019161181b565b6120b5611abf612637565b6120be81613894565b50565b60006120cb612637565b90506120d681612692565b6001600160a01b0381166000818152600b6020526040808220805460ff19169055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a250565b6000612129612637565b9050806001600160a01b0316836001600160a01b03161415612192576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a2073656c662d617070726f76616c0000000000000000604482015290519081900360640190fd5b6001600160a01b0381811660008181526020818152604080832094881680845294825291829020805460ff1916871515908117909155825190815291517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319281900390910190a3505050565b600b6020526000908152604090205460ff1681565b6000611787826138e0565b612226612c9f565b611a3384848484613906565b600061223d826125a7565b15612273576000828152600360205260409020546001600160a01b031615612266576001612269565b60005b60ff16905061178a565b5060008181526002602052604090205461178a565b612293611abf612637565b8483811480156122a257508082145b6122f3576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b818114611f765785858281811061230957fe5b905060200201356001600160a01b03166001600160a01b03166323b872dd308a8a8581811061233457fe5b905060200201356001600160a01b031687878681811061235057fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b1580156123ad57600080fd5b505af11580156123c1573d6000803e3d6000fd5b505050508060010190506122f6565b60006123db826125a7565b61242c576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a206e6f7420616e204e46540000000000000000000000604482015290519081900360640190fd5b61178782613914565b6000818152600360205260409020546060906001600160a01b03166124a1576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f6e2d6578697374696e67204e46540000000000604482015290519081900360640190fd5b61178782611a39565b6124b5611abf612637565b6120be81613921565b6124c9611a22612637565b611f768888888888888888613a62565b6001600160a01b0391821660009081526020818152604080832093909416825291909152205460ff1690565b61250d612c9f565b611aad8585858585613dc1565b612522612c9f565b611af58282613f3f565b612537611abf612637565b6009805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383811691821792839055604051919216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b61259c612c9f565b611a8083838361419d565b60007f80000000000000000000000000000000000000000000000000000000000000008216158015906117875750507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16151590565b60006001600160e01b031982167f6059f1b4000000000000000000000000000000000000000000000000000000001480611787575061178782614485565b600061264161452b565b905090565b6000816001600160a01b0316836001600160a01b0316148061268b57506001600160a01b038084166000908152602081815260408083209386168352929052205460ff165b9392505050565b6001600160a01b0381166000908152600b602052604090205460ff166120be576040805162461bcd60e51b815260206004820152601860248201527f4d696e746572526f6c653a206e6f742061204d696e7465720000000000000000604482015290519081900360640190fd5b6001600160a01b03841661275a576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206d696e7420746f207a65726f000000000000000000604482015290519081900360640190fd5b8251825181146127b1576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b6000806000805b84811461295f5760008882815181106127cd57fe5b6020026020010151905060008883815181106127e557fe5b602002602001015190506127f8826138e0565b1561280d576128088b838361468b565b612955565b612816826125a7565b15612908576128288b8383600161477d565b60405182906001600160a01b038d16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4600061286b83613914565b90508661287e5780965060019550612902565b8681146128fb57856001600089815260200190815260200160002060008e6001600160a01b03166001600160a01b0316815260200190815260200160002060008282540192505081905550856002600089815260200190815260200160002060008282540192505081905550809650858501945060019550612902565b8560010195505b50612955565b6040805162461bcd60e51b815260206004820152601960248201527f496e76656e746f72793a206e6f74206120746f6b656e20696400000000000000604482015290519081900360640190fd5b50506001016127b8565b5082156129b45760008381526001602090815260408083206001600160a01b038c1680855290835281842080548701905586845260028352818420805487019055835260079091529020805491830191820190555b6001600160a01b03881660006129c8612637565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a8a604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015612a38578181015183820152602001612a20565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015612a77578181015183820152602001612a5f565b5050505090500194505050505060405180910390a4612a9e886001600160a01b03166148ab565b15611f7657611f766000898989896148b1565b6060600a612abe83614ab7565b6040516020018083805460018160011615610100020316600290048015612b1c5780601f10612afa576101008083540402835291820191612b1c565b820191906000526020600020905b815481529060010190602001808311612b08575b5050825160208401908083835b60208310612b485780518252601f199092019160209182019101612b29565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529050919050565b600c5460ff16611acc576040805162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015290519081900360640190fd5b306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612c1457600080fd5b505afa158015612c28573d6000803e3d6000fd5b505050506040513d6020811015612c3e57600080fd5b50516001600160a01b038281169116146120be576040805162461bcd60e51b815260206004820152601660248201527f4f776e61626c653a206e6f7420746865206f776e657200000000000000000000604482015290519081900360640190fd5b600c5460ff1615611acc576040805162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b6000612d01612637565b90506000612d0f8583612646565b9050612d1a846138e0565b15612d3057612d2b85858584614bc6565b612d85565b612d39846125a7565b1561290857612d4c858585846000614d22565b60405184906000906001600160a01b038816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45b60006001600160a01b0316856001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a45050505050565b611a80838383604051806020016040528060008152506000614ee9565b611aad8585858585615057565b612e1c612b84565b600c805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612e4f612637565b604080516001600160a01b039092168252519081900360200190a1565b6001600160a01b038416612ec7576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206d696e7420746f207a65726f000000000000000000604482015290519081900360640190fd5b612ed0836125a7565b612f21576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a206e6f7420616e204e46540000000000000000000000604482015290519081900360640190fd5b612f2f84846001600061477d565b60405183906001600160a01b038616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46001600160a01b0384166000612f7b612637565b6001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62866001604051808381526020018281526020019250505060405180910390a4612fd6846001600160a01b03166148ab565b15611a3357612fe484615364565b15612ffd57612ff86000858560018661542c565b611a33565b8015611a3357611a33600085858561552e565b611a80838383604051806020016040528060008152506001614ee9565b6001600160a01b038216613088576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206d696e7420746f207a65726f000000000000000000604482015290519081900360640190fd5b805160008167ffffffffffffffff811180156130a357600080fd5b506040519080825280602002602001820160405280156130cd578160200160208202803683370190505b50905060008060005b8481146132275760008682815181106130eb57fe5b602002602001015190506130fe816125a7565b61314f576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a206e6f7420616e204e46540000000000000000000000604482015290519081900360640190fd5b600185838151811061315d57fe5b602002602001018181525050613176888260018061477d565b60405181906001600160a01b038a16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a460006131b982613914565b9050846131cc578094506001935061321d565b8481146132165760008581526001602081815260408084206001600160a01b038e16855282528084208054890190559783526002905295902080549094019093559192918361321d565b8360010193505b50506001016130d6565b5060008281526001602090815260408083206001600160a01b038a1680855290835281842080548601905585845260028352818420805486019055808452600790925282208054870190559061327b612637565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8887604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156132eb5781810151838201526020016132d3565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561332a578181015183820152602001613312565b5050505090500194505050505060405180910390a4613351866001600160a01b03166148ab565b8015613361575061336186615364565b15613383576133836000878786604051806020016040528060008152506148b1565b505050505050565b6000613396826125a7565b156133e8576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b506000908152600460205260409020546001600160a01b031690565b6001600160a01b03841661345f576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206d696e7420746f207a65726f000000000000000000604482015290519081900360640190fd5b6000613469612637565b9050613474846138e0565b156134895761348485858561468b565b6134dd565b613492846125a7565b15612908576134a4858585600061477d565b60405184906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45b604080518581526020810185905281516001600160a01b0380891693600093918616927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f629281900390910190a461353c856001600160a01b03166148ab565b15611aad57611aad60008686868661542c565b6000818152600360205260408120546001600160a01b038116611787576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f6e2d6578697374696e67204e46540000000000604482015290519081900360640190fd5b815181518114613610576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b600061361a612637565b905060006136288683612646565b90506000806000805b86811461373b57600089828151811061364657fe5b60200260200101519050613659816138e0565b156136825761367d8b828b858151811061366f57fe5b602002602001015189614bc6565b613732565b61368b816125a7565b15612908576136b18b828b85815181106136a157fe5b6020026020010151896001614d22565b60405181906000906001600160a01b038e16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a460006136f482613914565b9050856137075780955060019450613730565b858114613729576137198c87876156b0565b9450600193929092019184613730565b8460010194505b505b50600101613631565b5082156137715761374d8984846156b0565b6001600160a01b038916600090815260076020526040902080549183019182900390555b60006001600160a01b0316896001600160a01b0316866001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8b8b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156137f75781810151838201526020016137df565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561383657818101518382015260200161381e565b5050505090500194505050505060405180910390a4505050505050505050565b61385e612c9f565b600c805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612e4f612637565b6001600160a01b0381166000818152600b6020526040808220805460ff19166001179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b7f8000000000000000000000000000000000000000000000000000000000000000161590565b611a33848484846001614ee9565b6001600160e01b03191690565b61392a816125a7565b1561397c576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b6000818152600460205260409020546001600160a01b0316156139e6576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206578697374696e6720636f6c6c656374696f6e0000604482015290519081900360640190fd5b6139ee612637565b6000828152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055613a30816138e0565b1515817f4ebf8ad0df535ba5e487bc9cb27fe44120ca81c3a95d3eba79c0bd1df2ab2d5d60405160405180910390a350565b868581148015613a7157508084145b613ac2576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b6000613acc612637565b905060005b828114613db45760008b8b83818110613ae657fe5b905060200201356001600160a01b0316905060006001600160a01b0316816001600160a01b03161415613b60576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206d696e7420746f207a65726f000000000000000000604482015290519081900360640190fd5b60008a8a84818110613b6e57fe5b9050602002013590506000898985818110613b8557fe5b905060200201359050613b97826138e0565b15613c5457613ba783838361468b565b604080518381526020810183905281516001600160a01b0380871693600093918a16927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f629281900390910190a4613c06836001600160a01b03166148ab565b15613c4f57613c4f60008484848c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061542c92505050565b613da6565b613c5d826125a7565b1561290857613c6f838383600061477d565b60405182906001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4604080518381526001602082015281516001600160a01b0380871693600093918a16927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f629281900390910190a4613d06836001600160a01b03166148ab565b15613c4f57613d1483615364565b15613d6357613d5e6000848460018c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061542c92505050565b613c4f565b613c4f600084848b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061552e92505050565b505050806001019050613ad1565b5050505050505050505050565b6000613dcb612637565b90506001600160a01b038516613e28576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b6000613e348783612646565b9050613e3f856138e0565b15613e5657613e5187878787856156f0565b613eb5565b613e5f856125a7565b1561290857613e7387878787856000615863565b84866001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b856001600160a01b0316876001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051808381526020018281526020019250505060405180910390a4613f24866001600160a01b03166148ab565b15613f3657613f36878787878761542c565b50505050505050565b6000613f49612637565b90506000613f578483612646565b835190915060008167ffffffffffffffff81118015613f7557600080fd5b50604051908082528060200260200182016040528015613f9f578160200160208202803683370190505b50905060008060005b848114614087576000888281518110613fbd57fe5b602002602001015190506001858381518110613fd557fe5b6020026020010181815250506140028a82878581518110613ff257fe5b60200260200101518a6001614d22565b60405181906000906001600160a01b038d16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4600061404582613914565b905084614058578094506001935061407d565b8481146140765761406a8b86866156b0565b8094506001935061407d565b8360010193505b5050600101613fa8565b5081156140b9576140998883836156b0565b6001600160a01b0388166000908152600760205260409020805485900390555b60006001600160a01b0316886001600160a01b0316876001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a87604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561413f578181015183820152602001614127565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561417e578181015183820152602001614166565b5050505090500194505050505060405180910390a45050505050505050565b6001600160a01b0382166141f8576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b6000614202612637565b905060006142108583612646565b835190915060008167ffffffffffffffff8111801561422e57600080fd5b50604051908082528060200260200182016040528015614258578160200160208202803683370190505b50905060008060005b84811461433957600088828151811061427657fe5b60200260200101519050600185838151811061428e57fe5b6020026020010181815250506142aa8b8b8360018b6001615863565b808a6001600160a01b03168c6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a460006142f682613914565b905084614309578094506001935061432f565b8481146143285761431c8c8c87876159f4565b8094506001935061432f565b8360010193505b5050600101614261565b5081156143575761434c898984846159f4565b614357898986615a48565b876001600160a01b0316896001600160a01b0316614373612637565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a87604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156143e35781810151838201526020016143cb565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561442257818101518382015260200161440a565b5050505090500194505050505060405180910390a4614449886001600160a01b03166148ab565b8015614459575061445988615364565b1561447a5761447a89898986604051806020016040528060008152506148b1565b505050505050505050565b60006001600160e01b031982167f80ac58cd0000000000000000000000000000000000000000000000000000000014806144e857506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061451c57506001600160e01b031982167ff3993d1100000000000000000000000000000000000000000000000000000000145b80611787575061178782615a93565b60003381614537615b94565b90507f00000000000000000000000071bee13e92e64701b78f059801a70857e4683acd6001600160a01b0316826001600160a01b031614806145aa57507f00000000000000000000000056133a31f4cd01ede8c6ee780071c021bd324ad26001600160a01b0316826001600160a01b0316145b156145b85791506118239050565b6001600160a01b038216321480159061467757507f00000000000000000000000071bee13e92e64701b78f059801a70857e4683acd6001600160a01b031663e60125d682846040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561464a57600080fd5b505afa15801561465e573d6000803e3d6000fd5b505050506040513d602081101561467457600080fd5b50515b156146855791506118239050565b50905090565b806146dd576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a207a65726f2076616c75650000000000000000000000604482015290519081900360640190fd5b600082815260026020526040902054818101818111614743576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a20737570706c79206f766572666c6f77000000000000604482015290519081900360640190fd5b600093845260026020908152604080862092909255600181528185206001600160a01b039096168552949094525091902080549091019055565b816001146147d2576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a2077726f6e67204e46542076616c7565000000000000604482015290519081900360640190fd5b60008381526003602052604090205415614833576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206578697374696e672f6275726e74204e4654000000604482015290519081900360640190fd5b60008381526003602052604090206001600160a01b038516905580611a3357600061485d84613914565b6000908152600260209081526040808320805460019081019091558083528184206001600160a01b038a16855283528184208054820190556007909252909120805490910190555050505050565b3b151590565b7fbc197c81000000000000000000000000000000000000000000000000000000006001600160a01b03851663bc197c816148e9612637565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561496257818101518382015260200161494a565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156149a1578181015183820152602001614989565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156149dd5781810151838201526020016149c5565b50505050905090810190601f168015614a0a5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b158015614a2f57600080fd5b505af1158015614a43573d6000803e3d6000fd5b505050506040513d6020811015614a5957600080fd5b50516001600160e01b03191614611aad576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220726566757365640000000000604482015290519081900360640190fd5b606081614af8575060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015261178a565b8160005b8115614b1057600101600a82049150614afc565b60008167ffffffffffffffff81118015614b2957600080fd5b506040519080825280601f01601f191660200182016040528015614b54576020820181803683370190505b50859350905060001982015b8315614bbd57600a840660300160f81b82828060019003935081518110614b8357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84049350614b60565b50949350505050565b81614c18576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a207a65726f2076616c75650000000000000000000000604482015290519081900360640190fd5b80614c6a576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b60008381526001602090815260408083206001600160a01b038816845290915290205482811015614ce2576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b60008481526001602090815260408083206001600160a01b0390981683529681528682209285900390925593845260029052509190208054919091039055565b82600114614d77576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a2077726f6e67204e46542076616c7565000000000000604482015290519081900360640190fd5b6000848152600360205260409020546001600160a01b0386811690821614614de6576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a206e6f6e2d6f776e6564204e46540000000000000000604482015290519081900360640190fd5b82614e7757600160a01b811615801590614e2657506000858152600860205260409020546001600160a01b0316614e1b612637565b6001600160a01b0316145b614e77576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b60008581526003602052604090207fdead00000000000000000000000000000000000000000000000000000000000090558161338357614ec186614eba87613914565b60016156b0565b6001600160a01b03861660009081526007602052604090208054600019019055505050505050565b6001600160a01b038416614f44576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b6000614f4e612637565b90506000614f5c8783612646565b9050614f6e8787876001856000615863565b84866001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4856001600160a01b0316876001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62886001604051808381526020018281526020019250505060405180910390a461501f866001600160a01b03166148ab565b15613f365761502d86615364565b156150455761504087878760018861542c565b613f36565b8215613f3657613f368787878761552e565b6001600160a01b0384166150b2576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b825182518114615109576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b6000615113612637565b905060006151218883612646565b90506000806000805b8681146152405760008a828151811061513f57fe5b60200260200101519050615152816138e0565b1561517c576151778d8d838d868151811061516957fe5b60200260200101518a6156f0565b615237565b615185816125a7565b15612908576151ac8d8d838d868151811061519c57fe5b60200260200101518a6001615863565b808c6001600160a01b03168e6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a460006151f882613914565b90508561520b5780955060019450615235565b85811461522e5761521e8e8e88886159f4565b9450600193929092019184615235565b8460010194505b505b5060010161512a565b508215615260576152538b8b85856159f4565b81016152608b8b83615a48565b896001600160a01b03168b6001600160a01b031661527c612637565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8c8c604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156152ec5781810151838201526020016152d4565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561532b578181015183820152602001615313565b5050505090500194505050505060405180910390a46153528a6001600160a01b03166148ab565b15613db457613db48b8b8b8b8b6148b1565b604080517f4e2312e0000000000000000000000000000000000000000000000000000000006024808301919091528251808303909101815260449091018252602081810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a7000000000000000000000000000000000000000000000000000000001781528251935160008082529485948594909392908183858b612710fa955080519450505050609e5a1161541957fe5b8280156154235750815b95945050505050565b7ff23a6e61000000000000000000000000000000000000000000000000000000006001600160a01b03851663f23a6e61615464612637565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156154de5781810151838201526020016154c6565b50505050905090810190601f16801561550b5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015614a2f57600080fd5b7f150b7a02000000000000000000000000000000000000000000000000000000006001600160a01b03841663150b7a02615566612637565b8786866040518563ffffffff1660e01b815260040180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156155d95781810151838201526020016155c1565b50505050905090810190601f1680156156065780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561562857600080fd5b505af115801561563c573d6000803e3d6000fd5b505050506040513d602081101561565257600080fd5b50516001600160e01b03191614611a33576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220726566757365640000000000604482015290519081900360640190fd5b60008281526001602090815260408083206001600160a01b0390961683529481528482208054849003905592815260029092529190208054919091039055565b80615742576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b81615794576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a207a65726f2076616c75650000000000000000000000604482015290519081900360640190fd5b60008381526001602090815260408083206001600160a01b03891684529091529020548281101561580c576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b846001600160a01b0316866001600160a01b0316146133835760009384526001602090815260408086206001600160a01b039889168752909152808520918490039091559390941682529190208054909101905550565b826001146158b8576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a2077726f6e67204e46542076616c7565000000000000604482015290519081900360640190fd5b6000848152600360205260409020546001600160a01b0387811690821614615927576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a206e6f6e2d6f776e6564204e46540000000000000000604482015290519081900360640190fd5b826159b857600160a01b81161580159061596757506000858152600860205260409020546001600160a01b031661595c612637565b6001600160a01b0316145b6159b8576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b60008581526003602052604090206001600160a01b038716905581613f36576159e387876001615a48565b613f3687876159f188613914565b60015b826001600160a01b0316846001600160a01b031614611a335760009182526001602090815260408084206001600160a01b039687168552909152808320805483900390559290931681522080549091019055565b816001600160a01b0316836001600160a01b031614611a80576001600160a01b0380841660009081526007602052604080822080548590039055918416815220805482019055505050565b60006001600160e01b031982167f01ffc9a7000000000000000000000000000000000000000000000000000000001480615af657506001600160e01b031982167fd9b67a2600000000000000000000000000000000000000000000000000000000145b80615b2a57506001600160e01b031982167f0e89341c00000000000000000000000000000000000000000000000000000000145b80615b5e57506001600160e01b031982167f09ce5c4600000000000000000000000000000000000000000000000000000000145b806117875750506001600160e01b0319167fbd85b039000000000000000000000000000000000000000000000000000000001490565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282615bf45760008555615c3a565b82601f10615c0d5782800160ff19823516178555615c3a565b82800160010185558215615c3a579182015b82811115615c3a578235825591602001919060010190615c1f565b50615c46929150615c4a565b5090565b5b80821115615c465760008155600101615c4b56fea2646970667358221220f15bb571a09ca2cc4fc24fb025c14fbc428a46d23fa58f2d9c182efa34bd4bd064736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000071bee13e92e64701b78f059801a70857e4683acd00000000000000000000000056133a31f4cd01ede8c6ee780071c021bd324ad2
-----Decoded View---------------
Arg [0] : forwarderRegistry (address): 0x71beE13E92e64701b78f059801A70857E4683ACd
Arg [1] : universalForwarder (address): 0x56133a31F4cD01EDe8c6EE780071c021bd324aD2
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000071bee13e92e64701b78f059801a70857e4683acd
Arg [1] : 00000000000000000000000056133a31f4cd01ede8c6ee780071c021bd324ad2
Deployed Bytecode Sourcemap
107613:8209:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44062:328;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44062:328:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;108514:214;;;;;;;;;;;;;;;;-1:-1:-1;108514:214:0;-1:-1:-1;;;;;;108514:214:0;;:::i;:::-;;;;;;;;;;;;;;;;;;53194:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54565:396;;;;;;;;;;;;;;;;-1:-1:-1;54565:396:0;;:::i;:::-;;;;-1:-1:-1;;;;;54565:396:0;;;;;;;;;;;;;;54058:449;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;54058:449:0;;;;;;;;:::i;:::-;;114709:263;;;;;;;;;;;;;;;;-1:-1:-1;;;;;114709:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;114709:263:0;;;;;;;;-1:-1:-1;114709:263:0;;-1:-1:-1;;114709:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;114709:263:0;;;;;;;;-1:-1:-1;114709:263:0;;-1:-1:-1;;114709:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;114709:263:0;;-1:-1:-1;114709:263:0;;-1:-1:-1;;;;;114709:263:0:i;108894:112::-;;;;;;;;;;;;;;;;-1:-1:-1;108894:112:0;;:::i;109631:180::-;;;:::i;112543:197::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;112543:197:0;;;;;;;;;;;;;:::i;110759:205::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;110759:205:0;;;;;;;;;;;;;;;;;:::i;112231:304::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;112231:304:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;112231:304:0;;;;;;;;-1:-1:-1;112231:304:0;;-1:-1:-1;;112231:304:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;112231:304:0;;;;;;;;-1:-1:-1;112231:304:0;;-1:-1:-1;;112231:304:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;112231:304:0;;-1:-1:-1;112231:304:0;;-1:-1:-1;;;;;112231:304:0:i;110552:107::-;;;:::i;113257:150::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;113257:150:0;;;;;;;;:::i;111206:213::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;111206:213:0;;;;;;;;;;;;;;;;;:::i;113586:160::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;113586:160:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;113586:160:0;;-1:-1:-1;113586:160:0;;-1:-1:-1;;;;;113586:160:0:i;44464:445::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44464:445:0;;-1:-1:-1;44464:445:0;-1:-1:-1;44464:445:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;109186:128;;;;;;;;;;;;;;;;-1:-1:-1;109186:128:0;;:::i;105597:195::-;;;;;;;;;;;;;;;;-1:-1:-1;105597:195:0;-1:-1:-1;;;;;105597:195:0;;:::i;97285:29::-;;;:::i;102903:18::-;;;:::i;114293:231::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;114293:231:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;114293:231:0;;-1:-1:-1;114293:231:0;;-1:-1:-1;;;;;114293:231:0:i;53827:169::-;;;;;;;;;;;;;;;;-1:-1:-1;53827:169:0;;:::i;53523:209::-;;;;;;;;;;;;;;;;-1:-1:-1;53523:209:0;-1:-1:-1;;;;;53523:209:0;;:::i;100156:523::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;100156:523:0;;-1:-1:-1;100156:523:0;-1:-1:-1;100156:523:0;:::i;97323:218::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;97323:218:0;;-1:-1:-1;97323:218:0;-1:-1:-1;97323:218:0;:::i;112748:229::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;112748:229:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;112748:229:0;;;;;;;;-1:-1:-1;112748:229:0;;-1:-1:-1;;112748:229:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;112748:229:0;;-1:-1:-1;112748:229:0;;-1:-1:-1;;;;;112748:229:0:i;110441:103::-;;;:::i;113916:208::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;113916:208:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;113916:208:0;;-1:-1:-1;113916:208:0;;-1:-1:-1;;;;;113916:208:0:i;95327:96::-;;;:::i;53363:104::-;;;:::i;98452:123::-;;;;;;;;;;;;;;;;-1:-1:-1;98452:123:0;-1:-1:-1;;;;;98452:123:0;;:::i;98696:190::-;;;:::i;44979:306::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44979:306:0;;;;;;;;;;:::i;98083:40::-;;;;;;;;;;;;;;;;-1:-1:-1;98083:40:0;-1:-1:-1;;;;;98083:40:0;;:::i;45692:124::-;;;;;;;;;;;;;;;;-1:-1:-1;45692:124:0;;:::i;111427:247::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;111427:247:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;111427:247:0;;-1:-1:-1;111427:247:0;;-1:-1:-1;;;;;111427:247:0:i;46471:267::-;;;;;;;;;;;;;;;;-1:-1:-1;46471:267:0;;:::i;101505:521::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;101505:521:0;;-1:-1:-1;101505:521:0;-1:-1:-1;101505:521:0;:::i;45885:215::-;;;;;;;;;;;;;;;;-1:-1:-1;45885:215:0;;:::i;58341:221::-;;;;;;;;;;;;;;;;-1:-1:-1;58341:221:0;;:::i;110190:149::-;;;;;;;;;;;;;;;;-1:-1:-1;110190:149:0;;:::i;115142:294::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;115142:294:0;;-1:-1:-1;115142:294:0;-1:-1:-1;115142:294:0;:::i;45357:166::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;45357:166:0;;;;;;;;;;:::i;111951:272::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;111951:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;111951:272:0;;-1:-1:-1;111951:272:0;;-1:-1:-1;;;;;111951:272:0:i;111682:168::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;111682:168:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;111682:168:0;;-1:-1:-1;111682:168:0;;-1:-1:-1;;;;;111682:168:0:i;95568:201::-;;;;;;;;;;;;;;;;-1:-1:-1;95568:201:0;-1:-1:-1;;;;;95568:201:0;;:::i;110972:226::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;110972:226:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;110972:226:0;;-1:-1:-1;110972:226:0;;-1:-1:-1;;;;;110972:226:0:i;44062:328::-;44146:7;-1:-1:-1;;;;;44174:19:0;;44166:55;;;;;-1:-1:-1;;;44166:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;44238:23;:2;:21;:23::i;:::-;44234:109;;;44301:11;;;;:7;:11;;;;;;-1:-1:-1;;;;;44285:38:0;;;;;;:46;;44330:1;44285:46;;;44326:1;44285:46;44278:53;;;;;;44234:109;-1:-1:-1;44362:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;44362:20:0;;;;;;;;;;44062:328;;;;;:::o;108514:214::-;108599:4;-1:-1:-1;;;;;;108623:57:0;;108638:42;108623:57;;:97;;;108684:36;108708:11;108684:23;:36::i;:::-;108616:104;;108514:214;;;;:::o;53194:100::-;53281:5;53274:12;;;;;;;;-1:-1:-1;;53274:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53248:13;;53274:12;;53281:5;;53274:12;;53281:5;53274:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53194:100;;:::o;54565:396::-;54641:7;54682:14;;;:7;:14;;;;;;-1:-1:-1;;;;;54715:42:0;;54707:82;;;;;-1:-1:-1;;;54707:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;54804:39:0;;:44;54800:154;;-1:-1:-1;;54872:20:0;;;;:13;:20;;;;;;-1:-1:-1;;;;;54872:20:0;54865:27;;54800:154;54940:1;54925:17;;;;;54058:449;54139:18;54160:14;54168:5;54160:7;:14::i;:::-;54139:35;;54199:10;-1:-1:-1;;;;;54193:16:0;:2;-1:-1:-1;;;;;54193:16:0;;;54185:53;;;;;-1:-1:-1;;;54185:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;54257:39;54271:10;54283:12;:10;:12::i;:::-;54257:13;:39::i;:::-;54249:82;;;;;-1:-1:-1;;;54249:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;54342:14;;;;:7;:14;;;;;;;;-1:-1:-1;;;;;54359:28:0;;;-1:-1:-1;;;54359:57:0;;54342:74;;;54427:13;:20;;;;;;:25;;;;;-1:-1:-1;;54427:25:0;;;;;;;54468:31;;54350:5;;54468:31;;;54058:449;;;:::o;114709:263::-;114888:28;114903:12;:10;:12::i;:::-;114888:14;:28::i;:::-;114927:37;114942:2;114946:3;114951:6;114959:4;114927:14;:37::i;:::-;114709:263;;;;:::o;108894:112::-;108957:13;108990:8;108995:2;108990:4;:8::i;109631:180::-;109672:16;:14;:16::i;:::-;109699:22;109724:12;:10;:12::i;:::-;109699:37;;109747:25;109765:6;109747:17;:25::i;:::-;109796:6;-1:-1:-1;;;;;109783:20:0;;112543:197;112671:19;:17;:19::i;:::-;112701:31;112716:4;112722:2;112726:5;112701:14;:31::i;:::-;112543:197;;;:::o;110759:205::-;110891:19;:17;:19::i;:::-;110921:35;110940:4;110946:2;110950:5;110921:18;:35::i;112231:304::-;112441:19;:17;:19::i;:::-;112471:56;112499:4;112505:2;112509:3;112514:6;112522:4;112471:27;:56::i;:::-;112231:304;;;;;:::o;110552:107::-;110599:31;110617:12;:10;:12::i;:::-;110599:17;:31::i;:::-;110641:10;:8;:10::i;:::-;110552:107::o;113257:150::-;113333:28;113348:12;:10;:12::i;113333:28::-;113372:27;113378:2;113382:5;113372:27;;;;;;;;;;;;113393:5;113372;:27::i;:::-;113257:150;;:::o;111206:213::-;111342:19;:17;:19::i;:::-;111372:39;111395:4;111401:2;111405:5;111372:22;:39::i;113586:160::-;113677:28;113692:12;:10;:12::i;113677:28::-;113716:22;113727:2;113731:6;113716:10;:22::i;44464:445::-;44579:16;44616:27;;;44608:70;;;;;-1:-1:-1;;;44608:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;44691:25;44733:6;44719:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44719:28:0;;44691:56;;44765:9;44760:114;44780:18;;;44760:114;;44834:28;44844:6;;44851:1;44844:9;;;;;;;;;;;;;-1:-1:-1;;;;;44844:9:0;44855:3;;44859:1;44855:6;;;;;;;;;;;;;44834:9;:28::i;:::-;44820:8;44829:1;44820:11;;;;;;;;;;;;;;;;;:42;44800:3;;44760:114;;;-1:-1:-1;44893:8:0;44464:445;-1:-1:-1;;;;;44464:445:0:o;109186:128::-;109257:7;109284:22;109293:12;109284:8;:22::i;105597:195::-;105684:4;105721:19;-1:-1:-1;;;;;105708:32:0;:9;-1:-1:-1;;;;;105708:32:0;;:76;;;;105765:18;-1:-1:-1;;;;;105744:40:0;:9;-1:-1:-1;;;;;105744:40:0;;105701:83;;105597:195;;;:::o;97285:29::-;;;;;;;;;;;;;;;-1:-1:-1;;97285:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;102903:18::-;;;;;;:::o;114293:231::-;114447:28;114462:12;:10;:12::i;114447:28::-;114486:30;114496:2;114500;114504:5;114511:4;114486:9;:30::i;53827:169::-;53941:7;53968:20;53982:5;53968:13;:20::i;53523:209::-;53602:7;-1:-1:-1;;;;;53630:24:0;;53622:60;;;;;-1:-1:-1;;;53622:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;53700:24:0;;;;;:12;:24;;;;;;;53523:209::o;100156:523::-;100325:31;100343:12;:10;:12::i;100325:31::-;100384:8;100418:23;;;:51;;;;-1:-1:-1;100445:24:0;;;100418:51;100410:90;;;;;-1:-1:-1;;;100410:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;100516:9;100511:161;100536:6;100531:1;:11;100511:161;;100589:6;;100596:1;100589:9;;;;;;;;;;;;;-1:-1:-1;;;;;100589:9:0;-1:-1:-1;;;;;100572:36:0;;100609:8;;100618:1;100609:11;;;;;;;;;;;;;-1:-1:-1;;;;;100609:11:0;100622:7;;100630:1;100622:10;;;;;;;;;;;;;100572:61;;;;;;;;;;;;;-1:-1:-1;;;;;100572:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;100572:61:0;100564:96;;;;;-1:-1:-1;;;100564:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;100544:3;;100511:161;;;;100156:523;;;;;;;:::o;97323:218::-;97405:31;97423:12;:10;:12::i;97405:31::-;97447:34;:15;97465:16;;97447:34;:::i;:::-;;97497:36;97516:16;;97497:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;97497:36:0;;;;;;;;-1:-1:-1;97497:36:0;;-1:-1:-1;;;;97497:36:0;97323:218;;:::o;112748:229::-;112901:19;:17;:19::i;:::-;112931:38;112951:4;112957:3;112962:6;112931:19;:38::i;110441:103::-;110486:31;110504:12;:10;:12::i;110486:31::-;110528:8;:6;:8::i;113916:208::-;114049:28;114064:12;:10;:12::i;114049:28::-;114088;114094:2;114098:5;114105:4;114111;114088:5;:28::i;95327:96::-;95409:6;;-1:-1:-1;;;;;95409:6:0;95327:96;:::o;53363:104::-;53452:7;53445:14;;;;;;;;-1:-1:-1;;53445:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53419:13;;53445:14;;53452:7;;53445:14;;53452:7;53445:14;;;;;;;;;;;;;;;;;;;;;;;;98452:123;98506:31;98524:12;:10;:12::i;98506:31::-;98548:19;98559:7;98548:10;:19::i;:::-;98452:123;:::o;98696:190::-;98740:15;98758:12;:10;:12::i;:::-;98740:30;;98781:23;98796:7;98781:14;:23::i;:::-;-1:-1:-1;;;;;98815:17:0;;98835:5;98815:17;;;:8;:17;;;;;;:25;;-1:-1:-1;;98815:25:0;;;98856:22;;;98835:5;98856:22;98696:190;:::o;44979:306::-;45074:14;45091:12;:10;:12::i;:::-;45074:29;;45134:6;-1:-1:-1;;;;;45122:18:0;:8;-1:-1:-1;;;;;45122:18:0;;;45114:55;;;;;-1:-1:-1;;;45114:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45180:18:0;;;:10;:18;;;;;;;;;;;:28;;;;;;;;;;;;;:39;;-1:-1:-1;;45180:39:0;;;;;;;;;;45235:42;;;;;;;;;;;;;;;;;44979:306;;;:::o;98083:40::-;;;;;;;;;;;;;;;:::o;45692:124::-;45764:4;45788:20;:2;:18;:20::i;111427:247::-;111591:19;:17;:19::i;:::-;111621:45;111644:4;111650:2;111654:5;111661:4;111621:22;:45::i;46471:267::-;46544:7;46568:23;:2;:21;:23::i;:::-;46564:167;;;46656:1;46631:11;;;:7;:11;;;;;;-1:-1:-1;;;;;46615:43:0;;:51;;46665:1;46615:51;;;46661:1;46615:51;46608:58;;;;;;46564:167;-1:-1:-1;46706:13:0;;;;:9;:13;;;;;;46699:20;;101505:521;101679:31;101697:12;:10;:12::i;101679:31::-;101738:8;101772:26;;;:55;;;;-1:-1:-1;101802:25:0;;;101772:55;101764:94;;;;;-1:-1:-1;;;101764:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;101874:9;101869:150;101894:6;101889:1;:11;101869:150;;101940:9;;101950:1;101940:12;;;;;;;;;;;;;-1:-1:-1;;;;;101940:12:0;-1:-1:-1;;;;;101922:44:0;;101975:4;101982:8;;101991:1;101982:11;;;;;;;;;;;;;-1:-1:-1;;;;;101982:11:0;101995:8;;102004:1;101995:11;;;;;;;;;;;;;101922:85;;;;;;;;;;;;;-1:-1:-1;;;;;101922:85:0;;;;;;-1:-1:-1;;;;;101922:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101902:3;;;;;101869:150;;45885:215;45962:7;45990:26;:5;:24;:26::i;:::-;45982:60;;;;;-1:-1:-1;;;45982:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46060:32;:5;:30;:32::i;58341:221::-;58492:1;58464:14;;;:7;:14;;;;;;58414:13;;-1:-1:-1;;;;;58448:46:0;58440:86;;;;;-1:-1:-1;;;58440:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;58544:10;58548:5;58544:3;:10::i;110190:149::-;110258:31;110276:12;:10;:12::i;110258:31::-;110300;110318:12;110300:17;:31::i;115142:294::-;115346:28;115361:12;:10;:12::i;115346:28::-;115385:43;115398:10;;115410:3;;115415:6;;115423:4;;115385:12;:43::i;45357:166::-;-1:-1:-1;;;;;45483:22:0;;;45459:4;45483:22;;;;;;;;;;;:32;;;;;;;;;;;;;;;45357:166::o;111951:272::-;112136:19;:17;:19::i;:::-;112166:49;112189:4;112195:2;112199;112203:5;112210:4;112166:22;:49::i;111682:168::-;111779:19;:17;:19::i;:::-;111809:33;111829:4;111835:6;111809:19;:33::i;95568:201::-;95648:31;95666:12;:10;:12::i;95648:31::-;95690:6;:17;;-1:-1:-1;;95690:17:0;-1:-1:-1;;;;;95690:17:0;;;;;;;;;;95723:38;;95690:17;;95744:6;;95723:38;;-1:-1:-1;;95723:38:0;95568:201;:::o;110972:226::-;111119:19;:17;:19::i;:::-;111149:41;111173:4;111179:2;111183:6;111149:23;:41::i;41932:140::-;41995:4;41575:8;42019:12;;:17;;;;:45;;-1:-1:-1;;41786:20:0;42040:19;:24;;;41932:140::o;78859:218::-;78944:4;-1:-1:-1;;;;;;78968:61:0;;78983:46;78968:61;;:101;;;79033:36;79057:11;79033:23;:36::i;115444:185::-;115549:15;115584:37;:35;:37::i;:::-;115577:44;;115444:185;:::o;48255:160::-;48339:4;48372:6;-1:-1:-1;;;;;48364:14:0;:4;-1:-1:-1;;;;;48364:14:0;;48363:44;;;-1:-1:-1;;;;;;48383:16:0;;;:10;:16;;;;;;;;;;;:24;;;;;;;;;;;;48363:44;48356:51;48255:160;-1:-1:-1;;;48255:160:0:o;98894:128::-;-1:-1:-1;;;;;98968:17:0;;;;;;:8;:17;;;;;;;;98960:54;;;;;-1:-1:-1;;;98960:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;67850:2106;-1:-1:-1;;;;;68031:16:0;;68023:52;;;;;-1:-1:-1;;;68023:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;68103:10;;68142:13;;68132:23;;68124:66;;;;;-1:-1:-1;;;68124:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;68203:22;68236:25;68272:17;68305:9;68300:1191;68321:6;68316:1;:11;68300:1191;;68349:10;68362:3;68366:1;68362:6;;;;;;;;;;;;;;68349:19;;68383:13;68399:6;68406:1;68399:9;;;;;;;;;;;;;;68383:25;;68427:20;:2;:18;:20::i;:::-;68423:1057;;;68468:28;68482:2;68486;68490:5;68468:13;:28::i;:::-;68423:1057;;;68522:23;:2;:21;:23::i;:::-;68518:962;;;68566:29;68575:2;68579;68583:5;68590:4;68566:8;:29::i;:::-;68619:28;;68644:2;;-1:-1:-1;;;;;68619:28:0;;;68636:1;;68619:28;;68636:1;;68619:28;68666:24;68693:29;:2;:27;:29::i;:::-;68666:56;-1:-1:-1;68745:19:0;68741:648;;68806:16;68789:33;;68865:1;68845:21;;68741:648;;;68939:14;68919:16;:34;68915:455;;69015:17;68982:9;:25;68992:14;68982:25;;;;;;;;;;;:29;69008:2;-1:-1:-1;;;;;68982:29:0;-1:-1:-1;;;;;68982:29:0;;;;;;;;;;;;;:50;;;;;;;;;;;69088:17;69059:9;:25;69069:14;69059:25;;;;;;;;;;;;:46;;;;;;;;;;;69149:16;69132:33;;69205:17;69192:30;;;;69269:1;69249:21;;68915:455;;;69327:19;;;;;68915:455;68518:962;;;;69429:35;;;-1:-1:-1;;;69429:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;68518:962;-1:-1:-1;;68329:3:0;;68300:1191;;;-1:-1:-1;69507:19:0;;69503:252;;69543:25;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;69543:29:0;;;;;;;;;;;:50;;;;;;69608:25;;;:9;:25;;;;;:46;;;;;;69714:16;;:12;:16;;;;;:29;;69669:30;;;69714:29;;;;;69503:252;-1:-1:-1;;;;;69772:56:0;;69808:1;69786:12;:10;:12::i;:::-;-1:-1:-1;;;;;69772:56:0;;69816:3;69821:6;69772:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69843:15;:2;-1:-1:-1;;;;;69843:13:0;;:15::i;:::-;69839:110;;;69875:62;69911:1;69915:2;69919:3;69924:6;69932:4;69875:27;:62::i;97549:161::-;97606:13;97663:15;97680:20;:2;:18;:20::i;:::-;97646:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;97646:55:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;97646:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97632:70;;97549:161;;;:::o;103105:98::-;103164:6;;;;103156:39;;;;;-1:-1:-1;;;103156:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;95900:138;95991:4;-1:-1:-1;;;;;95991:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;95991:12:0;-1:-1:-1;;;;;95980:23:0;;;;;;95972:58;;;;;-1:-1:-1;;;95972:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;102999:98;103062:6;;;;103061:7;103053:36;;;;;-1:-1:-1;;;103053:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;79342:621;79470:14;79487:12;:10;:12::i;:::-;79470:29;;79510:15;79528:27;79542:4;79548:6;79528:13;:27::i;:::-;79510:45;;79572:20;:2;:18;:20::i;:::-;79568:319;;;79609:42;79623:4;79629:2;79633:5;79640:10;79609:13;:42::i;:::-;79568:319;;;79673:23;:2;:21;:23::i;:::-;79669:218;;;79713:44;79722:4;79728:2;79732:5;79739:10;79751:5;79713:8;:44::i;:::-;79777:30;;79804:2;;79800:1;;-1:-1:-1;;;;;79777:30:0;;;;;79800:1;;79777:30;79669:218;79941:1;-1:-1:-1;;;;;79904:51:0;79927:4;-1:-1:-1;;;;;79904:51:0;79919:6;-1:-1:-1;;;;;79904:51:0;;79945:2;79949:5;79904:51;;;;;;;;;;;;;;;;;;;;;;;;79342:621;;;;;:::o;55135:281::-;55267:141;55295:4;55314:2;55331:5;55267:141;;;;;;;;;;;;55392:5;55267:13;:141::i;59885:329::-;60155:51;60178:4;60184:2;60188:3;60193:6;60201:4;60155:22;:51::i;103621:135::-;103669:16;:14;:16::i;:::-;103696:6;:14;;-1:-1:-1;;103696:14:0;;;103726:22;103735:12;:10;:12::i;:::-;103726:22;;;-1:-1:-1;;;;;103726:22:0;;;;;;;;;;;;;;103621:135::o;64264:707::-;-1:-1:-1;;;;;64407:16:0;;64399:52;;;;;-1:-1:-1;;;64399:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;64470:26;:5;:24;:26::i;:::-;64462:60;;;;;-1:-1:-1;;;64462:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;64535:29;64544:2;64548:5;64555:1;64558:5;64535:8;:29::i;:::-;64582:31;;64607:5;;-1:-1:-1;;;;;64582:31:0;;;64599:1;;64582:31;;64599:1;;64582:31;-1:-1:-1;;;;;64629:54:0;;64666:1;64644:12;:10;:12::i;:::-;-1:-1:-1;;;;;64629:54:0;;64674:5;64681:1;64629:54;;;;;;;;;;;;;;;;;;;;;;;;64698:15;:2;-1:-1:-1;;;;;64698:13:0;;:15::i;:::-;64694:270;;;64734:27;64758:2;64734:23;:27::i;:::-;64730:223;;;64782:54;64813:1;64817:2;64821:5;64828:1;64831:4;64782:22;:54::i;:::-;64730:223;;;64862:4;64858:95;;;64887:50;64917:1;64921:2;64925:5;64932:4;64887:21;:50::i;55592:284::-;55728:140;55756:4;55775:2;55792:5;55728:140;;;;;;;;;;;;55853:4;55728:13;:140::i;65150:1619::-;-1:-1:-1;;;;;65235:16:0;;65227:52;;;;;-1:-1:-1;;;65227:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;65309:13;;65292:14;65309:13;65359:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65359:21:0;;65333:47;;65393:22;65426:25;65467:9;65462:914;65483:6;65478:1;:11;65462:914;;65511:13;65527:6;65534:1;65527:9;;;;;;;;;;;;;;65511:25;;65559:26;:5;:24;:26::i;:::-;65551:60;;;;;-1:-1:-1;;;65551:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;65638:1;65626:6;65633:1;65626:9;;;;;;;;;;;;;:13;;;;;65654:28;65663:2;65667:5;65674:1;65677:4;65654:8;:28::i;:::-;65702:31;;65727:5;;-1:-1:-1;;;;;65702:31:0;;;65719:1;;65702:31;;65719:1;;65702:31;65748:24;65775:32;:5;:30;:32::i;:::-;65748:59;-1:-1:-1;65826:19:0;65822:543;;65883:16;65866:33;;65938:1;65918:21;;65822:543;;;66004:14;65984:16;:34;65980:370;;66043:25;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;66043:29:0;;;;;;;;;:50;;;;;;66116:25;;;:9;:25;;;;;:46;;;;;;;;66202:16;;66043:9;66202:16;65980:370;;;66311:19;;;;;65980:370;-1:-1:-1;;65491:3:0;;65462:914;;;-1:-1:-1;66388:25:0;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;66388:29:0;;;;;;;;;;;:50;;;;;;66449:25;;;:9;:25;;;;;:46;;;;;;66506:16;;;:12;:16;;;;;:26;;;;;;66388:29;66564:12;:10;:12::i;:::-;-1:-1:-1;;;;;66550:59:0;;66594:6;66602;66550:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66624:15;:2;-1:-1:-1;;;;;66624:13:0;;:15::i;:::-;:46;;;;;66643:27;66667:2;66643:23;:27::i;:::-;66620:142;;;66687:63;66723:1;66727:2;66731:6;66739;66687:63;;;;;;;;;;;;:27;:63::i;:::-;65150:1619;;;;;;:::o;47629:214::-;47700:7;47729:33;:12;:31;:33::i;:::-;47728:34;47720:74;;;;;-1:-1:-1;;;47720:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47812:23:0;;;;:9;:23;;;;;;-1:-1:-1;;;;;47812:23:0;;47629:214::o;66938:727::-;-1:-1:-1;;;;;67094:16:0;;67086:52;;;;;-1:-1:-1;;;67086:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;67149:14;67166:12;:10;:12::i;:::-;67149:29;;67193:20;:2;:18;:20::i;:::-;67189:289;;;67230:28;67244:2;67248;67252:5;67230:13;:28::i;:::-;67189:289;;;67280:23;:2;:21;:23::i;:::-;67276:202;;;67320:30;67329:2;67333;67337:5;67344;67320:8;:30::i;:::-;67370:28;;67395:2;;-1:-1:-1;;;;;67370:28:0;;;67387:1;;67370:28;;67387:1;;67370:28;67276:202;67495:49;;;;;;;;;;;;;;-1:-1:-1;;;;;67495:49:0;;;;67526:1;;67495:49;;;;;;;;;;;;;;67559:15;:2;-1:-1:-1;;;;;67559:13:0;;:15::i;:::-;67555:103;;;67591:55;67622:1;67626:2;67630;67634:5;67641:4;67591:22;:55::i;46164:239::-;46234:7;46286:14;;;:7;:14;;;;;;-1:-1:-1;;;;;46321:19:0;;46313:59;;;;;-1:-1:-1;;;46313:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;80134:1967;80304:10;;80343:13;;80333:23;;80325:66;;;;;-1:-1:-1;;;80325:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;80404:14;80421:12;:10;:12::i;:::-;80404:29;;80444:15;80462:27;80476:4;80482:6;80462:13;:27::i;:::-;80444:45;;80502:22;80535:25;80571:17;80604:9;80599:1131;80620:6;80615:1;:11;80599:1131;;80648:10;80661:3;80665:1;80661:6;;;;;;;;;;;;;;80648:19;;80686:20;:2;:18;:20::i;:::-;80682:1037;;;80727:46;80741:4;80747:2;80751:6;80758:1;80751:9;;;;;;;;;;;;;;80762:10;80727:13;:46::i;:::-;80682:1037;;;80799:23;:2;:21;:23::i;:::-;80795:924;;;80843:47;80852:4;80858:2;80862:6;80869:1;80862:9;;;;;;;;;;;;;;80873:10;80885:4;80843:8;:47::i;:::-;80914:30;;80941:2;;80937:1;;-1:-1:-1;;;;;80914:30:0;;;;;80937:1;;80914:30;80963:24;80990:29;:2;:27;:29::i;:::-;80963:56;-1:-1:-1;81042:19:0;81038:590;;81103:16;81086:33;;81162:1;81142:21;;81038:590;;;81236:14;81216:16;:34;81212:397;;81279:65;81304:4;81310:14;81326:17;81279:24;:65::i;:::-;81388:16;-1:-1:-1;81508:1:0;;81431:30;;;;;81388:16;81212:397;;;81566:19;;;;;81212:397;80795:924;;-1:-1:-1;80628:3:0;;80599:1131;;;-1:-1:-1;81746:19:0;;81742:282;;81782:65;81807:4;81813:14;81829:17;81782:24;:65::i;:::-;-1:-1:-1;;;;;81981:18:0;;;;;;:12;:18;;;;;:31;;81862:30;;;81981:31;;;;;;81742:282;82077:1;-1:-1:-1;;;;;82041:52:0;82063:4;-1:-1:-1;;;;;82041:52:0;82055:6;-1:-1:-1;;;;;82041:52:0;;82081:3;82086:6;82041:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80134:1967;;;;;;;;;:::o;103347:133::-;103393:19;:17;:19::i;:::-;103423:6;:13;;-1:-1:-1;;103423:13:0;103432:4;103423:13;;;103452:20;103459:12;:10;:12::i;99030:125::-;-1:-1:-1;;;;;99087:17:0;;;;;;:8;:17;;;;;;:24;;-1:-1:-1;;99087:24:0;99107:4;99087:24;;;99127:20;;;99087:17;99127:20;99030:125;:::o;41815:109::-;41575:8;41899:12;:17;;41815:109::o;56058:314::-;56222:142;56250:4;56269:2;56286:5;56306:4;56349;56222:13;:142::i;42080:134::-;-1:-1:-1;;;;;;42179:27:0;;42080:134::o;47180:378::-;47266:33;:12;:31;:33::i;:::-;47265:34;47257:74;;;;;-1:-1:-1;;;47257:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47385:1;47350:23;;;:9;:23;;;;;;-1:-1:-1;;;;;47350:23:0;:37;47342:80;;;;;-1:-1:-1;;;47342:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47459:12;:10;:12::i;:::-;47433:23;;;;:9;:23;;;;;:38;;-1:-1:-1;;47433:38:0;-1:-1:-1;;;;;47433:38:0;;;;;;;;;;47519:30;47433:23;47519:28;:30::i;:::-;47487:63;;47505:12;47487:63;;;;;;;;;;47180:378;:::o;71287:1541::-;71492:10;71528:20;;;:47;;;;-1:-1:-1;71552:23:0;;;71528:47;71520:90;;;;;-1:-1:-1;;;71520:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;71623:14;71640:12;:10;:12::i;:::-;71623:29;;71668:9;71663:1158;71684:6;71679:1;:11;71663:1158;;71712:10;71725;;71736:1;71725:13;;;;;;;;;;;;;-1:-1:-1;;;;;71725:13:0;71712:26;;71775:1;-1:-1:-1;;;;;71761:16:0;:2;-1:-1:-1;;;;;71761:16:0;;;71753:52;;;;;-1:-1:-1;;;71753:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;71820:10;71833:3;;71837:1;71833:6;;;;;;;;;;;;;71820:19;;71854:13;71870:6;;71877:1;71870:9;;;;;;;;;;;;;71854:25;;71898:20;:2;:18;:20::i;:::-;71894:916;;;71939:28;71953:2;71957;71961:5;71939:13;:28::i;:::-;71991:49;;;;;;;;;;;;;;-1:-1:-1;;;;;71991:49:0;;;;72022:1;;71991:49;;;;;;;;;;;;;;72063:15;:2;-1:-1:-1;;;;;72063:13:0;;:15::i;:::-;72059:119;;;72103:55;72134:1;72138:2;72142;72146:5;72153:4;;72103:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72103:22:0;;-1:-1:-1;;;72103:55:0:i;:::-;71894:916;;;72203:23;:2;:21;:23::i;:::-;72199:611;;;72247:30;72256:2;72260;72264:5;72271;72247:8;:30::i;:::-;72301:28;;72326:2;;-1:-1:-1;;;;;72301:28:0;;;72318:1;;72301:28;;72318:1;;72301:28;72353:45;;;;;;72396:1;72353:45;;;;;;-1:-1:-1;;;;;72353:45:0;;;;72384:1;;72353:45;;;;;;;;;;;;;;72421:15;:2;-1:-1:-1;;;;;72421:13:0;;:15::i;:::-;72417:302;;;72465:27;72489:2;72465:23;:27::i;:::-;72461:239;;;72521:51;72552:1;72556:2;72560;72564:1;72567:4;;72521:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72521:22:0;;-1:-1:-1;;;72521:51:0:i;:::-;72461:239;;;72629:47;72659:1;72663:2;72667;72671:4;;72629:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72629:21:0;;-1:-1:-1;;;72629:47:0:i;72199:611::-;71663:1158;;;71692:3;;;;;71663:1158;;;;71287:1541;;;;;;;;;;:::o;58836:852::-;59021:14;59038:12;:10;:12::i;:::-;59021:29;-1:-1:-1;;;;;;59069:16:0;;59061:56;;;;;-1:-1:-1;;;59061:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;59128:15;59146:27;59160:4;59166:6;59146:13;:27::i;:::-;59128:45;;59190:20;:2;:18;:20::i;:::-;59186:327;;;59227:50;59245:4;59251:2;59255;59259:5;59266:10;59227:17;:50::i;:::-;59186:327;;;59299:23;:2;:21;:23::i;:::-;59295:218;;;59339:52;59352:4;59358:2;59362;59366:5;59373:10;59385:5;59339:12;:52::i;:::-;59430:2;59426;-1:-1:-1;;;;;59411:22:0;59420:4;-1:-1:-1;;;;;59411:22:0;;;;;;;;;;;59295:218;59559:2;-1:-1:-1;;;;;59530:43:0;59553:4;-1:-1:-1;;;;;59530:43:0;59545:6;-1:-1:-1;;;;;59530:43:0;;59563:2;59567:5;59530:43;;;;;;;;;;;;;;;;;;;;;;;;59588:15;:2;-1:-1:-1;;;;;59588:13:0;;:15::i;:::-;59584:97;;;59620:49;59643:4;59649:2;59653;59657:5;59664:4;59620:22;:49::i;:::-;58836:852;;;;;;;:::o;82261:1426::-;82358:14;82375:12;:10;:12::i;:::-;82358:29;;82398:15;82416:27;82430:4;82436:6;82416:13;:27::i;:::-;82473:13;;82398:45;;-1:-1:-1;82456:14:0;82473:13;82523:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;82523:21:0;;82497:47;;82557:22;82590:25;82631:9;82626:809;82647:6;82642:1;:11;82626:809;;82675:13;82691:6;82698:1;82691:9;;;;;;;;;;;;;;82675:25;;82727:1;82715:6;82722:1;82715:9;;;;;;;;;;;;;:13;;;;;82743:50;82752:4;82758:5;82765:6;82772:1;82765:9;;;;;;;;;;;;;;82776:10;82788:4;82743:8;:50::i;:::-;82813:33;;82840:5;;82836:1;;-1:-1:-1;;;;;82813:33:0;;;;;82836:1;;82813:33;82861:24;82888:32;:5;:30;:32::i;:::-;82861:59;-1:-1:-1;82939:19:0;82935:489;;82996:16;82979:33;;83051:1;83031:21;;82935:489;;;83117:14;83097:16;:34;83093:316;;83156:65;83181:4;83187:14;83203:17;83156:24;:65::i;:::-;83261:16;83244:33;;83320:1;83300:21;;83093:316;;;83370:19;;;;;83093:316;-1:-1:-1;;82655:3:0;;82626:809;;;-1:-1:-1;83451:19:0;;83447:160;;83487:65;83512:4;83518:14;83534:17;83487:24;:65::i;:::-;-1:-1:-1;;;;;83567:18:0;;;;;;:12;:18;;;;;:28;;;;;;;83447:160;83660:1;-1:-1:-1;;;;;83624:55:0;83646:4;-1:-1:-1;;;;;83624:55:0;83638:6;-1:-1:-1;;;;;83624:55:0;;83664:6;83672;83624:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82261:1426;;;;;;;;:::o;56567:1711::-;-1:-1:-1;;;;;56722:16:0;;56714:56;;;;;-1:-1:-1;;;56714:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;56781:14;56798:12;:10;:12::i;:::-;56781:29;;56821:15;56839:27;56853:4;56859:6;56839:13;:27::i;:::-;56896:13;;56821:45;;-1:-1:-1;56879:14:0;56896:13;56946:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56946:21:0;;56920:47;;56980:22;57013:25;57054:9;57049:809;57070:6;57065:1;:11;57049:809;;57098:13;57114:6;57121:1;57114:9;;;;;;;;;;;;;;57098:25;;57150:1;57138:6;57145:1;57138:9;;;;;;;;;;;;;:13;;;;;57166:50;57179:4;57185:2;57189:5;57196:1;57199:10;57211:4;57166:12;:50::i;:::-;57255:5;57251:2;-1:-1:-1;;;;;57236:25:0;57245:4;-1:-1:-1;;;;;57236:25:0;;;;;;;;;;;57276:24;57303:32;:5;:30;:32::i;:::-;57276:59;-1:-1:-1;57354:19:0;57350:497;;57411:16;57394:33;;57466:1;57446:21;;57350:497;;;57532:14;57512:16;:34;57508:324;;57571:73;57600:4;57606:2;57610:14;57626:17;57571:28;:73::i;:::-;57684:16;57667:33;;57743:1;57723:21;;57508:324;;;57793:19;;;;;57508:324;-1:-1:-1;;57078:3:0;;57049:809;;;-1:-1:-1;57874:19:0;;57870:184;;57910:73;57939:4;57945:2;57949:14;57965:17;57910:28;:73::i;:::-;57998:44;58025:4;58031:2;58035:6;57998:26;:44::i;:::-;58105:2;-1:-1:-1;;;;;58071:53:0;58099:4;-1:-1:-1;;;;;58071:53:0;58085:12;:10;:12::i;:::-;-1:-1:-1;;;;;58071:53:0;;58109:6;58117;58071:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58139:15;:2;-1:-1:-1;;;;;58139:13:0;;:15::i;:::-;:46;;;;;58158:27;58182:2;58158:23;:27::i;:::-;58135:136;;;58202:57;58230:4;58236:2;58240:6;58248;58202:57;;;;;;;;;;;;:27;:57::i;:::-;56567:1711;;;;;;;;;:::o;52562:467::-;52647:4;-1:-1:-1;;;;;;52684:40:0;;52699:25;52684:40;;:105;;-1:-1:-1;;;;;;;52741:48:0;;52756:33;52741:48;52684:105;:175;;;-1:-1:-1;;;;;;;52806:53:0;;52821:38;52806:53;52684:175;:228;;;;52876:36;52900:11;52876:23;:36::i;105800:922::-;105853:15;105909:10;105853:15;105955:27;:25;:27::i;:::-;105930:52;;106018:18;-1:-1:-1;;;;;105997:40:0;:9;-1:-1:-1;;;;;105997:40:0;;:76;;;;106054:19;-1:-1:-1;;;;;106041:32:0;:9;-1:-1:-1;;;;;106041:32:0;;105997:76;105993:169;;;106144:6;-1:-1:-1;106137:13:0;;-1:-1:-1;106137:13:0;105993:169;-1:-1:-1;;;;;106566:22:0;;106579:9;106566:22;;;;:78;;;106592:18;-1:-1:-1;;;;;106592:33:0;;106626:6;106634:9;106592:52;;;;;;;;;;;;;-1:-1:-1;;;;;106592:52:0;;;;;;-1:-1:-1;;;;;106592:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;106592:52:0;106566:78;106562:124;;;106668:6;-1:-1:-1;106661:13:0;;-1:-1:-1;106661:13:0;106562:124;-1:-1:-1;106705:9:0;-1:-1:-1;105800:922:0;:::o;72943:449::-;73067:10;73059:44;;;;;-1:-1:-1;;;73059:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;73114:14;73131:13;;;:9;:13;;;;;;73175:14;;;73208:18;;;73200:57;;;;;-1:-1:-1;;;73200:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;73268:13;;;;:9;:13;;;;;;;;:25;;;;73358:9;:13;;;;;-1:-1:-1;;;;;73358:17:0;;;;;;;;;-1:-1:-1;73358:17:0;;;:26;;;;;;;72943:449::o;73400:681::-;73542:5;73551:1;73542:10;73534:49;;;;;-1:-1:-1;;;73534:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;73602:11;;;;:7;:11;;;;;;:16;73594:58;;;;;-1:-1:-1;;;73594:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;73665:11;;;;:7;:11;;;;;-1:-1:-1;;;;;73679:20:0;;73665:34;;73717:7;73712:362;;73741:20;73764:29;:2;:27;:29::i;:::-;73962:23;;;;:9;:23;;;;;;;;73960:25;;;;;;;;;74002:23;;;;;;-1:-1:-1;;;;;74002:27:0;;;;;;;;;74000:29;;;;;;74046:12;:16;;;;;;74044:18;;;;;;;-1:-1:-1;73400:681:0;;;;:::o;51135:444::-;51515:20;51563:8;;;51135:444::o;49719:400::-;50033:23;-1:-1:-1;;;;;49942:48:0;;42728:10;49991:12;:10;:12::i;:::-;50005:4;50011:3;50016:6;50024:4;49942:87;;;;;;;;;;;;;-1:-1:-1;;;;;49942:87:0;;;;;;-1:-1:-1;;;;;49942:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49942:87:0;-1:-1:-1;;;;;;49942:114:0;;49920:191;;;;;-1:-1:-1;;;49920:191:0;;;;;;;;;;;;;;;;;;;;;;;;;;;96402:564;96465:13;96495:10;96491:53;;-1:-1:-1;96522:10:0;;;;;;;;;;;;;;;;;;;96491:53;96569:5;96554:12;96610:78;96617:9;;96610:78;;96643:8;;96674:2;96666:10;;;;96610:78;;;96698:19;96730:6;96720:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;96720:17:0;-1:-1:-1;96792:5:0;;-1:-1:-1;96698:39:0;-1:-1:-1;;;96764:10:0;;96808:119;96815:9;;96808:119;;96885:2;96878:4;:9;96872:2;:16;96859:31;;96841:6;96848:7;;;;;;;96841:15;;;;;;;;;;;:49;;;;;;;;;;-1:-1:-1;96913:2:0;96905:10;;;;96808:119;;;-1:-1:-1;96951:6:0;96402:564;-1:-1:-1;;;;96402:564:0:o;83802:487::-;83954:10;83946:44;;;;;-1:-1:-1;;;83946:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;84009:10;84001:53;;;;;-1:-1:-1;;;84001:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;84065:15;84083:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;84083:19:0;;;;;;;;;;84121:16;;;;84113:58;;;;;-1:-1:-1;;;84113:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;84182:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;84182:19:0;;;;;;;;;;;84204:15;;;;84182:37;;;84259:13;;;:9;:13;;-1:-1:-1;84259:13:0;;;:22;;;;;;;;83802:487::o;84297:792::-;84475:5;84484:1;84475:10;84467:49;;;;;-1:-1:-1;;;84467:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;84527:13;84543:11;;;:7;:11;;;;;;-1:-1:-1;;;;;84573:31:0;;;;;;;84565:68;;;;;-1:-1:-1;;;84565:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;84649:10;84644:165;;-1:-1:-1;;;84685:34:0;;:39;;;;84684:78;;-1:-1:-1;84745:17:0;;;;:13;:17;;;;;;-1:-1:-1;;;;;84745:17:0;84729:12;:10;:12::i;:::-;-1:-1:-1;;;;;84729:33:0;;84684:78;84676:121;;;;;-1:-1:-1;;;84676:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;84819:11;;;;:7;:11;;;;;42845:66;84819:30;;84867:7;84862:220;;84891:64;84916:4;84922:29;:2;:27;:29::i;:::-;84953:1;84891:24;:64::i;:::-;-1:-1:-1;;;;;85052:18:0;;;;;;:12;:18;;;;;85050:20;;-1:-1:-1;;85050:20:0;;;84297:792;;;;;;:::o;60876:759::-;-1:-1:-1;;;;;61050:16:0;;61042:56;;;;;-1:-1:-1;;;61042:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;61109:14;61126:12;:10;:12::i;:::-;61109:29;;61149:15;61167:27;61181:4;61187:6;61167:13;:27::i;:::-;61149:45;;61207:51;61220:4;61226:2;61230:5;61237:1;61240:10;61252:5;61207:12;:51::i;:::-;61295:5;61291:2;-1:-1:-1;;;;;61276:25:0;61285:4;-1:-1:-1;;;;;61276:25:0;;;;;;;;;;;61346:2;-1:-1:-1;;;;;61317:42:0;61340:4;-1:-1:-1;;;;;61317:42:0;61332:6;-1:-1:-1;;;;;61317:42:0;;61350:5;61357:1;61317:42;;;;;;;;;;;;;;;;;;;;;;;;61374:15;:2;-1:-1:-1;;;;;61374:13:0;;:15::i;:::-;61370:258;;;61410:27;61434:2;61410:23;:27::i;:::-;61406:211;;;61458:48;61481:4;61487:2;61491:5;61498:1;61501:4;61458:22;:48::i;:::-;61406:211;;;61532:4;61528:89;;;61557:44;61579:4;61585:2;61589:5;61596:4;61557:21;:44::i;61832:2153::-;-1:-1:-1;;;;;62036:16:0;;62028:56;;;;;-1:-1:-1;;;62028:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;62112:10;;62151:13;;62141:23;;62133:66;;;;;-1:-1:-1;;;62133:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;62210:14;62227:12;:10;:12::i;:::-;62210:29;;62250:15;62268:27;62282:4;62288:6;62268:13;:27::i;:::-;62250:45;;62308:22;62341:25;62377:17;62410:9;62405:1147;62426:6;62421:1;:11;62405:1147;;62454:10;62467:3;62471:1;62467:6;;;;;;;;;;;;;;62454:19;;62492:20;:2;:18;:20::i;:::-;62488:1053;;;62533:54;62551:4;62557:2;62561;62565:6;62572:1;62565:9;;;;;;;;;;;;;;62576:10;62533:17;:54::i;:::-;62488:1053;;;62613:23;:2;:21;:23::i;:::-;62609:932;;;62657:55;62670:4;62676:2;62680;62684:6;62691:1;62684:9;;;;;;;;;;;;;;62695:10;62707:4;62657:12;:55::i;:::-;62755:2;62751;-1:-1:-1;;;;;62736:22:0;62745:4;-1:-1:-1;;;;;62736:22:0;;;;;;;;;;;62777:24;62804:29;:2;:27;:29::i;:::-;62777:56;-1:-1:-1;62856:19:0;62852:598;;62917:16;62900:33;;62976:1;62956:21;;62852:598;;;63050:14;63030:16;:34;63026:405;;63093:73;63122:4;63128:2;63132:14;63148:17;63093:28;:73::i;:::-;63210:16;-1:-1:-1;63330:1:0;;63253:30;;;;;63210:16;63026:405;;;63388:19;;;;;63026:405;62609:932;;-1:-1:-1;62434:3:0;;62405:1147;;;-1:-1:-1;63568:19:0;;63564:232;;63604:73;63633:4;63639:2;63643:14;63659:17;63604:28;:73::i;:::-;63692:30;;63737:47;63764:4;63770:2;63692:30;63737:26;:47::i;:::-;63847:2;-1:-1:-1;;;;;63813:50:0;63841:4;-1:-1:-1;;;;;63813:50:0;63827:12;:10;:12::i;:::-;-1:-1:-1;;;;;63813:50:0;;63851:3;63856:6;63813:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63878:15;:2;-1:-1:-1;;;;;63878:13:0;;:15::i;:::-;63874:104;;;63910:56;63938:4;63944:2;63948:3;63953:6;63961:4;63910:27;:56::i;76634:886::-;76801:90;;;76851:39;76801:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76824:25;76801:90;;;76998:21;;77047:11;;76709:4;77131:19;;;76709:4;;;;;76801:90;;;77047:11;;76998:21;76801:90;77193:9;77186:5;77175:63;77164:74;;77280:6;77274:13;77264:23;;;;;77473:3;77461:9;:15;77454:23;;;;77495:7;:17;;;;;77506:6;77495:17;77488:24;76634:886;-1:-1:-1;;;;;76634:886:0:o;48898:325::-;49166:17;-1:-1:-1;;;;;49082:43:0;;42563:10;49126:12;:10;:12::i;:::-;49140:4;49146:2;49150:5;49157:4;49082:80;;;;;;;;;;;;;-1:-1:-1;;;;;49082:80:0;;;;;;-1:-1:-1;;;;;49082:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77949:345;78198:33;-1:-1:-1;;;;;78125:36:0;;;78162:12;:10;:12::i;:::-;78176:4;78182:5;78189:4;78125:69;;;;;;;;;;;;;-1:-1:-1;;;;;78125:69:0;;;;;;-1:-1:-1;;;;;78125:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;78125:69:0;-1:-1:-1;;;;;;78125:106:0;;78103:183;;;;;-1:-1:-1;;;78103:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;85097:313;85319:23;;;;:9;:23;;;;;;;;-1:-1:-1;;;;;85319:29:0;;;;;;;;;;;:39;;;;;;;85369:23;;;:9;:23;;;;;;:33;;;;;;;;85097:313::o;74089:591::-;74266:10;74258:53;;;;;-1:-1:-1;;;74258:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;74330:10;74322:44;;;;;-1:-1:-1;;;74322:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;74377:15;74395:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;74395:19:0;;;;;;;;;;74433:16;;;;74425:58;;;;;-1:-1:-1;;;74425:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;74506:2;-1:-1:-1;;;;;74498:10:0;:4;-1:-1:-1;;;;;74498:10:0;;74494:179;;74525:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;74525:19:0;;;;;;;;;;;74547:15;;;;74525:37;;;74635:17;;;;;;;;;:26;;;;;;;-1:-1:-1;74089:591:0:o;74688:766::-;74891:5;74900:1;74891:10;74883:49;;;;;-1:-1:-1;;;74883:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;74943:13;74959:11;;;:7;:11;;;;;;-1:-1:-1;;;;;74989:31:0;;;;;;;74981:68;;;;;-1:-1:-1;;;74981:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;75065:10;75060:165;;-1:-1:-1;;;75101:34:0;;:39;;;;75100:78;;-1:-1:-1;75161:17:0;;;;:13;:17;;;;;;-1:-1:-1;;;;;75161:17:0;75145:12;:10;:12::i;:::-;-1:-1:-1;;;;;75145:33:0;;75100:78;75092:121;;;;;-1:-1:-1;;;75092:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;75235:11;;;;:7;:11;;;;;-1:-1:-1;;;;;75249:20:0;;75235:34;;75285:7;75280:167;;75309:39;75336:4;75342:2;75346:1;75309:26;:39::i;:::-;75363:72;75392:4;75398:2;75402:29;:2;:27;:29::i;:::-;75433:1;75862:446;76047:2;-1:-1:-1;;;;;76039:10:0;:4;-1:-1:-1;;;;;76039:10:0;;76035:266;;76140:23;;;;:9;:23;;;;;;;;-1:-1:-1;;;;;76140:29:0;;;;;;;;;;;:39;;;;;;;76252:27;;;;;;;:37;;;;;;;75862:446::o;75462:392::-;75614:2;-1:-1:-1;;;;;75606:10:0;:4;-1:-1:-1;;;;;75606:10:0;;75602:245;;-1:-1:-1;;;;;75707:18:0;;;;;;;:12;:18;;;;;;:28;;;;;;;75809:16;;;;;;:26;;;;;;75462:392;;;:::o;43462:442::-;43547:4;-1:-1:-1;;;;;;43584:40:0;;43599:25;43584:40;;:98;;-1:-1:-1;;;;;;;43641:41:0;;43656:26;43641:41;43584:98;:167;;;-1:-1:-1;;;;;;;43699:52:0;;43714:37;43699:52;43584:167;:234;;;-1:-1:-1;;;;;;;43768:50:0;;43783:35;43768:50;43584:234;:312;;;-1:-1:-1;;;;;;;;43835:61:0;43850:46;43835:61;;43462:442::o;103931:526::-;104414:23;104418:14;104414:23;104401:37;104397:2;104393:46;;104368:82::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;
Swarm Source
ipfs://f15bb571a09ca2cc4fc24fb025c14fbc428a46d23fa58f2d9c182efa34bd4bd0
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.