Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Loading...
Loading
Contract Name:
KimJongPunks
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-01-19 */ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (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; } } // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // OpenZeppelin Contracts v4.4.0 (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); } // OpenZeppelin Contracts v4.4.0 (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; } // OpenZeppelin Contracts v4.4.0 (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); } // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // OpenZeppelin Contracts v4.4.0 (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); } // OpenZeppelin Contracts v4.4.0 (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; } } // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } pragma solidity ^0.8.6; library Address { function isContract(address account) internal view returns (bool) { uint size; assembly { size := extcodesize(account) } return size > 0; } } // OpenZeppelin Contracts v4.4.0 (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); } } pragma solidity ^0.8.7; abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; string private _name; string private _symbol; // Mapping from token ID to owner address address[] internal _owners; mapping(uint256 => address) private _tokenApprovals; 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 (uint) { require(owner != address(0), "ERC721: balance query for the zero address"); uint count; for( uint i; i < _owners.length; ++i ){ if( owner == _owners[i] ) ++count; } return count; } /** * @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 {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 { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return tokenId < _owners.length && _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); _owners.push(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); _owners[tokenId] = address(0); 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); _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 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 {} } pragma solidity ^0.8.7; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account but rips out the core of the gas-wasting processing that comes from OpenZeppelin. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _owners.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < _owners.length, "ERC721Enumerable: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256 tokenId) { require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); uint count; for(uint i; i < _owners.length; i++){ if(owner == _owners[i]){ if(count == index) return i; else count++; } } revert("ERC721Enumerable: owner index out of bounds"); } } // OpenZeppelin Contracts v4.4.0 (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); } } pragma solidity ^0.8.11; pragma abicoder v2; contract KimJongPunks is ERC721Enumerable, Ownable, ReentrancyGuard { using SafeMath for uint256; string public uriSuffix = ".json"; string public hiddenMetadataUri; mapping(address => uint256) private freeKimAllowance; bool public saleIsActive = false; bool public revealed = false; string public final_provenance = ""; address public proxyRegistryAddress; mapping(address => bool) public projectProxy; string public baseURI; uint256 public TOKEN_PRICE = 0.0123 ether; uint256 public MAX_TXN_KIM_PURCHASE = 20; uint256 public constant MAX_KIMS = 3333; uint256 public RESERVED_KIMS = 100; uint256 public constant MAX_FREE_PER_USER_KIMS = 10; uint256 public FREE_KIMS = 333; uint256 public MINTED_FREE_KIMS = 0; constructor() ERC721("Kim Jong Punks", "KimJongPunks") { setHiddenMetadataUri("ipfs://QmeW19ky5uTzC9bATgdnhnNDQdZuVBmmubDgRJ7oCpqgha/hidden.json"); proxyRegistryAddress = address(0xa5409ec958C83C3f309868babACA7c86DCB077c1); } function setProxyRegistryAddress(address _proxyRegistryAddress) external onlyOwner { proxyRegistryAddress = _proxyRegistryAddress; } function flipProxyState(address proxyAddress) public onlyOwner { projectProxy[proxyAddress] = !projectProxy[proxyAddress]; } function withdraw() public onlyOwner nonReentrant { uint256 balance = address(this).balance; require(balance > 0); (bool ownerSuccess, ) = _msgSender().call{value: address(this).balance}(""); require(ownerSuccess, "Failed to send to Owner."); } function setProvenanceHash(string memory provenanceHash) public onlyOwner { final_provenance = provenanceHash; } function setRevealed(bool _state) public onlyOwner { revealed = _state; } function setCost(uint256 _cost) public onlyOwner { TOKEN_PRICE = _cost; } function setFreeKims(uint256 _free) public onlyOwner { FREE_KIMS = _free; } function setReserved(uint256 _reserved) public onlyOwner { RESERVED_KIMS = _reserved; } function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner { MAX_TXN_KIM_PURCHASE = _maxMintAmountPerTx; } function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner { hiddenMetadataUri = _hiddenMetadataUri; } function setBaseURI(string memory _baseURI) public onlyOwner { baseURI = _baseURI; } function flipSaleState(bool _state) public onlyOwner { saleIsActive = _state; } function tokensOfOwner(address _owner) external view returns(uint256[] memory ) { uint256 tokenCount = balanceOf(_owner); if (tokenCount == 0) { // Return an empty array return new uint256[](0); } else { uint256[] memory result = new uint256[](tokenCount); uint256 index; for (index = 0; index < tokenCount; index++) { result[index] = tokenOfOwnerByIndex(_owner, index); } return result; } } function freeMint(uint256 numberOfTokens) public nonReentrant { require(saleIsActive, "Sale must be active to mint"); require(freeKimAllowance[msg.sender].add(numberOfTokens) < MAX_FREE_PER_USER_KIMS + 1, "Your mint would exceed the total of 10 Kims allowed for free."); require(MINTED_FREE_KIMS.add(numberOfTokens) < FREE_KIMS + 1 && totalSupply().add(numberOfTokens) < MAX_KIMS - RESERVED_KIMS + 1, "Purchase would exceed free supply"); for(uint i = 0; i < numberOfTokens; i++) { _safeMint(msg.sender, totalSupply()); } freeKimAllowance[msg.sender] += numberOfTokens; MINTED_FREE_KIMS += numberOfTokens; } function mintToken(uint256 numberOfTokens) public payable nonReentrant { require(saleIsActive, "Sale must be active to mint"); require(numberOfTokens > 0, "Must mint more than 0 tokens."); require(numberOfTokens < MAX_TXN_KIM_PURCHASE + 1, "You can only mint 20 Kims per transaction."); require(totalSupply().add(numberOfTokens) < MAX_KIMS - RESERVED_KIMS + 1, "Purchase would exceed max supply"); require(msg.value == TOKEN_PRICE.mul(numberOfTokens), "Ether value sent is not correct"); for(uint256 i = 0; i < numberOfTokens; i++) { _safeMint(msg.sender, totalSupply()); } } function airdrop(uint256 _mintAmount, address _receiver) public onlyOwner { for(uint256 i = 0; i < _mintAmount; i++) { _safeMint(_receiver, totalSupply()); } } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token"); if (revealed == false) { return hiddenMetadataUri; } string memory currentBaseURI = baseURI; return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, Strings.toString(_tokenId), uriSuffix)) : ""; } function isApprovedForAll(address _owner, address operator) public view override returns (bool) { OpenSeaProxyRegistry proxyRegistry = OpenSeaProxyRegistry(proxyRegistryAddress); if (address(proxyRegistry.proxies(_owner)) == operator || projectProxy[operator]) return true; return super.isApprovedForAll(_owner, operator); } } contract OwnableDelegateProxy {} contract OpenSeaProxyRegistry { mapping(address => OwnableDelegateProxy) public proxies; }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"FREE_KIMS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FREE_PER_USER_KIMS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_KIMS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TXN_KIM_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTED_FREE_KIMS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED_KIMS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"airdrop","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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"final_provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"proxyAddress","type":"address"}],"name":"flipProxyState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintToken","outputs":[],"stateMutability":"payable","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":[{"internalType":"address","name":"","type":"address"}],"name":"projectProxy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_free","type":"uint256"}],"name":"setFreeKims","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"name":"setProxyRegistryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reserved","type":"uint256"}],"name":"setReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040526005608081905264173539b7b760d91b60a090815262000028916007919062000236565b50600a805461ffff191690556040805160208101918290526000908190526200005491600b9162000236565b50662bb2c8eabcc000600f556014601055606460115561014d60125560006013553480156200008257600080fd5b50604080518082018252600e81526d4b696d204a6f6e672050756e6b7360901b60208083019182528351808501909452600c84526b4b696d4a6f6e6750756e6b7360a01b908401528151919291620000dd9160009162000236565b508051620000f390600190602084019062000236565b505050620001106200010a6200016860201b60201c565b6200016c565b60016006819055506200013c60405180608001604052806041815260200162002eb560419139620001be565b600c80546001600160a01b03191673a5409ec958c83c3f309868babaca7c86dcb077c117905562000319565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005546001600160a01b031633146200021d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b80516200023290600890602084019062000236565b5050565b8280546200024490620002dc565b90600052602060002090601f016020900481019282620002685760008555620002b3565b82601f106200028357805160ff1916838001178555620002b3565b82800160010185558215620002b3579182015b82811115620002b357825182559160200191906001019062000296565b50620002c1929150620002c5565b5090565b5b80821115620002c15760008155600101620002c6565b600181811c90821680620002f157607f821691505b602082108114156200031357634e487b7160e01b600052602260045260246000fd5b50919050565b612b8c80620003296000396000f3fe6080604052600436106102c95760003560e01c806376b7f09111610175578063bc63f02e116100dc578063d26ea6c011610095578063e985e9c51161006f578063e985e9c514610837578063eb8d244414610857578063f2fde38b14610871578063f73c814b1461089157600080fd5b8063d26ea6c0146107e1578063d2d8cb6714610801578063e0a808531461081757600080fd5b8063bc63f02e14610742578063bd1f906414610762578063c634d03214610778578063c7611c091461078b578063c87b56dd146107a1578063cd7c0326146107c157600080fd5b806395d89b411161012e57806395d89b41146106a3578063a22cb465146106b8578063a45ba8e7146106d8578063b071401b146106ed578063b2462be51461070d578063b88d4fde1461072257600080fd5b806376b7f091146105f75780637c928fe91461060c5780637cc54a961461062c5780638043bbd8146106425780638462151c146106585780638da5cb5b1461068557600080fd5b806344a0d68a1161023457806356757250116101ed5780636c0360eb116101c75780636c0360eb1461059757806370a08231146105ac578063715018a6146105cc57806371b5d850146105e157600080fd5b806356757250146105275780635bab26e2146105475780636352211e1461057757600080fd5b806344a0d68a146104735780634f6ccce7146104935780634fdd43cb146104b357806351830227146104d35780635503a0e8146104f257806355f804b31461050757600080fd5b806323b872dd1161028657806323b872dd146103be5780632b07d76e146103de5780632d6e71b6146103fe5780632f745c591461041e5780633ccfd60b1461043e57806342842e0e1461045357600080fd5b806301ffc9a7146102ce57806306fdde0314610303578063081812fc14610325578063095ea7b31461035d578063109695231461037f57806318160ddd1461039f575b600080fd5b3480156102da57600080fd5b506102ee6102e936600461241d565b6108b1565b60405190151581526020015b60405180910390f35b34801561030f57600080fd5b506103186108dc565b6040516102fa9190612492565b34801561033157600080fd5b506103456103403660046124a5565b61096e565b6040516001600160a01b0390911681526020016102fa565b34801561036957600080fd5b5061037d6103783660046124d3565b6109fb565b005b34801561038b57600080fd5b5061037d61039a36600461258b565b610b11565b3480156103ab57600080fd5b506002545b6040519081526020016102fa565b3480156103ca57600080fd5b5061037d6103d93660046125d4565b610b52565b3480156103ea57600080fd5b5061037d6103f936600461262a565b610b83565b34801561040a57600080fd5b5061037d6104193660046124a5565b610bc0565b34801561042a57600080fd5b506103b06104393660046124d3565b610bef565b34801561044a57600080fd5b5061037d610ca2565b34801561045f57600080fd5b5061037d61046e3660046125d4565b610da0565b34801561047f57600080fd5b5061037d61048e3660046124a5565b610dbb565b34801561049f57600080fd5b506103b06104ae3660046124a5565b610dea565b3480156104bf57600080fd5b5061037d6104ce36600461258b565b610e57565b3480156104df57600080fd5b50600a546102ee90610100900460ff1681565b3480156104fe57600080fd5b50610318610e94565b34801561051357600080fd5b5061037d61052236600461258b565b610f22565b34801561053357600080fd5b5061037d6105423660046124a5565b610f5f565b34801561055357600080fd5b506102ee610562366004612645565b600d6020526000908152604090205460ff1681565b34801561058357600080fd5b506103456105923660046124a5565b610f8e565b3480156105a357600080fd5b5061031861101a565b3480156105b857600080fd5b506103b06105c7366004612645565b611027565b3480156105d857600080fd5b5061037d6110f5565b3480156105ed57600080fd5b506103b060115481565b34801561060357600080fd5b506103b0600a81565b34801561061857600080fd5b5061037d6106273660046124a5565b61112b565b34801561063857600080fd5b506103b060125481565b34801561064e57600080fd5b506103b060135481565b34801561066457600080fd5b50610678610673366004612645565b61135b565b6040516102fa9190612662565b34801561069157600080fd5b506005546001600160a01b0316610345565b3480156106af57600080fd5b5061031861141a565b3480156106c457600080fd5b5061037d6106d33660046126a6565b611429565b3480156106e457600080fd5b506103186114ee565b3480156106f957600080fd5b5061037d6107083660046124a5565b6114fb565b34801561071957600080fd5b5061031861152a565b34801561072e57600080fd5b5061037d61073d3660046126db565b611537565b34801561074e57600080fd5b5061037d61075d36600461275b565b61156f565b34801561076e57600080fd5b506103b060105481565b61037d6107863660046124a5565b6115c3565b34801561079757600080fd5b506103b0610d0581565b3480156107ad57600080fd5b506103186107bc3660046124a5565b6117f5565b3480156107cd57600080fd5b50600c54610345906001600160a01b031681565b3480156107ed57600080fd5b5061037d6107fc366004612645565b6119e7565b34801561080d57600080fd5b506103b0600f5481565b34801561082357600080fd5b5061037d61083236600461262a565b611a33565b34801561084357600080fd5b506102ee61085236600461278b565b611a77565b34801561086357600080fd5b50600a546102ee9060ff1681565b34801561087d57600080fd5b5061037d61088c366004612645565b611b5b565b34801561089d57600080fd5b5061037d6108ac366004612645565b611bf6565b60006001600160e01b0319821663780e9d6360e01b14806108d657506108d682611c49565b92915050565b6060600080546108eb906127b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610917906127b9565b80156109645780601f1061093957610100808354040283529160200191610964565b820191906000526020600020905b81548152906001019060200180831161094757829003601f168201915b5050505050905090565b600061097982611c99565b6109df5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b6000610a0682610f8e565b9050806001600160a01b0316836001600160a01b03161415610a745760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109d6565b336001600160a01b0382161480610a905750610a908133611a77565b610b025760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109d6565b610b0c8383611ce3565b505050565b6005546001600160a01b03163314610b3b5760405162461bcd60e51b81526004016109d6906127ee565b8051610b4e90600b906020840190612377565b5050565b610b5c3382611d51565b610b785760405162461bcd60e51b81526004016109d690612823565b610b0c838383611e13565b6005546001600160a01b03163314610bad5760405162461bcd60e51b81526004016109d6906127ee565b600a805460ff1916911515919091179055565b6005546001600160a01b03163314610bea5760405162461bcd60e51b81526004016109d6906127ee565b601155565b6000610bfa83611027565b8210610c185760405162461bcd60e51b81526004016109d690612874565b6000805b600254811015610c895760028181548110610c3957610c396128bf565b6000918252602090912001546001600160a01b0386811691161415610c775783821415610c695791506108d69050565b81610c73816128eb565b9250505b80610c81816128eb565b915050610c1c565b5060405162461bcd60e51b81526004016109d690612874565b6005546001600160a01b03163314610ccc5760405162461bcd60e51b81526004016109d6906127ee565b60026006541415610cef5760405162461bcd60e51b81526004016109d690612906565b60026006554780610cff57600080fd5b604051600090339047908381818185875af1925050503d8060008114610d41576040519150601f19603f3d011682016040523d82523d6000602084013e610d46565b606091505b5050905080610d975760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f2073656e6420746f204f776e65722e000000000000000060448201526064016109d6565b50506001600655565b610b0c83838360405180602001604052806000815250611537565b6005546001600160a01b03163314610de55760405162461bcd60e51b81526004016109d6906127ee565b600f55565b6002546000908210610e535760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109d6565b5090565b6005546001600160a01b03163314610e815760405162461bcd60e51b81526004016109d6906127ee565b8051610b4e906008906020840190612377565b60078054610ea1906127b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610ecd906127b9565b8015610f1a5780601f10610eef57610100808354040283529160200191610f1a565b820191906000526020600020905b815481529060010190602001808311610efd57829003601f168201915b505050505081565b6005546001600160a01b03163314610f4c5760405162461bcd60e51b81526004016109d6906127ee565b8051610b4e90600e906020840190612377565b6005546001600160a01b03163314610f895760405162461bcd60e51b81526004016109d6906127ee565b601255565b60008060028381548110610fa457610fa46128bf565b6000918252602090912001546001600160a01b03169050806108d65760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109d6565b600e8054610ea1906127b9565b60006001600160a01b0382166110925760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109d6565b6000805b6002548110156110ee57600281815481106110b3576110b36128bf565b6000918252602090912001546001600160a01b03858116911614156110de576110db826128eb565b91505b6110e7816128eb565b9050611096565b5092915050565b6005546001600160a01b0316331461111f5760405162461bcd60e51b81526004016109d6906127ee565b6111296000611f69565b565b6002600654141561114e5760405162461bcd60e51b81526004016109d690612906565b6002600655600a5460ff166111a55760405162461bcd60e51b815260206004820152601b60248201527f53616c65206d7573742062652061637469766520746f206d696e74000000000060448201526064016109d6565b6111b1600a600161293d565b336000908152600960205260409020546111cb9083611fbb565b1061123e5760405162461bcd60e51b815260206004820152603d60248201527f596f7572206d696e7420776f756c64206578636565642074686520746f74616c60448201527f206f66203130204b696d7320616c6c6f77656420666f7220667265652e00000060648201526084016109d6565b60125461124c90600161293d565b6013546112599083611fbb565b108015611290575060115461127090610d05612955565b61127b90600161293d565b61128e8261128860025490565b90611fbb565b105b6112e65760405162461bcd60e51b815260206004820152602160248201527f507572636861736520776f756c6420657863656564206672656520737570706c6044820152607960f81b60648201526084016109d6565b60005b8181101561131557611303336112fe60025490565b611fc7565b8061130d816128eb565b9150506112e9565b50336000908152600960205260408120805483929061133590849061293d565b92505081905550806013600082825461134e919061293d565b9091555050600160065550565b6060600061136883611027565b9050806113895760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff8111156113a4576113a46124ff565b6040519080825280602002602001820160405280156113cd578160200160208202803683370190505b50905060005b82811015611381576113e58582610bef565b8282815181106113f7576113f76128bf565b60209081029190910101528061140c816128eb565b9150506113d3565b50919050565b6060600180546108eb906127b9565b6001600160a01b0382163314156114825760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109d6565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60088054610ea1906127b9565b6005546001600160a01b031633146115255760405162461bcd60e51b81526004016109d6906127ee565b601055565b600b8054610ea1906127b9565b6115413383611d51565b61155d5760405162461bcd60e51b81526004016109d690612823565b61156984848484611fe1565b50505050565b6005546001600160a01b031633146115995760405162461bcd60e51b81526004016109d6906127ee565b60005b82811015610b0c576115b1826112fe60025490565b806115bb816128eb565b91505061159c565b600260065414156115e65760405162461bcd60e51b81526004016109d690612906565b6002600655600a5460ff1661163d5760405162461bcd60e51b815260206004820152601b60248201527f53616c65206d7573742062652061637469766520746f206d696e74000000000060448201526064016109d6565b6000811161168d5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206d696e74206d6f7265207468616e203020746f6b656e732e00000060448201526064016109d6565b60105461169b90600161293d565b81106116fc5760405162461bcd60e51b815260206004820152602a60248201527f596f752063616e206f6e6c79206d696e74203230204b696d732070657220747260448201526930b739b0b1ba34b7b71760b11b60648201526084016109d6565b60115461170b90610d05612955565b61171690600161293d565b6117238261128860025490565b106117705760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c7960448201526064016109d6565b600f5461177d9082612014565b34146117cb5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563740060448201526064016109d6565b60005b81811015610d97576117e3336112fe60025490565b806117ed816128eb565b9150506117ce565b606061180082611c99565b6118645760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109d6565b600a54610100900460ff166119055760088054611880906127b9565b80601f01602080910402602001604051908101604052809291908181526020018280546118ac906127b9565b80156118f95780601f106118ce576101008083540402835291602001916118f9565b820191906000526020600020905b8154815290600101906020018083116118dc57829003601f168201915b50505050509050919050565b6000600e8054611914906127b9565b80601f0160208091040260200160405190810160405280929190818152602001828054611940906127b9565b801561198d5780601f106119625761010080835404028352916020019161198d565b820191906000526020600020905b81548152906001019060200180831161197057829003601f168201915b5050505050905060008151116119b257604051806020016040528060008152506119e0565b806119bc84612020565b60076040516020016119d09392919061296c565b6040516020818303038152906040525b9392505050565b6005546001600160a01b03163314611a115760405162461bcd60e51b81526004016109d6906127ee565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611a5d5760405162461bcd60e51b81526004016109d6906127ee565b600a80549115156101000261ff0019909216919091179055565b600c5460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa158015611ac9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aed9190612a30565b6001600160a01b03161480611b1a57506001600160a01b0383166000908152600d602052604090205460ff165b15611b295760019150506108d6565b6001600160a01b0380851660009081526004602090815260408083209387168352929052205460ff165b949350505050565b6005546001600160a01b03163314611b855760405162461bcd60e51b81526004016109d6906127ee565b6001600160a01b038116611bea5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109d6565b611bf381611f69565b50565b6005546001600160a01b03163314611c205760405162461bcd60e51b81526004016109d6906127ee565b6001600160a01b03166000908152600d60205260409020805460ff19811660ff90911615179055565b60006001600160e01b031982166380ac58cd60e01b1480611c7a57506001600160e01b03198216635b5e139f60e01b145b806108d657506301ffc9a760e01b6001600160e01b03198316146108d6565b600254600090821080156108d6575060006001600160a01b031660028381548110611cc657611cc66128bf565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d1882610f8e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d5c82611c99565b611dbd5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109d6565b6000611dc883610f8e565b9050806001600160a01b0316846001600160a01b03161480611e035750836001600160a01b0316611df88461096e565b6001600160a01b0316145b80611b535750611b538185611a77565b826001600160a01b0316611e2682610f8e565b6001600160a01b031614611e8e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016109d6565b6001600160a01b038216611ef05760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109d6565b611efb600082611ce3565b8160028281548110611f0f57611f0f6128bf565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006119e0828461293d565b610b4e82826040518060200160405280600081525061211e565b611fec848484611e13565b611ff884848484612151565b6115695760405162461bcd60e51b81526004016109d690612a4d565b60006119e08284612a9f565b6060816120445750506040805180820190915260018152600360fc1b602082015290565b8160005b811561206e5780612058816128eb565b91506120679050600a83612ad4565b9150612048565b60008167ffffffffffffffff811115612089576120896124ff565b6040519080825280601f01601f1916602001820160405280156120b3576020820181803683370190505b5090505b8415611b53576120c8600183612955565b91506120d5600a86612ae8565b6120e090603061293d565b60f81b8183815181106120f5576120f56128bf565b60200101906001600160f81b031916908160001a905350612117600a86612ad4565b94506120b7565b612128838361224f565b6121356000848484612151565b610b0c5760405162461bcd60e51b81526004016109d690612a4d565b60006001600160a01b0384163b1561224457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612195903390899088908890600401612afc565b6020604051808303816000875af19250505080156121d0575060408051601f3d908101601f191682019092526121cd91810190612b39565b60015b61222a573d8080156121fe576040519150601f19603f3d011682016040523d82523d6000602084013e612203565b606091505b5080516122225760405162461bcd60e51b81526004016109d690612a4d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b53565b506001949350505050565b6001600160a01b0382166122a55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109d6565b6122ae81611c99565b156122fb5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109d6565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612383906127b9565b90600052602060002090601f0160209004810192826123a557600085556123eb565b82601f106123be57805160ff19168380011785556123eb565b828001600101855582156123eb579182015b828111156123eb5782518255916020019190600101906123d0565b50610e539291505b80821115610e5357600081556001016123f3565b6001600160e01b031981168114611bf357600080fd5b60006020828403121561242f57600080fd5b81356119e081612407565b60005b8381101561245557818101518382015260200161243d565b838111156115695750506000910152565b6000815180845261247e81602086016020860161243a565b601f01601f19169290920160200192915050565b6020815260006119e06020830184612466565b6000602082840312156124b757600080fd5b5035919050565b6001600160a01b0381168114611bf357600080fd5b600080604083850312156124e657600080fd5b82356124f1816124be565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612530576125306124ff565b604051601f8501601f19908116603f01168101908282118183101715612558576125586124ff565b8160405280935085815286868601111561257157600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561259d57600080fd5b813567ffffffffffffffff8111156125b457600080fd5b8201601f810184136125c557600080fd5b611b5384823560208401612515565b6000806000606084860312156125e957600080fd5b83356125f4816124be565b92506020840135612604816124be565b929592945050506040919091013590565b8035801515811461262557600080fd5b919050565b60006020828403121561263c57600080fd5b6119e082612615565b60006020828403121561265757600080fd5b81356119e0816124be565b6020808252825182820181905260009190848201906040850190845b8181101561269a5783518352928401929184019160010161267e565b50909695505050505050565b600080604083850312156126b957600080fd5b82356126c4816124be565b91506126d260208401612615565b90509250929050565b600080600080608085870312156126f157600080fd5b84356126fc816124be565b9350602085013561270c816124be565b925060408501359150606085013567ffffffffffffffff81111561272f57600080fd5b8501601f8101871361274057600080fd5b61274f87823560208401612515565b91505092959194509250565b6000806040838503121561276e57600080fd5b823591506020830135612780816124be565b809150509250929050565b6000806040838503121561279e57600080fd5b82356127a9816124be565b91506020830135612780816124be565b600181811c908216806127cd57607f821691505b6020821081141561141457634e487b7160e01b600052602260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156128ff576128ff6128d5565b5060010190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115612950576129506128d5565b500190565b600082821015612967576129676128d5565b500390565b60008451602061297f8285838a0161243a565b8551918401916129928184848a0161243a565b8554920191600090600181811c90808316806129af57607f831692505b8583108114156129cd57634e487b7160e01b85526022600452602485fd5b8080156129e157600181146129f257612a1f565b60ff19851688528388019550612a1f565b60008b81526020902060005b85811015612a175781548a8201529084019088016129fe565b505083880195505b50939b9a5050505050505050505050565b600060208284031215612a4257600080fd5b81516119e0816124be565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000816000190483118215151615612ab957612ab96128d5565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612ae357612ae3612abe565b500490565b600082612af757612af7612abe565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b2f90830184612466565b9695505050505050565b600060208284031215612b4b57600080fd5b81516119e08161240756fea2646970667358221220636de106f87b4fa9f05bb0b109eaf17b3e7858b6d7bd7b411d9d917e286b64a464736f6c634300080b0033697066733a2f2f516d655731396b793575547a433962415467646e686e4e4451645a7556426d6d75624467524a376f4370716768612f68696464656e2e6a736f6e
Deployed Bytecode
0x6080604052600436106102c95760003560e01c806376b7f09111610175578063bc63f02e116100dc578063d26ea6c011610095578063e985e9c51161006f578063e985e9c514610837578063eb8d244414610857578063f2fde38b14610871578063f73c814b1461089157600080fd5b8063d26ea6c0146107e1578063d2d8cb6714610801578063e0a808531461081757600080fd5b8063bc63f02e14610742578063bd1f906414610762578063c634d03214610778578063c7611c091461078b578063c87b56dd146107a1578063cd7c0326146107c157600080fd5b806395d89b411161012e57806395d89b41146106a3578063a22cb465146106b8578063a45ba8e7146106d8578063b071401b146106ed578063b2462be51461070d578063b88d4fde1461072257600080fd5b806376b7f091146105f75780637c928fe91461060c5780637cc54a961461062c5780638043bbd8146106425780638462151c146106585780638da5cb5b1461068557600080fd5b806344a0d68a1161023457806356757250116101ed5780636c0360eb116101c75780636c0360eb1461059757806370a08231146105ac578063715018a6146105cc57806371b5d850146105e157600080fd5b806356757250146105275780635bab26e2146105475780636352211e1461057757600080fd5b806344a0d68a146104735780634f6ccce7146104935780634fdd43cb146104b357806351830227146104d35780635503a0e8146104f257806355f804b31461050757600080fd5b806323b872dd1161028657806323b872dd146103be5780632b07d76e146103de5780632d6e71b6146103fe5780632f745c591461041e5780633ccfd60b1461043e57806342842e0e1461045357600080fd5b806301ffc9a7146102ce57806306fdde0314610303578063081812fc14610325578063095ea7b31461035d578063109695231461037f57806318160ddd1461039f575b600080fd5b3480156102da57600080fd5b506102ee6102e936600461241d565b6108b1565b60405190151581526020015b60405180910390f35b34801561030f57600080fd5b506103186108dc565b6040516102fa9190612492565b34801561033157600080fd5b506103456103403660046124a5565b61096e565b6040516001600160a01b0390911681526020016102fa565b34801561036957600080fd5b5061037d6103783660046124d3565b6109fb565b005b34801561038b57600080fd5b5061037d61039a36600461258b565b610b11565b3480156103ab57600080fd5b506002545b6040519081526020016102fa565b3480156103ca57600080fd5b5061037d6103d93660046125d4565b610b52565b3480156103ea57600080fd5b5061037d6103f936600461262a565b610b83565b34801561040a57600080fd5b5061037d6104193660046124a5565b610bc0565b34801561042a57600080fd5b506103b06104393660046124d3565b610bef565b34801561044a57600080fd5b5061037d610ca2565b34801561045f57600080fd5b5061037d61046e3660046125d4565b610da0565b34801561047f57600080fd5b5061037d61048e3660046124a5565b610dbb565b34801561049f57600080fd5b506103b06104ae3660046124a5565b610dea565b3480156104bf57600080fd5b5061037d6104ce36600461258b565b610e57565b3480156104df57600080fd5b50600a546102ee90610100900460ff1681565b3480156104fe57600080fd5b50610318610e94565b34801561051357600080fd5b5061037d61052236600461258b565b610f22565b34801561053357600080fd5b5061037d6105423660046124a5565b610f5f565b34801561055357600080fd5b506102ee610562366004612645565b600d6020526000908152604090205460ff1681565b34801561058357600080fd5b506103456105923660046124a5565b610f8e565b3480156105a357600080fd5b5061031861101a565b3480156105b857600080fd5b506103b06105c7366004612645565b611027565b3480156105d857600080fd5b5061037d6110f5565b3480156105ed57600080fd5b506103b060115481565b34801561060357600080fd5b506103b0600a81565b34801561061857600080fd5b5061037d6106273660046124a5565b61112b565b34801561063857600080fd5b506103b060125481565b34801561064e57600080fd5b506103b060135481565b34801561066457600080fd5b50610678610673366004612645565b61135b565b6040516102fa9190612662565b34801561069157600080fd5b506005546001600160a01b0316610345565b3480156106af57600080fd5b5061031861141a565b3480156106c457600080fd5b5061037d6106d33660046126a6565b611429565b3480156106e457600080fd5b506103186114ee565b3480156106f957600080fd5b5061037d6107083660046124a5565b6114fb565b34801561071957600080fd5b5061031861152a565b34801561072e57600080fd5b5061037d61073d3660046126db565b611537565b34801561074e57600080fd5b5061037d61075d36600461275b565b61156f565b34801561076e57600080fd5b506103b060105481565b61037d6107863660046124a5565b6115c3565b34801561079757600080fd5b506103b0610d0581565b3480156107ad57600080fd5b506103186107bc3660046124a5565b6117f5565b3480156107cd57600080fd5b50600c54610345906001600160a01b031681565b3480156107ed57600080fd5b5061037d6107fc366004612645565b6119e7565b34801561080d57600080fd5b506103b0600f5481565b34801561082357600080fd5b5061037d61083236600461262a565b611a33565b34801561084357600080fd5b506102ee61085236600461278b565b611a77565b34801561086357600080fd5b50600a546102ee9060ff1681565b34801561087d57600080fd5b5061037d61088c366004612645565b611b5b565b34801561089d57600080fd5b5061037d6108ac366004612645565b611bf6565b60006001600160e01b0319821663780e9d6360e01b14806108d657506108d682611c49565b92915050565b6060600080546108eb906127b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610917906127b9565b80156109645780601f1061093957610100808354040283529160200191610964565b820191906000526020600020905b81548152906001019060200180831161094757829003601f168201915b5050505050905090565b600061097982611c99565b6109df5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b6000610a0682610f8e565b9050806001600160a01b0316836001600160a01b03161415610a745760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109d6565b336001600160a01b0382161480610a905750610a908133611a77565b610b025760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109d6565b610b0c8383611ce3565b505050565b6005546001600160a01b03163314610b3b5760405162461bcd60e51b81526004016109d6906127ee565b8051610b4e90600b906020840190612377565b5050565b610b5c3382611d51565b610b785760405162461bcd60e51b81526004016109d690612823565b610b0c838383611e13565b6005546001600160a01b03163314610bad5760405162461bcd60e51b81526004016109d6906127ee565b600a805460ff1916911515919091179055565b6005546001600160a01b03163314610bea5760405162461bcd60e51b81526004016109d6906127ee565b601155565b6000610bfa83611027565b8210610c185760405162461bcd60e51b81526004016109d690612874565b6000805b600254811015610c895760028181548110610c3957610c396128bf565b6000918252602090912001546001600160a01b0386811691161415610c775783821415610c695791506108d69050565b81610c73816128eb565b9250505b80610c81816128eb565b915050610c1c565b5060405162461bcd60e51b81526004016109d690612874565b6005546001600160a01b03163314610ccc5760405162461bcd60e51b81526004016109d6906127ee565b60026006541415610cef5760405162461bcd60e51b81526004016109d690612906565b60026006554780610cff57600080fd5b604051600090339047908381818185875af1925050503d8060008114610d41576040519150601f19603f3d011682016040523d82523d6000602084013e610d46565b606091505b5050905080610d975760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f2073656e6420746f204f776e65722e000000000000000060448201526064016109d6565b50506001600655565b610b0c83838360405180602001604052806000815250611537565b6005546001600160a01b03163314610de55760405162461bcd60e51b81526004016109d6906127ee565b600f55565b6002546000908210610e535760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109d6565b5090565b6005546001600160a01b03163314610e815760405162461bcd60e51b81526004016109d6906127ee565b8051610b4e906008906020840190612377565b60078054610ea1906127b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610ecd906127b9565b8015610f1a5780601f10610eef57610100808354040283529160200191610f1a565b820191906000526020600020905b815481529060010190602001808311610efd57829003601f168201915b505050505081565b6005546001600160a01b03163314610f4c5760405162461bcd60e51b81526004016109d6906127ee565b8051610b4e90600e906020840190612377565b6005546001600160a01b03163314610f895760405162461bcd60e51b81526004016109d6906127ee565b601255565b60008060028381548110610fa457610fa46128bf565b6000918252602090912001546001600160a01b03169050806108d65760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109d6565b600e8054610ea1906127b9565b60006001600160a01b0382166110925760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109d6565b6000805b6002548110156110ee57600281815481106110b3576110b36128bf565b6000918252602090912001546001600160a01b03858116911614156110de576110db826128eb565b91505b6110e7816128eb565b9050611096565b5092915050565b6005546001600160a01b0316331461111f5760405162461bcd60e51b81526004016109d6906127ee565b6111296000611f69565b565b6002600654141561114e5760405162461bcd60e51b81526004016109d690612906565b6002600655600a5460ff166111a55760405162461bcd60e51b815260206004820152601b60248201527f53616c65206d7573742062652061637469766520746f206d696e74000000000060448201526064016109d6565b6111b1600a600161293d565b336000908152600960205260409020546111cb9083611fbb565b1061123e5760405162461bcd60e51b815260206004820152603d60248201527f596f7572206d696e7420776f756c64206578636565642074686520746f74616c60448201527f206f66203130204b696d7320616c6c6f77656420666f7220667265652e00000060648201526084016109d6565b60125461124c90600161293d565b6013546112599083611fbb565b108015611290575060115461127090610d05612955565b61127b90600161293d565b61128e8261128860025490565b90611fbb565b105b6112e65760405162461bcd60e51b815260206004820152602160248201527f507572636861736520776f756c6420657863656564206672656520737570706c6044820152607960f81b60648201526084016109d6565b60005b8181101561131557611303336112fe60025490565b611fc7565b8061130d816128eb565b9150506112e9565b50336000908152600960205260408120805483929061133590849061293d565b92505081905550806013600082825461134e919061293d565b9091555050600160065550565b6060600061136883611027565b9050806113895760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff8111156113a4576113a46124ff565b6040519080825280602002602001820160405280156113cd578160200160208202803683370190505b50905060005b82811015611381576113e58582610bef565b8282815181106113f7576113f76128bf565b60209081029190910101528061140c816128eb565b9150506113d3565b50919050565b6060600180546108eb906127b9565b6001600160a01b0382163314156114825760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109d6565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60088054610ea1906127b9565b6005546001600160a01b031633146115255760405162461bcd60e51b81526004016109d6906127ee565b601055565b600b8054610ea1906127b9565b6115413383611d51565b61155d5760405162461bcd60e51b81526004016109d690612823565b61156984848484611fe1565b50505050565b6005546001600160a01b031633146115995760405162461bcd60e51b81526004016109d6906127ee565b60005b82811015610b0c576115b1826112fe60025490565b806115bb816128eb565b91505061159c565b600260065414156115e65760405162461bcd60e51b81526004016109d690612906565b6002600655600a5460ff1661163d5760405162461bcd60e51b815260206004820152601b60248201527f53616c65206d7573742062652061637469766520746f206d696e74000000000060448201526064016109d6565b6000811161168d5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206d696e74206d6f7265207468616e203020746f6b656e732e00000060448201526064016109d6565b60105461169b90600161293d565b81106116fc5760405162461bcd60e51b815260206004820152602a60248201527f596f752063616e206f6e6c79206d696e74203230204b696d732070657220747260448201526930b739b0b1ba34b7b71760b11b60648201526084016109d6565b60115461170b90610d05612955565b61171690600161293d565b6117238261128860025490565b106117705760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c7960448201526064016109d6565b600f5461177d9082612014565b34146117cb5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563740060448201526064016109d6565b60005b81811015610d97576117e3336112fe60025490565b806117ed816128eb565b9150506117ce565b606061180082611c99565b6118645760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109d6565b600a54610100900460ff166119055760088054611880906127b9565b80601f01602080910402602001604051908101604052809291908181526020018280546118ac906127b9565b80156118f95780601f106118ce576101008083540402835291602001916118f9565b820191906000526020600020905b8154815290600101906020018083116118dc57829003601f168201915b50505050509050919050565b6000600e8054611914906127b9565b80601f0160208091040260200160405190810160405280929190818152602001828054611940906127b9565b801561198d5780601f106119625761010080835404028352916020019161198d565b820191906000526020600020905b81548152906001019060200180831161197057829003601f168201915b5050505050905060008151116119b257604051806020016040528060008152506119e0565b806119bc84612020565b60076040516020016119d09392919061296c565b6040516020818303038152906040525b9392505050565b6005546001600160a01b03163314611a115760405162461bcd60e51b81526004016109d6906127ee565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611a5d5760405162461bcd60e51b81526004016109d6906127ee565b600a80549115156101000261ff0019909216919091179055565b600c5460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa158015611ac9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aed9190612a30565b6001600160a01b03161480611b1a57506001600160a01b0383166000908152600d602052604090205460ff165b15611b295760019150506108d6565b6001600160a01b0380851660009081526004602090815260408083209387168352929052205460ff165b949350505050565b6005546001600160a01b03163314611b855760405162461bcd60e51b81526004016109d6906127ee565b6001600160a01b038116611bea5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109d6565b611bf381611f69565b50565b6005546001600160a01b03163314611c205760405162461bcd60e51b81526004016109d6906127ee565b6001600160a01b03166000908152600d60205260409020805460ff19811660ff90911615179055565b60006001600160e01b031982166380ac58cd60e01b1480611c7a57506001600160e01b03198216635b5e139f60e01b145b806108d657506301ffc9a760e01b6001600160e01b03198316146108d6565b600254600090821080156108d6575060006001600160a01b031660028381548110611cc657611cc66128bf565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d1882610f8e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d5c82611c99565b611dbd5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109d6565b6000611dc883610f8e565b9050806001600160a01b0316846001600160a01b03161480611e035750836001600160a01b0316611df88461096e565b6001600160a01b0316145b80611b535750611b538185611a77565b826001600160a01b0316611e2682610f8e565b6001600160a01b031614611e8e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016109d6565b6001600160a01b038216611ef05760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109d6565b611efb600082611ce3565b8160028281548110611f0f57611f0f6128bf565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006119e0828461293d565b610b4e82826040518060200160405280600081525061211e565b611fec848484611e13565b611ff884848484612151565b6115695760405162461bcd60e51b81526004016109d690612a4d565b60006119e08284612a9f565b6060816120445750506040805180820190915260018152600360fc1b602082015290565b8160005b811561206e5780612058816128eb565b91506120679050600a83612ad4565b9150612048565b60008167ffffffffffffffff811115612089576120896124ff565b6040519080825280601f01601f1916602001820160405280156120b3576020820181803683370190505b5090505b8415611b53576120c8600183612955565b91506120d5600a86612ae8565b6120e090603061293d565b60f81b8183815181106120f5576120f56128bf565b60200101906001600160f81b031916908160001a905350612117600a86612ad4565b94506120b7565b612128838361224f565b6121356000848484612151565b610b0c5760405162461bcd60e51b81526004016109d690612a4d565b60006001600160a01b0384163b1561224457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612195903390899088908890600401612afc565b6020604051808303816000875af19250505080156121d0575060408051601f3d908101601f191682019092526121cd91810190612b39565b60015b61222a573d8080156121fe576040519150601f19603f3d011682016040523d82523d6000602084013e612203565b606091505b5080516122225760405162461bcd60e51b81526004016109d690612a4d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b53565b506001949350505050565b6001600160a01b0382166122a55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109d6565b6122ae81611c99565b156122fb5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109d6565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612383906127b9565b90600052602060002090601f0160209004810192826123a557600085556123eb565b82601f106123be57805160ff19168380011785556123eb565b828001600101855582156123eb579182015b828111156123eb5782518255916020019190600101906123d0565b50610e539291505b80821115610e5357600081556001016123f3565b6001600160e01b031981168114611bf357600080fd5b60006020828403121561242f57600080fd5b81356119e081612407565b60005b8381101561245557818101518382015260200161243d565b838111156115695750506000910152565b6000815180845261247e81602086016020860161243a565b601f01601f19169290920160200192915050565b6020815260006119e06020830184612466565b6000602082840312156124b757600080fd5b5035919050565b6001600160a01b0381168114611bf357600080fd5b600080604083850312156124e657600080fd5b82356124f1816124be565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612530576125306124ff565b604051601f8501601f19908116603f01168101908282118183101715612558576125586124ff565b8160405280935085815286868601111561257157600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561259d57600080fd5b813567ffffffffffffffff8111156125b457600080fd5b8201601f810184136125c557600080fd5b611b5384823560208401612515565b6000806000606084860312156125e957600080fd5b83356125f4816124be565b92506020840135612604816124be565b929592945050506040919091013590565b8035801515811461262557600080fd5b919050565b60006020828403121561263c57600080fd5b6119e082612615565b60006020828403121561265757600080fd5b81356119e0816124be565b6020808252825182820181905260009190848201906040850190845b8181101561269a5783518352928401929184019160010161267e565b50909695505050505050565b600080604083850312156126b957600080fd5b82356126c4816124be565b91506126d260208401612615565b90509250929050565b600080600080608085870312156126f157600080fd5b84356126fc816124be565b9350602085013561270c816124be565b925060408501359150606085013567ffffffffffffffff81111561272f57600080fd5b8501601f8101871361274057600080fd5b61274f87823560208401612515565b91505092959194509250565b6000806040838503121561276e57600080fd5b823591506020830135612780816124be565b809150509250929050565b6000806040838503121561279e57600080fd5b82356127a9816124be565b91506020830135612780816124be565b600181811c908216806127cd57607f821691505b6020821081141561141457634e487b7160e01b600052602260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156128ff576128ff6128d5565b5060010190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115612950576129506128d5565b500190565b600082821015612967576129676128d5565b500390565b60008451602061297f8285838a0161243a565b8551918401916129928184848a0161243a565b8554920191600090600181811c90808316806129af57607f831692505b8583108114156129cd57634e487b7160e01b85526022600452602485fd5b8080156129e157600181146129f257612a1f565b60ff19851688528388019550612a1f565b60008b81526020902060005b85811015612a175781548a8201529084019088016129fe565b505083880195505b50939b9a5050505050505050505050565b600060208284031215612a4257600080fd5b81516119e0816124be565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000816000190483118215151615612ab957612ab96128d5565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612ae357612ae3612abe565b500490565b600082612af757612af7612abe565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b2f90830184612466565b9695505050505050565b600060208284031215612b4b57600080fd5b81516119e08161240756fea2646970667358221220636de106f87b4fa9f05bb0b109eaf17b3e7858b6d7bd7b411d9d917e286b64a464736f6c634300080b0033
Deployed Bytecode Sourcemap
39325:5737:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35530:224;;;;;;;;;;-1:-1:-1;35530:224:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;35530:224:0;;;;;;;;24147:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24959:308::-;;;;;;;;;;-1:-1:-1;24959:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;24959:308:0;1528:203:1;24482:411:0;;;;;;;;;;-1:-1:-1;24482:411:0;;;;;:::i;:::-;;:::i;:::-;;41329:120;;;;;;;;;;-1:-1:-1;41329:120:0;;;;;:::i;:::-;;:::i;35830:110::-;;;;;;;;;;-1:-1:-1;35918:7:0;:14;35830:110;;;3563:25:1;;;3551:2;3536:18;35830:110:0;3417:177:1;26018:376:0;;;;;;;;;;-1:-1:-1;26018:376:0;;;;;:::i;:::-;;:::i;42193:87::-;;;;;;;;;;-1:-1:-1;42193:87:0;;;;;:::i;:::-;;:::i;41718:95::-;;;;;;;;;;-1:-1:-1;41718:95:0;;;;;:::i;:::-;;:::i;36306:490::-;;;;;;;;;;-1:-1:-1;36306:490:0;;;;;:::i;:::-;;:::i;41054:269::-;;;;;;;;;;;;;:::i;26465:185::-;;;;;;;;;;-1:-1:-1;26465:185:0;;;;;:::i;:::-;;:::i;41542:81::-;;;;;;;;;;-1:-1:-1;41542:81:0;;;;;:::i;:::-;;:::i;36017:205::-;;;;;;;;;;-1:-1:-1;36017:205:0;;;;;:::i;:::-;;:::i;41957:132::-;;;;;;;;;;-1:-1:-1;41957:132:0;;;;;:::i;:::-;;:::i;39701:60::-;;;;;;;;;;-1:-1:-1;39701:60:0;;;;;;;;;;;39433:63;;;;;;;;;;;;;:::i;42095:92::-;;;;;;;;;;-1:-1:-1;42095:92:0;;;;;:::i;:::-;;:::i;41629:83::-;;;;;;;;;;-1:-1:-1;41629:83:0;;;;;:::i;:::-;;:::i;39905:56::-;;;;;;;;;;-1:-1:-1;39905:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;23754:326;;;;;;;;;;-1:-1:-1;23754:326:0;;;;;:::i;:::-;;:::i;39966:51::-;;;;;;;;;;;;;:::i;23300:392::-;;;;;;;;;;-1:-1:-1;23300:392:0;;;;;:::i;:::-;;:::i;38457:103::-;;;;;;;;;;;;;:::i;40237:63::-;;;;;;;;;;;;;;;;40305:71;;;;;;;;;;;;40374:2;40305:71;;42768:660;;;;;;;;;;-1:-1:-1;42768:660:0;;;;;:::i;:::-;;:::i;40381:59::-;;;;;;;;;;;;;;;;40445:64;;;;;;;;;;;;;;;;42288:472;;;;;;;;;;-1:-1:-1;42288:472:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;37806:87::-;;;;;;;;;;-1:-1:-1;37879:6:0;;-1:-1:-1;;;;;37879:6:0;37806:87;;24316:104;;;;;;;;;;;;;:::i;25339:327::-;;;;;;;;;;-1:-1:-1;25339:327:0;;;;;:::i;:::-;;:::i;39501:61::-;;;;;;;;;;;;;:::i;41819:132::-;;;;;;;;;;-1:-1:-1;41819:132:0;;;;;:::i;:::-;;:::i;39766:65::-;;;;;;;;;;;;;:::i;26721:365::-;;;;;;;;;;-1:-1:-1;26721:365:0;;;;;:::i;:::-;;:::i;44068:179::-;;;;;;;;;;-1:-1:-1;44068:179:0;;;;;:::i;:::-;;:::i;40099:69::-;;;;;;;;;;;;;;;;43436:626;;;;;;:::i;:::-;;:::i;40173:59::-;;;;;;;;;;;;40228:4;40173:59;;44257:452;;;;;;;;;;-1:-1:-1;44257:452:0;;;;;:::i;:::-;;:::i;39836:64::-;;;;;;;;;;-1:-1:-1;39836:64:0;;;;-1:-1:-1;;;;;39836:64:0;;;40768:140;;;;;;;;;;-1:-1:-1;40768:140:0;;;;;:::i;:::-;;:::i;40022:70::-;;;;;;;;;;;;;;;;41455:81;;;;;;;;;;-1:-1:-1;41455:81:0;;;;;:::i;:::-;;:::i;44715:342::-;;;;;;;;;;-1:-1:-1;44715:342:0;;;;;:::i;:::-;;:::i;39632:64::-;;;;;;;;;;-1:-1:-1;39632:64:0;;;;;;;;38715:201;;;;;;;;;;-1:-1:-1;38715:201:0;;;;;:::i;:::-;;:::i;40916:132::-;;;;;;;;;;-1:-1:-1;40916:132:0;;;;;:::i;:::-;;:::i;35530:224::-;35632:4;-1:-1:-1;;;;;;35656:50:0;;-1:-1:-1;;;35656:50:0;;:90;;;35710:36;35734:11;35710:23;:36::i;:::-;35649:97;35530:224;-1:-1:-1;;35530:224:0:o;24147:100::-;24201:13;24234:5;24227:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24147:100;:::o;24959:308::-;25080:7;25127:16;25135:7;25127;:16::i;:::-;25105:110;;;;-1:-1:-1;;;25105:110:0;;7719:2:1;25105:110:0;;;7701:21:1;7758:2;7738:18;;;7731:30;7797:34;7777:18;;;7770:62;-1:-1:-1;;;7848:18:1;;;7841:42;7900:19;;25105:110:0;;;;;;;;;-1:-1:-1;25235:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25235:24:0;;24959:308::o;24482:411::-;24563:13;24579:23;24594:7;24579:14;:23::i;:::-;24563:39;;24627:5;-1:-1:-1;;;;;24621:11:0;:2;-1:-1:-1;;;;;24621:11:0;;;24613:57;;;;-1:-1:-1;;;24613:57:0;;8132:2:1;24613:57:0;;;8114:21:1;8171:2;8151:18;;;8144:30;8210:34;8190:18;;;8183:62;-1:-1:-1;;;8261:18:1;;;8254:31;8302:19;;24613:57:0;7930:397:1;24613:57:0;738:10;-1:-1:-1;;;;;24705:21:0;;;;:62;;-1:-1:-1;24730:37:0;24747:5;738:10;44715:342;:::i;24730:37::-;24683:168;;;;-1:-1:-1;;;24683:168:0;;8534:2:1;24683:168:0;;;8516:21:1;8573:2;8553:18;;;8546:30;8612:34;8592:18;;;8585:62;8683:26;8663:18;;;8656:54;8727:19;;24683:168:0;8332:420:1;24683:168:0;24864:21;24873:2;24877:7;24864:8;:21::i;:::-;24552:341;24482:411;;:::o;41329:120::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;41410:33;;::::1;::::0;:16:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;:::-;;41329:120:::0;:::o;26018:376::-;26227:41;738:10;26260:7;26227:18;:41::i;:::-;26205:140;;;;-1:-1:-1;;;26205:140:0;;;;;;;:::i;:::-;26358:28;26368:4;26374:2;26378:7;26358:9;:28::i;42193:87::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;42253:12:::1;:21:::0;;-1:-1:-1;;42253:21:0::1;::::0;::::1;;::::0;;;::::1;::::0;;42193:87::o;41718:95::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;41782:13:::1;:25:::0;41718:95::o;36306:490::-;36403:15;36447:16;36457:5;36447:9;:16::i;:::-;36439:5;:24;36431:80;;;;-1:-1:-1;;;36431:80:0;;;;;;;:::i;:::-;36524:10;36549:6;36545:178;36561:7;:14;36557:18;;36545:178;;;36608:7;36616:1;36608:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;36599:19:0;;;36608:10;;36599:19;36596:116;;;36650:5;36641;:14;36638:58;;;36664:1;-1:-1:-1;36657:8:0;;-1:-1:-1;36657:8:0;36638:58;36689:7;;;;:::i;:::-;;;;36638:58;36577:3;;;;:::i;:::-;;;;36545:178;;;;36735:53;;-1:-1:-1;;;36735:53:0;;;;;;;:::i;41054:269::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;2617:1:::1;3215:7;;:19;;3207:63;;;;-1:-1:-1::0;;;3207:63:0::1;;;;;;;:::i;:::-;2617:1;3348:7;:18:::0;41129:21:::2;41165:11:::0;41157:20:::2;;;::::0;::::2;;41210:51;::::0;41187:17:::2;::::0;738:10;;41235:21:::2;::::0;41187:17;41210:51;41187:17;41210:51;41235:21;738:10;41210:51:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41186:75;;;41276:12;41268:49;;;::::0;-1:-1:-1;;;41268:49:0;;11124:2:1;41268:49:0::2;::::0;::::2;11106:21:1::0;11163:2;11143:18;;;11136:30;11202:26;11182:18;;;11175:54;11246:18;;41268:49:0::2;10922:348:1::0;41268:49:0::2;-1:-1:-1::0;;2573:1:0::1;3527:7;:22:::0;41054:269::o;26465:185::-;26603:39;26620:4;26626:2;26630:7;26603:39;;;;;;;;;;;;:16;:39::i;41542:81::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;41598:11:::1;:19:::0;41542:81::o;36017:205::-;36128:7;:14;36092:7;;36120:22;;36112:79;;;;-1:-1:-1;;;36112:79:0;;11477:2:1;36112:79:0;;;11459:21:1;11516:2;11496:18;;;11489:30;11555:34;11535:18;;;11528:62;-1:-1:-1;;;11606:18:1;;;11599:42;11658:19;;36112:79:0;11275:408:1;36112:79:0;-1:-1:-1;36209:5:0;36017:205::o;41957:132::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;42045:38;;::::1;::::0;:17:::1;::::0;:38:::1;::::0;::::1;::::0;::::1;:::i;39433:63::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42095:92::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;42163:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;41629:83::-:0;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;41689:9:::1;:17:::0;41629:83::o;23754:326::-;23871:7;23896:13;23912:7;23920;23912:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;23912:16:0;;-1:-1:-1;23961:19:0;23939:110;;;;-1:-1:-1;;;23939:110:0;;11890:2:1;23939:110:0;;;11872:21:1;11929:2;11909:18;;;11902:30;11968:34;11948:18;;;11941:62;-1:-1:-1;;;12019:18:1;;;12012:39;12068:19;;23939:110:0;11688:405:1;39966:51:0;;;;;;;:::i;23300:392::-;23422:4;-1:-1:-1;;;;;23453:19:0;;23445:74;;;;-1:-1:-1;;;23445:74:0;;12300:2:1;23445:74:0;;;12282:21:1;12339:2;12319:18;;;12312:30;12378:34;12358:18;;;12351:62;-1:-1:-1;;;12429:18:1;;;12422:40;12479:19;;23445:74:0;12098:406:1;23445:74:0;23532:10;23558:6;23553:109;23570:7;:14;23566:18;;23553:109;;;23617:7;23625:1;23617:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;23608:19:0;;;23617:10;;23608:19;23604:46;;;23643:7;;;:::i;:::-;;;23604:46;23586:3;;;:::i;:::-;;;23553:109;;;-1:-1:-1;23679:5:0;23300:392;-1:-1:-1;;23300:392:0:o;38457:103::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;38522:30:::1;38549:1;38522:18;:30::i;:::-;38457:103::o:0;42768:660::-;2617:1;3215:7;;:19;;3207:63;;;;-1:-1:-1;;;3207:63:0;;;;;;;:::i;:::-;2617:1;3348:7;:18;42845:12:::1;::::0;::::1;;42837:52;;;::::0;-1:-1:-1;;;42837:52:0;;12711:2:1;42837:52:0::1;::::0;::::1;12693:21:1::0;12750:2;12730:18;;;12723:30;12789:29;12769:18;;;12762:57;12836:18;;42837:52:0::1;12509:351:1::0;42837:52:0::1;42955:26;40374:2;42980:1;42955:26;:::i;:::-;42921:10;42904:28;::::0;;;:16:::1;:28;::::0;;;;;:48:::1;::::0;42937:14;42904:32:::1;:48::i;:::-;:77;42896:151;;;::::0;-1:-1:-1;;;42896:151:0;;13200:2:1;42896:151:0::1;::::0;::::1;13182:21:1::0;13239:2;13219:18;;;13212:30;13278:34;13258:18;;;13251:62;13349:31;13329:18;;;13322:59;13398:19;;42896:151:0::1;12998:425:1::0;42896:151:0::1;43101:9;::::0;:13:::1;::::0;43113:1:::1;43101:13;:::i;:::-;43062:16;::::0;:36:::1;::::0;43083:14;43062:20:::1;:36::i;:::-;:52;:120;;;;-1:-1:-1::0;43165:13:0::1;::::0;43154:24:::1;::::0;40228:4:::1;43154:24;:::i;:::-;:28;::::0;43181:1:::1;43154:28;:::i;:::-;43118:33;43136:14;43118:13;35918:7:::0;:14;;35830:110;43118:13:::1;:17:::0;::::1;:33::i;:::-;:64;43062:120;43054:166;;;::::0;-1:-1:-1;;;43054:166:0;;13760:2:1;43054:166:0::1;::::0;::::1;13742:21:1::0;13799:2;13779:18;;;13772:30;13838:34;13818:18;;;13811:62;-1:-1:-1;;;13889:18:1;;;13882:31;13930:19;;43054:166:0::1;13558:397:1::0;43054:166:0::1;43237:6;43233:94;43253:14;43249:1;:18;43233:94;;;43283:36;43293:10;43305:13;35918:7:::0;:14;;35830:110;43305:13:::1;43283:9;:36::i;:::-;43269:3:::0;::::1;::::0;::::1;:::i;:::-;;;;43233:94;;;-1:-1:-1::0;43352:10:0::1;43335:28;::::0;;;:16:::1;:28;::::0;;;;:46;;43367:14;;43335:28;:46:::1;::::0;43367:14;;43335:46:::1;:::i;:::-;;;;;;;;43408:14;43388:16;;:34;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;2573:1:0;3527:7;:22;-1:-1:-1;42768:660:0:o;42288:472::-;42349:16;42375:18;42396:17;42406:6;42396:9;:17::i;:::-;42375:38;-1:-1:-1;42424:15:0;42420:335;;42489:16;;;42503:1;42489:16;;;;;;;;;;;-1:-1:-1;42482:23:0;42288:472;-1:-1:-1;;;42288:472:0:o;42420:335::-;42528:23;42568:10;42554:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42554:25:0;;42528:51;;42588:13;42610:116;42634:10;42626:5;:18;42610:116;;;42682:34;42702:6;42710:5;42682:19;:34::i;:::-;42666:6;42673:5;42666:13;;;;;;;;:::i;:::-;;;;;;;;;;:50;42646:7;;;;:::i;:::-;;;;42610:116;;42420:335;42368:392;42288:472;;;:::o;24316:104::-;24372:13;24405:7;24398:14;;;;;:::i;25339:327::-;-1:-1:-1;;;;;25474:24:0;;738:10;25474:24;;25466:62;;;;-1:-1:-1;;;25466:62:0;;14162:2:1;25466:62:0;;;14144:21:1;14201:2;14181:18;;;14174:30;14240:27;14220:18;;;14213:55;14285:18;;25466:62:0;13960:349:1;25466:62:0;738:10;25541:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;25541:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;25541:53:0;;;;;;;;;;25610:48;;540:41:1;;;25541:42:0;;738:10;25610:48;;513:18:1;25610:48:0;;;;;;;25339:327;;:::o;39501:61::-;;;;;;;:::i;41819:132::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;41903:20:::1;:42:::0;41819:132::o;39766:65::-;;;;;;;:::i;26721:365::-;26910:41;738:10;26943:7;26910:18;:41::i;:::-;26888:140;;;;-1:-1:-1;;;26888:140:0;;;;;;;:::i;:::-;27039:39;27053:4;27059:2;27063:7;27072:5;27039:13;:39::i;:::-;26721:365;;;;:::o;44068:179::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;44153:9:::1;44149:93;44172:11;44168:1;:15;44149:93;;;44199:35;44209:9;44220:13;35918:7:::0;:14;;35830:110;44199:35:::1;44185:3:::0;::::1;::::0;::::1;:::i;:::-;;;;44149:93;;43436:626:::0;2617:1;3215:7;;:19;;3207:63;;;;-1:-1:-1;;;3207:63:0;;;;;;;:::i;:::-;2617:1;3348:7;:18;43522:12:::1;::::0;::::1;;43514:52;;;::::0;-1:-1:-1;;;43514:52:0;;12711:2:1;43514:52:0::1;::::0;::::1;12693:21:1::0;12750:2;12730:18;;;12723:30;12789:29;12769:18;;;12762:57;12836:18;;43514:52:0::1;12509:351:1::0;43514:52:0::1;43598:1;43581:14;:18;43573:60;;;::::0;-1:-1:-1;;;43573:60:0;;14516:2:1;43573:60:0::1;::::0;::::1;14498:21:1::0;14555:2;14535:18;;;14528:30;14594:31;14574:18;;;14567:59;14643:18;;43573:60:0::1;14314:353:1::0;43573:60:0::1;43665:20;::::0;:24:::1;::::0;43688:1:::1;43665:24;:::i;:::-;43648:14;:41;43640:96;;;::::0;-1:-1:-1;;;43640:96:0;;14874:2:1;43640:96:0::1;::::0;::::1;14856:21:1::0;14913:2;14893:18;;;14886:30;14952:34;14932:18;;;14925:62;-1:-1:-1;;;15003:18:1;;;14996:40;15053:19;;43640:96:0::1;14672:406:1::0;43640:96:0::1;43798:13;::::0;43787:24:::1;::::0;40228:4:::1;43787:24;:::i;:::-;:28;::::0;43814:1:::1;43787:28;:::i;:::-;43751:33;43769:14;43751:13;35918:7:::0;:14;;35830:110;43751:33:::1;:64;43743:109;;;::::0;-1:-1:-1;;;43743:109:0;;15285:2:1;43743:109:0::1;::::0;::::1;15267:21:1::0;;;15304:18;;;15297:30;15363:34;15343:18;;;15336:62;15415:18;;43743:109:0::1;15083:356:1::0;43743:109:0::1;43880:11;::::0;:31:::1;::::0;43896:14;43880:15:::1;:31::i;:::-;43867:9;:44;43859:88;;;::::0;-1:-1:-1;;;43859:88:0;;15646:2:1;43859:88:0::1;::::0;::::1;15628:21:1::0;15685:2;15665:18;;;15658:30;15724:33;15704:18;;;15697:61;15775:18;;43859:88:0::1;15444:355:1::0;43859:88:0::1;43964:9;43960:97;43983:14;43979:1;:18;43960:97;;;44013:36;44023:10;44035:13;35918:7:::0;:14;;35830:110;44013:36:::1;43999:3:::0;::::1;::::0;::::1;:::i;:::-;;;;43960:97;;44257:452:::0;44331:13;44364:17;44372:8;44364:7;:17::i;:::-;44356:77;;;;-1:-1:-1;;;44356:77:0;;16006:2:1;44356:77:0;;;15988:21:1;16045:2;16025:18;;;16018:30;16084:34;16064:18;;;16057:62;-1:-1:-1;;;16135:18:1;;;16128:45;16190:19;;44356:77:0;15804:411:1;44356:77:0;44446:8;;;;;;;44442:64;;44481:17;44474:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44257:452;;;:::o;44442:64::-;44514:28;44545:7;44514:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44597:1;44572:14;44566:28;:32;:137;;;;;;;;;;;;;;;;;44634:14;44650:26;44667:8;44650:16;:26::i;:::-;44678:9;44617:71;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44566:137;44559:144;44257:452;-1:-1:-1;;;44257:452:0:o;40768:140::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;40858:20:::1;:44:::0;;-1:-1:-1;;;;;;40858:44:0::1;-1:-1:-1::0;;;;;40858:44:0;;;::::1;::::0;;;::::1;::::0;;40768:140::o;41455:81::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;41513:8:::1;:17:::0;;;::::1;;;;-1:-1:-1::0;;41513:17:0;;::::1;::::0;;;::::1;::::0;;41455:81::o;44715:342::-;44876:20;;44916:29;;-1:-1:-1;;;44916:29:0;;-1:-1:-1;;;;;1692:32:1;;;44916:29:0;;;1674:51:1;44805:4:0;;44876:20;;;44908:50;;;;44876:20;;44916:21;;1647:18:1;;44916:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;44908:50:0;;:76;;;-1:-1:-1;;;;;;44962:22:0;;;;;;:12;:22;;;;;;;;44908:76;44904:93;;;44993:4;44986:11;;;;;44904:93;-1:-1:-1;;;;;25908:25:0;;;25879:4;25908:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;45011:40;45004:47;44715:342;-1:-1:-1;;;;44715:342:0:o;38715:201::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38804:22:0;::::1;38796:73;;;::::0;-1:-1:-1;;;38796:73:0;;18365:2:1;38796:73:0::1;::::0;::::1;18347:21:1::0;18404:2;18384:18;;;18377:30;18443:34;18423:18;;;18416:62;-1:-1:-1;;;18494:18:1;;;18487:36;18540:19;;38796:73:0::1;18163:402:1::0;38796:73:0::1;38880:28;38899:8;38880:18;:28::i;:::-;38715:201:::0;:::o;40916:132::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41016:26:0::1;;::::0;;;:12:::1;:26;::::0;;;;;;-1:-1:-1;;40986:56:0;::::1;41016:26;::::0;;::::1;41015:27;40986:56;::::0;;40916:132::o;22881:355::-;23028:4;-1:-1:-1;;;;;;23070:40:0;;-1:-1:-1;;;23070:40:0;;:105;;-1:-1:-1;;;;;;;23127:48:0;;-1:-1:-1;;;23127:48:0;23070:105;:158;;;-1:-1:-1;;;;;;;;;;12787:40:0;;;23192:36;12678:157;28633:155;28732:7;:14;28698:4;;28722:24;;:58;;;;;28778:1;-1:-1:-1;;;;;28750:30:0;:7;28758;28750:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;28750:16:0;:30;;28715:65;28633:155;-1:-1:-1;;28633:155:0:o;32658:174::-;32733:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32733:29:0;-1:-1:-1;;;;;32733:29:0;;;;;;;;:24;;32787:23;32733:24;32787:14;:23::i;:::-;-1:-1:-1;;;;;32778:46:0;;;;;;;;;;;32658:174;;:::o;28955:452::-;29084:4;29128:16;29136:7;29128;:16::i;:::-;29106:110;;;;-1:-1:-1;;;29106:110:0;;18772:2:1;29106:110:0;;;18754:21:1;18811:2;18791:18;;;18784:30;18850:34;18830:18;;;18823:62;-1:-1:-1;;;18901:18:1;;;18894:42;18953:19;;29106:110:0;18570:408:1;29106:110:0;29227:13;29243:23;29258:7;29243:14;:23::i;:::-;29227:39;;29296:5;-1:-1:-1;;;;;29285:16:0;:7;-1:-1:-1;;;;;29285:16:0;;:64;;;;29342:7;-1:-1:-1;;;;;29318:31:0;:20;29330:7;29318:11;:20::i;:::-;-1:-1:-1;;;;;29318:31:0;;29285:64;:113;;;;29366:32;29383:5;29390:7;29366:16;:32::i;31987:553::-;32160:4;-1:-1:-1;;;;;32133:31:0;:23;32148:7;32133:14;:23::i;:::-;-1:-1:-1;;;;;32133:31:0;;32111:122;;;;-1:-1:-1;;;32111:122:0;;19185:2:1;32111:122:0;;;19167:21:1;19224:2;19204:18;;;19197:30;19263:34;19243:18;;;19236:62;-1:-1:-1;;;19314:18:1;;;19307:39;19363:19;;32111:122:0;18983:405:1;32111:122:0;-1:-1:-1;;;;;32252:16:0;;32244:65;;;;-1:-1:-1;;;32244:65:0;;19595:2:1;32244:65:0;;;19577:21:1;19634:2;19614:18;;;19607:30;19673:34;19653:18;;;19646:62;-1:-1:-1;;;19724:18:1;;;19717:34;19768:19;;32244:65:0;19393:400:1;32244:65:0;32426:29;32443:1;32447:7;32426:8;:29::i;:::-;32485:2;32466:7;32474;32466:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;-1:-1:-1;;;;;;32466:21:0;-1:-1:-1;;;;;32466:21:0;;;;;;32505:27;;32524:7;;32505:27;;;;;;;;;;32466:16;32505:27;31987:553;;;:::o;39076:191::-;39169:6;;;-1:-1:-1;;;;;39186:17:0;;;-1:-1:-1;;;;;;39186:17:0;;;;;;;39219:40;;39169:6;;;39186:17;39169:6;;39219:40;;39150:16;;39219:40;39139:128;39076:191;:::o;15642:98::-;15700:7;15727:5;15731:1;15727;:5;:::i;29749:110::-;29825:26;29835:2;29839:7;29825:26;;;;;;;;;;;;:9;:26::i;27968:352::-;28125:28;28135:4;28141:2;28145:7;28125:9;:28::i;:::-;28186:48;28209:4;28215:2;28219:7;28228:5;28186:22;:48::i;:::-;28164:148;;;;-1:-1:-1;;;28164:148:0;;;;;;;:::i;16380:98::-;16438:7;16465:5;16469:1;16465;:5;:::i;20366:723::-;20422:13;20643:10;20639:53;;-1:-1:-1;;20670:10:0;;;;;;;;;;;;-1:-1:-1;;;20670:10:0;;;;;20366:723::o;20639:53::-;20717:5;20702:12;20758:78;20765:9;;20758:78;;20791:8;;;;:::i;:::-;;-1:-1:-1;20814:10:0;;-1:-1:-1;20822:2:0;20814:10;;:::i;:::-;;;20758:78;;;20846:19;20878:6;20868:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20868:17:0;;20846:39;;20896:154;20903:10;;20896:154;;20930:11;20940:1;20930:11;;:::i;:::-;;-1:-1:-1;20999:10:0;21007:2;20999:5;:10;:::i;:::-;20986:24;;:2;:24;:::i;:::-;20973:39;;20956:6;20963;20956:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;20956:56:0;;;;;;;;-1:-1:-1;21027:11:0;21036:2;21027:11;;:::i;:::-;;;20896:154;;30086:321;30216:18;30222:2;30226:7;30216:5;:18::i;:::-;30267:54;30298:1;30302:2;30306:7;30315:5;30267:22;:54::i;:::-;30245:154;;;;-1:-1:-1;;;30245:154:0;;;;;;;:::i;33397:980::-;33552:4;-1:-1:-1;;;;;33573:13:0;;19986:20;20034:8;33569:801;;33626:175;;-1:-1:-1;;;33626:175:0;;-1:-1:-1;;;;;33626:36:0;;;;;:175;;738:10;;33720:4;;33747:7;;33777:5;;33626:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33626:175:0;;;;;;;;-1:-1:-1;;33626:175:0;;;;;;;;;;;;:::i;:::-;;;33605:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33984:13:0;;33980:320;;34027:108;;-1:-1:-1;;;34027:108:0;;;;;;;:::i;33980:320::-;34250:6;34244:13;34235:6;34231:2;34227:15;34220:38;33605:710;-1:-1:-1;;;;;;33865:51:0;-1:-1:-1;;;33865:51:0;;-1:-1:-1;33858:58:0;;33569:801;-1:-1:-1;34354:4:0;33397:980;;;;;;:::o;30743:346::-;-1:-1:-1;;;;;30823:16:0;;30815:61;;;;-1:-1:-1;;;30815:61:0;;21714:2:1;30815:61:0;;;21696:21:1;;;21733:18;;;21726:30;21792:34;21772:18;;;21765:62;21844:18;;30815:61:0;21512:356:1;30815:61:0;30896:16;30904:7;30896;:16::i;:::-;30895:17;30887:58;;;;-1:-1:-1;;;30887:58:0;;22075:2:1;30887:58:0;;;22057:21:1;22114:2;22094:18;;;22087:30;22153;22133:18;;;22126:58;22201:18;;30887:58:0;21873:352:1;30887:58:0;31014:7;:16;;;;;;;-1:-1:-1;31014:16:0;;;;;;;-1:-1:-1;;;;;;31014:16:0;-1:-1:-1;;;;;31014:16:0;;;;;;;;31048:33;;31073:7;;-1:-1:-1;31048:33:0;;-1:-1:-1;;31048:33:0;30743:346;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:131::-;-1:-1:-1;;;;;1811:31:1;;1801:42;;1791:70;;1857:1;1854;1847:12;1872:315;1940:6;1948;2001:2;1989:9;1980:7;1976:23;1972:32;1969:52;;;2017:1;2014;2007:12;1969:52;2056:9;2043:23;2075:31;2100:5;2075:31;:::i;:::-;2125:5;2177:2;2162:18;;;;2149:32;;-1:-1:-1;;;1872:315:1:o;2192:127::-;2253:10;2248:3;2244:20;2241:1;2234:31;2284:4;2281:1;2274:15;2308:4;2305:1;2298:15;2324:632;2389:5;2419:18;2460:2;2452:6;2449:14;2446:40;;;2466:18;;:::i;:::-;2541:2;2535:9;2509:2;2595:15;;-1:-1:-1;;2591:24:1;;;2617:2;2587:33;2583:42;2571:55;;;2641:18;;;2661:22;;;2638:46;2635:72;;;2687:18;;:::i;:::-;2727:10;2723:2;2716:22;2756:6;2747:15;;2786:6;2778;2771:22;2826:3;2817:6;2812:3;2808:16;2805:25;2802:45;;;2843:1;2840;2833:12;2802:45;2893:6;2888:3;2881:4;2873:6;2869:17;2856:44;2948:1;2941:4;2932:6;2924;2920:19;2916:30;2909:41;;;;2324:632;;;;;:::o;2961:451::-;3030:6;3083:2;3071:9;3062:7;3058:23;3054:32;3051:52;;;3099:1;3096;3089:12;3051:52;3139:9;3126:23;3172:18;3164:6;3161:30;3158:50;;;3204:1;3201;3194:12;3158:50;3227:22;;3280:4;3272:13;;3268:27;-1:-1:-1;3258:55:1;;3309:1;3306;3299:12;3258:55;3332:74;3398:7;3393:2;3380:16;3375:2;3371;3367:11;3332:74;:::i;3599:456::-;3676:6;3684;3692;3745:2;3733:9;3724:7;3720:23;3716:32;3713:52;;;3761:1;3758;3751:12;3713:52;3800:9;3787:23;3819:31;3844:5;3819:31;:::i;:::-;3869:5;-1:-1:-1;3926:2:1;3911:18;;3898:32;3939:33;3898:32;3939:33;:::i;:::-;3599:456;;3991:7;;-1:-1:-1;;;4045:2:1;4030:18;;;;4017:32;;3599:456::o;4060:160::-;4125:20;;4181:13;;4174:21;4164:32;;4154:60;;4210:1;4207;4200:12;4154:60;4060:160;;;:::o;4225:180::-;4281:6;4334:2;4322:9;4313:7;4309:23;4305:32;4302:52;;;4350:1;4347;4340:12;4302:52;4373:26;4389:9;4373:26;:::i;4410:247::-;4469:6;4522:2;4510:9;4501:7;4497:23;4493:32;4490:52;;;4538:1;4535;4528:12;4490:52;4577:9;4564:23;4596:31;4621:5;4596:31;:::i;4662:632::-;4833:2;4885:21;;;4955:13;;4858:18;;;4977:22;;;4804:4;;4833:2;5056:15;;;;5030:2;5015:18;;;4804:4;5099:169;5113:6;5110:1;5107:13;5099:169;;;5174:13;;5162:26;;5243:15;;;;5208:12;;;;5135:1;5128:9;5099:169;;;-1:-1:-1;5285:3:1;;4662:632;-1:-1:-1;;;;;;4662:632:1:o;5299:315::-;5364:6;5372;5425:2;5413:9;5404:7;5400:23;5396:32;5393:52;;;5441:1;5438;5431:12;5393:52;5480:9;5467:23;5499:31;5524:5;5499:31;:::i;:::-;5549:5;-1:-1:-1;5573:35:1;5604:2;5589:18;;5573:35;:::i;:::-;5563:45;;5299:315;;;;;:::o;5619:795::-;5714:6;5722;5730;5738;5791:3;5779:9;5770:7;5766:23;5762:33;5759:53;;;5808:1;5805;5798:12;5759:53;5847:9;5834:23;5866:31;5891:5;5866:31;:::i;:::-;5916:5;-1:-1:-1;5973:2:1;5958:18;;5945:32;5986:33;5945:32;5986:33;:::i;:::-;6038:7;-1:-1:-1;6092:2:1;6077:18;;6064:32;;-1:-1:-1;6147:2:1;6132:18;;6119:32;6174:18;6163:30;;6160:50;;;6206:1;6203;6196:12;6160:50;6229:22;;6282:4;6274:13;;6270:27;-1:-1:-1;6260:55:1;;6311:1;6308;6301:12;6260:55;6334:74;6400:7;6395:2;6382:16;6377:2;6373;6369:11;6334:74;:::i;:::-;6324:84;;;5619:795;;;;;;;:::o;6419:315::-;6487:6;6495;6548:2;6536:9;6527:7;6523:23;6519:32;6516:52;;;6564:1;6561;6554:12;6516:52;6600:9;6587:23;6577:33;;6660:2;6649:9;6645:18;6632:32;6673:31;6698:5;6673:31;:::i;:::-;6723:5;6713:15;;;6419:315;;;;;:::o;6739:388::-;6807:6;6815;6868:2;6856:9;6847:7;6843:23;6839:32;6836:52;;;6884:1;6881;6874:12;6836:52;6923:9;6910:23;6942:31;6967:5;6942:31;:::i;:::-;6992:5;-1:-1:-1;7049:2:1;7034:18;;7021:32;7062:33;7021:32;7062:33;:::i;7132:380::-;7211:1;7207:12;;;;7254;;;7275:61;;7329:4;7321:6;7317:17;7307:27;;7275:61;7382:2;7374:6;7371:14;7351:18;7348:38;7345:161;;;7428:10;7423:3;7419:20;7416:1;7409:31;7463:4;7460:1;7453:15;7491:4;7488:1;7481:15;8757:356;8959:2;8941:21;;;8978:18;;;8971:30;9037:34;9032:2;9017:18;;9010:62;9104:2;9089:18;;8757:356::o;9118:413::-;9320:2;9302:21;;;9359:2;9339:18;;;9332:30;9398:34;9393:2;9378:18;;9371:62;-1:-1:-1;;;9464:2:1;9449:18;;9442:47;9521:3;9506:19;;9118:413::o;9536:407::-;9738:2;9720:21;;;9777:2;9757:18;;;9750:30;9816:34;9811:2;9796:18;;9789:62;-1:-1:-1;;;9882:2:1;9867:18;;9860:41;9933:3;9918:19;;9536:407::o;9948:127::-;10009:10;10004:3;10000:20;9997:1;9990:31;10040:4;10037:1;10030:15;10064:4;10061:1;10054:15;10080:127;10141:10;10136:3;10132:20;10129:1;10122:31;10172:4;10169:1;10162:15;10196:4;10193:1;10186:15;10212:135;10251:3;-1:-1:-1;;10272:17:1;;10269:43;;;10292:18;;:::i;:::-;-1:-1:-1;10339:1:1;10328:13;;10212:135::o;10352:355::-;10554:2;10536:21;;;10593:2;10573:18;;;10566:30;10632:33;10627:2;10612:18;;10605:61;10698:2;10683:18;;10352:355::o;12865:128::-;12905:3;12936:1;12932:6;12929:1;12926:13;12923:39;;;12942:18;;:::i;:::-;-1:-1:-1;12978:9:1;;12865:128::o;13428:125::-;13468:4;13496:1;13493;13490:8;13487:34;;;13501:18;;:::i;:::-;-1:-1:-1;13538:9:1;;13428:125::o;16346:1527::-;16570:3;16608:6;16602:13;16634:4;16647:51;16691:6;16686:3;16681:2;16673:6;16669:15;16647:51;:::i;:::-;16761:13;;16720:16;;;;16783:55;16761:13;16720:16;16805:15;;;16783:55;:::i;:::-;16927:13;;16860:20;;;16900:1;;16987;17009:18;;;;17062;;;;17089:93;;17167:4;17157:8;17153:19;17141:31;;17089:93;17230:2;17220:8;17217:16;17197:18;17194:40;17191:167;;;-1:-1:-1;;;17257:33:1;;17313:4;17310:1;17303:15;17343:4;17264:3;17331:17;17191:167;17374:18;17401:110;;;;17525:1;17520:328;;;;17367:481;;17401:110;-1:-1:-1;;17436:24:1;;17422:39;;17481:20;;;;-1:-1:-1;17401:110:1;;17520:328;16293:1;16286:14;;;16330:4;16317:18;;17615:1;17629:169;17643:8;17640:1;17637:15;17629:169;;;17725:14;;17710:13;;;17703:37;17768:16;;;;17660:10;;17629:169;;;17633:3;;17829:8;17822:5;17818:20;17811:27;;17367:481;-1:-1:-1;17864:3:1;;16346:1527;-1:-1:-1;;;;;;;;;;;16346:1527:1:o;17878:280::-;17977:6;18030:2;18018:9;18009:7;18005:23;18001:32;17998:52;;;18046:1;18043;18036:12;17998:52;18078:9;18072:16;18097:31;18122:5;18097:31;:::i;19798:414::-;20000:2;19982:21;;;20039:2;20019:18;;;20012:30;20078:34;20073:2;20058:18;;20051:62;-1:-1:-1;;;20144:2:1;20129:18;;20122:48;20202:3;20187:19;;19798:414::o;20217:168::-;20257:7;20323:1;20319;20315:6;20311:14;20308:1;20305:21;20300:1;20293:9;20286:17;20282:45;20279:71;;;20330:18;;:::i;:::-;-1:-1:-1;20370:9:1;;20217:168::o;20390:127::-;20451:10;20446:3;20442:20;20439:1;20432:31;20482:4;20479:1;20472:15;20506:4;20503:1;20496:15;20522:120;20562:1;20588;20578:35;;20593:18;;:::i;:::-;-1:-1:-1;20627:9:1;;20522:120::o;20647:112::-;20679:1;20705;20695:35;;20710:18;;:::i;:::-;-1:-1:-1;20744:9:1;;20647:112::o;20764:489::-;-1:-1:-1;;;;;21033:15:1;;;21015:34;;21085:15;;21080:2;21065:18;;21058:43;21132:2;21117:18;;21110:34;;;21180:3;21175:2;21160:18;;21153:31;;;20958:4;;21201:46;;21227:19;;21219:6;21201:46;:::i;:::-;21193:54;20764:489;-1:-1:-1;;;;;;20764:489:1:o;21258:249::-;21327:6;21380:2;21368:9;21359:7;21355:23;21351:32;21348:52;;;21396:1;21393;21386:12;21348:52;21428:9;21422:16;21447:30;21471:5;21447:30;:::i
Swarm Source
ipfs://636de106f87b4fa9f05bb0b109eaf17b3e7858b6d7bd7b411d9d917e286b64a4
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 29 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.