ERC-721
NFT
Overview
Max Total Supply
2,572 7COMP
Holders
864
Market
Volume (24H)
0.003 ETH
Min Price (24H)
$8.04 @ 0.003000 ETH
Max Price (24H)
$8.04 @ 0.003000 ETH
Other Info
Token Contract
Balance
1 7COMPLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TheSevensCompanions
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-22 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); 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 = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: Misc/Verification/TheSevensCompanions.sol pragma solidity ^0.8.7; contract TheSevensCompanions is ERC721, Ownable{ using Strings for uint; using ECDSA for bytes32; constructor(IERC20 zeniContract_,string memory baseURI_) ERC721("The Sevens Companions","7COMP") { zeniContract = zeniContract_; baseURI = baseURI_; saleStartTime = 1640199600; _batchMint(address(0x1C9dEbB357b031e3220bEdF6a4F3710c773c145D), 49); } // Constants uint constant zeniToClaim = 350e18; uint constant etherToMint = 0.049e18; uint constant maxSupply = 7000; uint constant maxPerTransaction = 21; address constant dead = address(0x000000000000000000000000000000000000dEaD); // Storage Variables uint public saleStartTime; uint public totalSupply = 0; string baseURI; IERC20 zeniContract; address stakingContract = address(0); address signer = 0x94382f4bcCD5c1Cb0B2B3A5CAA16B2909c0E494d; mapping(address => uint) public whitelistMintAmount; // Modifiers modifier mintChecks(uint amount, uint offset) { require(msg.sender == tx.origin, "No"); require(amount <= maxPerTransaction,string(abi.encodePacked("You can only mint up to ", maxPerTransaction.toString() ," per transaction"))); uint timeNow = block.timestamp; uint startTime = saleStartTime; require(startTime != 0, "Sale start time is not setup!"); require(startTime + offset <= timeNow && timeNow <= startTime + 2 weeks,"Sale is not active!"); _; } modifier etherMintChecks(uint amount) { require(msg.value == amount * etherToMint,"Invalid amount sent"); _; } // Minting Functions function zeniMint(uint amount) external mintChecks(amount, 0) { zeniContract.transferFrom(msg.sender, dead, amount * zeniToClaim); _batchMint(msg.sender, amount); } function etherWhitelistMint(uint amount, uint maxMints, bytes calldata signature) external payable mintChecks(amount, 1 days) etherMintChecks(amount) { require(keccak256(abi.encode(msg.sender, maxMints)).toEthSignedMessageHash().recover(signature) == signer,"Invalid signature received"); require(whitelistMintAmount[msg.sender] + amount <= maxMints, string(abi.encodePacked("You can only mint up to ", maxMints.toString(), " using your whitelist!"))); whitelistMintAmount[msg.sender] += amount; _batchMint(msg.sender, amount); } function etherMint(uint amount) external payable mintChecks(amount, 2 days) etherMintChecks(amount) { _batchMint(msg.sender, amount); } function _batchMint(address to, uint amount) internal { uint nextId = totalSupply; require(nextId + amount <= maxSupply, "Mint would exceed supply"); for(uint i = 1; i <= amount; i++) { _mint(to, nextId + i); } totalSupply += amount; } // View Only Functions function tokenURI(uint tokenId) public view override returns(string memory) { require(_exists(tokenId), string(abi.encodePacked("Token ", tokenId.toString(), " does not exist"))); return string(abi.encodePacked(baseURI, tokenId.toString(), ".json")); } // Owner Only function adminSetSaleStartTime(uint startTime) external onlyOwner { saleStartTime = startTime; } bool public metadataLocked = false; function adminLockMetadata() external onlyOwner { metadataLocked = true; } function adminSetBaseURI(string memory baseURI_) external onlyOwner { require(!metadataLocked); baseURI = baseURI_; } function adminSetZeni(IERC20 zeniContract_) external onlyOwner { zeniContract = zeniContract_; } function adminSetStaking(address stakingContract_) external onlyOwner { stakingContract = stakingContract_; } function adminSetSigner(address signer_) external onlyOwner { signer = signer_; } function withdraw() external onlyOwner { payable(0xE776DF26ac31C46a302F495c61b1fab1198C582a).transfer(address(this).balance); } // Staking function takeToken(address from,uint tokenId) external { require(msg.sender == stakingContract); _transfer(from,msg.sender,tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"zeniContract_","type":"address"},{"internalType":"string","name":"baseURI_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"adminLockMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"adminSetBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startTime","type":"uint256"}],"name":"adminSetSaleStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signer_","type":"address"}],"name":"adminSetSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"stakingContract_","type":"address"}],"name":"adminSetStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"zeniContract_","type":"address"}],"name":"adminSetZeni","outputs":[],"stateMutability":"nonpayable","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":"amount","type":"uint256"}],"name":"etherMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"maxMints","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"etherWhitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":[],"name":"saleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","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":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"takeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"zeniMint","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600855600b80546001600160a01b0319908116909155600c80549091167394382f4bccd5c1cb0b2b3a5caa16b2909c0e494d179055600e805460ff191690553480156200005257600080fd5b5060405162002e6638038062002e6683398101604081905262000075916200046c565b604080518082018252601581527f54686520536576656e7320436f6d70616e696f6e730000000000000000000000602080830191825283518085019094526005845264037434f4d560dc1b908401528151919291620000d791600091620003c6565b508051620000ed906001906020840190620003c6565b5050506200010a620001046200016c60201b60201c565b62000170565b600a80546001600160a01b0319166001600160a01b03841617905580516200013a906009906020840190620003c6565b506361c375b060075562000164731c9debb357b031e3220bedf6a4f3710c773c145d6031620001c2565b50506200060e565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600854611b58620001d483836200056c565b1115620002285760405162461bcd60e51b815260206004820152601860248201527f4d696e7420776f756c642065786365656420737570706c79000000000000000060448201526064015b60405180910390fd5b60015b8281116200025f576200024a846200024483856200056c565b6200027e565b806200025681620005c4565b9150506200022b565b5081600860008282546200027491906200056c565b9091555050505050565b6001600160a01b038216620002d65760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016200021f565b6000818152600260205260409020546001600160a01b0316156200033d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016200021f565b6001600160a01b0382166000908152600360205260408120805460019290620003689084906200056c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054620003d49062000587565b90600052602060002090601f016020900481019282620003f8576000855562000443565b82601f106200041357805160ff191683800117855562000443565b8280016001018555821562000443579182015b828111156200044357825182559160200191906001019062000426565b506200045192915062000455565b5090565b5b8082111562000451576000815560010162000456565b600080604083850312156200048057600080fd5b82516001600160a01b03811681146200049857600080fd5b602084810151919350906001600160401b0380821115620004b857600080fd5b818601915086601f830112620004cd57600080fd5b815181811115620004e257620004e2620005f8565b604051601f8201601f19908116603f011681019083821181831017156200050d576200050d620005f8565b8160405282815289868487010111156200052657600080fd5b600093505b828410156200054a57848401860151818501870152928501926200052b565b828411156200055c5760008684830101525b8096505050505050509250929050565b60008219821115620005825762000582620005e2565b500190565b600181811c908216806200059c57607f821691505b60208210811415620005be57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415620005db57620005db620005e2565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b612848806200061e6000396000f3fe6080604052600436106101d85760003560e01c8063835821ee11610102578063b187add111610095578063d7e18c4f11610064578063d7e18c4f1461053f578063dd2101d114610552578063e985e9c514610567578063f2fde38b146105b057600080fd5b8063b187add1146104bf578063b88d4fde146104df578063c87b56dd146104ff578063cfcfa6ef1461051f57600080fd5b806398c2f565116100d157806398c2f5651461043f578063a22cb4651461045f578063a8d1b9bf1461047f578063afd0f9061461049f57600080fd5b8063835821ee146103d9578063877e7122146103ec5780638da5cb5b1461040c57806395d89b411461042a57600080fd5b80633ccfd60b1161017a57806369d2ceb11161014957806369d2ceb11461035d57806370a0823114610377578063715018a6146103975780638135fbdf146103ac57600080fd5b80633ccfd60b146102e85780633e976df5146102fd57806342842e0e1461031d5780636352211e1461033d57600080fd5b8063095ea7b3116101b6578063095ea7b31461026c57806318160ddd1461028e5780631cbaee2d146102b257806323b872dd146102c857600080fd5b806301ffc9a7146101dd57806306fdde0314610212578063081812fc14610234575b600080fd5b3480156101e957600080fd5b506101fd6101f83660046121ab565b6105d0565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b50610227610622565b6040516102099190612508565b34801561024057600080fd5b5061025461024f36600461222e565b6106b4565b6040516001600160a01b039091168152602001610209565b34801561027857600080fd5b5061028c610287366004612162565b61074e565b005b34801561029a57600080fd5b506102a460085481565b604051908152602001610209565b3480156102be57600080fd5b506102a460075481565b3480156102d457600080fd5b5061028c6102e3366004612073565b610864565b3480156102f457600080fd5b5061028c610895565b34801561030957600080fd5b5061028c6103183660046121e5565b610902565b34801561032957600080fd5b5061028c610338366004612073565b610953565b34801561034957600080fd5b5061025461035836600461222e565b61096e565b34801561036957600080fd5b50600e546101fd9060ff1681565b34801561038357600080fd5b506102a4610392366004612016565b6109e5565b3480156103a357600080fd5b5061028c610a6c565b3480156103b857600080fd5b506102a46103c7366004612016565b600d6020526000908152604090205481565b61028c6103e7366004612247565b610aa2565b3480156103f857600080fd5b5061028c61040736600461222e565b610d8f565b34801561041857600080fd5b506006546001600160a01b0316610254565b34801561043657600080fd5b50610227610f22565b34801561044b57600080fd5b5061028c61045a366004612016565b610f31565b34801561046b57600080fd5b5061028c61047a366004612134565b610f7d565b34801561048b57600080fd5b5061028c61049a36600461222e565b610f88565b3480156104ab57600080fd5b5061028c6104ba366004612162565b610fb7565b3480156104cb57600080fd5b5061028c6104da366004612016565b610fd9565b3480156104eb57600080fd5b5061028c6104fa3660046120b4565b611025565b34801561050b57600080fd5b5061022761051a36600461222e565b61105d565b34801561052b57600080fd5b5061028c61053a366004612016565b6110f3565b61028c61054d36600461222e565b61113f565b34801561055e57600080fd5b5061028c61127b565b34801561057357600080fd5b506101fd61058236600461203a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156105bc57600080fd5b5061028c6105cb366004612016565b6112b4565b60006001600160e01b031982166380ac58cd60e01b148061060157506001600160e01b03198216635b5e139f60e01b145b8061061c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461063190612701565b80601f016020809104026020016040519081016040528092919081815260200182805461065d90612701565b80156106aa5780601f1061067f576101008083540402835291602001916106aa565b820191906000526020600020905b81548152906001019060200180831161068d57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107325760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006107598261096e565b9050806001600160a01b0316836001600160a01b031614156107c75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610729565b336001600160a01b03821614806107e357506107e38133610582565b6108555760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610729565b61085f838361134c565b505050565b61086e33826113ba565b61088a5760405162461bcd60e51b815260040161072990612622565b61085f8383836114b1565b6006546001600160a01b031633146108bf5760405162461bcd60e51b8152600401610729906125c0565b60405173e776df26ac31c46a302f495c61b1fab1198c582a904780156108fc02916000818181858888f193505050501580156108ff573d6000803e3d6000fd5b50565b6006546001600160a01b0316331461092c5760405162461bcd60e51b8152600401610729906125c0565b600e5460ff161561093c57600080fd5b805161094f906009906020840190611f07565b5050565b61085f83838360405180602001604052806000815250611025565b6000818152600260205260408120546001600160a01b03168061061c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610729565b60006001600160a01b038216610a505760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610729565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610a965760405162461bcd60e51b8152600401610729906125c0565b610aa06000611651565b565b8362015180333214610ac65760405162461bcd60e51b81526004016107299061256d565b6015821115610ad560156116a3565b604051602001610ae591906123ca565b60405160208183030381529060405290610b125760405162461bcd60e51b81526004016107299190612508565b50600754429080610b355760405162461bcd60e51b815260040161072990612589565b81610b408483612673565b11158015610b5a5750610b568162127500612673565b8211155b610b765760405162461bcd60e51b8152600401610729906125f5565b87610b8866ae153d89fe80008261269f565b3414610bcc5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a5908185b5bdd5b9d081cd95b9d606a1b6044820152606401610729565b600c54604080516020601f8a018190048102820181019092528881526001600160a01b0390921691610c99918a908a908190840183828082843760009201919091525050604080513360208201529081018e9052610c9392506060019050604051602081830303815290604052805190602001206040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b906117a1565b6001600160a01b031614610cef5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c6964207369676e61747572652072656365697665640000000000006044820152606401610729565b336000908152600d60205260409020548890610d0c908b90612673565b1115610d17896116a3565b604051602001610d279190612424565b60405160208183030381529060405290610d545760405162461bcd60e51b81526004016107299190612508565b50336000908152600d6020526040812080548b9290610d74908490612673565b90915550610d849050338a6117c5565b505050505050505050565b806000333214610db15760405162461bcd60e51b81526004016107299061256d565b6015821115610dc060156116a3565b604051602001610dd091906123ca565b60405160208183030381529060405290610dfd5760405162461bcd60e51b81526004016107299190612508565b50600754429080610e205760405162461bcd60e51b815260040161072990612589565b81610e2b8483612673565b11158015610e455750610e418162127500612673565b8211155b610e615760405162461bcd60e51b8152600401610729906125f5565b600a546001600160a01b03166323b872dd3361dead610e896812f939c99edab800008a61269f565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381600087803b158015610ed857600080fd5b505af1158015610eec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f10919061218e565b50610f1b33866117c5565b5050505050565b60606001805461063190612701565b6006546001600160a01b03163314610f5b5760405162461bcd60e51b8152600401610729906125c0565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b61094f33838361186f565b6006546001600160a01b03163314610fb25760405162461bcd60e51b8152600401610729906125c0565b600755565b600b546001600160a01b03163314610fce57600080fd5b61094f8233836114b1565b6006546001600160a01b031633146110035760405162461bcd60e51b8152600401610729906125c0565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b61102f33836113ba565b61104b5760405162461bcd60e51b815260040161072990612622565b6110578484848461193e565b50505050565b6000818152600260205260409020546060906001600160a01b03161515611083836116a3565b6040516020016110939190612484565b604051602081830303815290604052906110c05760405162461bcd60e51b81526004016107299190612508565b5060096110cc836116a3565b6040516020016110dd92919061230f565b6040516020818303038152906040529050919050565b6006546001600160a01b0316331461111d5760405162461bcd60e51b8152600401610729906125c0565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b806202a3003332146111635760405162461bcd60e51b81526004016107299061256d565b601582111561117260156116a3565b60405160200161118291906123ca565b604051602081830303815290604052906111af5760405162461bcd60e51b81526004016107299190612508565b506007544290806111d25760405162461bcd60e51b815260040161072990612589565b816111dd8483612673565b111580156111f757506111f38162127500612673565b8211155b6112135760405162461bcd60e51b8152600401610729906125f5565b8461122566ae153d89fe80008261269f565b34146112695760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a5908185b5bdd5b9d081cd95b9d606a1b6044820152606401610729565b61127333876117c5565b505050505050565b6006546001600160a01b031633146112a55760405162461bcd60e51b8152600401610729906125c0565b600e805460ff19166001179055565b6006546001600160a01b031633146112de5760405162461bcd60e51b8152600401610729906125c0565b6001600160a01b0381166113435760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610729565b6108ff81611651565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906113818261096e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166114335760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610729565b600061143e8361096e565b9050806001600160a01b0316846001600160a01b031614806114795750836001600160a01b031661146e846106b4565b6001600160a01b0316145b806114a957506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166114c48261096e565b6001600160a01b03161461152c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610729565b6001600160a01b03821661158e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610729565b61159960008261134c565b6001600160a01b03831660009081526003602052604081208054600192906115c29084906126be565b90915550506001600160a01b03821660009081526003602052604081208054600192906115f0908490612673565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060816116c75750506040805180820190915260018152600360fc1b602082015290565b8160005b81156116f157806116db8161273c565b91506116ea9050600a8361268b565b91506116cb565b60008167ffffffffffffffff81111561170c5761170c6127c3565b6040519080825280601f01601f191660200182016040528015611736576020820181803683370190505b5090505b84156114a95761174b6001836126be565b9150611758600a86612757565b611763906030612673565b60f81b818381518110611778576117786127ad565b60200101906001600160f81b031916908160001a90535061179a600a8661268b565b945061173a565b60008060006117b08585611971565b915091506117bd816119e1565b509392505050565b600854611b586117d58383612673565b11156118235760405162461bcd60e51b815260206004820152601860248201527f4d696e7420776f756c642065786365656420737570706c7900000000000000006044820152606401610729565b60015b828111611852576118408461183b8385612673565b611b9c565b8061184a8161273c565b915050611826565b5081600860008282546118659190612673565b9091555050505050565b816001600160a01b0316836001600160a01b031614156118d15760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610729565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6119498484846114b1565b61195584848484611cde565b6110575760405162461bcd60e51b81526004016107299061251b565b6000808251604114156119a85760208301516040840151606085015160001a61199c87828585611deb565b945094505050506119da565b8251604014156119d257602083015160408401516119c7868383611ed8565b9350935050506119da565b506000905060025b9250929050565b60008160048111156119f5576119f5612797565b14156119fe5750565b6001816004811115611a1257611a12612797565b1415611a605760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610729565b6002816004811115611a7457611a74612797565b1415611ac25760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610729565b6003816004811115611ad657611ad6612797565b1415611b2f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610729565b6004816004811115611b4357611b43612797565b14156108ff5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610729565b6001600160a01b038216611bf25760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610729565b6000818152600260205260409020546001600160a01b031615611c575760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610729565b6001600160a01b0382166000908152600360205260408120805460019290611c80908490612673565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b15611de057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611d229033908990889088906004016124cb565b602060405180830381600087803b158015611d3c57600080fd5b505af1925050508015611d6c575060408051601f3d908101601f19168201909252611d69918101906121c8565b60015b611dc6573d808015611d9a576040519150601f19603f3d011682016040523d82523d6000602084013e611d9f565b606091505b508051611dbe5760405162461bcd60e51b81526004016107299061251b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506114a9565b506001949350505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611e225750600090506003611ecf565b8460ff16601b14158015611e3a57508460ff16601c14155b15611e4b5750600090506004611ecf565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611e9f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611ec857600060019250925050611ecf565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b01611ef987828885611deb565b935093505050935093915050565b828054611f1390612701565b90600052602060002090601f016020900481019282611f355760008555611f7b565b82601f10611f4e57805160ff1916838001178555611f7b565b82800160010185558215611f7b579182015b82811115611f7b578251825591602001919060010190611f60565b50611f87929150611f8b565b5090565b5b80821115611f875760008155600101611f8c565b600067ffffffffffffffff80841115611fbb57611fbb6127c3565b604051601f8501601f19908116603f01168101908282118183101715611fe357611fe36127c3565b81604052809350858152868686011115611ffc57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561202857600080fd5b8135612033816127d9565b9392505050565b6000806040838503121561204d57600080fd5b8235612058816127d9565b91506020830135612068816127d9565b809150509250929050565b60008060006060848603121561208857600080fd5b8335612093816127d9565b925060208401356120a3816127d9565b929592945050506040919091013590565b600080600080608085870312156120ca57600080fd5b84356120d5816127d9565b935060208501356120e5816127d9565b925060408501359150606085013567ffffffffffffffff81111561210857600080fd5b8501601f8101871361211957600080fd5b61212887823560208401611fa0565b91505092959194509250565b6000806040838503121561214757600080fd5b8235612152816127d9565b91506020830135612068816127ee565b6000806040838503121561217557600080fd5b8235612180816127d9565b946020939093013593505050565b6000602082840312156121a057600080fd5b8151612033816127ee565b6000602082840312156121bd57600080fd5b8135612033816127fc565b6000602082840312156121da57600080fd5b8151612033816127fc565b6000602082840312156121f757600080fd5b813567ffffffffffffffff81111561220e57600080fd5b8201601f8101841361221f57600080fd5b6114a984823560208401611fa0565b60006020828403121561224057600080fd5b5035919050565b6000806000806060858703121561225d57600080fd5b8435935060208501359250604085013567ffffffffffffffff8082111561228357600080fd5b818701915087601f83011261229757600080fd5b8135818111156122a657600080fd5b8860208285010111156122b857600080fd5b95989497505060200194505050565b600081518084526122df8160208601602086016126d5565b601f01601f19169290920160200192915050565b600081516123058185602086016126d5565b9290920192915050565b600080845481600182811c91508083168061232b57607f831692505b602080841082141561234b57634e487b7160e01b86526022600452602486fd5b81801561235f57600181146123705761239d565b60ff1986168952848901965061239d565b60008b81526020902060005b868110156123955781548b82015290850190830161237c565b505084890196505b5050505050506123c16123b082866122f3565b64173539b7b760d91b815260050190565b95945050505050565b7702cb7ba9031b0b71037b7363c9036b4b73a103ab8103a37960451b8152600082516123fd8160188501602087016126d5565b6f103832b9103a3930b739b0b1ba34b7b760811b6018939091019283015250602801919050565b7702cb7ba9031b0b71037b7363c9036b4b73a103ab8103a37960451b8152600082516124578160188501602087016126d5565b75207573696e6720796f75722077686974656c6973742160501b6018939091019283015250602e01919050565b6502a37b5b2b7160d51b8152600082516124a58160068501602087016126d5565b6e08191bd95cc81b9bdd08195e1a5cdd608a1b6006939091019283015250601501919050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906124fe908301846122c7565b9695505050505050565b60208152600061203360208301846122c7565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252600290820152614e6f60f01b604082015260600190565b6020808252601d908201527f53616c652073746172742074696d65206973206e6f7420736574757021000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526013908201527253616c65206973206e6f74206163746976652160681b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156126865761268661276b565b500190565b60008261269a5761269a612781565b500490565b60008160001904831182151516156126b9576126b961276b565b500290565b6000828210156126d0576126d061276b565b500390565b60005b838110156126f05781810151838201526020016126d8565b838111156110575750506000910152565b600181811c9082168061271557607f821691505b6020821081141561273657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156127505761275061276b565b5060010190565b60008261276657612766612781565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146108ff57600080fd5b80151581146108ff57600080fd5b6001600160e01b0319811681146108ff57600080fdfea2646970667358221220a400086dc69444c943126800df743355c0663ee17fb29718c0f256cfd8605ed164736f6c634300080700330000000000000000000000002e59d147962e2bb3fbdc52dc18cfba2653c06ccc00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d63485a5344335037577566486e464d6d4d484852335a72417463487333376d586d794c7a66454c556d7936522f00000000000000000000
Deployed Bytecode
0x6080604052600436106101d85760003560e01c8063835821ee11610102578063b187add111610095578063d7e18c4f11610064578063d7e18c4f1461053f578063dd2101d114610552578063e985e9c514610567578063f2fde38b146105b057600080fd5b8063b187add1146104bf578063b88d4fde146104df578063c87b56dd146104ff578063cfcfa6ef1461051f57600080fd5b806398c2f565116100d157806398c2f5651461043f578063a22cb4651461045f578063a8d1b9bf1461047f578063afd0f9061461049f57600080fd5b8063835821ee146103d9578063877e7122146103ec5780638da5cb5b1461040c57806395d89b411461042a57600080fd5b80633ccfd60b1161017a57806369d2ceb11161014957806369d2ceb11461035d57806370a0823114610377578063715018a6146103975780638135fbdf146103ac57600080fd5b80633ccfd60b146102e85780633e976df5146102fd57806342842e0e1461031d5780636352211e1461033d57600080fd5b8063095ea7b3116101b6578063095ea7b31461026c57806318160ddd1461028e5780631cbaee2d146102b257806323b872dd146102c857600080fd5b806301ffc9a7146101dd57806306fdde0314610212578063081812fc14610234575b600080fd5b3480156101e957600080fd5b506101fd6101f83660046121ab565b6105d0565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b50610227610622565b6040516102099190612508565b34801561024057600080fd5b5061025461024f36600461222e565b6106b4565b6040516001600160a01b039091168152602001610209565b34801561027857600080fd5b5061028c610287366004612162565b61074e565b005b34801561029a57600080fd5b506102a460085481565b604051908152602001610209565b3480156102be57600080fd5b506102a460075481565b3480156102d457600080fd5b5061028c6102e3366004612073565b610864565b3480156102f457600080fd5b5061028c610895565b34801561030957600080fd5b5061028c6103183660046121e5565b610902565b34801561032957600080fd5b5061028c610338366004612073565b610953565b34801561034957600080fd5b5061025461035836600461222e565b61096e565b34801561036957600080fd5b50600e546101fd9060ff1681565b34801561038357600080fd5b506102a4610392366004612016565b6109e5565b3480156103a357600080fd5b5061028c610a6c565b3480156103b857600080fd5b506102a46103c7366004612016565b600d6020526000908152604090205481565b61028c6103e7366004612247565b610aa2565b3480156103f857600080fd5b5061028c61040736600461222e565b610d8f565b34801561041857600080fd5b506006546001600160a01b0316610254565b34801561043657600080fd5b50610227610f22565b34801561044b57600080fd5b5061028c61045a366004612016565b610f31565b34801561046b57600080fd5b5061028c61047a366004612134565b610f7d565b34801561048b57600080fd5b5061028c61049a36600461222e565b610f88565b3480156104ab57600080fd5b5061028c6104ba366004612162565b610fb7565b3480156104cb57600080fd5b5061028c6104da366004612016565b610fd9565b3480156104eb57600080fd5b5061028c6104fa3660046120b4565b611025565b34801561050b57600080fd5b5061022761051a36600461222e565b61105d565b34801561052b57600080fd5b5061028c61053a366004612016565b6110f3565b61028c61054d36600461222e565b61113f565b34801561055e57600080fd5b5061028c61127b565b34801561057357600080fd5b506101fd61058236600461203a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156105bc57600080fd5b5061028c6105cb366004612016565b6112b4565b60006001600160e01b031982166380ac58cd60e01b148061060157506001600160e01b03198216635b5e139f60e01b145b8061061c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461063190612701565b80601f016020809104026020016040519081016040528092919081815260200182805461065d90612701565b80156106aa5780601f1061067f576101008083540402835291602001916106aa565b820191906000526020600020905b81548152906001019060200180831161068d57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107325760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006107598261096e565b9050806001600160a01b0316836001600160a01b031614156107c75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610729565b336001600160a01b03821614806107e357506107e38133610582565b6108555760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610729565b61085f838361134c565b505050565b61086e33826113ba565b61088a5760405162461bcd60e51b815260040161072990612622565b61085f8383836114b1565b6006546001600160a01b031633146108bf5760405162461bcd60e51b8152600401610729906125c0565b60405173e776df26ac31c46a302f495c61b1fab1198c582a904780156108fc02916000818181858888f193505050501580156108ff573d6000803e3d6000fd5b50565b6006546001600160a01b0316331461092c5760405162461bcd60e51b8152600401610729906125c0565b600e5460ff161561093c57600080fd5b805161094f906009906020840190611f07565b5050565b61085f83838360405180602001604052806000815250611025565b6000818152600260205260408120546001600160a01b03168061061c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610729565b60006001600160a01b038216610a505760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610729565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610a965760405162461bcd60e51b8152600401610729906125c0565b610aa06000611651565b565b8362015180333214610ac65760405162461bcd60e51b81526004016107299061256d565b6015821115610ad560156116a3565b604051602001610ae591906123ca565b60405160208183030381529060405290610b125760405162461bcd60e51b81526004016107299190612508565b50600754429080610b355760405162461bcd60e51b815260040161072990612589565b81610b408483612673565b11158015610b5a5750610b568162127500612673565b8211155b610b765760405162461bcd60e51b8152600401610729906125f5565b87610b8866ae153d89fe80008261269f565b3414610bcc5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a5908185b5bdd5b9d081cd95b9d606a1b6044820152606401610729565b600c54604080516020601f8a018190048102820181019092528881526001600160a01b0390921691610c99918a908a908190840183828082843760009201919091525050604080513360208201529081018e9052610c9392506060019050604051602081830303815290604052805190602001206040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b906117a1565b6001600160a01b031614610cef5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c6964207369676e61747572652072656365697665640000000000006044820152606401610729565b336000908152600d60205260409020548890610d0c908b90612673565b1115610d17896116a3565b604051602001610d279190612424565b60405160208183030381529060405290610d545760405162461bcd60e51b81526004016107299190612508565b50336000908152600d6020526040812080548b9290610d74908490612673565b90915550610d849050338a6117c5565b505050505050505050565b806000333214610db15760405162461bcd60e51b81526004016107299061256d565b6015821115610dc060156116a3565b604051602001610dd091906123ca565b60405160208183030381529060405290610dfd5760405162461bcd60e51b81526004016107299190612508565b50600754429080610e205760405162461bcd60e51b815260040161072990612589565b81610e2b8483612673565b11158015610e455750610e418162127500612673565b8211155b610e615760405162461bcd60e51b8152600401610729906125f5565b600a546001600160a01b03166323b872dd3361dead610e896812f939c99edab800008a61269f565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381600087803b158015610ed857600080fd5b505af1158015610eec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f10919061218e565b50610f1b33866117c5565b5050505050565b60606001805461063190612701565b6006546001600160a01b03163314610f5b5760405162461bcd60e51b8152600401610729906125c0565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b61094f33838361186f565b6006546001600160a01b03163314610fb25760405162461bcd60e51b8152600401610729906125c0565b600755565b600b546001600160a01b03163314610fce57600080fd5b61094f8233836114b1565b6006546001600160a01b031633146110035760405162461bcd60e51b8152600401610729906125c0565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b61102f33836113ba565b61104b5760405162461bcd60e51b815260040161072990612622565b6110578484848461193e565b50505050565b6000818152600260205260409020546060906001600160a01b03161515611083836116a3565b6040516020016110939190612484565b604051602081830303815290604052906110c05760405162461bcd60e51b81526004016107299190612508565b5060096110cc836116a3565b6040516020016110dd92919061230f565b6040516020818303038152906040529050919050565b6006546001600160a01b0316331461111d5760405162461bcd60e51b8152600401610729906125c0565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b806202a3003332146111635760405162461bcd60e51b81526004016107299061256d565b601582111561117260156116a3565b60405160200161118291906123ca565b604051602081830303815290604052906111af5760405162461bcd60e51b81526004016107299190612508565b506007544290806111d25760405162461bcd60e51b815260040161072990612589565b816111dd8483612673565b111580156111f757506111f38162127500612673565b8211155b6112135760405162461bcd60e51b8152600401610729906125f5565b8461122566ae153d89fe80008261269f565b34146112695760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a5908185b5bdd5b9d081cd95b9d606a1b6044820152606401610729565b61127333876117c5565b505050505050565b6006546001600160a01b031633146112a55760405162461bcd60e51b8152600401610729906125c0565b600e805460ff19166001179055565b6006546001600160a01b031633146112de5760405162461bcd60e51b8152600401610729906125c0565b6001600160a01b0381166113435760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610729565b6108ff81611651565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906113818261096e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166114335760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610729565b600061143e8361096e565b9050806001600160a01b0316846001600160a01b031614806114795750836001600160a01b031661146e846106b4565b6001600160a01b0316145b806114a957506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166114c48261096e565b6001600160a01b03161461152c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610729565b6001600160a01b03821661158e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610729565b61159960008261134c565b6001600160a01b03831660009081526003602052604081208054600192906115c29084906126be565b90915550506001600160a01b03821660009081526003602052604081208054600192906115f0908490612673565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060816116c75750506040805180820190915260018152600360fc1b602082015290565b8160005b81156116f157806116db8161273c565b91506116ea9050600a8361268b565b91506116cb565b60008167ffffffffffffffff81111561170c5761170c6127c3565b6040519080825280601f01601f191660200182016040528015611736576020820181803683370190505b5090505b84156114a95761174b6001836126be565b9150611758600a86612757565b611763906030612673565b60f81b818381518110611778576117786127ad565b60200101906001600160f81b031916908160001a90535061179a600a8661268b565b945061173a565b60008060006117b08585611971565b915091506117bd816119e1565b509392505050565b600854611b586117d58383612673565b11156118235760405162461bcd60e51b815260206004820152601860248201527f4d696e7420776f756c642065786365656420737570706c7900000000000000006044820152606401610729565b60015b828111611852576118408461183b8385612673565b611b9c565b8061184a8161273c565b915050611826565b5081600860008282546118659190612673565b9091555050505050565b816001600160a01b0316836001600160a01b031614156118d15760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610729565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6119498484846114b1565b61195584848484611cde565b6110575760405162461bcd60e51b81526004016107299061251b565b6000808251604114156119a85760208301516040840151606085015160001a61199c87828585611deb565b945094505050506119da565b8251604014156119d257602083015160408401516119c7868383611ed8565b9350935050506119da565b506000905060025b9250929050565b60008160048111156119f5576119f5612797565b14156119fe5750565b6001816004811115611a1257611a12612797565b1415611a605760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610729565b6002816004811115611a7457611a74612797565b1415611ac25760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610729565b6003816004811115611ad657611ad6612797565b1415611b2f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610729565b6004816004811115611b4357611b43612797565b14156108ff5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610729565b6001600160a01b038216611bf25760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610729565b6000818152600260205260409020546001600160a01b031615611c575760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610729565b6001600160a01b0382166000908152600360205260408120805460019290611c80908490612673565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b15611de057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611d229033908990889088906004016124cb565b602060405180830381600087803b158015611d3c57600080fd5b505af1925050508015611d6c575060408051601f3d908101601f19168201909252611d69918101906121c8565b60015b611dc6573d808015611d9a576040519150601f19603f3d011682016040523d82523d6000602084013e611d9f565b606091505b508051611dbe5760405162461bcd60e51b81526004016107299061251b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506114a9565b506001949350505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611e225750600090506003611ecf565b8460ff16601b14158015611e3a57508460ff16601c14155b15611e4b5750600090506004611ecf565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611e9f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611ec857600060019250925050611ecf565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b01611ef987828885611deb565b935093505050935093915050565b828054611f1390612701565b90600052602060002090601f016020900481019282611f355760008555611f7b565b82601f10611f4e57805160ff1916838001178555611f7b565b82800160010185558215611f7b579182015b82811115611f7b578251825591602001919060010190611f60565b50611f87929150611f8b565b5090565b5b80821115611f875760008155600101611f8c565b600067ffffffffffffffff80841115611fbb57611fbb6127c3565b604051601f8501601f19908116603f01168101908282118183101715611fe357611fe36127c3565b81604052809350858152868686011115611ffc57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561202857600080fd5b8135612033816127d9565b9392505050565b6000806040838503121561204d57600080fd5b8235612058816127d9565b91506020830135612068816127d9565b809150509250929050565b60008060006060848603121561208857600080fd5b8335612093816127d9565b925060208401356120a3816127d9565b929592945050506040919091013590565b600080600080608085870312156120ca57600080fd5b84356120d5816127d9565b935060208501356120e5816127d9565b925060408501359150606085013567ffffffffffffffff81111561210857600080fd5b8501601f8101871361211957600080fd5b61212887823560208401611fa0565b91505092959194509250565b6000806040838503121561214757600080fd5b8235612152816127d9565b91506020830135612068816127ee565b6000806040838503121561217557600080fd5b8235612180816127d9565b946020939093013593505050565b6000602082840312156121a057600080fd5b8151612033816127ee565b6000602082840312156121bd57600080fd5b8135612033816127fc565b6000602082840312156121da57600080fd5b8151612033816127fc565b6000602082840312156121f757600080fd5b813567ffffffffffffffff81111561220e57600080fd5b8201601f8101841361221f57600080fd5b6114a984823560208401611fa0565b60006020828403121561224057600080fd5b5035919050565b6000806000806060858703121561225d57600080fd5b8435935060208501359250604085013567ffffffffffffffff8082111561228357600080fd5b818701915087601f83011261229757600080fd5b8135818111156122a657600080fd5b8860208285010111156122b857600080fd5b95989497505060200194505050565b600081518084526122df8160208601602086016126d5565b601f01601f19169290920160200192915050565b600081516123058185602086016126d5565b9290920192915050565b600080845481600182811c91508083168061232b57607f831692505b602080841082141561234b57634e487b7160e01b86526022600452602486fd5b81801561235f57600181146123705761239d565b60ff1986168952848901965061239d565b60008b81526020902060005b868110156123955781548b82015290850190830161237c565b505084890196505b5050505050506123c16123b082866122f3565b64173539b7b760d91b815260050190565b95945050505050565b7702cb7ba9031b0b71037b7363c9036b4b73a103ab8103a37960451b8152600082516123fd8160188501602087016126d5565b6f103832b9103a3930b739b0b1ba34b7b760811b6018939091019283015250602801919050565b7702cb7ba9031b0b71037b7363c9036b4b73a103ab8103a37960451b8152600082516124578160188501602087016126d5565b75207573696e6720796f75722077686974656c6973742160501b6018939091019283015250602e01919050565b6502a37b5b2b7160d51b8152600082516124a58160068501602087016126d5565b6e08191bd95cc81b9bdd08195e1a5cdd608a1b6006939091019283015250601501919050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906124fe908301846122c7565b9695505050505050565b60208152600061203360208301846122c7565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252600290820152614e6f60f01b604082015260600190565b6020808252601d908201527f53616c652073746172742074696d65206973206e6f7420736574757021000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526013908201527253616c65206973206e6f74206163746976652160681b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156126865761268661276b565b500190565b60008261269a5761269a612781565b500490565b60008160001904831182151516156126b9576126b961276b565b500290565b6000828210156126d0576126d061276b565b500390565b60005b838110156126f05781810151838201526020016126d8565b838111156110575750506000910152565b600181811c9082168061271557607f821691505b6020821081141561273657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156127505761275061276b565b5060010190565b60008261276657612766612781565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146108ff57600080fd5b80151581146108ff57600080fd5b6001600160e01b0319811681146108ff57600080fdfea2646970667358221220a400086dc69444c943126800df743355c0663ee17fb29718c0f256cfd8605ed164736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000002e59d147962e2bb3fbdc52dc18cfba2653c06ccc00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d63485a5344335037577566486e464d6d4d484852335a72417463487333376d586d794c7a66454c556d7936522f00000000000000000000
-----Decoded View---------------
Arg [0] : zeniContract_ (address): 0x2E59D147962E2bB3fBdc52dc18CfBa2653C06Ccc
Arg [1] : baseURI_ (string): ipfs://QmcHZSD3P7WufHnFMmMHHR3ZrAtcHs37mXmyLzfELUmy6R/
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000002e59d147962e2bb3fbdc52dc18cfba2653c06ccc
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [3] : 697066733a2f2f516d63485a5344335037577566486e464d6d4d484852335a72
Arg [4] : 417463487333376d586d794c7a66454c556d7936522f00000000000000000000
Deployed Bytecode Sourcemap
48735:4405:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26638:305;;;;;;;;;;-1:-1:-1;26638:305:0;;;;;:::i;:::-;;:::i;:::-;;;11278:14:1;;11271:22;11253:41;;11241:2;11226:18;26638:305:0;;;;;;;;27583:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29142:221::-;;;;;;;;;;-1:-1:-1;29142:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9917:32:1;;;9899:51;;9887:2;9872:18;29142:221:0;9753:203:1;28665:411:0;;;;;;;;;;-1:-1:-1;28665:411:0;;;;;:::i;:::-;;:::i;:::-;;49486:27;;;;;;;;;;;;;;;;;;;21655:25:1;;;21643:2;21628:18;49486:27:0;21509:177:1;49452:25:0;;;;;;;;;;;;;;;;29892:339;;;;;;;;;;-1:-1:-1;29892:339:0;;;;;:::i;:::-;;:::i;52813:141::-;;;;;;;;;;;;;:::i;52313:140::-;;;;;;;;;;-1:-1:-1;52313:140:0;;;;;:::i;:::-;;:::i;30302:185::-;;;;;;;;;;-1:-1:-1;30302:185:0;;;;;:::i;:::-;;:::i;27277:239::-;;;;;;;;;;-1:-1:-1;27277:239:0;;;;;:::i;:::-;;:::i;52176:34::-;;;;;;;;;;-1:-1:-1;52176:34:0;;;;;;;;27007:208;;;;;;;;;;-1:-1:-1;27007:208:0;;;;;:::i;:::-;;:::i;5502:103::-;;;;;;;;;;;;;:::i;49684:51::-;;;;;;;;;;-1:-1:-1;49684:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;50679:572;;;;;;:::i;:::-;;:::i;50480:189::-;;;;;;;;;;-1:-1:-1;50480:189:0;;;;;:::i;:::-;;:::i;4851:87::-;;;;;;;;;;-1:-1:-1;4924:6:0;;-1:-1:-1;;;;;4924:6:0;4851:87;;27752:104;;;;;;;;;;;;;:::i;52710:95::-;;;;;;;;;;-1:-1:-1;52710:95:0;;;;;:::i;:::-;;:::i;29435:155::-;;;;;;;;;;-1:-1:-1;29435:155:0;;;;;:::i;:::-;;:::i;52058:110::-;;;;;;;;;;-1:-1:-1;52058:110:0;;;;;:::i;:::-;;:::i;52980:157::-;;;;;;;;;;-1:-1:-1;52980:157:0;;;;;:::i;:::-;;:::i;52461:110::-;;;;;;;;;;-1:-1:-1;52461:110:0;;;;;:::i;:::-;;:::i;30558:328::-;;;;;;;;;;-1:-1:-1;30558:328:0;;;;;:::i;:::-;;:::i;51754:275::-;;;;;;;;;;-1:-1:-1;51754:275:0;;;;;:::i;:::-;;:::i;52579:123::-;;;;;;;;;;-1:-1:-1;52579:123:0;;;;;:::i;:::-;;:::i;51259:149::-;;;;;;:::i;:::-;;:::i;52217:88::-;;;;;;;;;;;;;:::i;29661:164::-;;;;;;;;;;-1:-1:-1;29661:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;29782:25:0;;;29758:4;29782:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29661:164;5760:201;;;;;;;;;;-1:-1:-1;5760:201:0;;;;;:::i;:::-;;:::i;26638:305::-;26740:4;-1:-1:-1;;;;;;26777:40:0;;-1:-1:-1;;;26777:40:0;;:105;;-1:-1:-1;;;;;;;26834:48:0;;-1:-1:-1;;;26834:48:0;26777:105;:158;;;-1:-1:-1;;;;;;;;;;17392:40:0;;;26899:36;26757:178;26638:305;-1:-1:-1;;26638:305:0:o;27583:100::-;27637:13;27670:5;27663:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27583:100;:::o;29142:221::-;29218:7;32485:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32485:16:0;29238:73;;;;-1:-1:-1;;;29238:73:0;;19006:2:1;29238:73:0;;;18988:21:1;19045:2;19025:18;;;19018:30;19084:34;19064:18;;;19057:62;-1:-1:-1;;;19135:18:1;;;19128:42;19187:19;;29238:73:0;;;;;;;;;-1:-1:-1;29331:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29331:24:0;;29142:221::o;28665:411::-;28746:13;28762:23;28777:7;28762:14;:23::i;:::-;28746:39;;28810:5;-1:-1:-1;;;;;28804:11:0;:2;-1:-1:-1;;;;;28804:11:0;;;28796:57;;;;-1:-1:-1;;;28796:57:0;;20891:2:1;28796:57:0;;;20873:21:1;20930:2;20910:18;;;20903:30;20969:34;20949:18;;;20942:62;-1:-1:-1;;;21020:18:1;;;21013:31;21061:19;;28796:57:0;20689:397:1;28796:57:0;3655:10;-1:-1:-1;;;;;28888:21:0;;;;:62;;-1:-1:-1;28913:37:0;28930:5;3655:10;29661:164;:::i;28913:37::-;28866:168;;;;-1:-1:-1;;;28866:168:0;;16648:2:1;28866:168:0;;;16630:21:1;16687:2;16667:18;;;16660:30;16726:34;16706:18;;;16699:62;16797:26;16777:18;;;16770:54;16841:19;;28866:168:0;16446:420:1;28866:168:0;29047:21;29056:2;29060:7;29047:8;:21::i;:::-;28735:341;28665:411;;:::o;29892:339::-;30087:41;3655:10;30120:7;30087:18;:41::i;:::-;30079:103;;;;-1:-1:-1;;;30079:103:0;;;;;;;:::i;:::-;30195:28;30205:4;30211:2;30215:7;30195:9;:28::i;52813:141::-;4924:6;;-1:-1:-1;;;;;4924:6:0;3655:10;5071:23;5063:68;;;;-1:-1:-1;;;5063:68:0;;;;;;;:::i;:::-;52863:83:::1;::::0;52871:42:::1;::::0;52924:21:::1;52863:83:::0;::::1;;;::::0;::::1;::::0;;;52924:21;52871:42;52863:83;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;52813:141::o:0;52313:140::-;4924:6;;-1:-1:-1;;;;;4924:6:0;3655:10;5071:23;5063:68;;;;-1:-1:-1;;;5063:68:0;;;;;;;:::i;:::-;52401:14:::1;::::0;::::1;;52400:15;52392:24;;;::::0;::::1;;52427:18:::0;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;52313:140:::0;:::o;30302:185::-;30440:39;30457:4;30463:2;30467:7;30440:39;;;;;;;;;;;;:16;:39::i;27277:239::-;27349:7;27385:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27385:16:0;27420:19;27412:73;;;;-1:-1:-1;;;27412:73:0;;17484:2:1;27412:73:0;;;17466:21:1;17523:2;17503:18;;;17496:30;17562:34;17542:18;;;17535:62;-1:-1:-1;;;17613:18:1;;;17606:39;17662:19;;27412:73:0;17282:405:1;27007:208:0;27079:7;-1:-1:-1;;;;;27107:19:0;;27099:74;;;;-1:-1:-1;;;27099:74:0;;17073:2:1;27099:74:0;;;17055:21:1;17112:2;17092:18;;;17085:30;17151:34;17131:18;;;17124:62;-1:-1:-1;;;17202:18:1;;;17195:40;17252:19;;27099:74:0;16871:406:1;27099:74:0;-1:-1:-1;;;;;;27191:16:0;;;;;:9;:16;;;;;;;27007:208::o;5502:103::-;4924:6;;-1:-1:-1;;;;;4924:6:0;3655:10;5071:23;5063:68;;;;-1:-1:-1;;;5063:68:0;;;;;;;:::i;:::-;5567:30:::1;5594:1;5567:18;:30::i;:::-;5502:103::o:0;50679:572::-;50789:6;50797;49829:10;49843:9;49829:23;49821:38;;;;-1:-1:-1;;;49821:38:0;;;;;;;:::i;:::-;49327:2;49888:6;:27;;49968:28;49327:2;49968:26;:28::i;:::-;49923:94;;;;;;;;:::i;:::-;;;;;;;;;;;;;49880:139;;;;;-1:-1:-1;;;49880:139:0;;;;;;;;:::i;:::-;-1:-1:-1;50098:13:0;;50055:15;;50130:14;50122:56;;;;-1:-1:-1;;;50122:56:0;;;;;;;:::i;:::-;50219:7;50197:18;50209:6;50197:9;:18;:::i;:::-;:29;;:63;;;;-1:-1:-1;50241:19:0;:9;50253:7;50241:19;:::i;:::-;50230:7;:30;;50197:63;50189:94;;;;-1:-1:-1;;;50189:94:0;;;;;;;:::i;:::-;50821:6;50381:20:::1;49237:8;50821:6:::0;50381:20:::1;:::i;:::-;50368:9;:33;50360:64;;;::::0;-1:-1:-1;;;50360:64:0;;17894:2:1;50360:64:0::1;::::0;::::1;17876:21:1::0;17933:2;17913:18;;;17906:30;-1:-1:-1;;;17952:18:1;;;17945:49;18011:18;;50360:64:0::1;17692:343:1::0;50360:64:0::1;50939:6:::2;::::0;50848:87:::2;::::0;;::::2;;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;;;-1:-1:-1;;;;;50939:6:0;;::::2;::::0;50848:87:::2;::::0;50925:9;;;;;;50848:87;::::2;50925:9:::0;;;;50848:87;::::2;;::::0;::::2;::::0;;;;-1:-1:-1;;50858:32:0::2;::::0;;50869:10:::2;50858:32;::::0;::::2;11008:51:1::0;11075:18;;;11068:34;;;50848:68:0::2;::::0;-1:-1:-1;10981:18:1;;;-1:-1:-1;50858:32:0::2;;;;;;;;;;;;50848:43;;;;;;47531:58:::0;;9013:66:1;47531:58:0;;;9001:79:1;9096:12;;;9089:28;;;47398:7:0;;9133:12:1;;47531:58:0;;;;;;;;;;;;47521:69;;;;;;47514:76;;47329:269;;;;50848:68:::2;:76:::0;::::2;:87::i;:::-;-1:-1:-1::0;;;;;50848:97:0::2;;50840:135;;;::::0;-1:-1:-1;;;50840:135:0;;16293:2:1;50840:135:0::2;::::0;::::2;16275:21:1::0;16332:2;16312:18;;;16305:30;16371:28;16351:18;;;16344:56;16417:18;;50840:135:0::2;16091:350:1::0;50840:135:0::2;51014:10;50994:31;::::0;;;:19:::2;:31;::::0;;;;;51038:8;;50994:40:::2;::::0;51028:6;;50994:40:::2;:::i;:::-;:52;;51100:19;:8;:17;:19::i;:::-;51055:91;;;;;;;;:::i;:::-;;;;;;;;;;;;;50986:162;;;;;-1:-1:-1::0;;;50986:162:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;51179:10:0::2;51159:31;::::0;;;:19:::2;:31;::::0;;;;:41;;51194:6;;51159:31;:41:::2;::::0;51194:6;;51159:41:::2;:::i;:::-;::::0;;;-1:-1:-1;51213:30:0::2;::::0;-1:-1:-1;51224:10:0::2;51236:6:::0;51213:10:::2;:30::i;:::-;50294:1:::1;49810:493:::0;;50679:572;;;;;;:::o;50480:189::-;50531:6;50539:1;49829:10;49843:9;49829:23;49821:38;;;;-1:-1:-1;;;49821:38:0;;;;;;;:::i;:::-;49327:2;49888:6;:27;;49968:28;49327:2;49968:26;:28::i;:::-;49923:94;;;;;;;;:::i;:::-;;;;;;;;;;;;;49880:139;;;;;-1:-1:-1;;;49880:139:0;;;;;;;;:::i;:::-;-1:-1:-1;50098:13:0;;50055:15;;50130:14;50122:56;;;;-1:-1:-1;;;50122:56:0;;;;;;;:::i;:::-;50219:7;50197:18;50209:6;50197:9;:18;:::i;:::-;:29;;:63;;;;-1:-1:-1;50241:19:0;:9;50253:7;50241:19;:::i;:::-;50230:7;:30;;50197:63;50189:94;;;;-1:-1:-1;;;50189:94:0;;;;;;;:::i;:::-;50553:12:::1;::::0;-1:-1:-1;;;;;50553:12:0::1;:25;50579:10;49370:42;50597:20;49196:6;50597::::0;:20:::1;:::i;:::-;50553:65;::::0;-1:-1:-1;;;;;;50553:65:0::1;::::0;;;;;;-1:-1:-1;;;;;10219:15:1;;;50553:65:0::1;::::0;::::1;10201:34:1::0;10271:15;;;;10251:18;;;10244:43;10303:18;;;10296:34;10136:18;;50553:65:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;50631:30;50642:10;50654:6;50631:10;:30::i;:::-;49810:493:::0;;50480:189;;;:::o;27752:104::-;27808:13;27841:7;27834:14;;;;;:::i;52710:95::-;4924:6;;-1:-1:-1;;;;;4924:6:0;3655:10;5071:23;5063:68;;;;-1:-1:-1;;;5063:68:0;;;;;;;:::i;:::-;52781:6:::1;:16:::0;;-1:-1:-1;;;;;;52781:16:0::1;-1:-1:-1::0;;;;;52781:16:0;;;::::1;::::0;;;::::1;::::0;;52710:95::o;29435:155::-;29530:52;3655:10;29563:8;29573;29530:18;:52::i;52058:110::-;4924:6;;-1:-1:-1;;;;;4924:6:0;3655:10;5071:23;5063:68;;;;-1:-1:-1;;;5063:68:0;;;;;;;:::i;:::-;52135:13:::1;:25:::0;52058:110::o;52980:157::-;53068:15;;-1:-1:-1;;;;;53068:15:0;53054:10;:29;53046:38;;;;;;53095:34;53105:4;53110:10;53121:7;53095:9;:34::i;52461:110::-;4924:6;;-1:-1:-1;;;;;4924:6:0;3655:10;5071:23;5063:68;;;;-1:-1:-1;;;5063:68:0;;;;;;;:::i;:::-;52535:12:::1;:28:::0;;-1:-1:-1;;;;;;52535:28:0::1;-1:-1:-1::0;;;;;52535:28:0;;;::::1;::::0;;;::::1;::::0;;52461:110::o;30558:328::-;30733:41;3655:10;30766:7;30733:18;:41::i;:::-;30725:103;;;;-1:-1:-1;;;30725:103:0;;;;;;;:::i;:::-;30839:39;30853:4;30859:2;30863:7;30872:5;30839:13;:39::i;:::-;30558:328;;;;:::o;51754:275::-;32461:4;32485:16;;;:7;:16;;;;;;51815:13;;-1:-1:-1;;;;;32485:16:0;:30;;51901:18;:7;:16;:18::i;:::-;51874:65;;;;;;;;:::i;:::-;;;;;;;;;;;;;51841:100;;;;;-1:-1:-1;;;51841:100:0;;;;;;;;:::i;:::-;;51983:7;51992:18;:7;:16;:18::i;:::-;51966:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51952:69;;51754:275;;;:::o;52579:123::-;4924:6;;-1:-1:-1;;;;;4924:6:0;3655:10;5071:23;5063:68;;;;-1:-1:-1;;;5063:68:0;;;;;;;:::i;:::-;52660:15:::1;:34:::0;;-1:-1:-1;;;;;;52660:34:0::1;-1:-1:-1::0;;;;;52660:34:0;;;::::1;::::0;;;::::1;::::0;;52579:123::o;51259:149::-;51319:6;51327;49829:10;49843:9;49829:23;49821:38;;;;-1:-1:-1;;;49821:38:0;;;;;;;:::i;:::-;49327:2;49888:6;:27;;49968:28;49327:2;49968:26;:28::i;:::-;49923:94;;;;;;;;:::i;:::-;;;;;;;;;;;;;49880:139;;;;;-1:-1:-1;;;49880:139:0;;;;;;;;:::i;:::-;-1:-1:-1;50098:13:0;;50055:15;;50130:14;50122:56;;;;-1:-1:-1;;;50122:56:0;;;;;;;:::i;:::-;50219:7;50197:18;50209:6;50197:9;:18;:::i;:::-;:29;;:63;;;;-1:-1:-1;50241:19:0;:9;50253:7;50241:19;:::i;:::-;50230:7;:30;;50197:63;50189:94;;;;-1:-1:-1;;;50189:94:0;;;;;;;:::i;:::-;51351:6;50381:20:::1;49237:8;51351:6:::0;50381:20:::1;:::i;:::-;50368:9;:33;50360:64;;;::::0;-1:-1:-1;;;50360:64:0;;17894:2:1;50360:64:0::1;::::0;::::1;17876:21:1::0;17933:2;17913:18;;;17906:30;-1:-1:-1;;;17952:18:1;;;17945:49;18011:18;;50360:64:0::1;17692:343:1::0;50360:64:0::1;51370:30:::2;51381:10;51393:6;51370:10;:30::i;:::-;50294:1:::1;49810:493:::0;;51259:149;;;:::o;52217:88::-;4924:6;;-1:-1:-1;;;;;4924:6:0;3655:10;5071:23;5063:68;;;;-1:-1:-1;;;5063:68:0;;;;;;;:::i;:::-;52276:14:::1;:21:::0;;-1:-1:-1;;52276:21:0::1;52293:4;52276:21;::::0;;52217:88::o;5760:201::-;4924:6;;-1:-1:-1;;;;;4924:6:0;3655:10;5071:23;5063:68;;;;-1:-1:-1;;;5063:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5849:22:0;::::1;5841:73;;;::::0;-1:-1:-1;;;5841:73:0;;13266:2:1;5841:73:0::1;::::0;::::1;13248:21:1::0;13305:2;13285:18;;;13278:30;13344:34;13324:18;;;13317:62;-1:-1:-1;;;13395:18:1;;;13388:36;13441:19;;5841:73:0::1;13064:402:1::0;5841:73:0::1;5925:28;5944:8;5925:18;:28::i;36378:174::-:0;36453:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;36453:29:0;-1:-1:-1;;;;;36453:29:0;;;;;;;;:24;;36507:23;36453:24;36507:14;:23::i;:::-;-1:-1:-1;;;;;36498:46:0;;;;;;;;;;;36378:174;;:::o;32690:348::-;32783:4;32485:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32485:16:0;32800:73;;;;-1:-1:-1;;;32800:73:0;;15522:2:1;32800:73:0;;;15504:21:1;15561:2;15541:18;;;15534:30;15600:34;15580:18;;;15573:62;-1:-1:-1;;;15651:18:1;;;15644:42;15703:19;;32800:73:0;15320:408:1;32800:73:0;32884:13;32900:23;32915:7;32900:14;:23::i;:::-;32884:39;;32953:5;-1:-1:-1;;;;;32942:16:0;:7;-1:-1:-1;;;;;32942:16:0;;:51;;;;32986:7;-1:-1:-1;;;;;32962:31:0;:20;32974:7;32962:11;:20::i;:::-;-1:-1:-1;;;;;32962:31:0;;32942:51;:87;;;-1:-1:-1;;;;;;29782:25:0;;;29758:4;29782:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;32997:32;32934:96;32690:348;-1:-1:-1;;;;32690:348:0:o;35682:578::-;35841:4;-1:-1:-1;;;;;35814:31:0;:23;35829:7;35814:14;:23::i;:::-;-1:-1:-1;;;;;35814:31:0;;35806:85;;;;-1:-1:-1;;;35806:85:0;;19780:2:1;35806:85:0;;;19762:21:1;19819:2;19799:18;;;19792:30;19858:34;19838:18;;;19831:62;-1:-1:-1;;;19909:18:1;;;19902:39;19958:19;;35806:85:0;19578:405:1;35806:85:0;-1:-1:-1;;;;;35910:16:0;;35902:65;;;;-1:-1:-1;;;35902:65:0;;14360:2:1;35902:65:0;;;14342:21:1;14399:2;14379:18;;;14372:30;14438:34;14418:18;;;14411:62;-1:-1:-1;;;14489:18:1;;;14482:34;14533:19;;35902:65:0;14158:400:1;35902:65:0;36084:29;36101:1;36105:7;36084:8;:29::i;:::-;-1:-1:-1;;;;;36126:15:0;;;;;;:9;:15;;;;;:20;;36145:1;;36126:15;:20;;36145:1;;36126:20;:::i;:::-;;;;-1:-1:-1;;;;;;;36157:13:0;;;;;;:9;:13;;;;;:18;;36174:1;;36157:13;:18;;36174:1;;36157:18;:::i;:::-;;;;-1:-1:-1;;36186:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36186:21:0;-1:-1:-1;;;;;36186:21:0;;;;;;;;;36225:27;;36186:16;;36225:27;;;;;;;35682:578;;;:::o;6121:191::-;6214:6;;;-1:-1:-1;;;;;6231:17:0;;;-1:-1:-1;;;;;;6231:17:0;;;;;;;6264:40;;6214:6;;;6231:17;6214:6;;6264:40;;6195:16;;6264:40;6184:128;6121:191;:::o;23487:723::-;23543:13;23764:10;23760:53;;-1:-1:-1;;23791:10:0;;;;;;;;;;;;-1:-1:-1;;;23791:10:0;;;;;23487:723::o;23760:53::-;23838:5;23823:12;23879:78;23886:9;;23879:78;;23912:8;;;;:::i;:::-;;-1:-1:-1;23935:10:0;;-1:-1:-1;23943:2:0;23935:10;;:::i;:::-;;;23879:78;;;23967:19;23999:6;23989:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23989:17:0;;23967:39;;24017:154;24024:10;;24017:154;;24051:11;24061:1;24051:11;;:::i;:::-;;-1:-1:-1;24120:10:0;24128:2;24120:5;:10;:::i;:::-;24107:24;;:2;:24;:::i;:::-;24094:39;;24077:6;24084;24077:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;24077:56:0;;;;;;;;-1:-1:-1;24148:11:0;24157:2;24148:11;;:::i;:::-;;;24017:154;;43480:231;43558:7;43579:17;43598:18;43620:27;43631:4;43637:9;43620:10;:27::i;:::-;43578:69;;;;43658:18;43670:5;43658:11;:18::i;:::-;-1:-1:-1;43694:9:0;43480:231;-1:-1:-1;;;43480:231:0:o;51418:298::-;51497:11;;49280:4;51527:15;51536:6;51497:11;51527:15;:::i;:::-;:28;;51519:65;;;;-1:-1:-1;;;51519:65:0;;20190:2:1;51519:65:0;;;20172:21:1;20229:2;20209:18;;;20202:30;20268:26;20248:18;;;20241:54;20312:18;;51519:65:0;19988:348:1;51519:65:0;51608:1;51595:82;51616:6;51611:1;:11;51595:82;;51644:21;51650:2;51654:10;51663:1;51654:6;:10;:::i;:::-;51644:5;:21::i;:::-;51624:3;;;;:::i;:::-;;;;51595:82;;;;51702:6;51687:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;51418:298:0:o;36694:315::-;36849:8;-1:-1:-1;;;;;36840:17:0;:5;-1:-1:-1;;;;;36840:17:0;;;36832:55;;;;-1:-1:-1;;;36832:55:0;;14765:2:1;36832:55:0;;;14747:21:1;14804:2;14784:18;;;14777:30;14843:27;14823:18;;;14816:55;14888:18;;36832:55:0;14563:349:1;36832:55:0;-1:-1:-1;;;;;36898:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;36898:46:0;;;;;;;;;;36960:41;;11253::1;;;36960::0;;11226:18:1;36960:41:0;;;;;;;36694:315;;;:::o;31768:::-;31925:28;31935:4;31941:2;31945:7;31925:9;:28::i;:::-;31972:48;31995:4;32001:2;32005:7;32014:5;31972:22;:48::i;:::-;31964:111;;;;-1:-1:-1;;;31964:111:0;;;;;;;:::i;41370:1308::-;41451:7;41460:12;41685:9;:16;41705:2;41685:22;41681:990;;;41981:4;41966:20;;41960:27;42031:4;42016:20;;42010:27;42089:4;42074:20;;42068:27;41724:9;42060:36;42132:25;42143:4;42060:36;41960:27;42010;42132:10;:25::i;:::-;42125:32;;;;;;;;;41681:990;42179:9;:16;42199:2;42179:22;42175:496;;;42454:4;42439:20;;42433:27;42505:4;42490:20;;42484:27;42547:23;42558:4;42433:27;42484;42547:10;:23::i;:::-;42540:30;;;;;;;;42175:496;-1:-1:-1;42619:1:0;;-1:-1:-1;42623:35:0;42175:496;41370:1308;;;;;:::o;39641:643::-;39719:20;39710:5;:29;;;;;;;;:::i;:::-;;39706:571;;;39641:643;:::o;39706:571::-;39817:29;39808:5;:38;;;;;;;;:::i;:::-;;39804:473;;;39863:34;;-1:-1:-1;;;39863:34:0;;12134:2:1;39863:34:0;;;12116:21:1;12173:2;12153:18;;;12146:30;12212:26;12192:18;;;12185:54;12256:18;;39863:34:0;11932:348:1;39804:473:0;39928:35;39919:5;:44;;;;;;;;:::i;:::-;;39915:362;;;39980:41;;-1:-1:-1;;;39980:41:0;;12487:2:1;39980:41:0;;;12469:21:1;12526:2;12506:18;;;12499:30;12565:33;12545:18;;;12538:61;12616:18;;39980:41:0;12285:355:1;39915:362:0;40052:30;40043:5;:39;;;;;;;;:::i;:::-;;40039:238;;;40099:44;;-1:-1:-1;;;40099:44:0;;15119:2:1;40099:44:0;;;15101:21:1;15158:2;15138:18;;;15131:30;15197:34;15177:18;;;15170:62;-1:-1:-1;;;15248:18:1;;;15241:32;15290:19;;40099:44:0;14917:398:1;40039:238:0;40174:30;40165:5;:39;;;;;;;;:::i;:::-;;40161:116;;;40221:44;;-1:-1:-1;;;40221:44:0;;18242:2:1;40221:44:0;;;18224:21:1;18281:2;18261:18;;;18254:30;18320:34;18300:18;;;18293:62;-1:-1:-1;;;18371:18:1;;;18364:32;18413:19;;40221:44:0;18040:398:1;34374:382:0;-1:-1:-1;;;;;34454:16:0;;34446:61;;;;-1:-1:-1;;;34446:61:0;;18645:2:1;34446:61:0;;;18627:21:1;;;18664:18;;;18657:30;18723:34;18703:18;;;18696:62;18775:18;;34446:61:0;18443:356:1;34446:61:0;32461:4;32485:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32485:16:0;:30;34518:58;;;;-1:-1:-1;;;34518:58:0;;14003:2:1;34518:58:0;;;13985:21:1;14042:2;14022:18;;;14015:30;14081;14061:18;;;14054:58;14129:18;;34518:58:0;13801:352:1;34518:58:0;-1:-1:-1;;;;;34647:13:0;;;;;;:9;:13;;;;;:18;;34664:1;;34647:13;:18;;34664:1;;34647:18;:::i;:::-;;;;-1:-1:-1;;34676:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34676:21:0;-1:-1:-1;;;;;34676:21:0;;;;;;;;34715:33;;34676:16;;;34715:33;;34676:16;;34715:33;34374:382;;:::o;37574:799::-;37729:4;-1:-1:-1;;;;;37750:13:0;;7462:20;7510:8;37746:620;;37786:72;;-1:-1:-1;;;37786:72:0;;-1:-1:-1;;;;;37786:36:0;;;;;:72;;3655:10;;37837:4;;37843:7;;37852:5;;37786:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37786:72:0;;;;;;;;-1:-1:-1;;37786:72:0;;;;;;;;;;;;:::i;:::-;;;37782:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38028:13:0;;38024:272;;38071:60;;-1:-1:-1;;;38071:60:0;;;;;;;:::i;38024:272::-;38246:6;38240:13;38231:6;38227:2;38223:15;38216:38;37782:529;-1:-1:-1;;;;;;37909:51:0;-1:-1:-1;;;37909:51:0;;-1:-1:-1;37902:58:0;;37746:620;-1:-1:-1;38350:4:0;37574:799;;;;;;:::o;44979:1632::-;45110:7;;46044:66;46031:79;;46027:163;;;-1:-1:-1;46143:1:0;;-1:-1:-1;46147:30:0;46127:51;;46027:163;46204:1;:7;;46209:2;46204:7;;:18;;;;;46215:1;:7;;46220:2;46215:7;;46204:18;46200:102;;;-1:-1:-1;46255:1:0;;-1:-1:-1;46259:30:0;46239:51;;46200:102;46416:24;;;46399:14;46416:24;;;;;;;;;11532:25:1;;;11605:4;11593:17;;11573:18;;;11566:45;;;;11627:18;;;11620:34;;;11670:18;;;11663:34;;;46416:24:0;;11504:19:1;;46416:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46416:24:0;;-1:-1:-1;;46416:24:0;;;-1:-1:-1;;;;;;;46455:20:0;;46451:103;;46508:1;46512:29;46492:50;;;;;;;46451:103;46574:6;-1:-1:-1;46582:20:0;;-1:-1:-1;44979:1632:0;;;;;;;;:::o;43974:391::-;44088:7;;-1:-1:-1;;;;;44189:75:0;;44291:3;44287:12;;;44301:2;44283:21;44332:25;44343:4;44283:21;44352:1;44189:75;44332:10;:25::i;:::-;44325:32;;;;;;43974:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:247::-;709:6;762:2;750:9;741:7;737:23;733:32;730:52;;;778:1;775;768:12;730:52;817:9;804:23;836:31;861:5;836:31;:::i;:::-;886:5;650:247;-1:-1:-1;;;650:247:1:o;902:388::-;970:6;978;1031:2;1019:9;1010:7;1006:23;1002:32;999:52;;;1047:1;1044;1037:12;999:52;1086:9;1073:23;1105:31;1130:5;1105:31;:::i;:::-;1155:5;-1:-1:-1;1212:2:1;1197:18;;1184:32;1225:33;1184:32;1225:33;:::i;:::-;1277:7;1267:17;;;902:388;;;;;:::o;1295:456::-;1372:6;1380;1388;1441:2;1429:9;1420:7;1416:23;1412:32;1409:52;;;1457:1;1454;1447:12;1409:52;1496:9;1483:23;1515:31;1540:5;1515:31;:::i;:::-;1565:5;-1:-1:-1;1622:2:1;1607:18;;1594:32;1635:33;1594:32;1635:33;:::i;:::-;1295:456;;1687:7;;-1:-1:-1;;;1741:2:1;1726:18;;;;1713:32;;1295:456::o;1756:794::-;1851:6;1859;1867;1875;1928:3;1916:9;1907:7;1903:23;1899:33;1896:53;;;1945:1;1942;1935:12;1896:53;1984:9;1971:23;2003:31;2028:5;2003:31;:::i;:::-;2053:5;-1:-1:-1;2110:2:1;2095:18;;2082:32;2123:33;2082:32;2123:33;:::i;:::-;2175:7;-1:-1:-1;2229:2:1;2214:18;;2201:32;;-1:-1:-1;2284:2:1;2269:18;;2256:32;2311:18;2300:30;;2297:50;;;2343:1;2340;2333:12;2297:50;2366:22;;2419:4;2411:13;;2407:27;-1:-1:-1;2397:55:1;;2448:1;2445;2438:12;2397:55;2471:73;2536:7;2531:2;2518:16;2513:2;2509;2505:11;2471:73;:::i;:::-;2461:83;;;1756:794;;;;;;;:::o;2555:382::-;2620:6;2628;2681:2;2669:9;2660:7;2656:23;2652:32;2649:52;;;2697:1;2694;2687:12;2649:52;2736:9;2723:23;2755:31;2780:5;2755:31;:::i;:::-;2805:5;-1:-1:-1;2862:2:1;2847:18;;2834:32;2875:30;2834:32;2875:30;:::i;2942:315::-;3010:6;3018;3071:2;3059:9;3050:7;3046:23;3042:32;3039:52;;;3087:1;3084;3077:12;3039:52;3126:9;3113:23;3145:31;3170:5;3145:31;:::i;:::-;3195:5;3247:2;3232:18;;;;3219:32;;-1:-1:-1;;;2942:315:1:o;3262:245::-;3329:6;3382:2;3370:9;3361:7;3357:23;3353:32;3350:52;;;3398:1;3395;3388:12;3350:52;3430:9;3424:16;3449:28;3471:5;3449:28;:::i;3512:245::-;3570:6;3623:2;3611:9;3602:7;3598:23;3594:32;3591:52;;;3639:1;3636;3629:12;3591:52;3678:9;3665:23;3697:30;3721:5;3697:30;:::i;3762:249::-;3831:6;3884:2;3872:9;3863:7;3859:23;3855:32;3852:52;;;3900:1;3897;3890:12;3852:52;3932:9;3926:16;3951:30;3975:5;3951:30;:::i;4281:450::-;4350:6;4403:2;4391:9;4382:7;4378:23;4374:32;4371:52;;;4419:1;4416;4409:12;4371:52;4459:9;4446:23;4492:18;4484:6;4481:30;4478:50;;;4524:1;4521;4514:12;4478:50;4547:22;;4600:4;4592:13;;4588:27;-1:-1:-1;4578:55:1;;4629:1;4626;4619:12;4578:55;4652:73;4717:7;4712:2;4699:16;4694:2;4690;4686:11;4652:73;:::i;4736:180::-;4795:6;4848:2;4836:9;4827:7;4823:23;4819:32;4816:52;;;4864:1;4861;4854:12;4816:52;-1:-1:-1;4887:23:1;;4736:180;-1:-1:-1;4736:180:1:o;4921:727::-;5009:6;5017;5025;5033;5086:2;5074:9;5065:7;5061:23;5057:32;5054:52;;;5102:1;5099;5092:12;5054:52;5138:9;5125:23;5115:33;;5195:2;5184:9;5180:18;5167:32;5157:42;;5250:2;5239:9;5235:18;5222:32;5273:18;5314:2;5306:6;5303:14;5300:34;;;5330:1;5327;5320:12;5300:34;5368:6;5357:9;5353:22;5343:32;;5413:7;5406:4;5402:2;5398:13;5394:27;5384:55;;5435:1;5432;5425:12;5384:55;5475:2;5462:16;5501:2;5493:6;5490:14;5487:34;;;5517:1;5514;5507:12;5487:34;5562:7;5557:2;5548:6;5544:2;5540:15;5536:24;5533:37;5530:57;;;5583:1;5580;5573:12;5530:57;4921:727;;;;-1:-1:-1;;5614:2:1;5606:11;;-1:-1:-1;;;4921:727:1:o;5653:257::-;5694:3;5732:5;5726:12;5759:6;5754:3;5747:19;5775:63;5831:6;5824:4;5819:3;5815:14;5808:4;5801:5;5797:16;5775:63;:::i;:::-;5892:2;5871:15;-1:-1:-1;;5867:29:1;5858:39;;;;5899:4;5854:50;;5653:257;-1:-1:-1;;5653:257:1:o;5915:185::-;5957:3;5995:5;5989:12;6010:52;6055:6;6050:3;6043:4;6036:5;6032:16;6010:52;:::i;:::-;6078:16;;;;;5915:185;-1:-1:-1;;5915:185:1:o;6223:1301::-;6500:3;6529:1;6562:6;6556:13;6592:3;6614:1;6642:9;6638:2;6634:18;6624:28;;6702:2;6691:9;6687:18;6724;6714:61;;6768:4;6760:6;6756:17;6746:27;;6714:61;6794:2;6842;6834:6;6831:14;6811:18;6808:38;6805:165;;;-1:-1:-1;;;6869:33:1;;6925:4;6922:1;6915:15;6955:4;6876:3;6943:17;6805:165;6986:18;7013:104;;;;7131:1;7126:320;;;;6979:467;;7013:104;-1:-1:-1;;7046:24:1;;7034:37;;7091:16;;;;-1:-1:-1;7013:104:1;;7126:320;21764:1;21757:14;;;21801:4;21788:18;;7221:1;7235:165;7249:6;7246:1;7243:13;7235:165;;;7327:14;;7314:11;;;7307:35;7370:16;;;;7264:10;;7235:165;;;7239:3;;7429:6;7424:3;7420:16;7413:23;;6979:467;;;;;;;7462:56;7487:30;7513:3;7505:6;7487:30;:::i;:::-;-1:-1:-1;;;6165:20:1;;6210:1;6201:11;;6105:113;7462:56;7455:63;6223:1301;-1:-1:-1;;;;;6223:1301:1:o;7529:613::-;-1:-1:-1;;;7887:3:1;7880:39;7862:3;7948:6;7942:13;7964:62;8019:6;8014:2;8009:3;8005:12;7998:4;7990:6;7986:17;7964:62;:::i;:::-;-1:-1:-1;;;8085:2:1;8045:16;;;;8077:11;;;8070:39;-1:-1:-1;8133:2:1;8125:11;;7529:613;-1:-1:-1;7529:613:1:o;8147:619::-;-1:-1:-1;;;8505:3:1;8498:39;8480:3;8566:6;8560:13;8582:62;8637:6;8632:2;8627:3;8623:12;8616:4;8608:6;8604:17;8582:62;:::i;:::-;-1:-1:-1;;;8703:2:1;8663:16;;;;8695:11;;;8688:45;-1:-1:-1;8757:2:1;8749:11;;8147:619;-1:-1:-1;8147:619:1:o;9156:592::-;-1:-1:-1;;;9514:3:1;9507:21;9489:3;9557:6;9551:13;9573:61;9627:6;9623:1;9618:3;9614:11;9607:4;9599:6;9595:17;9573:61;:::i;:::-;-1:-1:-1;;;9693:1:1;9653:16;;;;9685:10;;;9678:37;-1:-1:-1;9739:2:1;9731:11;;9156:592;-1:-1:-1;9156:592:1:o;10341:488::-;-1:-1:-1;;;;;10610:15:1;;;10592:34;;10662:15;;10657:2;10642:18;;10635:43;10709:2;10694:18;;10687:34;;;10757:3;10752:2;10737:18;;10730:31;;;10535:4;;10778:45;;10803:19;;10795:6;10778:45;:::i;:::-;10770:53;10341:488;-1:-1:-1;;;;;;10341:488:1:o;11708:219::-;11857:2;11846:9;11839:21;11820:4;11877:44;11917:2;11906:9;11902:18;11894:6;11877:44;:::i;12645:414::-;12847:2;12829:21;;;12886:2;12866:18;;;12859:30;12925:34;12920:2;12905:18;;12898:62;-1:-1:-1;;;12991:2:1;12976:18;;12969:48;13049:3;13034:19;;12645:414::o;13471:325::-;13673:2;13655:21;;;13712:1;13692:18;;;13685:29;-1:-1:-1;;;13745:2:1;13730:18;;13723:32;13787:2;13772:18;;13471:325::o;15733:353::-;15935:2;15917:21;;;15974:2;15954:18;;;15947:30;16013:31;16008:2;15993:18;;15986:59;16077:2;16062:18;;15733:353::o;19217:356::-;19419:2;19401:21;;;19438:18;;;19431:30;19497:34;19492:2;19477:18;;19470:62;19564:2;19549:18;;19217:356::o;20341:343::-;20543:2;20525:21;;;20582:2;20562:18;;;20555:30;-1:-1:-1;;;20616:2:1;20601:18;;20594:49;20675:2;20660:18;;20341:343::o;21091:413::-;21293:2;21275:21;;;21332:2;21312:18;;;21305:30;21371:34;21366:2;21351:18;;21344:62;-1:-1:-1;;;21437:2:1;21422:18;;21415:47;21494:3;21479:19;;21091:413::o;21817:128::-;21857:3;21888:1;21884:6;21881:1;21878:13;21875:39;;;21894:18;;:::i;:::-;-1:-1:-1;21930:9:1;;21817:128::o;21950:120::-;21990:1;22016;22006:35;;22021:18;;:::i;:::-;-1:-1:-1;22055:9:1;;21950:120::o;22075:168::-;22115:7;22181:1;22177;22173:6;22169:14;22166:1;22163:21;22158:1;22151:9;22144:17;22140:45;22137:71;;;22188:18;;:::i;:::-;-1:-1:-1;22228:9:1;;22075:168::o;22248:125::-;22288:4;22316:1;22313;22310:8;22307:34;;;22321:18;;:::i;:::-;-1:-1:-1;22358:9:1;;22248:125::o;22378:258::-;22450:1;22460:113;22474:6;22471:1;22468:13;22460:113;;;22550:11;;;22544:18;22531:11;;;22524:39;22496:2;22489:10;22460:113;;;22591:6;22588:1;22585:13;22582:48;;;-1:-1:-1;;22626:1:1;22608:16;;22601:27;22378:258::o;22641:380::-;22720:1;22716:12;;;;22763;;;22784:61;;22838:4;22830:6;22826:17;22816:27;;22784:61;22891:2;22883:6;22880:14;22860:18;22857:38;22854:161;;;22937:10;22932:3;22928:20;22925:1;22918:31;22972:4;22969:1;22962:15;23000:4;22997:1;22990:15;22854:161;;22641:380;;;:::o;23026:135::-;23065:3;-1:-1:-1;;23086:17:1;;23083:43;;;23106:18;;:::i;:::-;-1:-1:-1;23153:1:1;23142:13;;23026:135::o;23166:112::-;23198:1;23224;23214:35;;23229:18;;:::i;:::-;-1:-1:-1;23263:9:1;;23166:112::o;23283:127::-;23344:10;23339:3;23335:20;23332:1;23325:31;23375:4;23372:1;23365:15;23399:4;23396:1;23389:15;23415:127;23476:10;23471:3;23467:20;23464:1;23457:31;23507:4;23504:1;23497:15;23531:4;23528:1;23521:15;23547:127;23608:10;23603:3;23599:20;23596:1;23589:31;23639:4;23636:1;23629:15;23663:4;23660:1;23653:15;23679:127;23740:10;23735:3;23731:20;23728:1;23721:31;23771:4;23768:1;23761:15;23795:4;23792:1;23785:15;23811:127;23872:10;23867:3;23863:20;23860:1;23853:31;23903:4;23900:1;23893:15;23927:4;23924:1;23917:15;23943:131;-1:-1:-1;;;;;24018:31:1;;24008:42;;23998:70;;24064:1;24061;24054:12;24079:118;24165:5;24158:13;24151:21;24144:5;24141:32;24131:60;;24187:1;24184;24177:12;24202:131;-1:-1:-1;;;;;;24276:32:1;;24266:43;;24256:71;;24323:1;24320;24313:12
Swarm Source
ipfs://a400086dc69444c943126800df743355c0663ee17fb29718c0f256cfd8605ed1
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.