Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 13150995 | 1061 days ago | IN | 0 ETH | 0.250002 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MoverOlympusNFT
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-03 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /////////////////////////////////////////////////////////////////////////// // __/| OLYMPUS NFT // __/ // /| This smart contract is part of Mover // |/ //_/// https://viamover.com // |_/ // // |/ /////////////////////////////////////////////////////////////////////////// /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165Upgradeable { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721ReceiverUpgradeable { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721MetadataUpgradeable is IERC721Upgradeable { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721EnumerableUpgradeable is IERC721Upgradeable { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } } /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } /** * @dev String operations. */ library StringsUpgradeable { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal initializer { __ERC165_init_unchained(); } function __ERC165_init_unchained() internal initializer { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } uint256[50] private __gap; } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable { using AddressUpgradeable for address; using StringsUpgradeable for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping (uint256 => address) private _owners; // Mapping owner address to token count mapping (address => uint256) private _balances; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ function __ERC721_init(string memory name_, string memory symbol_) internal initializer { __Context_init_unchained(); __ERC165_init_unchained(); __ERC721_init_unchained(name_, symbol_); } function __ERC721_init_unchained(string memory name_, string memory symbol_) internal initializer { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC721Upgradeable).interfaceId || interfaceId == type(IERC721MetadataUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden * in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721Upgradeable.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || ERC721Upgradeable.isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721Upgradeable.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || ERC721Upgradeable.isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721Upgradeable.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721Upgradeable.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721Upgradeable.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (to.isContract()) { try IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721ReceiverUpgradeable(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } uint256[44] private __gap; } /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721EnumerableUpgradeable is Initializable, ERC721Upgradeable, IERC721EnumerableUpgradeable { function __ERC721Enumerable_init() internal initializer { __Context_init_unchained(); __ERC165_init_unchained(); __ERC721Enumerable_init_unchained(); } function __ERC721Enumerable_init_unchained() internal initializer { } // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165Upgradeable, ERC721Upgradeable) returns (bool) { return interfaceId == type(IERC721EnumerableUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721Upgradeable.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721EnumerableUpgradeable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721Upgradeable.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721Upgradeable.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } uint256[46] private __gap; } /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721BurnableUpgradeable is Initializable, ContextUpgradeable, ERC721Upgradeable { function __ERC721Burnable_init() internal initializer { __Context_init_unchained(); __ERC165_init_unchained(); __ERC721Burnable_init_unchained(); } function __ERC721Burnable_init_unchained() internal initializer { } /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } uint256[50] private __gap; } /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal initializer { __Context_init_unchained(); __Pausable_init_unchained(); } function __Pausable_init_unchained() internal initializer { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } uint256[49] private __gap; } /** * @dev ERC721 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC721PausableUpgradeable is Initializable, ERC721Upgradeable, PausableUpgradeable { function __ERC721Pausable_init() internal initializer { __Context_init_unchained(); __ERC165_init_unchained(); __Pausable_init_unchained(); __ERC721Pausable_init_unchained(); } function __ERC721Pausable_init_unchained() internal initializer { } /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); require(!paused(), "ERC721Pausable: token transfer while paused"); } uint256[50] private __gap; } /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControlUpgradeable { function hasRole(bytes32 role, address account) external view returns (bool); function getRoleAdmin(bytes32 role) external view returns (bytes32); function grantRole(bytes32 role, address account) external; function revokeRole(bytes32 role, address account) external; function renounceRole(bytes32 role, address account) external; } /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable { function __AccessControl_init() internal initializer { __Context_init_unchained(); __ERC165_init_unchained(); __AccessControl_init_unchained(); } function __AccessControl_init_unchained() internal initializer { } struct RoleData { mapping (address => bool) members; bytes32 adminRole; } mapping (bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override { require(hasRole(getRoleAdmin(role), _msgSender()), "AccessControl: sender must be an admin to grant"); _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override { require(hasRole(getRoleAdmin(role), _msgSender()), "AccessControl: sender must be an admin to revoke"); _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, getRoleAdmin(role), adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } uint256[49] private __gap; } /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSetUpgradeable { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerableUpgradeable { function getRoleMember(bytes32 role, uint256 index) external view returns (address); function getRoleMemberCount(bytes32 role) external view returns (uint256); } /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerableUpgradeable is Initializable, IAccessControlEnumerableUpgradeable, AccessControlUpgradeable { function __AccessControlEnumerable_init() internal initializer { __Context_init_unchained(); __ERC165_init_unchained(); __AccessControl_init_unchained(); __AccessControlEnumerable_init_unchained(); } function __AccessControlEnumerable_init_unchained() internal initializer { } using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet; mapping (bytes32 => EnumerableSetUpgradeable.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerableUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {grantRole} to track enumerable memberships */ function grantRole(bytes32 role, address account) public virtual override { super.grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {revokeRole} to track enumerable memberships */ function revokeRole(bytes32 role, address account) public virtual override { super.revokeRole(role, account); _roleMembers[role].remove(account); } /** * @dev Overload {renounceRole} to track enumerable memberships */ function renounceRole(bytes32 role, address account) public virtual override { super.renounceRole(role, account); _roleMembers[role].remove(account); } /** * @dev Overload {_setupRole} to track enumerable memberships */ function _setupRole(bytes32 role, address account) internal virtual override { super._setupRole(role, account); _roleMembers[role].add(account); } uint256[49] private __gap; } /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library CountersUpgradeable { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20Upgradeable { using AddressUpgradeable for address; function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMathUpgradeable { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } contract MoverOlympusNFT is Initializable, ContextUpgradeable, AccessControlEnumerableUpgradeable, ERC721EnumerableUpgradeable, ERC721BurnableUpgradeable, ERC721PausableUpgradeable { using SafeMathUpgradeable for uint256; using SafeERC20Upgradeable for IERC20Upgradeable; using CountersUpgradeable for CountersUpgradeable.Counter; using AddressUpgradeable for address payable; function initialize(string memory name, string memory symbol, string memory baseTokenURI, uint256 _claimStart, uint256 _claimEnd, address _feeAddress, uint256 _feeAmount) public virtual initializer { __MoverNFT_init(name, symbol, baseTokenURI); totalClaimed = 0; claimStart = _claimStart; claimEnd = _claimEnd; claimFeeAddress = _feeAddress; feeAmount = _feeAmount; } //////////////////////////////////////////////////////////// // ERC721 MintablePausable Preset from OpenZeppelin-upgradeable //////////////////////////////////////////////////////////// bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); CountersUpgradeable.Counter private _tokenIdTracker; string private _baseTokenURI; /** * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the * account that deploys the contract. * * Token URIs will be autogenerated based on `baseURI` and their token IDs. * See {ERC721-tokenURI}. */ function __MoverNFT_init(string memory name, string memory symbol, string memory baseTokenURI) internal initializer { __Context_init_unchained(); __ERC165_init_unchained(); __AccessControl_init_unchained(); __AccessControlEnumerable_init_unchained(); __ERC721_init_unchained(name, symbol); __ERC721Enumerable_init_unchained(); __ERC721Burnable_init_unchained(); __Pausable_init_unchained(); __ERC721Pausable_init_unchained(); __ERC721PresetMinterPauserAutoId_init_unchained(name, symbol, baseTokenURI); } function __ERC721PresetMinterPauserAutoId_init_unchained(string memory name, string memory symbol, string memory baseTokenURI) internal initializer { _baseTokenURI = baseTokenURI; _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(MINTER_ROLE, _msgSender()); _setupRole(PAUSER_ROLE, _msgSender()); } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } /** * @dev Creates a new token for `to`. Its token ID will be automatically * assigned (and available on the emitted {IERC721-Transfer} event), and the token * URI autogenerated based on the base URI passed at construction. * * See {ERC721-_mint}. * * Requirements: * * - the caller must have the `MINTER_ROLE`. */ function mint(address to) public virtual { require(hasRole(MINTER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have minter role to mint"); // We cannot just use balanceOf to create the new tokenId because tokens // can be burned (destroyed), so we need a separate counter. _mint(to, _tokenIdTracker.current()); _tokenIdTracker.increment(); } /** * @dev Pauses all token transfers. * * See {ERC721Pausable} and {Pausable-_pause}. * * Requirements: * * - the caller must have the `PAUSER_ROLE`. */ function pause() public virtual { require(hasRole(PAUSER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have pauser role to pause"); _pause(); } /** * @dev Unpauses all token transfers. * * See {ERC721Pausable} and {Pausable-_unpause}. * * Requirements: * * - the caller must have the `PAUSER_ROLE`. */ function unpause() public virtual { require(hasRole(PAUSER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have pauser role to unpause"); _unpause(); } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override(ERC721Upgradeable, ERC721EnumerableUpgradeable, ERC721PausableUpgradeable) { super._beforeTokenTransfer(from, to, tokenId); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControlEnumerableUpgradeable, ERC721Upgradeable, ERC721EnumerableUpgradeable) returns (bool) { return super.supportsInterface(interfaceId); } uint256[48] private __gap; //////////////////////////////////////////////////////////// // CLAIM WITH MINTING //////////////////////////////////////////////////////////// uint256 public totalClaimed; uint256 public claimStart; uint256 public claimEnd; address public claimFeeAddress; uint256 public feeAmount; fallback() external payable {} receive() external payable {} function setFeeAmount(uint256 _fee) public { require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "admin only"); feeAmount = _fee; } function setFeeAddress(address _feeAddress) public { require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "admin only"); claimFeeAddress = _feeAddress; } // just in case, role could be dropped after claims for immutability function setClaimInterval(uint256 _startTime, uint256 _endTime) public { require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "admin only"); claimStart = _startTime; claimEnd = _endTime; } function claimNFT() public payable { require(block.timestamp >= claimStart, "claim not started"); require(block.timestamp < claimEnd, "claim time ended"); require(msg.value == feeAmount, "need to send ETH"); _mint(msg.sender, _tokenIdTracker.current()); if (feeAmount > 0) { payable(claimFeeAddress).sendValue(feeAmount); } _tokenIdTracker.increment(); totalClaimed = totalClaimed + 1; } //////////////////////////////////////////////////////////// // TOKEN METADATA //////////////////////////////////////////////////////////// /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? baseURI //we have same metadata for all tokens minted by this contract string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } ///////////////////////////////////////////////////////////// // EMERGENCY FUNCTIONS ///////////////////////////////////////////////////////////// event EmergencyTransfer( address indexed token, address indexed destination, uint256 amount ); address private constant ETH_TOKEN_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; function emergencyTransfer( address _token, address _destination, uint256 _amount ) public { require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "admin only"); if (_token != ETH_TOKEN_ADDRESS) { IERC20Upgradeable(_token).safeTransfer(_destination, _amount); } else { payable(_destination).sendValue(_amount); } emit EmergencyTransfer(_token, _destination, _amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"destination","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimFeeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_destination","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseTokenURI","type":"string"},{"internalType":"uint256","name":"_claimStart","type":"uint256"},{"internalType":"uint256","name":"_claimEnd","type":"uint256"},{"internalType":"address","name":"_feeAddress","type":"address"},{"internalType":"uint256","name":"_feeAmount","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"}],"name":"setClaimInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeAddress","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setFeeAmount","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b5061343e806100206000396000f3fe6080604052600436106102555760003560e01c80636a62784211610139578063a217fddf116100b6578063d53913931161007a578063d539139314610695578063d547741f146106aa578063d54ad2a1146106ca578063e63ab1e9146106df578063e985e9c5146106f4578063f04d688f146107145761025c565b8063a217fddf14610600578063a22cb46514610615578063b88d4fde14610635578063c87b56dd14610655578063ca15c873146106755761025c565b806385d196e4116100fd57806385d196e41461056b5780638705fcd41461058b5780639010d07c146105ab57806391d14854146105cb57806395d89b41146105eb5761025c565b80636a627842146104d65780636b392680146104f657806370a0823114610516578063736c3b06146105365780638456cb59146105565761025c565b80632f745c59116101d257806342966c681161019657806342966c68146104445780634f6ccce7146104645780635c975abb146104845780636352211e14610499578063672756ad146104b957806369e15404146104c15761025c565b80632f745c59146103ba57806336568abe146103da5780633ccfa92f146103fa5780633f4ba83a1461040f57806342842e0e146104245761025c565b80631e84c725116102195780631e84c725146103255780631f59b6851461034557806323b872dd1461035a578063248a9ca31461037a5780632f2ff15d1461039a5761025c565b806301ffc9a71461025e57806306fdde0314610294578063081812fc146102b6578063095ea7b3146102e357806318160ddd146103035761025c565b3661025c57005b005b34801561026a57600080fd5b5061027e610279366004612733565b610729565b60405161028b91906128d2565b60405180910390f35b3480156102a057600080fd5b506102a961073c565b60405161028b91906128e6565b3480156102c257600080fd5b506102d66102d13660046126d8565b6107ce565b60405161028b9190612868565b3480156102ef57600080fd5b5061025c6102fe366004612693565b61081a565b34801561030f57600080fd5b506103186108b2565b60405161028b91906128dd565b34801561033157600080fd5b5061025c6103403660046125a9565b6108b8565b34801561035157600080fd5b506102d661097f565b34801561036657600080fd5b5061025c6103753660046125a9565b61098f565b34801561038657600080fd5b506103186103953660046126d8565b6109c7565b3480156103a657600080fd5b5061025c6103b53660046126f0565b6109dc565b3480156103c657600080fd5b506103186103d5366004612693565b6109fe565b3480156103e657600080fd5b5061025c6103f53660046126f0565b610a53565b34801561040657600080fd5b50610318610a75565b34801561041b57600080fd5b5061025c610a7c565b34801561043057600080fd5b5061025c61043f3660046125a9565b610abc565b34801561045057600080fd5b5061025c61045f3660046126d8565b610ad7565b34801561047057600080fd5b5061031861047f3660046126d8565b610b0a565b34801561049057600080fd5b5061027e610b65565b3480156104a557600080fd5b506102d66104b43660046126d8565b610b6f565b61025c610ba4565b3480156104cd57600080fd5b50610318610c65565b3480156104e257600080fd5b5061025c6104f136600461255d565b610c6c565b34801561050257600080fd5b5061025c6105113660046126d8565b610cce565b34801561052257600080fd5b5061031861053136600461255d565b610cfb565b34801561054257600080fd5b5061025c61055136600461276b565b610d3f565b34801561056257600080fd5b5061025c610dfa565b34801561057757600080fd5b5061025c610586366004612712565b610e38565b34801561059757600080fd5b5061025c6105a636600461255d565b610e6c565b3480156105b757600080fd5b506102d66105c6366004612712565b610eb6565b3480156105d757600080fd5b5061027e6105e63660046126f0565b610ed5565b3480156105f757600080fd5b506102a9610f00565b34801561060c57600080fd5b50610318610f0f565b34801561062157600080fd5b5061025c61063036600461265d565b610f14565b34801561064157600080fd5b5061025c6106503660046125e4565b610fe2565b34801561066157600080fd5b506102a96106703660046126d8565b611021565b34801561068157600080fd5b506103186106903660046126d8565b611074565b3480156106a157600080fd5b5061031861108b565b3480156106b657600080fd5b5061025c6106c53660046126f0565b6110af565b3480156106d657600080fd5b506103186110b9565b3480156106eb57600080fd5b506103186110c0565b34801561070057600080fd5b5061027e61070f366004612577565b6110d2565b34801561072057600080fd5b50610318611100565b600061073482611107565b90505b919050565b606060c9805461074b9061335d565b80601f01602080910402602001604051908101604052809291908181526020018280546107779061335d565b80156107c45780601f10610799576101008083540402835291602001916107c4565b820191906000526020600020905b8154815290600101906020018083116107a757829003601f168201915b5050505050905090565b60006107d98261112c565b6107fe5760405162461bcd60e51b81526004016107f590612ee6565b60405180910390fd5b50600090815260cd60205260409020546001600160a01b031690565b600061082582610b6f565b9050806001600160a01b0316836001600160a01b031614156108595760405162461bcd60e51b81526004016107f590612fca565b806001600160a01b031661086b611149565b6001600160a01b0316148061088757506108878161070f611149565b6108a35760405162461bcd60e51b81526004016107f590612d73565b6108ad838361114d565b505050565b60fd5490565b6108c3600033610ed5565b6108df5760405162461bcd60e51b81526004016107f590612ad7565b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1461091c576109176001600160a01b03841683836111bb565b61092f565b61092f6001600160a01b03831682611211565b816001600160a01b0316836001600160a01b03167fe73b77795c13bee9883a40de3973381a54190f3bc777dcab3a8206d302afc7848360405161097291906128dd565b60405180910390a3505050565b6101f8546001600160a01b031681565b6109a061099a611149565b826112ad565b6109bc5760405162461bcd60e51b81526004016107f590613035565b6108ad838383611332565b60009081526065602052604090206001015490565b6109e6828261145f565b60008281526097602052604090206108ad908261149d565b6000610a0983610cfb565b8210610a275760405162461bcd60e51b81526004016107f590612a03565b506001600160a01b038216600090815260fb602090815260408083208484529091529020545b92915050565b610a5d82826114b2565b60008281526097602052604090206108ad90826114f4565b6101f75481565b610a966000805160206133e98339815191526105e6611149565b610ab25760405162461bcd60e51b81526004016107f590613255565b610aba611509565b565b6108ad83838360405180602001604052806000815250610fe2565b610ae261099a611149565b610afe5760405162461bcd60e51b81526004016107f590613205565b610b0781611578565b50565b6000610b146108b2565b8210610b325760405162461bcd60e51b81526004016107f5906130e7565b60fd8281548110610b5357634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b61015f5460ff1690565b600081815260cb60205260408120546001600160a01b0316806107345760405162461bcd60e51b81526004016107f590612e1a565b6101f654421015610bc75760405162461bcd60e51b81526004016107f590613133565b6101f7544210610be95760405162461bcd60e51b81526004016107f5906130bd565b6101f9543414610c0b5760405162461bcd60e51b81526004016107f59061300b565b610c1f33610c1a6101c361161f565b611623565b6101f95415610c45576101f9546101f854610c45916001600160a01b0390911690611211565b610c506101c3611702565b6101f554610c5f906001613302565b6101f555565b6101f95481565b610c987f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66105e6611149565b610cb45760405162461bcd60e51b81526004016107f5906131a8565b610cc381610c1a6101c361161f565b610b076101c3611702565b610cd9600033610ed5565b610cf55760405162461bcd60e51b81526004016107f590612ad7565b6101f955565b60006001600160a01b038216610d235760405162461bcd60e51b81526004016107f590612dd0565b506001600160a01b0316600090815260cc602052604090205490565b600054610100900460ff1680610d58575060005460ff16155b610d745760405162461bcd60e51b81526004016107f590612e63565b600054610100900460ff16158015610d9f576000805460ff1961ff0019909116610100171660011790555b610daa88888861170b565b60006101f5556101f68590556101f78490556101f880546001600160a01b0319166001600160a01b0385161790556101f98290558015610df0576000805461ff00191690555b5050505050505050565b610e146000805160206133e98339815191526105e6611149565b610e305760405162461bcd60e51b81526004016107f590612afb565b610aba6117d7565b610e43600033610ed5565b610e5f5760405162461bcd60e51b81526004016107f590612ad7565b6101f6919091556101f755565b610e77600033610ed5565b610e935760405162461bcd60e51b81526004016107f590612ad7565b6101f880546001600160a01b0319166001600160a01b0392909216919091179055565b6000828152609760205260408120610ece9083611833565b9392505050565b60009182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060ca805461074b9061335d565b600081565b610f1c611149565b6001600160a01b0316826001600160a01b03161415610f4d5760405162461bcd60e51b81526004016107f590612b9c565b8060ce6000610f5a611149565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610f9e611149565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610fd691906128d2565b60405180910390a35050565b610ff3610fed611149565b836112ad565b61100f5760405162461bcd60e51b81526004016107f590613035565b61101b8484848461183f565b50505050565b606061102c8261112c565b6110485760405162461bcd60e51b81526004016107f590612f7b565b6000611052611872565b9050600081511161073457604051806020016040528060008152509392505050565b600081815260976020526040812061073490611882565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610a5d828261188d565b6101f55481565b6000805160206133e983398151915281565b6001600160a01b03918216600090815260ce6020908152604080832093909416825291909152205460ff1690565b6101f65481565b60006001600160e01b0319821663780e9d6360e01b14806107345750610734826118b5565b600090815260cb60205260409020546001600160a01b0316151590565b3390565b600081815260cd6020526040902080546001600160a01b0319166001600160a01b038416908117909155819061118282610b6f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6108ad8363a9059cbb60e01b84846040516024016111da9291906128b9565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526118f5565b804710156112315760405162461bcd60e51b81526004016107f590612c30565b6000826001600160a01b03168260405161124a90612865565b60006040518083038185875af1925050503d8060008114611287576040519150601f19603f3d011682016040523d82523d6000602084013e61128c565b606091505b50509050806108ad5760405162461bcd60e51b81526004016107f590612bd3565b60006112b88261112c565b6112d45760405162461bcd60e51b81526004016107f590612cad565b60006112df83610b6f565b9050806001600160a01b0316846001600160a01b0316148061131a5750836001600160a01b031661130f846107ce565b6001600160a01b0316145b8061132a575061132a81856110d2565b949350505050565b826001600160a01b031661134582610b6f565b6001600160a01b03161461136b5760405162461bcd60e51b81526004016107f590612f32565b6001600160a01b0382166113915760405162461bcd60e51b81526004016107f590612b58565b61139c838383611984565b6113a760008261114d565b6001600160a01b038316600090815260cc602052604081208054600192906113d090849061331a565b90915550506001600160a01b038216600090815260cc602052604081208054600192906113fe908490613302565b9091555050600081815260cb602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61147361146b836109c7565b6105e6611149565b61148f5760405162461bcd60e51b81526004016107f590612986565b611499828261198f565b5050565b6000610ece836001600160a01b038416611a16565b6114ba611149565b6001600160a01b0316816001600160a01b0316146114ea5760405162461bcd60e51b81526004016107f5906132b3565b6114998282611a60565b6000610ece836001600160a01b038416611ae5565b611511610b65565b61152d5760405162461bcd60e51b81526004016107f5906129d5565b61015f805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611561611149565b60405161156e9190612868565b60405180910390a1565b600061158382610b6f565b905061159181600084611984565b61159c60008361114d565b6001600160a01b038116600090815260cc602052604081208054600192906115c590849061331a565b9091555050600082815260cb602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b5490565b6001600160a01b0382166116495760405162461bcd60e51b81526004016107f590612eb1565b6116528161112c565b1561166f5760405162461bcd60e51b81526004016107f590612aa0565b61167b60008383611984565b6001600160a01b038216600090815260cc602052604081208054600192906116a4908490613302565b9091555050600081815260cb602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b80546001019055565b600054610100900460ff1680611724575060005460ff16155b6117405760405162461bcd60e51b81526004016107f590612e63565b600054610100900460ff1615801561176b576000805460ff1961ff0019909116610100171660011790555b611773611c02565b61177b611c02565b611783611c02565b61178b611c02565b6117958484611c76565b61179d611c02565b6117a5611c02565b6117ad611d14565b6117b5611c02565b6117c0848484611d93565b801561101b576000805461ff001916905550505050565b6117df610b65565b156117fc5760405162461bcd60e51b81526004016107f590612d49565b61015f805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611561611149565b6000610ece8383611e60565b61184a848484611332565b61185684848484611eb9565b61101b5760405162461bcd60e51b81526004016107f590612a4e565b60606101c4805461074b9061335d565b60006107348261161f565b61189961146b836109c7565b6114ea5760405162461bcd60e51b81526004016107f590612cf9565b60006001600160e01b031982166380ac58cd60e01b14806118e657506001600160e01b03198216635b5e139f60e01b145b80610734575061073482611fd4565b600061194a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ff99092919063ffffffff16565b8051909150156108ad578080602001905181019061196891906126bc565b6108ad5760405162461bcd60e51b81526004016107f59061315e565b6108ad838383612008565b6119998282610ed5565b6114995760008281526065602090815260408083206001600160a01b03851684529091529020805460ff191660011790556119d2611149565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000611a228383612038565b611a5857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610a4d565b506000610a4d565b611a6a8282610ed5565b156114995760008281526065602090815260408083206001600160a01b03851684529091529020805460ff19169055611aa1611149565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b60008181526001830160205260408120548015611bf8576000611b0960018361331a565b8554909150600090611b1d9060019061331a565b90506000866000018281548110611b4457634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110611b7557634e487b7160e01b600052603260045260246000fd5b600091825260209091200155611b8c836001613302565b60008281526001890160205260409020558654879080611bbc57634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610a4d565b6000915050610a4d565b600054610100900460ff1680611c1b575060005460ff16155b611c375760405162461bcd60e51b81526004016107f590612e63565b600054610100900460ff16158015611c62576000805460ff1961ff0019909116610100171660011790555b8015610b07576000805461ff001916905550565b600054610100900460ff1680611c8f575060005460ff16155b611cab5760405162461bcd60e51b81526004016107f590612e63565b600054610100900460ff16158015611cd6576000805460ff1961ff0019909116610100171660011790555b8251611ce99060c990602086019061241e565b508151611cfd9060ca90602085019061241e565b5080156108ad576000805461ff0019169055505050565b600054610100900460ff1680611d2d575060005460ff16155b611d495760405162461bcd60e51b81526004016107f590612e63565b600054610100900460ff16158015611d74576000805460ff1961ff0019909116610100171660011790555b61015f805460ff191690558015610b07576000805461ff001916905550565b600054610100900460ff1680611dac575060005460ff16155b611dc85760405162461bcd60e51b81526004016107f590612e63565b600054610100900460ff16158015611df3576000805460ff1961ff0019909116610100171660011790555b8151611e07906101c490602085019061241e565b50611e1a6000611e15611149565b612050565b611e467f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6611e15611149565b6117c06000805160206133e9833981519152611e15611149565b81546000908210611e835760405162461bcd60e51b81526004016107f5906128f9565b826000018281548110611ea657634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6000611ecd846001600160a01b031661205a565b15611fc957836001600160a01b031663150b7a02611ee9611149565b8786866040518563ffffffff1660e01b8152600401611f0b949392919061287c565b602060405180830381600087803b158015611f2557600080fd5b505af1925050508015611f55575060408051601f3d908101601f19168201909252611f529181019061274f565b60015b611faf573d808015611f83576040519150601f19603f3d011682016040523d82523d6000602084013e611f88565b606091505b508051611fa75760405162461bcd60e51b81526004016107f590612a4e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061132a565b506001949350505050565b60006001600160e01b03198216635a05180f60e01b1480610734575061073482612060565b606061132a8484600085612085565b612013838383612145565b61201b610b65565b156108ad5760405162461bcd60e51b81526004016107f59061293b565b60009081526001919091016020526040902054151590565b6109e6828261148f565b3b151590565b60006001600160e01b03198216637965db0b60e01b14806107345750610734826121ce565b6060824710156120a75760405162461bcd60e51b81526004016107f590612c67565b6120b08561205a565b6120cc5760405162461bcd60e51b81526004016107f590613086565b600080866001600160a01b031685876040516120e89190612849565b60006040518083038185875af1925050503d8060008114612125576040519150601f19603f3d011682016040523d82523d6000602084013e61212a565b606091505b509150915061213a8282866121e7565b979650505050505050565b6121508383836108ad565b6001600160a01b03831661216c5761216781612220565b61218f565b816001600160a01b0316836001600160a01b03161461218f5761218f8382612264565b6001600160a01b0382166121ab576121a681612301565b6108ad565b826001600160a01b0316826001600160a01b0316146108ad576108ad82826123da565b6001600160e01b031981166301ffc9a760e01b14919050565b606083156121f6575081610ece565b8251156122065782518084602001fd5b8160405162461bcd60e51b81526004016107f591906128e6565b60fd8054600083815260fe60205260408120829055600182018355919091527f9346ac6dd7de6b96975fec380d4d994c4c12e6a8897544f22915316cc6cca2800155565b6000600161227184610cfb565b61227b919061331a565b600083815260fc60205260409020549091508082146122ce576001600160a01b038416600090815260fb60209081526040808320858452825280832054848452818420819055835260fc90915290208190555b50600091825260fc602090815260408084208490556001600160a01b03909416835260fb81528383209183525290812055565b60fd546000906123139060019061331a565b600083815260fe602052604081205460fd805493945090928490811061234957634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060fd838154811061237857634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260fe909152604080822084905585825281205560fd8054806123be57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006123e583610cfb565b6001600160a01b03909316600090815260fb60209081526040808320868452825280832085905593825260fc9052919091209190915550565b82805461242a9061335d565b90600052602060002090601f01602090048101928261244c5760008555612492565b82601f1061246557805160ff1916838001178555612492565b82800160010185558215612492579182015b82811115612492578251825591602001919060010190612477565b5061249e9291506124a2565b5090565b5b8082111561249e57600081556001016124a3565b600067ffffffffffffffff808411156124d2576124d26133ae565b604051601f8501601f1916810160200182811182821017156124f6576124f66133ae565b60405284815291508183850186101561250e57600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b038116811461073757600080fd5b600082601f83011261254e578081fd5b610ece838335602085016124b7565b60006020828403121561256e578081fd5b610ece82612527565b60008060408385031215612589578081fd5b61259283612527565b91506125a060208401612527565b90509250929050565b6000806000606084860312156125bd578081fd5b6125c684612527565b92506125d460208501612527565b9150604084013590509250925092565b600080600080608085870312156125f9578081fd5b61260285612527565b935061261060208601612527565b925060408501359150606085013567ffffffffffffffff811115612632578182fd5b8501601f81018713612642578182fd5b612651878235602084016124b7565b91505092959194509250565b6000806040838503121561266f578182fd5b61267883612527565b91506020830135612688816133c4565b809150509250929050565b600080604083850312156126a5578182fd5b6126ae83612527565b946020939093013593505050565b6000602082840312156126cd578081fd5b8151610ece816133c4565b6000602082840312156126e9578081fd5b5035919050565b60008060408385031215612702578182fd5b823591506125a060208401612527565b60008060408385031215612724578182fd5b50508035926020909101359150565b600060208284031215612744578081fd5b8135610ece816133d2565b600060208284031215612760578081fd5b8151610ece816133d2565b600080600080600080600060e0888a031215612785578283fd5b873567ffffffffffffffff8082111561279c578485fd5b6127a88b838c0161253e565b985060208a01359150808211156127bd578485fd5b6127c98b838c0161253e565b975060408a01359150808211156127de578485fd5b506127eb8a828b0161253e565b955050606088013593506080880135925061280860a08901612527565b915060c0880135905092959891949750929550565b60008151808452612835816020860160208601613331565b601f01601f19169290920160200192915050565b6000825161285b818460208701613331565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906128af9083018461281d565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b600060208252610ece602083018461281d565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252602b908201527f4552433732315061757361626c653a20746f6b656e207472616e73666572207760408201526a1a1a5b19481c185d5cd95960aa1b606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60408201526e0818591b5a5b881d1bc819dc985b9d608a1b606082015260800190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252600a908201526961646d696e206f6e6c7960b01b604082015260600190565b6020808252603e908201527f4552433732315072657365744d696e7465725061757365724175746f49643a2060408201527f6d75737420686176652070617573657220726f6c6520746f2070617573650000606082015260800190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252603a908201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260408201527f6563697069656e74206d61792068617665207265766572746564000000000000606082015260800190565b6020808252601d908201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526030908201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60408201526f2061646d696e20746f207265766f6b6560801b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526010908201526f0dccacac840e8de40e6cadcc8408aa8960831b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526010908201526f18db185a5b481d1a5b5948195b99195960821b604082015260600190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b60208082526011908201527018db185a5b481b9bdd081cdd185c9d1959607a1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252603d908201527f4552433732315072657365744d696e7465725061757365724175746f49643a2060408201527f6d7573742068617665206d696e74657220726f6c6520746f206d696e74000000606082015260800190565b60208082526030908201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760408201526f1b995c881b9bdc88185c1c1c9bdd995960821b606082015260800190565b602080825260409082018190527f4552433732315072657365744d696e7465725061757365724175746f49643a20908201527f6d75737420686176652070617573657220726f6c6520746f20756e7061757365606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560408201526e103937b632b9903337b91039b2b63360891b606082015260800190565b6000821982111561331557613315613398565b500190565b60008282101561332c5761332c613398565b500390565b60005b8381101561334c578181015183820152602001613334565b8381111561101b5750506000910152565b60028104600182168061337157607f821691505b6020821081141561339257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114610b0757600080fd5b6001600160e01b031981168114610b0757600080fdfe65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862aa264697066735822122044ebd5cd6d9d51685bbb0e4130a35ca60bf64bf526867c14850b5f9b206d81d264736f6c63430008000033
Deployed Bytecode
0x6080604052600436106102555760003560e01c80636a62784211610139578063a217fddf116100b6578063d53913931161007a578063d539139314610695578063d547741f146106aa578063d54ad2a1146106ca578063e63ab1e9146106df578063e985e9c5146106f4578063f04d688f146107145761025c565b8063a217fddf14610600578063a22cb46514610615578063b88d4fde14610635578063c87b56dd14610655578063ca15c873146106755761025c565b806385d196e4116100fd57806385d196e41461056b5780638705fcd41461058b5780639010d07c146105ab57806391d14854146105cb57806395d89b41146105eb5761025c565b80636a627842146104d65780636b392680146104f657806370a0823114610516578063736c3b06146105365780638456cb59146105565761025c565b80632f745c59116101d257806342966c681161019657806342966c68146104445780634f6ccce7146104645780635c975abb146104845780636352211e14610499578063672756ad146104b957806369e15404146104c15761025c565b80632f745c59146103ba57806336568abe146103da5780633ccfa92f146103fa5780633f4ba83a1461040f57806342842e0e146104245761025c565b80631e84c725116102195780631e84c725146103255780631f59b6851461034557806323b872dd1461035a578063248a9ca31461037a5780632f2ff15d1461039a5761025c565b806301ffc9a71461025e57806306fdde0314610294578063081812fc146102b6578063095ea7b3146102e357806318160ddd146103035761025c565b3661025c57005b005b34801561026a57600080fd5b5061027e610279366004612733565b610729565b60405161028b91906128d2565b60405180910390f35b3480156102a057600080fd5b506102a961073c565b60405161028b91906128e6565b3480156102c257600080fd5b506102d66102d13660046126d8565b6107ce565b60405161028b9190612868565b3480156102ef57600080fd5b5061025c6102fe366004612693565b61081a565b34801561030f57600080fd5b506103186108b2565b60405161028b91906128dd565b34801561033157600080fd5b5061025c6103403660046125a9565b6108b8565b34801561035157600080fd5b506102d661097f565b34801561036657600080fd5b5061025c6103753660046125a9565b61098f565b34801561038657600080fd5b506103186103953660046126d8565b6109c7565b3480156103a657600080fd5b5061025c6103b53660046126f0565b6109dc565b3480156103c657600080fd5b506103186103d5366004612693565b6109fe565b3480156103e657600080fd5b5061025c6103f53660046126f0565b610a53565b34801561040657600080fd5b50610318610a75565b34801561041b57600080fd5b5061025c610a7c565b34801561043057600080fd5b5061025c61043f3660046125a9565b610abc565b34801561045057600080fd5b5061025c61045f3660046126d8565b610ad7565b34801561047057600080fd5b5061031861047f3660046126d8565b610b0a565b34801561049057600080fd5b5061027e610b65565b3480156104a557600080fd5b506102d66104b43660046126d8565b610b6f565b61025c610ba4565b3480156104cd57600080fd5b50610318610c65565b3480156104e257600080fd5b5061025c6104f136600461255d565b610c6c565b34801561050257600080fd5b5061025c6105113660046126d8565b610cce565b34801561052257600080fd5b5061031861053136600461255d565b610cfb565b34801561054257600080fd5b5061025c61055136600461276b565b610d3f565b34801561056257600080fd5b5061025c610dfa565b34801561057757600080fd5b5061025c610586366004612712565b610e38565b34801561059757600080fd5b5061025c6105a636600461255d565b610e6c565b3480156105b757600080fd5b506102d66105c6366004612712565b610eb6565b3480156105d757600080fd5b5061027e6105e63660046126f0565b610ed5565b3480156105f757600080fd5b506102a9610f00565b34801561060c57600080fd5b50610318610f0f565b34801561062157600080fd5b5061025c61063036600461265d565b610f14565b34801561064157600080fd5b5061025c6106503660046125e4565b610fe2565b34801561066157600080fd5b506102a96106703660046126d8565b611021565b34801561068157600080fd5b506103186106903660046126d8565b611074565b3480156106a157600080fd5b5061031861108b565b3480156106b657600080fd5b5061025c6106c53660046126f0565b6110af565b3480156106d657600080fd5b506103186110b9565b3480156106eb57600080fd5b506103186110c0565b34801561070057600080fd5b5061027e61070f366004612577565b6110d2565b34801561072057600080fd5b50610318611100565b600061073482611107565b90505b919050565b606060c9805461074b9061335d565b80601f01602080910402602001604051908101604052809291908181526020018280546107779061335d565b80156107c45780601f10610799576101008083540402835291602001916107c4565b820191906000526020600020905b8154815290600101906020018083116107a757829003601f168201915b5050505050905090565b60006107d98261112c565b6107fe5760405162461bcd60e51b81526004016107f590612ee6565b60405180910390fd5b50600090815260cd60205260409020546001600160a01b031690565b600061082582610b6f565b9050806001600160a01b0316836001600160a01b031614156108595760405162461bcd60e51b81526004016107f590612fca565b806001600160a01b031661086b611149565b6001600160a01b0316148061088757506108878161070f611149565b6108a35760405162461bcd60e51b81526004016107f590612d73565b6108ad838361114d565b505050565b60fd5490565b6108c3600033610ed5565b6108df5760405162461bcd60e51b81526004016107f590612ad7565b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1461091c576109176001600160a01b03841683836111bb565b61092f565b61092f6001600160a01b03831682611211565b816001600160a01b0316836001600160a01b03167fe73b77795c13bee9883a40de3973381a54190f3bc777dcab3a8206d302afc7848360405161097291906128dd565b60405180910390a3505050565b6101f8546001600160a01b031681565b6109a061099a611149565b826112ad565b6109bc5760405162461bcd60e51b81526004016107f590613035565b6108ad838383611332565b60009081526065602052604090206001015490565b6109e6828261145f565b60008281526097602052604090206108ad908261149d565b6000610a0983610cfb565b8210610a275760405162461bcd60e51b81526004016107f590612a03565b506001600160a01b038216600090815260fb602090815260408083208484529091529020545b92915050565b610a5d82826114b2565b60008281526097602052604090206108ad90826114f4565b6101f75481565b610a966000805160206133e98339815191526105e6611149565b610ab25760405162461bcd60e51b81526004016107f590613255565b610aba611509565b565b6108ad83838360405180602001604052806000815250610fe2565b610ae261099a611149565b610afe5760405162461bcd60e51b81526004016107f590613205565b610b0781611578565b50565b6000610b146108b2565b8210610b325760405162461bcd60e51b81526004016107f5906130e7565b60fd8281548110610b5357634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b61015f5460ff1690565b600081815260cb60205260408120546001600160a01b0316806107345760405162461bcd60e51b81526004016107f590612e1a565b6101f654421015610bc75760405162461bcd60e51b81526004016107f590613133565b6101f7544210610be95760405162461bcd60e51b81526004016107f5906130bd565b6101f9543414610c0b5760405162461bcd60e51b81526004016107f59061300b565b610c1f33610c1a6101c361161f565b611623565b6101f95415610c45576101f9546101f854610c45916001600160a01b0390911690611211565b610c506101c3611702565b6101f554610c5f906001613302565b6101f555565b6101f95481565b610c987f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66105e6611149565b610cb45760405162461bcd60e51b81526004016107f5906131a8565b610cc381610c1a6101c361161f565b610b076101c3611702565b610cd9600033610ed5565b610cf55760405162461bcd60e51b81526004016107f590612ad7565b6101f955565b60006001600160a01b038216610d235760405162461bcd60e51b81526004016107f590612dd0565b506001600160a01b0316600090815260cc602052604090205490565b600054610100900460ff1680610d58575060005460ff16155b610d745760405162461bcd60e51b81526004016107f590612e63565b600054610100900460ff16158015610d9f576000805460ff1961ff0019909116610100171660011790555b610daa88888861170b565b60006101f5556101f68590556101f78490556101f880546001600160a01b0319166001600160a01b0385161790556101f98290558015610df0576000805461ff00191690555b5050505050505050565b610e146000805160206133e98339815191526105e6611149565b610e305760405162461bcd60e51b81526004016107f590612afb565b610aba6117d7565b610e43600033610ed5565b610e5f5760405162461bcd60e51b81526004016107f590612ad7565b6101f6919091556101f755565b610e77600033610ed5565b610e935760405162461bcd60e51b81526004016107f590612ad7565b6101f880546001600160a01b0319166001600160a01b0392909216919091179055565b6000828152609760205260408120610ece9083611833565b9392505050565b60009182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060ca805461074b9061335d565b600081565b610f1c611149565b6001600160a01b0316826001600160a01b03161415610f4d5760405162461bcd60e51b81526004016107f590612b9c565b8060ce6000610f5a611149565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610f9e611149565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610fd691906128d2565b60405180910390a35050565b610ff3610fed611149565b836112ad565b61100f5760405162461bcd60e51b81526004016107f590613035565b61101b8484848461183f565b50505050565b606061102c8261112c565b6110485760405162461bcd60e51b81526004016107f590612f7b565b6000611052611872565b9050600081511161073457604051806020016040528060008152509392505050565b600081815260976020526040812061073490611882565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610a5d828261188d565b6101f55481565b6000805160206133e983398151915281565b6001600160a01b03918216600090815260ce6020908152604080832093909416825291909152205460ff1690565b6101f65481565b60006001600160e01b0319821663780e9d6360e01b14806107345750610734826118b5565b600090815260cb60205260409020546001600160a01b0316151590565b3390565b600081815260cd6020526040902080546001600160a01b0319166001600160a01b038416908117909155819061118282610b6f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6108ad8363a9059cbb60e01b84846040516024016111da9291906128b9565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526118f5565b804710156112315760405162461bcd60e51b81526004016107f590612c30565b6000826001600160a01b03168260405161124a90612865565b60006040518083038185875af1925050503d8060008114611287576040519150601f19603f3d011682016040523d82523d6000602084013e61128c565b606091505b50509050806108ad5760405162461bcd60e51b81526004016107f590612bd3565b60006112b88261112c565b6112d45760405162461bcd60e51b81526004016107f590612cad565b60006112df83610b6f565b9050806001600160a01b0316846001600160a01b0316148061131a5750836001600160a01b031661130f846107ce565b6001600160a01b0316145b8061132a575061132a81856110d2565b949350505050565b826001600160a01b031661134582610b6f565b6001600160a01b03161461136b5760405162461bcd60e51b81526004016107f590612f32565b6001600160a01b0382166113915760405162461bcd60e51b81526004016107f590612b58565b61139c838383611984565b6113a760008261114d565b6001600160a01b038316600090815260cc602052604081208054600192906113d090849061331a565b90915550506001600160a01b038216600090815260cc602052604081208054600192906113fe908490613302565b9091555050600081815260cb602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61147361146b836109c7565b6105e6611149565b61148f5760405162461bcd60e51b81526004016107f590612986565b611499828261198f565b5050565b6000610ece836001600160a01b038416611a16565b6114ba611149565b6001600160a01b0316816001600160a01b0316146114ea5760405162461bcd60e51b81526004016107f5906132b3565b6114998282611a60565b6000610ece836001600160a01b038416611ae5565b611511610b65565b61152d5760405162461bcd60e51b81526004016107f5906129d5565b61015f805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611561611149565b60405161156e9190612868565b60405180910390a1565b600061158382610b6f565b905061159181600084611984565b61159c60008361114d565b6001600160a01b038116600090815260cc602052604081208054600192906115c590849061331a565b9091555050600082815260cb602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b5490565b6001600160a01b0382166116495760405162461bcd60e51b81526004016107f590612eb1565b6116528161112c565b1561166f5760405162461bcd60e51b81526004016107f590612aa0565b61167b60008383611984565b6001600160a01b038216600090815260cc602052604081208054600192906116a4908490613302565b9091555050600081815260cb602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b80546001019055565b600054610100900460ff1680611724575060005460ff16155b6117405760405162461bcd60e51b81526004016107f590612e63565b600054610100900460ff1615801561176b576000805460ff1961ff0019909116610100171660011790555b611773611c02565b61177b611c02565b611783611c02565b61178b611c02565b6117958484611c76565b61179d611c02565b6117a5611c02565b6117ad611d14565b6117b5611c02565b6117c0848484611d93565b801561101b576000805461ff001916905550505050565b6117df610b65565b156117fc5760405162461bcd60e51b81526004016107f590612d49565b61015f805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611561611149565b6000610ece8383611e60565b61184a848484611332565b61185684848484611eb9565b61101b5760405162461bcd60e51b81526004016107f590612a4e565b60606101c4805461074b9061335d565b60006107348261161f565b61189961146b836109c7565b6114ea5760405162461bcd60e51b81526004016107f590612cf9565b60006001600160e01b031982166380ac58cd60e01b14806118e657506001600160e01b03198216635b5e139f60e01b145b80610734575061073482611fd4565b600061194a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ff99092919063ffffffff16565b8051909150156108ad578080602001905181019061196891906126bc565b6108ad5760405162461bcd60e51b81526004016107f59061315e565b6108ad838383612008565b6119998282610ed5565b6114995760008281526065602090815260408083206001600160a01b03851684529091529020805460ff191660011790556119d2611149565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000611a228383612038565b611a5857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610a4d565b506000610a4d565b611a6a8282610ed5565b156114995760008281526065602090815260408083206001600160a01b03851684529091529020805460ff19169055611aa1611149565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b60008181526001830160205260408120548015611bf8576000611b0960018361331a565b8554909150600090611b1d9060019061331a565b90506000866000018281548110611b4457634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110611b7557634e487b7160e01b600052603260045260246000fd5b600091825260209091200155611b8c836001613302565b60008281526001890160205260409020558654879080611bbc57634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610a4d565b6000915050610a4d565b600054610100900460ff1680611c1b575060005460ff16155b611c375760405162461bcd60e51b81526004016107f590612e63565b600054610100900460ff16158015611c62576000805460ff1961ff0019909116610100171660011790555b8015610b07576000805461ff001916905550565b600054610100900460ff1680611c8f575060005460ff16155b611cab5760405162461bcd60e51b81526004016107f590612e63565b600054610100900460ff16158015611cd6576000805460ff1961ff0019909116610100171660011790555b8251611ce99060c990602086019061241e565b508151611cfd9060ca90602085019061241e565b5080156108ad576000805461ff0019169055505050565b600054610100900460ff1680611d2d575060005460ff16155b611d495760405162461bcd60e51b81526004016107f590612e63565b600054610100900460ff16158015611d74576000805460ff1961ff0019909116610100171660011790555b61015f805460ff191690558015610b07576000805461ff001916905550565b600054610100900460ff1680611dac575060005460ff16155b611dc85760405162461bcd60e51b81526004016107f590612e63565b600054610100900460ff16158015611df3576000805460ff1961ff0019909116610100171660011790555b8151611e07906101c490602085019061241e565b50611e1a6000611e15611149565b612050565b611e467f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6611e15611149565b6117c06000805160206133e9833981519152611e15611149565b81546000908210611e835760405162461bcd60e51b81526004016107f5906128f9565b826000018281548110611ea657634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6000611ecd846001600160a01b031661205a565b15611fc957836001600160a01b031663150b7a02611ee9611149565b8786866040518563ffffffff1660e01b8152600401611f0b949392919061287c565b602060405180830381600087803b158015611f2557600080fd5b505af1925050508015611f55575060408051601f3d908101601f19168201909252611f529181019061274f565b60015b611faf573d808015611f83576040519150601f19603f3d011682016040523d82523d6000602084013e611f88565b606091505b508051611fa75760405162461bcd60e51b81526004016107f590612a4e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061132a565b506001949350505050565b60006001600160e01b03198216635a05180f60e01b1480610734575061073482612060565b606061132a8484600085612085565b612013838383612145565b61201b610b65565b156108ad5760405162461bcd60e51b81526004016107f59061293b565b60009081526001919091016020526040902054151590565b6109e6828261148f565b3b151590565b60006001600160e01b03198216637965db0b60e01b14806107345750610734826121ce565b6060824710156120a75760405162461bcd60e51b81526004016107f590612c67565b6120b08561205a565b6120cc5760405162461bcd60e51b81526004016107f590613086565b600080866001600160a01b031685876040516120e89190612849565b60006040518083038185875af1925050503d8060008114612125576040519150601f19603f3d011682016040523d82523d6000602084013e61212a565b606091505b509150915061213a8282866121e7565b979650505050505050565b6121508383836108ad565b6001600160a01b03831661216c5761216781612220565b61218f565b816001600160a01b0316836001600160a01b03161461218f5761218f8382612264565b6001600160a01b0382166121ab576121a681612301565b6108ad565b826001600160a01b0316826001600160a01b0316146108ad576108ad82826123da565b6001600160e01b031981166301ffc9a760e01b14919050565b606083156121f6575081610ece565b8251156122065782518084602001fd5b8160405162461bcd60e51b81526004016107f591906128e6565b60fd8054600083815260fe60205260408120829055600182018355919091527f9346ac6dd7de6b96975fec380d4d994c4c12e6a8897544f22915316cc6cca2800155565b6000600161227184610cfb565b61227b919061331a565b600083815260fc60205260409020549091508082146122ce576001600160a01b038416600090815260fb60209081526040808320858452825280832054848452818420819055835260fc90915290208190555b50600091825260fc602090815260408084208490556001600160a01b03909416835260fb81528383209183525290812055565b60fd546000906123139060019061331a565b600083815260fe602052604081205460fd805493945090928490811061234957634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060fd838154811061237857634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260fe909152604080822084905585825281205560fd8054806123be57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006123e583610cfb565b6001600160a01b03909316600090815260fb60209081526040808320868452825280832085905593825260fc9052919091209190915550565b82805461242a9061335d565b90600052602060002090601f01602090048101928261244c5760008555612492565b82601f1061246557805160ff1916838001178555612492565b82800160010185558215612492579182015b82811115612492578251825591602001919060010190612477565b5061249e9291506124a2565b5090565b5b8082111561249e57600081556001016124a3565b600067ffffffffffffffff808411156124d2576124d26133ae565b604051601f8501601f1916810160200182811182821017156124f6576124f66133ae565b60405284815291508183850186101561250e57600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b038116811461073757600080fd5b600082601f83011261254e578081fd5b610ece838335602085016124b7565b60006020828403121561256e578081fd5b610ece82612527565b60008060408385031215612589578081fd5b61259283612527565b91506125a060208401612527565b90509250929050565b6000806000606084860312156125bd578081fd5b6125c684612527565b92506125d460208501612527565b9150604084013590509250925092565b600080600080608085870312156125f9578081fd5b61260285612527565b935061261060208601612527565b925060408501359150606085013567ffffffffffffffff811115612632578182fd5b8501601f81018713612642578182fd5b612651878235602084016124b7565b91505092959194509250565b6000806040838503121561266f578182fd5b61267883612527565b91506020830135612688816133c4565b809150509250929050565b600080604083850312156126a5578182fd5b6126ae83612527565b946020939093013593505050565b6000602082840312156126cd578081fd5b8151610ece816133c4565b6000602082840312156126e9578081fd5b5035919050565b60008060408385031215612702578182fd5b823591506125a060208401612527565b60008060408385031215612724578182fd5b50508035926020909101359150565b600060208284031215612744578081fd5b8135610ece816133d2565b600060208284031215612760578081fd5b8151610ece816133d2565b600080600080600080600060e0888a031215612785578283fd5b873567ffffffffffffffff8082111561279c578485fd5b6127a88b838c0161253e565b985060208a01359150808211156127bd578485fd5b6127c98b838c0161253e565b975060408a01359150808211156127de578485fd5b506127eb8a828b0161253e565b955050606088013593506080880135925061280860a08901612527565b915060c0880135905092959891949750929550565b60008151808452612835816020860160208601613331565b601f01601f19169290920160200192915050565b6000825161285b818460208701613331565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906128af9083018461281d565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b600060208252610ece602083018461281d565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252602b908201527f4552433732315061757361626c653a20746f6b656e207472616e73666572207760408201526a1a1a5b19481c185d5cd95960aa1b606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60408201526e0818591b5a5b881d1bc819dc985b9d608a1b606082015260800190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252600a908201526961646d696e206f6e6c7960b01b604082015260600190565b6020808252603e908201527f4552433732315072657365744d696e7465725061757365724175746f49643a2060408201527f6d75737420686176652070617573657220726f6c6520746f2070617573650000606082015260800190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252603a908201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260408201527f6563697069656e74206d61792068617665207265766572746564000000000000606082015260800190565b6020808252601d908201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526030908201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60408201526f2061646d696e20746f207265766f6b6560801b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526010908201526f0dccacac840e8de40e6cadcc8408aa8960831b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526010908201526f18db185a5b481d1a5b5948195b99195960821b604082015260600190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b60208082526011908201527018db185a5b481b9bdd081cdd185c9d1959607a1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252603d908201527f4552433732315072657365744d696e7465725061757365724175746f49643a2060408201527f6d7573742068617665206d696e74657220726f6c6520746f206d696e74000000606082015260800190565b60208082526030908201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760408201526f1b995c881b9bdc88185c1c1c9bdd995960821b606082015260800190565b602080825260409082018190527f4552433732315072657365744d696e7465725061757365724175746f49643a20908201527f6d75737420686176652070617573657220726f6c6520746f20756e7061757365606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560408201526e103937b632b9903337b91039b2b63360891b606082015260800190565b6000821982111561331557613315613398565b500190565b60008282101561332c5761332c613398565b500390565b60005b8381101561334c578181015183820152602001613334565b8381111561101b5750506000910152565b60028104600182168061337157607f821691505b6020821081141561339257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114610b0757600080fd5b6001600160e01b031981168114610b0757600080fdfe65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862aa264697066735822122044ebd5cd6d9d51685bbb0e4130a35ca60bf64bf526867c14850b5f9b206d81d264736f6c63430008000033
Deployed Bytecode Sourcemap
82286:7866:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86816:237;;;;;;;;;;-1:-1:-1;86816:237:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23622:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25111:221::-;;;;;;;;;;-1:-1:-1;25111:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24619:426::-;;;;;;;;;;-1:-1:-1;24619:426:0;;;;;:::i;:::-;;:::i;36471:113::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;89677:472::-;;;;;;;;;;-1:-1:-1;89677:472:0;;;;;:::i;:::-;;:::i;87348:30::-;;;;;;;;;;;;;:::i;26001:305::-;;;;;;;;;;-1:-1:-1;26001:305:0;;;;;:::i;:::-;;:::i;50996:123::-;;;;;;;;;;-1:-1:-1;50996:123:0;;;;;:::i;:::-;;:::i;66497:165::-;;;;;;;;;;-1:-1:-1;66497:165:0;;;;;:::i;:::-;;:::i;36128:267::-;;;;;;;;;;-1:-1:-1;36128:267:0;;;;;:::i;:::-;;:::i;67020:174::-;;;;;;;;;;-1:-1:-1;67020:174:0;;;;;:::i;:::-;;:::i;87318:23::-;;;;;;;;;;;;;:::i;86313:185::-;;;;;;;;;;;;;:::i;26377:151::-;;;;;;;;;;-1:-1:-1;26377:151:0;;;;;:::i;:::-;;:::i;42668:245::-;;;;;;;;;;-1:-1:-1;42668:245:0;;;;;:::i;:::-;;:::i;36661:244::-;;;;;;;;;;-1:-1:-1;36661:244:0;;;;;:::i;:::-;;:::i;44157:86::-;;;;;;;;;;;;;:::i;23316:239::-;;;;;;;;;;-1:-1:-1;23316:239:0;;;;;:::i;:::-;;:::i;88128:481::-;;;:::i;87385:24::-;;;;;;;;;;;;;:::i;85293:407::-;;;;;;;;;;-1:-1:-1;85293:407:0;;;;;:::i;:::-;;:::i;87491:151::-;;;;;;;;;;-1:-1:-1;87491:151:0;;;;;:::i;:::-;;:::i;23046:208::-;;;;;;;;;;-1:-1:-1;23046:208:0;;;;;:::i;:::-;;:::i;82690:428::-;;;;;;;;;;-1:-1:-1;82690:428:0;;;;;:::i;:::-;;:::i;85915:179::-;;;;;;;;;;;;;:::i;87904:216::-;;;;;;;;;;-1:-1:-1;87904:216:0;;;;;:::i;:::-;;:::i;87650:172::-;;;;;;;;;;-1:-1:-1;87650:172:0;;;;;:::i;:::-;;:::i;65952:145::-;;;;;;;;;;-1:-1:-1;65952:145:0;;;;;:::i;:::-;;:::i;50668:139::-;;;;;;;;;;-1:-1:-1;50668:139:0;;;;;:::i;:::-;;:::i;23791:104::-;;;;;;;;;;;;;:::i;49113:49::-;;;;;;;;;;;;;:::i;25404:295::-;;;;;;;;;;-1:-1:-1;25404:295:0;;;;;:::i;:::-;;:::i;26599:285::-;;;;;;;;;;-1:-1:-1;26599:285:0;;;;;:::i;:::-;;:::i;88837:431::-;;;;;;;;;;-1:-1:-1;88837:431:0;;;;;:::i;:::-;;:::i;66271:134::-;;;;;;;;;;-1:-1:-1;66271:134:0;;;;;:::i;:::-;;:::i;83327:62::-;;;;;;;;;;;;;:::i;66755:170::-;;;;;;;;;;-1:-1:-1;66755:170:0;;;;;:::i;:::-;;:::i;87252:27::-;;;;;;;;;;;;;:::i;83396:62::-;;;;;;;;;;;;;:::i;25770:164::-;;;;;;;;;;-1:-1:-1;25770:164:0;;;;;:::i;:::-;;:::i;87286:25::-;;;;;;;;;;;;;:::i;86816:237::-;86985:4;87009:36;87033:11;87009:23;:36::i;:::-;87002:43;;86816:237;;;;:::o;23622:100::-;23676:13;23709:5;23702:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23622:100;:::o;25111:221::-;25187:7;25215:16;25223:7;25215;:16::i;:::-;25207:73;;;;-1:-1:-1;;;25207:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;25300:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25300:24:0;;25111:221::o;24619:426::-;24700:13;24716:34;24742:7;24716:25;:34::i;:::-;24700:50;;24775:5;-1:-1:-1;;;;;24769:11:0;:2;-1:-1:-1;;;;;24769:11:0;;;24761:57;;;;-1:-1:-1;;;24761:57:0;;;;;;;:::i;:::-;24855:5;-1:-1:-1;;;;;24839:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;24839:21:0;;:80;;;;24864:55;24899:5;24906:12;:10;:12::i;24864:55::-;24831:172;;;;-1:-1:-1;;;24831:172:0;;;;;;;:::i;:::-;25016:21;25025:2;25029:7;25016:8;:21::i;:::-;24619:426;;;:::o;36471:113::-;36559:10;:17;36471:113;:::o;89677:472::-;89819:39;49158:4;89847:10;89819:7;:39::i;:::-;89811:62;;;;-1:-1:-1;;;89811:62:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;89888:27:0;;89626:42;89888:27;89884:194;;89932:61;-1:-1:-1;;;;;89932:38:0;;89971:12;89985:7;89932:38;:61::i;:::-;89884:194;;;90026:40;-1:-1:-1;;;;;90026:31:0;;90058:7;90026:31;:40::i;:::-;90119:12;-1:-1:-1;;;;;90093:48:0;90111:6;-1:-1:-1;;;;;90093:48:0;;90133:7;90093:48;;;;;;:::i;:::-;;;;;;;;89677:472;;;:::o;87348:30::-;;;-1:-1:-1;;;;;87348:30:0;;:::o;26001:305::-;26162:41;26181:12;:10;:12::i;:::-;26195:7;26162:18;:41::i;:::-;26154:103;;;;-1:-1:-1;;;26154:103:0;;;;;;;:::i;:::-;26270:28;26280:4;26286:2;26290:7;26270:9;:28::i;50996:123::-;51062:7;51089:12;;;:6;:12;;;;;:22;;;;50996:123::o;66497:165::-;66582:30;66598:4;66604:7;66582:15;:30::i;:::-;66623:18;;;;:12;:18;;;;;:31;;66646:7;66623:22;:31::i;36128:267::-;36225:7;36261:34;36289:5;36261:27;:34::i;:::-;36253:5;:42;36245:98;;;;-1:-1:-1;;;36245:98:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;36361:19:0;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;36128:267;;;;;:::o;67020:174::-;67108:33;67127:4;67133:7;67108:18;:33::i;:::-;67152:18;;;;:12;:18;;;;;:34;;67178:7;67152:25;:34::i;87318:23::-;;;;:::o;86313:185::-;86366:34;-1:-1:-1;;;;;;;;;;;86387:12:0;:10;:12::i;86366:34::-;86358:111;;;;-1:-1:-1;;;86358:111:0;;;;;;;:::i;:::-;86480:10;:8;:10::i;:::-;86313:185::o;26377:151::-;26481:39;26498:4;26504:2;26508:7;26481:39;;;;;;;;;;;;:16;:39::i;42668:245::-;42786:41;42805:12;:10;:12::i;42786:41::-;42778:102;;;;-1:-1:-1;;;42778:102:0;;;;;;;:::i;:::-;42891:14;42897:7;42891:5;:14::i;:::-;42668:245;:::o;36661:244::-;36736:7;36772:41;:39;:41::i;:::-;36764:5;:49;36756:106;;;;-1:-1:-1;;;36756:106:0;;;;;;;:::i;:::-;36880:10;36891:5;36880:17;;;;;;-1:-1:-1;;;36880:17:0;;;;;;;;;;;;;;;;;36873:24;;36661:244;;;:::o;44157:86::-;44228:7;;;;44157:86;:::o;23316:239::-;23388:7;23424:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23424:16:0;23459:19;23451:73;;;;-1:-1:-1;;;23451:73:0;;;;;;;:::i;88128:481::-;88201:10;;88182:15;:29;;88174:59;;;;-1:-1:-1;;;88174:59:0;;;;;;;:::i;:::-;88270:8;;88252:15;:26;88244:55;;;;-1:-1:-1;;;88244:55:0;;;;;;;:::i;:::-;88331:9;;88318;:22;88310:51;;;;-1:-1:-1;;;88310:51:0;;;;;;;:::i;:::-;88374:44;88380:10;88392:25;:15;:23;:25::i;:::-;88374:5;:44::i;:::-;88433:9;;:13;88429:91;;88498:9;;88471:15;;88463:45;;-1:-1:-1;;;;;88471:15:0;;;;88463:34;:45::i;:::-;88532:27;:15;:25;:27::i;:::-;88585:12;;:16;;88600:1;88585:16;:::i;:::-;88570:12;:31;88128:481::o;87385:24::-;;;;:::o;85293:407::-;85353:34;83365:24;85374:12;:10;:12::i;85353:34::-;85345:108;;;;-1:-1:-1;;;85345:108:0;;;;;;;:::i;:::-;85618:36;85624:2;85628:25;:15;:23;:25::i;85618:36::-;85665:27;:15;:25;:27::i;87491:151::-;87553:39;49158:4;87581:10;87553:7;:39::i;:::-;87545:62;;;;-1:-1:-1;;;87545:62:0;;;;;;;:::i;:::-;87618:9;:16;87491:151::o;23046:208::-;23118:7;-1:-1:-1;;;;;23146:19:0;;23138:74;;;;-1:-1:-1;;;23138:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;23230:16:0;;;;;:9;:16;;;;;;;23046:208::o;82690:428::-;16477:13;;;;;;;;:30;;-1:-1:-1;16495:12:0;;;;16494:13;16477:30;16469:89;;;;-1:-1:-1;;;16469:89:0;;;;;;;:::i;:::-;16571:19;16594:13;;;;;;16593:14;16618:101;;;;16653:13;:20;;-1:-1:-1;;;;16653:20:0;;;;;16688:19;16669:4;16688:19;;;16618:101;82899:43:::1;82915:4;82921:6;82929:12;82899:15;:43::i;:::-;82970:1;82955:12;:16:::0;82982:10:::1;:24:::0;;;83017:8:::1;:20:::0;;;83048:15:::1;:29:::0;;-1:-1:-1;;;;;;83048:29:0::1;-1:-1:-1::0;;;;;83048:29:0;::::1;;::::0;;83088:9:::1;:22:::0;;;16745:68;;;;16796:5;16780:21;;-1:-1:-1;;16780:21:0;;;16745:68;82690:428;;;;;;;;:::o;85915:179::-;85966:34;-1:-1:-1;;;;;;;;;;;85987:12:0;:10;:12::i;85966:34::-;85958:109;;;;-1:-1:-1;;;85958:109:0;;;;;;;:::i;:::-;86078:8;:6;:8::i;87904:216::-;87994:39;49158:4;88022:10;87994:7;:39::i;:::-;87986:62;;;;-1:-1:-1;;;87986:62:0;;;;;;;:::i;:::-;88059:10;:23;;;;88093:8;:19;87904:216::o;87650:172::-;87720:39;49158:4;87748:10;87720:7;:39::i;:::-;87712:62;;;;-1:-1:-1;;;87712:62:0;;;;;;;:::i;:::-;87785:15;:29;;-1:-1:-1;;;;;;87785:29:0;-1:-1:-1;;;;;87785:29:0;;;;;;;;;;87650:172::o;65952:145::-;66034:7;66061:18;;;:12;:18;;;;;:28;;66083:5;66061:21;:28::i;:::-;66054:35;65952:145;-1:-1:-1;;;65952:145:0:o;50668:139::-;50746:4;50770:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;50770:29:0;;;;;;;;;;;;;;;50668:139::o;23791:104::-;23847:13;23880:7;23873:14;;;;;:::i;49113:49::-;49158:4;49113:49;:::o;25404:295::-;25519:12;:10;:12::i;:::-;-1:-1:-1;;;;;25507:24:0;:8;-1:-1:-1;;;;;25507:24:0;;;25499:62;;;;-1:-1:-1;;;25499:62:0;;;;;;;:::i;:::-;25619:8;25574:18;:32;25593:12;:10;:12::i;:::-;-1:-1:-1;;;;;25574:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;25574:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;25574:53:0;;;;;;;;;;;25658:12;:10;:12::i;:::-;-1:-1:-1;;;;;25643:48:0;;25682:8;25643:48;;;;;;:::i;:::-;;;;;;;;25404:295;;:::o;26599:285::-;26731:41;26750:12;:10;:12::i;:::-;26764:7;26731:18;:41::i;:::-;26723:103;;;;-1:-1:-1;;;26723:103:0;;;;;;;:::i;:::-;26837:39;26851:4;26857:2;26861:7;26870:5;26837:13;:39::i;:::-;26599:285;;;;:::o;88837:431::-;88910:13;88944:16;88952:7;88944;:16::i;:::-;88936:76;;;;-1:-1:-1;;;88936:76:0;;;;;;;:::i;:::-;89025:21;89049:10;:8;:10::i;:::-;89025:34;;89101:1;89083:7;89077:21;:25;:183;;;;;;;;;;;;;;89070:190;88837:431;-1:-1:-1;;;88837:431:0:o;66271:134::-;66343:7;66370:18;;;:12;:18;;;;;:27;;:25;:27::i;83327:62::-;83365:24;83327:62;:::o;66755:170::-;66841:31;66858:4;66864:7;66841:16;:31::i;87252:27::-;;;;:::o;83396:62::-;-1:-1:-1;;;;;;;;;;;83396:62:0;:::o;25770:164::-;-1:-1:-1;;;;;25891:25:0;;;25867:4;25891:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25770:164::o;87286:25::-;;;;:::o;35774:270::-;35898:4;-1:-1:-1;;;;;;35922:61:0;;-1:-1:-1;;;35922:61:0;;:114;;;36000:36;36024:11;36000:23;:36::i;28351:127::-;28416:4;28440:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28440:16:0;:30;;;28351:127::o;17567:98::-;17647:10;17567:98;:::o;32279:185::-;32354:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32354:29:0;-1:-1:-1;;;;;32354:29:0;;;;;;;;:24;;32408:34;32354:24;32408:25;:34::i;:::-;-1:-1:-1;;;;;32399:57:0;;;;;;;;;;;32279:185;;:::o;69288:188::-;69382:86;69402:5;69432:23;;;69457:2;69461:5;69409:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;69409:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;69409:58:0;-1:-1:-1;;;;;;69409:58:0;;;;;;;;;;69382:19;:86::i;10193:397::-;10308:6;10283:21;:31;;10275:73;;;;-1:-1:-1;;;10275:73:0;;;;;;;:::i;:::-;10440:12;10458:9;-1:-1:-1;;;;;10458:14:0;10481:6;10458:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10439:54;;;10512:7;10504:78;;;;-1:-1:-1;;;10504:78:0;;;;;;;:::i;28645:377::-;28738:4;28763:16;28771:7;28763;:16::i;:::-;28755:73;;;;-1:-1:-1;;;28755:73:0;;;;;;;:::i;:::-;28839:13;28855:34;28881:7;28855:25;:34::i;:::-;28839:50;;28919:5;-1:-1:-1;;;;;28908:16:0;:7;-1:-1:-1;;;;;28908:16:0;;:51;;;;28952:7;-1:-1:-1;;;;;28928:31:0;:20;28940:7;28928:11;:20::i;:::-;-1:-1:-1;;;;;28928:31:0;;28908:51;:105;;;;28963:50;28998:5;29005:7;28963:34;:50::i;:::-;28900:114;28645:377;-1:-1:-1;;;;28645:377:0:o;31606:555::-;31742:4;-1:-1:-1;;;;;31704:42:0;:34;31730:7;31704:25;:34::i;:::-;-1:-1:-1;;;;;31704:42:0;;31696:96;;;;-1:-1:-1;;;31696:96:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31811:16:0;;31803:65;;;;-1:-1:-1;;;31803:65:0;;;;;;;:::i;:::-;31881:39;31902:4;31908:2;31912:7;31881:20;:39::i;:::-;31985:29;32002:1;32006:7;31985:8;:29::i;:::-;-1:-1:-1;;;;;32027:15:0;;;;;;:9;:15;;;;;:20;;32046:1;;32027:15;:20;;32046:1;;32027:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32058:13:0;;;;;;:9;:13;;;;;:18;;32075:1;;32058:13;:18;;32075:1;;32058:18;:::i;:::-;;;;-1:-1:-1;;32087:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32087:21:0;-1:-1:-1;;;;;32087:21:0;;;;;;;;;32126:27;;32087:16;;32126:27;;;;;;;31606:555;;;:::o;51381:232::-;51474:41;51482:18;51495:4;51482:12;:18::i;:::-;51502:12;:10;:12::i;51474:41::-;51466:101;;;;-1:-1:-1;;;51466:101:0;;;;;;;:::i;:::-;51580:25;51591:4;51597:7;51580:10;:25::i;:::-;51381:232;;:::o;60926:152::-;60996:4;61020:50;61025:3;-1:-1:-1;;;;;61045:23:0;;61020:4;:50::i;52600:218::-;52707:12;:10;:12::i;:::-;-1:-1:-1;;;;;52696:23:0;:7;-1:-1:-1;;;;;52696:23:0;;52688:83;;;;-1:-1:-1;;;52688:83:0;;;;;;;:::i;:::-;52784:26;52796:4;52802:7;52784:11;:26::i;61254:158::-;61327:4;61351:53;61359:3;-1:-1:-1;;;;;61379:23:0;;61351:7;:53::i;45216:120::-;44760:8;:6;:8::i;:::-;44752:41;;;;-1:-1:-1;;;44752:41:0;;;;;;;:::i;:::-;45275:7:::1;:15:::0;;-1:-1:-1;;45275:15:0::1;::::0;;45306:22:::1;45315:12;:10;:12::i;:::-;45306:22;;;;;;:::i;:::-;;;;;;;;45216:120::o:0;30898:371::-;30958:13;30974:34;31000:7;30974:25;:34::i;:::-;30958:50;;31021:48;31042:5;31057:1;31061:7;31021:20;:48::i;:::-;31110:29;31127:1;31131:7;31110:8;:29::i;:::-;-1:-1:-1;;;;;31152:16:0;;;;;;:9;:16;;;;;:21;;31172:1;;31152:16;:21;;31172:1;;31152:21;:::i;:::-;;;;-1:-1:-1;;31191:16:0;;;;:7;:16;;;;;;31184:23;;-1:-1:-1;;;;;;31184:23:0;;;31225:36;31199:7;;31191:16;-1:-1:-1;;;;;31225:36:0;;;;;31191:16;;31225:36;30898:371;;:::o;68239:114::-;68331:14;;68239:114::o;30287:382::-;-1:-1:-1;;;;;30367:16:0;;30359:61;;;;-1:-1:-1;;;30359:61:0;;;;;;;:::i;:::-;30440:16;30448:7;30440;:16::i;:::-;30439:17;30431:58;;;;-1:-1:-1;;;30431:58:0;;;;;;;:::i;:::-;30502:45;30531:1;30535:2;30539:7;30502:20;:45::i;:::-;-1:-1:-1;;;;;30560:13:0;;;;;;:9;:13;;;;;:18;;30577:1;;30560:13;:18;;30577:1;;30560:18;:::i;:::-;;;;-1:-1:-1;;30589:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30589:21:0;-1:-1:-1;;;;;30589:21:0;;;;;;;;30628:33;;30589:16;;;30628:33;;30589:16;;30628:33;30287:382;;:::o;68361:127::-;68450:19;;68468:1;68450:19;;;68361:127::o;83826:599::-;16477:13;;;;;;;;:30;;-1:-1:-1;16495:12:0;;;;16494:13;16477:30;16469:89;;;;-1:-1:-1;;;16469:89:0;;;;;;;:::i;:::-;16571:19;16594:13;;;;;;16593:14;16618:101;;;;16653:13;:20;;-1:-1:-1;;;;16653:20:0;;;;;16688:19;16669:4;16688:19;;;16618:101;83953:26:::1;:24;:26::i;:::-;83990:25;:23;:25::i;:::-;84026:32;:30;:32::i;:::-;84069:42;:40;:42::i;:::-;84122:37;84146:4;84152:6;84122:23;:37::i;:::-;84170:35;:33;:35::i;:::-;84216:33;:31;:33::i;:::-;84260:27;:25;:27::i;:::-;84298:33;:31;:33::i;:::-;84342:75;84390:4;84396:6;84404:12;84342:47;:75::i;:::-;16749:14:::0;16745:68;;;16796:5;16780:21;;-1:-1:-1;;16780:21:0;;;83826:599;;;;:::o;44957:118::-;44483:8;:6;:8::i;:::-;44482:9;44474:38;;;;-1:-1:-1;;;44474:38:0;;;;;;;:::i;:::-;45017:7:::1;:14:::0;;-1:-1:-1;;45017:14:0::1;45027:4;45017:14;::::0;;45047:20:::1;45054:12;:10;:12::i;62212:158::-:0;62286:7;62337:22;62341:3;62353:5;62337:3;:22::i;27766:272::-;27880:28;27890:4;27896:2;27900:7;27880:9;:28::i;:::-;27927:48;27950:4;27956:2;27960:7;27969:5;27927:22;:48::i;:::-;27919:111;;;;-1:-1:-1;;;27919:111:0;;;;;;;:::i;84791:114::-;84851:13;84884;84877:20;;;;;:::i;61751:117::-;61814:7;61841:19;61849:3;61841:7;:19::i;51858:235::-;51952:41;51960:18;51973:4;51960:12;:18::i;51952:41::-;51944:102;;;;-1:-1:-1;;;51944:102:0;;;;;;;:::i;22646:336::-;22770:4;-1:-1:-1;;;;;;22794:51:0;;-1:-1:-1;;;22794:51:0;;:127;;-1:-1:-1;;;;;;;22862:59:0;;-1:-1:-1;;;22862:59:0;22794:127;:180;;;;22938:36;22962:11;22938:23;:36::i;71777:772::-;72212:23;72238:69;72266:4;72238:69;;;;;;;;;;;;;;;;;72246:5;-1:-1:-1;;;;;72238:27:0;;;:69;;;;;:::i;:::-;72322:17;;72212:95;;-1:-1:-1;72322:21:0;72318:224;;72464:10;72453:30;;;;;;;;;;;;:::i;:::-;72445:85;;;;-1:-1:-1;;;72445:85:0;;;;;;;:::i;86506:238::-;86691:45;86718:4;86724:2;86728:7;86691:26;:45::i;53848:229::-;53923:22;53931:4;53937:7;53923;:22::i;:::-;53918:152;;53962:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;53962:29:0;;;;;;;;;:36;;-1:-1:-1;;53962:36:0;53994:4;53962:36;;;54045:12;:10;:12::i;:::-;-1:-1:-1;;;;;54018:40:0;54036:7;-1:-1:-1;;;;;54018:40:0;54030:4;54018:40;;;;;;;;;;53848:229;;:::o;55990:414::-;56053:4;56075:21;56085:3;56090:5;56075:9;:21::i;:::-;56070:327;;-1:-1:-1;56113:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;56296:18;;56274:19;;;:12;;;:19;;;;;;:40;;;;56329:11;;56070:327;-1:-1:-1;56380:5:0;56373:12;;54085:230;54160:22;54168:4;54174:7;54160;:22::i;:::-;54156:152;;;54231:5;54199:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;54199:29:0;;;;;;;;;:37;;-1:-1:-1;;54199:37:0;;;54283:12;:10;:12::i;:::-;-1:-1:-1;;;;;54256:40:0;54274:7;-1:-1:-1;;;;;54256:40:0;54268:4;54256:40;;;;;;;;;;54085:230;;:::o;56580:1544::-;56646:4;56785:19;;;:12;;;:19;;;;;;56821:15;;56817:1300;;57183:21;57207:14;57220:1;57207:10;:14;:::i;:::-;57256:18;;57183:38;;-1:-1:-1;57236:17:0;;57256:22;;57277:1;;57256:22;:::i;:::-;57236:42;;57523:17;57543:3;:11;;57555:9;57543:22;;;;;;-1:-1:-1;;;57543:22:0;;;;;;;;;;;;;;;;;57523:42;;57689:9;57660:3;:11;;57672:13;57660:26;;;;;;-1:-1:-1;;;57660:26:0;;;;;;;;;;;;;;;;;;:38;57792:17;:13;57808:1;57792:17;:::i;:::-;57766:23;;;;:12;;;:23;;;;;:43;57918:17;;57766:3;;57918:17;;;-1:-1:-1;;;57918:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;58013:3;:12;;:19;58026:5;58013:19;;;;;;;;;;;58006:26;;;58056:4;58049:11;;;;;;;;56817:1300;58100:5;58093:12;;;;;17496:65;16477:13;;;;;;;;:30;;-1:-1:-1;16495:12:0;;;;16494:13;16477:30;16469:89;;;;-1:-1:-1;;;16469:89:0;;;;;;;:::i;:::-;16571:19;16594:13;;;;;;16593:14;16618:101;;;;16653:13;:20;;-1:-1:-1;;;;16653:20:0;;;;;16688:19;16669:4;16688:19;;;16618:101;16749:14;16745:68;;;16796:5;16780:21;;-1:-1:-1;;16780:21:0;;;17496:65;:::o;22416:158::-;16477:13;;;;;;;;:30;;-1:-1:-1;16495:12:0;;;;16494:13;16477:30;16469:89;;;;-1:-1:-1;;;16469:89:0;;;;;;;:::i;:::-;16571:19;16594:13;;;;;;16593:14;16618:101;;;;16653:13;:20;;-1:-1:-1;;;;16653:20:0;;;;;16688:19;16669:4;16688:19;;;16618:101;22525:13;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;22549:17:0;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;:::-;;16749:14:::0;16745:68;;;16796:5;16780:21;;-1:-1:-1;;16780:21:0;;;22416:158;;;:::o;43965:92::-;16477:13;;;;;;;;:30;;-1:-1:-1;16495:12:0;;;;16494:13;16477:30;16469:89;;;;-1:-1:-1;;;16469:89:0;;;;;;;:::i;:::-;16571:19;16594:13;;;;;;16593:14;16618:101;;;;16653:13;:20;;-1:-1:-1;;;;16653:20:0;;;;;16688:19;16669:4;16688:19;;;16618:101;44034:7:::1;:15:::0;;-1:-1:-1;;44034:15:0::1;::::0;;16745:68;;;;16796:5;16780:21;;-1:-1:-1;;16780:21:0;;;43965:92;:::o;84433:350::-;16477:13;;;;;;;;:30;;-1:-1:-1;16495:12:0;;;;16494:13;16477:30;16469:89;;;;-1:-1:-1;;;16469:89:0;;;;;;;:::i;:::-;16571:19;16594:13;;;;;;16593:14;16618:101;;;;16653:13;:20;;-1:-1:-1;;;;16653:20:0;;;;;16688:19;16669:4;16688:19;;;16618:101;84592:28;;::::1;::::0;:13:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;84633:44:0::1;49158:4;84664:12;:10;:12::i;:::-;84633:10;:44::i;:::-;84690:37;83365:24;84714:12;:10;:12::i;84690:37::-;84738;-1:-1:-1::0;;;;;;;;;;;84762:12:0::1;:10;:12::i;58878:204::-:0;58973:18;;58945:7;;58973:26;-1:-1:-1;58965:73:0;;;;-1:-1:-1;;;58965:73:0;;;;;;;:::i;:::-;59056:3;:11;;59068:5;59056:18;;;;;;-1:-1:-1;;;59056:18:0;;;;;;;;;;;;;;;;;59049:25;;58878:204;;;;:::o;33029:865::-;33150:4;33176:15;:2;-1:-1:-1;;;;;33176:13:0;;:15::i;:::-;33172:715;;;33239:2;-1:-1:-1;;;;;33212:47:0;;33260:12;:10;:12::i;:::-;33274:4;33280:7;33289:5;33212:83;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33212:83:0;;;;;;;;-1:-1:-1;;33212:83:0;;;;;;;;;;;;:::i;:::-;;;33208:624;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33480:13:0;;33476:341;;33523:60;;-1:-1:-1;;;33523:60:0;;;;;;;:::i;33476:341::-;33767:6;33761:13;33752:6;33748:2;33744:15;33737:38;33208:624;-1:-1:-1;;;;;;33346:66:0;-1:-1:-1;;;33346:66:0;;-1:-1:-1;33339:73:0;;33172:715;-1:-1:-1;33871:4:0;33029:865;;;;;;:::o;65115:238::-;65200:4;-1:-1:-1;;;;;;65224:68:0;;-1:-1:-1;;;65224:68:0;;:121;;;65309:36;65333:11;65309:23;:36::i;11754:195::-;11857:12;11889:52;11911:6;11919:4;11925:1;11928:12;11889:21;:52::i;46213:241::-;46323:45;46350:4;46356:2;46360:7;46323:26;:45::i;:::-;46390:8;:6;:8::i;:::-;46389:9;46381:65;;;;-1:-1:-1;;;46381:65:0;;;;;;;:::i;58210:129::-;58283:4;58307:19;;;:12;;;;;:19;;;;;;:24;;;58210:129::o;67287:169::-;67375:31;67392:4;67398:7;67375:16;:31::i;8836:422::-;9203:20;9242:8;;;8836:422::o;50348:228::-;50433:4;-1:-1:-1;;;;;;50457:58:0;;-1:-1:-1;;;50457:58:0;;:111;;;50532:36;50556:11;50532:23;:36::i;12806:530::-;12933:12;12991:5;12966:21;:30;;12958:81;;;;-1:-1:-1;;;12958:81:0;;;;;;;:::i;:::-;13058:18;13069:6;13058:10;:18::i;:::-;13050:60;;;;-1:-1:-1;;;13050:60:0;;;;;;;:::i;:::-;13184:12;13198:23;13225:6;-1:-1:-1;;;;;13225:11:0;13245:5;13253:4;13225:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13183:75;;;;13276:52;13294:7;13303:10;13315:12;13276:17;:52::i;:::-;13269:59;12806:530;-1:-1:-1;;;;;;;12806:530:0:o;37518:555::-;37628:45;37655:4;37661:2;37665:7;37628:26;:45::i;:::-;-1:-1:-1;;;;;37690:18:0;;37686:187;;37725:40;37757:7;37725:31;:40::i;:::-;37686:187;;;37795:2;-1:-1:-1;;;;;37787:10:0;:4;-1:-1:-1;;;;;37787:10:0;;37783:90;;37814:47;37847:4;37853:7;37814:32;:47::i;:::-;-1:-1:-1;;;;;37887:16:0;;37883:183;;37920:45;37957:7;37920:36;:45::i;:::-;37883:183;;;37993:4;-1:-1:-1;;;;;37987:10:0;:2;-1:-1:-1;;;;;37987:10:0;;37983:83;;38014:40;38042:2;38046:7;38014:27;:40::i;20844:168::-;-1:-1:-1;;;;;;20953:51:0;;-1:-1:-1;;;20953:51:0;20844:168;;;:::o;14342:742::-;14457:12;14486:7;14482:595;;;-1:-1:-1;14517:10:0;14510:17;;14482:595;14631:17;;:21;14627:439;;14894:10;14888:17;14955:15;14942:10;14938:2;14934:19;14927:44;14842:148;15037:12;15030:20;;-1:-1:-1;;;15030:20:0;;;;;;;;:::i;38807:164::-;38911:10;:17;;38884:24;;;;:15;:24;;;;;:44;;;38939:24;;;;;;;;;;;;38807:164::o;39598:999::-;39864:22;39925:1;39889:33;39917:4;39889:27;:33::i;:::-;:37;;;;:::i;:::-;39937:18;39958:26;;;:17;:26;;;;;;39864:62;;-1:-1:-1;40091:28:0;;;40087:328;;-1:-1:-1;;;;;40158:18:0;;40136:19;40158:18;;;:12;:18;;;;;;;;:34;;;;;;;;;40209:30;;;;;;:44;;;40326:30;;:17;:30;;;;;:43;;;40087:328;-1:-1:-1;40511:26:0;;;;:17;:26;;;;;;;;40504:33;;;-1:-1:-1;;;;;40555:18:0;;;;;:12;:18;;;;;:34;;;;;;;40548:41;39598:999::o;40892:1079::-;41170:10;:17;41145:22;;41170:21;;41190:1;;41170:21;:::i;:::-;41202:18;41223:24;;;:15;:24;;;;;;41596:10;:26;;41145:46;;-1:-1:-1;41223:24:0;;41145:46;;41596:26;;;;-1:-1:-1;;;41596:26:0;;;;;;;;;;;;;;;;;41574:48;;41660:11;41635:10;41646;41635:22;;;;;;-1:-1:-1;;;41635:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;41740:28;;;:15;:28;;;;;;;:41;;;41912:24;;;;;41905:31;41947:10;:16;;;;;-1:-1:-1;;;41947:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;40892:1079;;;;:::o;38374:232::-;38459:14;38476:31;38504:2;38476:27;:31::i;:::-;-1:-1:-1;;;;;38518:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;38563:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;38374:232:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:607:1;;110:18;151:2;143:6;140:14;137:2;;;157:18;;:::i;:::-;206:2;200:9;279:2;256:17;;-1:-1:-1;;252:31:1;240:44;;286:4;236:55;306:18;;;326:22;;;303:46;300:2;;;352:18;;:::i;:::-;388:2;381:22;436;;;421:6;-1:-1:-1;421:6:1;473:16;;;470:25;-1:-1:-1;467:2:1;;;508:1;505;498:12;467:2;558:6;553:3;546:4;538:6;534:17;521:44;613:1;606:4;597:6;589;585:19;581:30;574:41;;;90:531;;;;;:::o;626:175::-;696:20;;-1:-1:-1;;;;;745:31:1;;735:42;;725:2;;791:1;788;781:12;806:233;;904:3;897:4;889:6;885:17;881:27;871:2;;926:5;919;912:20;871:2;952:81;1029:3;1020:6;1007:20;1000:4;992:6;988:17;952:81;:::i;1044:198::-;;1156:2;1144:9;1135:7;1131:23;1127:32;1124:2;;;1177:6;1169;1162:22;1124:2;1205:31;1226:9;1205:31;:::i;1247:274::-;;;1376:2;1364:9;1355:7;1351:23;1347:32;1344:2;;;1397:6;1389;1382:22;1344:2;1425:31;1446:9;1425:31;:::i;:::-;1415:41;;1475:40;1511:2;1500:9;1496:18;1475:40;:::i;:::-;1465:50;;1334:187;;;;;:::o;1526:342::-;;;;1672:2;1660:9;1651:7;1647:23;1643:32;1640:2;;;1693:6;1685;1678:22;1640:2;1721:31;1742:9;1721:31;:::i;:::-;1711:41;;1771:40;1807:2;1796:9;1792:18;1771:40;:::i;:::-;1761:50;;1858:2;1847:9;1843:18;1830:32;1820:42;;1630:238;;;;;:::o;1873:702::-;;;;;2045:3;2033:9;2024:7;2020:23;2016:33;2013:2;;;2067:6;2059;2052:22;2013:2;2095:31;2116:9;2095:31;:::i;:::-;2085:41;;2145:40;2181:2;2170:9;2166:18;2145:40;:::i;:::-;2135:50;;2232:2;2221:9;2217:18;2204:32;2194:42;;2287:2;2276:9;2272:18;2259:32;2314:18;2306:6;2303:30;2300:2;;;2351:6;2343;2336:22;2300:2;2379:22;;2432:4;2424:13;;2420:27;-1:-1:-1;2410:2:1;;2466:6;2458;2451:22;2410:2;2494:75;2561:7;2556:2;2543:16;2538:2;2534;2530:11;2494:75;:::i;:::-;2484:85;;;2003:572;;;;;;;:::o;2580:329::-;;;2706:2;2694:9;2685:7;2681:23;2677:32;2674:2;;;2727:6;2719;2712:22;2674:2;2755:31;2776:9;2755:31;:::i;:::-;2745:41;;2836:2;2825:9;2821:18;2808:32;2849:30;2873:5;2849:30;:::i;:::-;2898:5;2888:15;;;2664:245;;;;;:::o;2914:266::-;;;3043:2;3031:9;3022:7;3018:23;3014:32;3011:2;;;3064:6;3056;3049:22;3011:2;3092:31;3113:9;3092:31;:::i;:::-;3082:41;3170:2;3155:18;;;;3142:32;;-1:-1:-1;;;3001:179:1:o;3185:257::-;;3305:2;3293:9;3284:7;3280:23;3276:32;3273:2;;;3326:6;3318;3311:22;3273:2;3363:9;3357:16;3382:30;3406:5;3382:30;:::i;3447:190::-;;3559:2;3547:9;3538:7;3534:23;3530:32;3527:2;;;3580:6;3572;3565:22;3527:2;-1:-1:-1;3608:23:1;;3517:120;-1:-1:-1;3517:120:1:o;3642:266::-;;;3771:2;3759:9;3750:7;3746:23;3742:32;3739:2;;;3792:6;3784;3777:22;3739:2;3833:9;3820:23;3810:33;;3862:40;3898:2;3887:9;3883:18;3862:40;:::i;3913:258::-;;;4042:2;4030:9;4021:7;4017:23;4013:32;4010:2;;;4063:6;4055;4048:22;4010:2;-1:-1:-1;;4091:23:1;;;4161:2;4146:18;;;4133:32;;-1:-1:-1;4000:171:1:o;4176:257::-;;4287:2;4275:9;4266:7;4262:23;4258:32;4255:2;;;4308:6;4300;4293:22;4255:2;4352:9;4339:23;4371:32;4397:5;4371:32;:::i;4438:261::-;;4560:2;4548:9;4539:7;4535:23;4531:32;4528:2;;;4581:6;4573;4566:22;4528:2;4618:9;4612:16;4637:32;4663:5;4637:32;:::i;4704:1073::-;;;;;;;;4948:3;4936:9;4927:7;4923:23;4919:33;4916:2;;;4970:6;4962;4955:22;4916:2;5015:9;5002:23;5044:18;5085:2;5077:6;5074:14;5071:2;;;5106:6;5098;5091:22;5071:2;5134:52;5178:7;5169:6;5158:9;5154:22;5134:52;:::i;:::-;5124:62;;5239:2;5228:9;5224:18;5211:32;5195:48;;5268:2;5258:8;5255:16;5252:2;;;5289:6;5281;5274:22;5252:2;5317:54;5363:7;5352:8;5341:9;5337:24;5317:54;:::i;:::-;5307:64;;5424:2;5413:9;5409:18;5396:32;5380:48;;5453:2;5443:8;5440:16;5437:2;;;5474:6;5466;5459:22;5437:2;;5502:54;5548:7;5537:8;5526:9;5522:24;5502:54;:::i;:::-;5492:64;;;5603:2;5592:9;5588:18;5575:32;5565:42;;5654:3;5643:9;5639:19;5626:33;5616:43;;5678:41;5714:3;5703:9;5699:19;5678:41;:::i;:::-;5668:51;;5766:3;5755:9;5751:19;5738:33;5728:43;;4906:871;;;;;;;;;;:::o;6240:259::-;;6321:5;6315:12;6348:6;6343:3;6336:19;6364:63;6420:6;6413:4;6408:3;6404:14;6397:4;6390:5;6386:16;6364:63;:::i;:::-;6481:2;6460:15;-1:-1:-1;;6456:29:1;6447:39;;;;6488:4;6443:50;;6291:208;-1:-1:-1;;6291:208:1:o;6504:274::-;;6671:6;6665:13;6687:53;6733:6;6728:3;6721:4;6713:6;6709:17;6687:53;:::i;:::-;6756:16;;;;;6641:137;-1:-1:-1;;6641:137:1:o;6783:205::-;6983:3;6974:14::o;6993:203::-;-1:-1:-1;;;;;7157:32:1;;;;7139:51;;7127:2;7112:18;;7094:102::o;7201:490::-;-1:-1:-1;;;;;7470:15:1;;;7452:34;;7522:15;;7517:2;7502:18;;7495:43;7569:2;7554:18;;7547:34;;;7617:3;7612:2;7597:18;;7590:31;;;7201:490;;7638:47;;7665:19;;7657:6;7638:47;:::i;:::-;7630:55;7404:287;-1:-1:-1;;;;;;7404:287:1:o;7696:274::-;-1:-1:-1;;;;;7888:32:1;;;;7870:51;;7952:2;7937:18;;7930:34;7858:2;7843:18;;7825:145::o;7975:187::-;8140:14;;8133:22;8115:41;;8103:2;8088:18;;8070:92::o;8167:177::-;8313:25;;;8301:2;8286:18;;8268:76::o;8349:221::-;;8498:2;8487:9;8480:21;8518:46;8560:2;8549:9;8545:18;8537:6;8518:46;:::i;8575:398::-;8777:2;8759:21;;;8816:2;8796:18;;;8789:30;8855:34;8850:2;8835:18;;8828:62;-1:-1:-1;;;8921:2:1;8906:18;;8899:32;8963:3;8948:19;;8749:224::o;8978:407::-;9180:2;9162:21;;;9219:2;9199:18;;;9192:30;9258:34;9253:2;9238:18;;9231:62;-1:-1:-1;;;9324:2:1;9309:18;;9302:41;9375:3;9360:19;;9152:233::o;9390:411::-;9592:2;9574:21;;;9631:2;9611:18;;;9604:30;9670:34;9665:2;9650:18;;9643:62;-1:-1:-1;;;9736:2:1;9721:18;;9714:45;9791:3;9776:19;;9564:237::o;9806:344::-;10008:2;9990:21;;;10047:2;10027:18;;;10020:30;-1:-1:-1;;;10081:2:1;10066:18;;10059:50;10141:2;10126:18;;9980:170::o;10155:407::-;10357:2;10339:21;;;10396:2;10376:18;;;10369:30;10435:34;10430:2;10415:18;;10408:62;-1:-1:-1;;;10501:2:1;10486:18;;10479:41;10552:3;10537:19;;10329:233::o;10567:414::-;10769:2;10751:21;;;10808:2;10788:18;;;10781:30;10847:34;10842:2;10827:18;;10820:62;-1:-1:-1;;;10913:2:1;10898:18;;10891:48;10971:3;10956:19;;10741:240::o;10986:352::-;11188:2;11170:21;;;11227:2;11207:18;;;11200:30;11266;11261:2;11246:18;;11239:58;11329:2;11314:18;;11160:178::o;11343:334::-;11545:2;11527:21;;;11584:2;11564:18;;;11557:30;-1:-1:-1;;;11618:2:1;11603:18;;11596:40;11668:2;11653:18;;11517:160::o;11682:426::-;11884:2;11866:21;;;11923:2;11903:18;;;11896:30;11962:34;11957:2;11942:18;;11935:62;12033:32;12028:2;12013:18;;12006:60;12098:3;12083:19;;11856:252::o;12113:400::-;12315:2;12297:21;;;12354:2;12334:18;;;12327:30;12393:34;12388:2;12373:18;;12366:62;-1:-1:-1;;;12459:2:1;12444:18;;12437:34;12503:3;12488:19;;12287:226::o;12518:349::-;12720:2;12702:21;;;12759:2;12739:18;;;12732:30;12798:27;12793:2;12778:18;;12771:55;12858:2;12843:18;;12692:175::o;12872:422::-;13074:2;13056:21;;;13113:2;13093:18;;;13086:30;13152:34;13147:2;13132:18;;13125:62;13223:28;13218:2;13203:18;;13196:56;13284:3;13269:19;;13046:248::o;13299:353::-;13501:2;13483:21;;;13540:2;13520:18;;;13513:30;13579:31;13574:2;13559:18;;13552:59;13643:2;13628:18;;13473:179::o;13657:402::-;13859:2;13841:21;;;13898:2;13878:18;;;13871:30;13937:34;13932:2;13917:18;;13910:62;-1:-1:-1;;;14003:2:1;13988:18;;13981:36;14049:3;14034:19;;13831:228::o;14064:408::-;14266:2;14248:21;;;14305:2;14285:18;;;14278:30;14344:34;14339:2;14324:18;;14317:62;-1:-1:-1;;;14410:2:1;14395:18;;14388:42;14462:3;14447:19;;14238:234::o;14477:412::-;14679:2;14661:21;;;14718:2;14698:18;;;14691:30;14757:34;14752:2;14737:18;;14730:62;-1:-1:-1;;;14823:2:1;14808:18;;14801:46;14879:3;14864:19;;14651:238::o;14894:340::-;15096:2;15078:21;;;15135:2;15115:18;;;15108:30;-1:-1:-1;;;15169:2:1;15154:18;;15147:46;15225:2;15210:18;;15068:166::o;15239:420::-;15441:2;15423:21;;;15480:2;15460:18;;;15453:30;15519:34;15514:2;15499:18;;15492:62;15590:26;15585:2;15570:18;;15563:54;15649:3;15634:19;;15413:246::o;15664:406::-;15866:2;15848:21;;;15905:2;15885:18;;;15878:30;15944:34;15939:2;15924:18;;15917:62;-1:-1:-1;;;16010:2:1;15995:18;;15988:40;16060:3;16045:19;;15838:232::o;16075:405::-;16277:2;16259:21;;;16316:2;16296:18;;;16289:30;16355:34;16350:2;16335:18;;16328:62;-1:-1:-1;;;16421:2:1;16406:18;;16399:39;16470:3;16455:19;;16249:231::o;16485:410::-;16687:2;16669:21;;;16726:2;16706:18;;;16699:30;16765:34;16760:2;16745:18;;16738:62;-1:-1:-1;;;16831:2:1;16816:18;;16809:44;16885:3;16870:19;;16659:236::o;16900:356::-;17102:2;17084:21;;;17121:18;;;17114:30;17180:34;17175:2;17160:18;;17153:62;17247:2;17232:18;;17074:182::o;17261:408::-;17463:2;17445:21;;;17502:2;17482:18;;;17475:30;17541:34;17536:2;17521:18;;17514:62;-1:-1:-1;;;17607:2:1;17592:18;;17585:42;17659:3;17644:19;;17435:234::o;17674:405::-;17876:2;17858:21;;;17915:2;17895:18;;;17888:30;17954:34;17949:2;17934:18;;17927:62;-1:-1:-1;;;18020:2:1;18005:18;;17998:39;18069:3;18054:19;;17848:231::o;18084:411::-;18286:2;18268:21;;;18325:2;18305:18;;;18298:30;18364:34;18359:2;18344:18;;18337:62;-1:-1:-1;;;18430:2:1;18415:18;;18408:45;18485:3;18470:19;;18258:237::o;18500:397::-;18702:2;18684:21;;;18741:2;18721:18;;;18714:30;18780:34;18775:2;18760:18;;18753:62;-1:-1:-1;;;18846:2:1;18831:18;;18824:31;18887:3;18872:19;;18674:223::o;18902:340::-;19104:2;19086:21;;;19143:2;19123:18;;;19116:30;-1:-1:-1;;;19177:2:1;19162:18;;19155:46;19233:2;19218:18;;19076:166::o;19247:413::-;19449:2;19431:21;;;19488:2;19468:18;;;19461:30;19527:34;19522:2;19507:18;;19500:62;-1:-1:-1;;;19593:2:1;19578:18;;19571:47;19650:3;19635:19;;19421:239::o;19665:353::-;19867:2;19849:21;;;19906:2;19886:18;;;19879:30;19945:31;19940:2;19925:18;;19918:59;20009:2;19994:18;;19839:179::o;20023:340::-;20225:2;20207:21;;;20264:2;20244:18;;;20237:30;-1:-1:-1;;;20298:2:1;20283:18;;20276:46;20354:2;20339:18;;20197:166::o;20368:408::-;20570:2;20552:21;;;20609:2;20589:18;;;20582:30;20648:34;20643:2;20628:18;;20621:62;-1:-1:-1;;;20714:2:1;20699:18;;20692:42;20766:3;20751:19;;20542:234::o;20781:341::-;20983:2;20965:21;;;21022:2;21002:18;;;20995:30;-1:-1:-1;;;21056:2:1;21041:18;;21034:47;21113:2;21098:18;;20955:167::o;21127:406::-;21329:2;21311:21;;;21368:2;21348:18;;;21341:30;21407:34;21402:2;21387:18;;21380:62;-1:-1:-1;;;21473:2:1;21458:18;;21451:40;21523:3;21508:19;;21301:232::o;21538:425::-;21740:2;21722:21;;;21779:2;21759:18;;;21752:30;21818:34;21813:2;21798:18;;21791:62;21889:31;21884:2;21869:18;;21862:59;21953:3;21938:19;;21712:251::o;21968:412::-;22170:2;22152:21;;;22209:2;22189:18;;;22182:30;22248:34;22243:2;22228:18;;22221:62;-1:-1:-1;;;22314:2:1;22299:18;;22292:46;22370:3;22355:19;;22142:238::o;22385:428::-;22587:2;22569:21;;;22626:2;22606:18;;;22599:30;;;22665:34;22645:18;;;22638:62;22736:34;22731:2;22716:18;;22709:62;22803:3;22788:19;;22559:254::o;22818:411::-;23020:2;23002:21;;;23059:2;23039:18;;;23032:30;23098:34;23093:2;23078:18;;23071:62;-1:-1:-1;;;23164:2:1;23149:18;;23142:45;23219:3;23204:19;;22992:237::o;23416:128::-;;23487:1;23483:6;23480:1;23477:13;23474:2;;;23493:18;;:::i;:::-;-1:-1:-1;23529:9:1;;23464:80::o;23549:125::-;;23617:1;23614;23611:8;23608:2;;;23622:18;;:::i;:::-;-1:-1:-1;23659:9:1;;23598:76::o;23679:258::-;23751:1;23761:113;23775:6;23772:1;23769:13;23761:113;;;23851:11;;;23845:18;23832:11;;;23825:39;23797:2;23790:10;23761:113;;;23892:6;23889:1;23886:13;23883:2;;;-1:-1:-1;;23927:1:1;23909:16;;23902:27;23732:205::o;23942:380::-;24027:1;24017:12;;24074:1;24064:12;;;24085:2;;24139:4;24131:6;24127:17;24117:27;;24085:2;24192;24184:6;24181:14;24161:18;24158:38;24155:2;;;24238:10;24233:3;24229:20;24226:1;24219:31;24273:4;24270:1;24263:15;24301:4;24298:1;24291:15;24155:2;;23997:325;;;:::o;24327:127::-;24388:10;24383:3;24379:20;24376:1;24369:31;24419:4;24416:1;24409:15;24443:4;24440:1;24433:15;24459:127;24520:10;24515:3;24511:20;24508:1;24501:31;24551:4;24548:1;24541:15;24575:4;24572:1;24565:15;24591:120;24679:5;24672:13;24665:21;24658:5;24655:32;24645:2;;24701:1;24698;24691:12;24716:133;-1:-1:-1;;;;;;24792:32:1;;24782:43;;24772:2;;24839:1;24836;24829:12
Swarm Source
ipfs://44ebd5cd6d9d51685bbb0e4130a35ca60bf64bf526867c14850b5f9b206d81d2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.