Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
2,000 DEMONZv2
Holders
581
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 DEMONZv2Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Demonzv2
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-26 */ // File: contracts\interfaces\IERC165.sol /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: contracts\interfaces\IERC721.sol /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: contracts\interfaces\IERC721Receiver.sol /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: contracts\interfaces\IERC721Metadata.sol /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: contracts\libs\Address.sol /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: contracts\utils\Context.sol /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: contracts\libs\Strings.sol /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: contracts\ERC165.sol /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: contracts\ERC721.sol /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev 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(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: contracts\utils\Ownable.sol /** * @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() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts\interfaces\IERC721Enumerable.sol /** * @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); } // File: contracts\ERC721Enumerable.sol /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts\interfaces\IDemonzv1.sol interface IDemonzv1 is IERC721 { function burnToken(uint256 _token_id) external; } // File: contracts\Demonzv2.sol contract Demonzv2 is ERC721Enumerable, Ownable { using Strings for uint256; uint256 public MAX_TOKENS = 2000; uint256 public MAX_PER_WALLET = 50; uint256 public CURRENT_TOKEN_ID = 0; // for testing string public BEGINNING_URI = "https://api.cryptodemonz.com/"; string public ENDING_URI = ".json"; bool public ALLOW_SACRIFCE = true; IDemonzv1 public demonzv1; constructor(address _demonzv1) ERC721 ("CryptoDemonzV2", "DEMONZv2") { demonzv1 = IDemonzv1(_demonzv1); } modifier safeSacrificing { require(ALLOW_SACRIFCE, "Sacrificing has not begun yet"); _; } event tokenSacrificed(address _sender); /// @notice standard minting function /// @param _amount to be minted function mintToken(uint256 _amount) public onlyOwner { require(totalSupply() + _amount <= MAX_TOKENS, "Not enough NFTs left to mint"); _batchMint(_amount, msg.sender); } /// @notice will mint demonzv2 for burning demonzv1 /// @param _ids array of demonzv1 ids to be burned function burnV1(uint256[] memory _ids) external safeSacrificing { uint256 i = 0; require(_ids.length % 3 == 0 && _ids.length <= 9, "Invalid list"); require(totalSupply() + _ids.length <= MAX_TOKENS, "Not enough NFTs left to mint"); require(balanceOf(msg.sender) + _ids.length <= MAX_PER_WALLET, "Exceeds wallet max allowed balance"); for (i=0; i<_ids.length; ++i) { require(demonzv1.ownerOf(_ids[i]) == msg.sender, "Sender is not owner"); demonzv1.safeTransferFrom(msg.sender, address(this), _ids[i]); demonzv1.burnToken(_ids[i]); } _batchMint(_ids.length / 3, msg.sender); // no need to increment token id here emit tokenSacrificed(msg.sender); } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { return string(abi.encodePacked(BEGINNING_URI, tokenId.toString(), ENDING_URI)); } function withdraw() external onlyOwner { payable(msg.sender).transfer(address(this).balance); } function setBeginningURI(string memory _new_uri) external onlyOwner { BEGINNING_URI = _new_uri; } function setEndingURI(string memory _new_uri) external onlyOwner { ENDING_URI = _new_uri; } function toggleSacrifice() external onlyOwner { ALLOW_SACRIFCE = !ALLOW_SACRIFCE; } function changeMaxPerWalletAmount(uint256 _amount) external onlyOwner { MAX_PER_WALLET = _amount; } /// @notice dummy function for unit testing function _incrementTokenId() internal { ++CURRENT_TOKEN_ID; } function _batchMint(uint256 _amount, address _sender) internal { for (uint256 i=0; i<_amount; ++i) { _safeMint(_sender, totalSupply()); _incrementTokenId(); } } /// @notice dummy function for unit testing function getCurrentTokenId() view external returns (uint256) { return CURRENT_TOKEN_ID; } /// @dev DO NOT FORMAT THIS TO PURE, even tho compiler is asking function onERC721Received( address, address, uint256, bytes calldata ) external returns (bytes4) { return bytes4( keccak256("onERC721Received(address,address,uint256,bytes)") ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_demonzv1","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_sender","type":"address"}],"name":"tokenSacrificed","type":"event"},{"inputs":[],"name":"ALLOW_SACRIFCE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BEGINNING_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURRENT_TOKEN_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ENDING_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"name":"burnV1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"changeMaxPerWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demonzv1","outputs":[{"internalType":"contract IDemonzv1","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"_amount","type":"uint256"}],"name":"mintToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_new_uri","type":"string"}],"name":"setBeginningURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_new_uri","type":"string"}],"name":"setEndingURI","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":[],"name":"toggleSacrifice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6107d0600b556032600c556000600d5560c0604052601d60808190527f68747470733a2f2f6170692e63727970746f64656d6f6e7a2e636f6d2f00000060a09081526200005091600e9190620001c8565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200007f91600f91620001c8565b506010805460ff191660011790553480156200009a57600080fd5b506040516200280138038062002801833981016040819052620000bd916200026e565b604080518082018252600e81526d21b93cb83a37a232b6b7b73d2b1960911b6020808301918252835180850190945260088452672222a6a7a72d3b1960c11b9084015281519192916200011391600091620001c8565b50805162000129906001906020840190620001c8565b50505062000146620001406200017260201b60201c565b62000176565b601080546001600160a01b0390921661010002610100600160a81b0319909216919091179055620002db565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001d6906200029e565b90600052602060002090601f016020900481019282620001fa576000855562000245565b82601f106200021557805160ff191683800117855562000245565b8280016001018555821562000245579182015b828111156200024557825182559160200191906001019062000228565b506200025392915062000257565b5090565b5b8082111562000253576000815560010162000258565b60006020828403121562000280578081fd5b81516001600160a01b038116811462000297578182fd5b9392505050565b600181811c90821680620002b357607f821691505b60208210811415620002d557634e487b7160e01b600052602260045260246000fd5b50919050565b61251680620002eb6000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80635701fc0b1161012557806395d89b41116100ad578063c87b56dd1161007c578063c87b56dd14610468578063e0ca32281461047b578063e985e9c514610484578063f2fde38b146104c0578063f47c84c5146104d357600080fd5b806395d89b4114610427578063a22cb4651461042f578063b88d4fde14610442578063c634d0321461045557600080fd5b80636352211e116100f45780636352211e146103d557806370a08231146103e8578063715018a6146103fb57806374e5ec02146104035780638da5cb5b1461041657600080fd5b80635701fc0b146103a55780635cfdf643146103b85780635f7f99af146103c05780636136f7ff146103c857600080fd5b806323b872dd116101a857806342842e0e1161017757806342842e0e1461035c57806342bb78971461036f5780634f6ccce714610382578063544015fe14610395578063561892361461039d57600080fd5b806323b872dd1461031b578063242877c51461032e5780632f745c59146103415780633ccfd60b1461035457600080fd5b80630e96b097116101e45780630e96b097146102935780630f2cdd6c146102ab578063150b7a02146102c257806318160ddd1461031357600080fd5b806301ffc9a71461021657806306fdde031461023e578063081812fc14610253578063095ea7b31461027e575b600080fd5b6102296102243660046120b4565b6104dc565b60405190151581526020015b60405180910390f35b610246610507565b604051610235919061227e565b610266610261366004612132565b610599565b6040516001600160a01b039091168152602001610235565b61029161028c366004611fe1565b610633565b005b6010546102669061010090046001600160a01b031681565b6102b4600c5481565b604051908152602001610235565b6102fa6102d0366004611e99565b7f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f95945050505050565b6040516001600160e01b03199091168152602001610235565b6008546102b4565b610291610329366004611e59565b610749565b61029161033c3660046120ec565b61077a565b6102b461034f366004611fe1565b6107bb565b610291610851565b61029161036a366004611e59565b6108aa565b61029161037d366004612132565b6108c5565b6102b4610390366004612132565b6108f4565b610246610995565b600d546102b4565b6102916103b33660046120ec565b610a23565b610246610a60565b610291610a6d565b6010546102299060ff1681565b6102666103e3366004612132565b610aab565b6102b46103f6366004611de2565b610b22565b610291610ba9565b61029161041136600461200c565b610bdf565b600a546001600160a01b0316610266565b61024661101a565b61029161043d366004611fb0565b611029565b610291610450366004611f33565b6110ee565b610291610463366004612132565b611126565b610246610476366004612132565b6111bf565b6102b4600d5481565b610229610492366004611e21565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6102916104ce366004611de2565b6111f6565b6102b4600b5481565b60006001600160e01b0319821663780e9d6360e01b148061050157506105018261128e565b92915050565b60606000805461051690612409565b80601f016020809104026020016040519081016040528092919081815260200182805461054290612409565b801561058f5780601f106105645761010080835404028352916020019161058f565b820191906000526020600020905b81548152906001019060200180831161057257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166106175760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061063e82610aab565b9050806001600160a01b0316836001600160a01b031614156106ac5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161060e565b336001600160a01b03821614806106c857506106c88133610492565b61073a5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161060e565b61074483836112de565b505050565b610753338261134c565b61076f5760405162461bcd60e51b815260040161060e90612318565b610744838383611443565b600a546001600160a01b031633146107a45760405162461bcd60e51b815260040161060e906122e3565b80516107b790600f906020840190611cf1565b5050565b60006107c683610b22565b82106108285760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161060e565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b0316331461087b5760405162461bcd60e51b815260040161060e906122e3565b60405133904780156108fc02916000818181858888f193505050501580156108a7573d6000803e3d6000fd5b50565b610744838383604051806020016040528060008152506110ee565b600a546001600160a01b031633146108ef5760405162461bcd60e51b815260040161060e906122e3565b600c55565b60006108ff60085490565b82106109625760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161060e565b6008828154811061098357634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600f80546109a290612409565b80601f01602080910402602001604051908101604052809291908181526020018280546109ce90612409565b8015610a1b5780601f106109f057610100808354040283529160200191610a1b565b820191906000526020600020905b8154815290600101906020018083116109fe57829003601f168201915b505050505081565b600a546001600160a01b03163314610a4d5760405162461bcd60e51b815260040161060e906122e3565b80516107b790600e906020840190611cf1565b600e80546109a290612409565b600a546001600160a01b03163314610a975760405162461bcd60e51b815260040161060e906122e3565b6010805460ff19811660ff90911615179055565b6000818152600260205260408120546001600160a01b0316806105015760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161060e565b60006001600160a01b038216610b8d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161060e565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610bd35760405162461bcd60e51b815260040161060e906122e3565b610bdd60006115ee565b565b60105460ff16610c315760405162461bcd60e51b815260206004820152601d60248201527f5361637269666963696e6720686173206e6f7420626567756e20796574000000604482015260640161060e565b600060038251610c41919061245f565b158015610c5057506009825111155b610c8b5760405162461bcd60e51b815260206004820152600c60248201526b125b9d985b1a59081b1a5cdd60a21b604482015260640161060e565b600b548251600854610c9d919061239a565b1115610ceb5760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f756768204e465473206c65667420746f206d696e7400000000604482015260640161060e565b600c548251610cf933610b22565b610d03919061239a565b1115610d5c5760405162461bcd60e51b815260206004820152602260248201527f457863656564732077616c6c6574206d617820616c6c6f7765642062616c616e604482015261636560f01b606482015260840161060e565b5060005b8151811015610fcc576010548251339161010090046001600160a01b031690636352211e90859085908110610da557634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610dcb91815260200190565b60206040518083038186803b158015610de357600080fd5b505afa158015610df7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1b9190611e05565b6001600160a01b031614610e675760405162461bcd60e51b815260206004820152601360248201527229b2b73232b91034b9903737ba1037bbb732b960691b604482015260640161060e565b601060019054906101000a90046001600160a01b03166001600160a01b03166342842e0e3330858581518110610ead57634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015610f0757600080fd5b505af1158015610f1b573d6000803e3d6000fd5b50505050601060019054906101000a90046001600160a01b03166001600160a01b0316637b47ec1a838381518110610f6357634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610f8991815260200190565b600060405180830381600087803b158015610fa357600080fd5b505af1158015610fb7573d6000803e3d6000fd5b5050505080610fc590612444565b9050610d60565b610fe360038351610fdd91906123b2565b33611640565b6040513381527ff3306520a6340cba86066ec084028581623403776130b6040d3da822951f879b9060200160405180910390a15050565b60606001805461051690612409565b6001600160a01b0382163314156110825760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161060e565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6110f8338361134c565b6111145760405162461bcd60e51b815260040161060e90612318565b61112084848484611675565b50505050565b600a546001600160a01b031633146111505760405162461bcd60e51b815260040161060e906122e3565b600b548161115d60085490565b611167919061239a565b11156111b55760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f756768204e465473206c65667420746f206d696e7400000000604482015260640161060e565b6108a78133611640565b6060600e6111cc836116a8565b600f6040516020016111e09392919061220e565b6040516020818303038152906040529050919050565b600a546001600160a01b031633146112205760405162461bcd60e51b815260040161060e906122e3565b6001600160a01b0381166112855760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161060e565b6108a7816115ee565b60006001600160e01b031982166380ac58cd60e01b14806112bf57506001600160e01b03198216635b5e139f60e01b145b8061050157506301ffc9a760e01b6001600160e01b0319831614610501565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061131382610aab565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166113c55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161060e565b60006113d083610aab565b9050806001600160a01b0316846001600160a01b0316148061140b5750836001600160a01b031661140084610599565b6001600160a01b0316145b8061143b57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661145682610aab565b6001600160a01b0316146114be5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161060e565b6001600160a01b0382166115205760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161060e565b61152b8383836117c2565b6115366000826112de565b6001600160a01b038316600090815260036020526040812080546001929061155f9084906123c6565b90915550506001600160a01b038216600090815260036020526040812080546001929061158d90849061239a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005b828110156107445761165d8261165860085490565b61187a565b611665611894565b61166e81612444565b9050611643565b611680848484611443565b61168c848484846118a9565b6111205760405162461bcd60e51b815260040161060e90612291565b6060816116cc5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156116f657806116e081612444565b91506116ef9050600a836123b2565b91506116d0565b60008167ffffffffffffffff81111561171f57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611749576020820181803683370190505b5090505b841561143b5761175e6001836123c6565b915061176b600a8661245f565b61177690603061239a565b60f81b81838151811061179957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506117bb600a866123b2565b945061174d565b6001600160a01b03831661181d5761181881600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611840565b816001600160a01b0316836001600160a01b0316146118405761184083826119b6565b6001600160a01b0382166118575761074481611a53565b826001600160a01b0316826001600160a01b031614610744576107448282611b2c565b6107b7828260405180602001604052806000815250611b70565b600d600081546118a390612444565b90915550565b60006001600160a01b0384163b156119ab57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906118ed903390899088908890600401612241565b602060405180830381600087803b15801561190757600080fd5b505af1925050508015611937575060408051601f3d908101601f19168201909252611934918101906120d0565b60015b611991573d808015611965576040519150601f19603f3d011682016040523d82523d6000602084013e61196a565b606091505b5080516119895760405162461bcd60e51b815260040161060e90612291565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061143b565b506001949350505050565b600060016119c384610b22565b6119cd91906123c6565b600083815260076020526040902054909150808214611a20576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611a65906001906123c6565b60008381526009602052604081205460088054939450909284908110611a9b57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110611aca57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611b1057634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000611b3783610b22565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b611b7a8383611ba3565b611b8760008484846118a9565b6107445760405162461bcd60e51b815260040161060e90612291565b6001600160a01b038216611bf95760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161060e565b6000818152600260205260409020546001600160a01b031615611c5e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161060e565b611c6a600083836117c2565b6001600160a01b0382166000908152600360205260408120805460019290611c9390849061239a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611cfd90612409565b90600052602060002090601f016020900481019282611d1f5760008555611d65565b82601f10611d3857805160ff1916838001178555611d65565b82800160010185558215611d65579182015b82811115611d65578251825591602001919060010190611d4a565b50611d71929150611d75565b5090565b5b80821115611d715760008155600101611d76565b600067ffffffffffffffff831115611da457611da461249f565b611db7601f8401601f1916602001612369565b9050828152838383011115611dcb57600080fd5b828260208301376000602084830101529392505050565b600060208284031215611df3578081fd5b8135611dfe816124b5565b9392505050565b600060208284031215611e16578081fd5b8151611dfe816124b5565b60008060408385031215611e33578081fd5b8235611e3e816124b5565b91506020830135611e4e816124b5565b809150509250929050565b600080600060608486031215611e6d578081fd5b8335611e78816124b5565b92506020840135611e88816124b5565b929592945050506040919091013590565b600080600080600060808688031215611eb0578081fd5b8535611ebb816124b5565b94506020860135611ecb816124b5565b935060408601359250606086013567ffffffffffffffff80821115611eee578283fd5b818801915088601f830112611f01578283fd5b813581811115611f0f578384fd5b896020828501011115611f20578384fd5b9699959850939650602001949392505050565b60008060008060808587031215611f48578384fd5b8435611f53816124b5565b93506020850135611f63816124b5565b925060408501359150606085013567ffffffffffffffff811115611f85578182fd5b8501601f81018713611f95578182fd5b611fa487823560208401611d8a565b91505092959194509250565b60008060408385031215611fc2578182fd5b8235611fcd816124b5565b915060208301358015158114611e4e578182fd5b60008060408385031215611ff3578182fd5b8235611ffe816124b5565b946020939093013593505050565b6000602080838503121561201e578182fd5b823567ffffffffffffffff80821115612035578384fd5b818501915085601f830112612048578384fd5b81358181111561205a5761205a61249f565b8060051b915061206b848301612369565b8181528481019084860184860187018a1015612085578788fd5b8795505b838610156120a7578035835260019590950194918601918601612089565b5098975050505050505050565b6000602082840312156120c5578081fd5b8135611dfe816124ca565b6000602082840312156120e1578081fd5b8151611dfe816124ca565b6000602082840312156120fd578081fd5b813567ffffffffffffffff811115612113578182fd5b8201601f81018413612123578182fd5b61143b84823560208401611d8a565b600060208284031215612143578081fd5b5035919050565b600081518084526121628160208601602086016123dd565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061219057607f831692505b60208084108214156121b057634e487b7160e01b86526022600452602486fd5b8180156121c457600181146121d557612202565b60ff19861689528489019650612202565b60008881526020902060005b868110156121fa5781548b8201529085019083016121e1565b505084890196505b50505050505092915050565b600061221a8286612176565b845161222a8183602089016123dd565b61223681830186612176565b979650505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906122749083018461214a565b9695505050505050565b602081526000611dfe602083018461214a565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156123925761239261249f565b604052919050565b600082198211156123ad576123ad612473565b500190565b6000826123c1576123c1612489565b500490565b6000828210156123d8576123d8612473565b500390565b60005b838110156123f85781810151838201526020016123e0565b838111156111205750506000910152565b600181811c9082168061241d57607f821691505b6020821081141561243e57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561245857612458612473565b5060010190565b60008261246e5761246e612489565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146108a757600080fd5b6001600160e01b0319811681146108a757600080fdfea2646970667358221220bf31260e0594340f131fe31d3dd0f06e35efae8d0050f1275646186cb3bb4d2764736f6c63430008040033000000000000000000000000ae16529ed90fafc927d774ea7be1b95d826664e3
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102115760003560e01c80635701fc0b1161012557806395d89b41116100ad578063c87b56dd1161007c578063c87b56dd14610468578063e0ca32281461047b578063e985e9c514610484578063f2fde38b146104c0578063f47c84c5146104d357600080fd5b806395d89b4114610427578063a22cb4651461042f578063b88d4fde14610442578063c634d0321461045557600080fd5b80636352211e116100f45780636352211e146103d557806370a08231146103e8578063715018a6146103fb57806374e5ec02146104035780638da5cb5b1461041657600080fd5b80635701fc0b146103a55780635cfdf643146103b85780635f7f99af146103c05780636136f7ff146103c857600080fd5b806323b872dd116101a857806342842e0e1161017757806342842e0e1461035c57806342bb78971461036f5780634f6ccce714610382578063544015fe14610395578063561892361461039d57600080fd5b806323b872dd1461031b578063242877c51461032e5780632f745c59146103415780633ccfd60b1461035457600080fd5b80630e96b097116101e45780630e96b097146102935780630f2cdd6c146102ab578063150b7a02146102c257806318160ddd1461031357600080fd5b806301ffc9a71461021657806306fdde031461023e578063081812fc14610253578063095ea7b31461027e575b600080fd5b6102296102243660046120b4565b6104dc565b60405190151581526020015b60405180910390f35b610246610507565b604051610235919061227e565b610266610261366004612132565b610599565b6040516001600160a01b039091168152602001610235565b61029161028c366004611fe1565b610633565b005b6010546102669061010090046001600160a01b031681565b6102b4600c5481565b604051908152602001610235565b6102fa6102d0366004611e99565b7f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f95945050505050565b6040516001600160e01b03199091168152602001610235565b6008546102b4565b610291610329366004611e59565b610749565b61029161033c3660046120ec565b61077a565b6102b461034f366004611fe1565b6107bb565b610291610851565b61029161036a366004611e59565b6108aa565b61029161037d366004612132565b6108c5565b6102b4610390366004612132565b6108f4565b610246610995565b600d546102b4565b6102916103b33660046120ec565b610a23565b610246610a60565b610291610a6d565b6010546102299060ff1681565b6102666103e3366004612132565b610aab565b6102b46103f6366004611de2565b610b22565b610291610ba9565b61029161041136600461200c565b610bdf565b600a546001600160a01b0316610266565b61024661101a565b61029161043d366004611fb0565b611029565b610291610450366004611f33565b6110ee565b610291610463366004612132565b611126565b610246610476366004612132565b6111bf565b6102b4600d5481565b610229610492366004611e21565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6102916104ce366004611de2565b6111f6565b6102b4600b5481565b60006001600160e01b0319821663780e9d6360e01b148061050157506105018261128e565b92915050565b60606000805461051690612409565b80601f016020809104026020016040519081016040528092919081815260200182805461054290612409565b801561058f5780601f106105645761010080835404028352916020019161058f565b820191906000526020600020905b81548152906001019060200180831161057257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166106175760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061063e82610aab565b9050806001600160a01b0316836001600160a01b031614156106ac5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161060e565b336001600160a01b03821614806106c857506106c88133610492565b61073a5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161060e565b61074483836112de565b505050565b610753338261134c565b61076f5760405162461bcd60e51b815260040161060e90612318565b610744838383611443565b600a546001600160a01b031633146107a45760405162461bcd60e51b815260040161060e906122e3565b80516107b790600f906020840190611cf1565b5050565b60006107c683610b22565b82106108285760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161060e565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b0316331461087b5760405162461bcd60e51b815260040161060e906122e3565b60405133904780156108fc02916000818181858888f193505050501580156108a7573d6000803e3d6000fd5b50565b610744838383604051806020016040528060008152506110ee565b600a546001600160a01b031633146108ef5760405162461bcd60e51b815260040161060e906122e3565b600c55565b60006108ff60085490565b82106109625760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161060e565b6008828154811061098357634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600f80546109a290612409565b80601f01602080910402602001604051908101604052809291908181526020018280546109ce90612409565b8015610a1b5780601f106109f057610100808354040283529160200191610a1b565b820191906000526020600020905b8154815290600101906020018083116109fe57829003601f168201915b505050505081565b600a546001600160a01b03163314610a4d5760405162461bcd60e51b815260040161060e906122e3565b80516107b790600e906020840190611cf1565b600e80546109a290612409565b600a546001600160a01b03163314610a975760405162461bcd60e51b815260040161060e906122e3565b6010805460ff19811660ff90911615179055565b6000818152600260205260408120546001600160a01b0316806105015760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161060e565b60006001600160a01b038216610b8d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161060e565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610bd35760405162461bcd60e51b815260040161060e906122e3565b610bdd60006115ee565b565b60105460ff16610c315760405162461bcd60e51b815260206004820152601d60248201527f5361637269666963696e6720686173206e6f7420626567756e20796574000000604482015260640161060e565b600060038251610c41919061245f565b158015610c5057506009825111155b610c8b5760405162461bcd60e51b815260206004820152600c60248201526b125b9d985b1a59081b1a5cdd60a21b604482015260640161060e565b600b548251600854610c9d919061239a565b1115610ceb5760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f756768204e465473206c65667420746f206d696e7400000000604482015260640161060e565b600c548251610cf933610b22565b610d03919061239a565b1115610d5c5760405162461bcd60e51b815260206004820152602260248201527f457863656564732077616c6c6574206d617820616c6c6f7765642062616c616e604482015261636560f01b606482015260840161060e565b5060005b8151811015610fcc576010548251339161010090046001600160a01b031690636352211e90859085908110610da557634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610dcb91815260200190565b60206040518083038186803b158015610de357600080fd5b505afa158015610df7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1b9190611e05565b6001600160a01b031614610e675760405162461bcd60e51b815260206004820152601360248201527229b2b73232b91034b9903737ba1037bbb732b960691b604482015260640161060e565b601060019054906101000a90046001600160a01b03166001600160a01b03166342842e0e3330858581518110610ead57634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015610f0757600080fd5b505af1158015610f1b573d6000803e3d6000fd5b50505050601060019054906101000a90046001600160a01b03166001600160a01b0316637b47ec1a838381518110610f6357634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610f8991815260200190565b600060405180830381600087803b158015610fa357600080fd5b505af1158015610fb7573d6000803e3d6000fd5b5050505080610fc590612444565b9050610d60565b610fe360038351610fdd91906123b2565b33611640565b6040513381527ff3306520a6340cba86066ec084028581623403776130b6040d3da822951f879b9060200160405180910390a15050565b60606001805461051690612409565b6001600160a01b0382163314156110825760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161060e565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6110f8338361134c565b6111145760405162461bcd60e51b815260040161060e90612318565b61112084848484611675565b50505050565b600a546001600160a01b031633146111505760405162461bcd60e51b815260040161060e906122e3565b600b548161115d60085490565b611167919061239a565b11156111b55760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f756768204e465473206c65667420746f206d696e7400000000604482015260640161060e565b6108a78133611640565b6060600e6111cc836116a8565b600f6040516020016111e09392919061220e565b6040516020818303038152906040529050919050565b600a546001600160a01b031633146112205760405162461bcd60e51b815260040161060e906122e3565b6001600160a01b0381166112855760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161060e565b6108a7816115ee565b60006001600160e01b031982166380ac58cd60e01b14806112bf57506001600160e01b03198216635b5e139f60e01b145b8061050157506301ffc9a760e01b6001600160e01b0319831614610501565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061131382610aab565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166113c55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161060e565b60006113d083610aab565b9050806001600160a01b0316846001600160a01b0316148061140b5750836001600160a01b031661140084610599565b6001600160a01b0316145b8061143b57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661145682610aab565b6001600160a01b0316146114be5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161060e565b6001600160a01b0382166115205760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161060e565b61152b8383836117c2565b6115366000826112de565b6001600160a01b038316600090815260036020526040812080546001929061155f9084906123c6565b90915550506001600160a01b038216600090815260036020526040812080546001929061158d90849061239a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005b828110156107445761165d8261165860085490565b61187a565b611665611894565b61166e81612444565b9050611643565b611680848484611443565b61168c848484846118a9565b6111205760405162461bcd60e51b815260040161060e90612291565b6060816116cc5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156116f657806116e081612444565b91506116ef9050600a836123b2565b91506116d0565b60008167ffffffffffffffff81111561171f57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611749576020820181803683370190505b5090505b841561143b5761175e6001836123c6565b915061176b600a8661245f565b61177690603061239a565b60f81b81838151811061179957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506117bb600a866123b2565b945061174d565b6001600160a01b03831661181d5761181881600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611840565b816001600160a01b0316836001600160a01b0316146118405761184083826119b6565b6001600160a01b0382166118575761074481611a53565b826001600160a01b0316826001600160a01b031614610744576107448282611b2c565b6107b7828260405180602001604052806000815250611b70565b600d600081546118a390612444565b90915550565b60006001600160a01b0384163b156119ab57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906118ed903390899088908890600401612241565b602060405180830381600087803b15801561190757600080fd5b505af1925050508015611937575060408051601f3d908101601f19168201909252611934918101906120d0565b60015b611991573d808015611965576040519150601f19603f3d011682016040523d82523d6000602084013e61196a565b606091505b5080516119895760405162461bcd60e51b815260040161060e90612291565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061143b565b506001949350505050565b600060016119c384610b22565b6119cd91906123c6565b600083815260076020526040902054909150808214611a20576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611a65906001906123c6565b60008381526009602052604081205460088054939450909284908110611a9b57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110611aca57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611b1057634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000611b3783610b22565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b611b7a8383611ba3565b611b8760008484846118a9565b6107445760405162461bcd60e51b815260040161060e90612291565b6001600160a01b038216611bf95760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161060e565b6000818152600260205260409020546001600160a01b031615611c5e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161060e565b611c6a600083836117c2565b6001600160a01b0382166000908152600360205260408120805460019290611c9390849061239a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611cfd90612409565b90600052602060002090601f016020900481019282611d1f5760008555611d65565b82601f10611d3857805160ff1916838001178555611d65565b82800160010185558215611d65579182015b82811115611d65578251825591602001919060010190611d4a565b50611d71929150611d75565b5090565b5b80821115611d715760008155600101611d76565b600067ffffffffffffffff831115611da457611da461249f565b611db7601f8401601f1916602001612369565b9050828152838383011115611dcb57600080fd5b828260208301376000602084830101529392505050565b600060208284031215611df3578081fd5b8135611dfe816124b5565b9392505050565b600060208284031215611e16578081fd5b8151611dfe816124b5565b60008060408385031215611e33578081fd5b8235611e3e816124b5565b91506020830135611e4e816124b5565b809150509250929050565b600080600060608486031215611e6d578081fd5b8335611e78816124b5565b92506020840135611e88816124b5565b929592945050506040919091013590565b600080600080600060808688031215611eb0578081fd5b8535611ebb816124b5565b94506020860135611ecb816124b5565b935060408601359250606086013567ffffffffffffffff80821115611eee578283fd5b818801915088601f830112611f01578283fd5b813581811115611f0f578384fd5b896020828501011115611f20578384fd5b9699959850939650602001949392505050565b60008060008060808587031215611f48578384fd5b8435611f53816124b5565b93506020850135611f63816124b5565b925060408501359150606085013567ffffffffffffffff811115611f85578182fd5b8501601f81018713611f95578182fd5b611fa487823560208401611d8a565b91505092959194509250565b60008060408385031215611fc2578182fd5b8235611fcd816124b5565b915060208301358015158114611e4e578182fd5b60008060408385031215611ff3578182fd5b8235611ffe816124b5565b946020939093013593505050565b6000602080838503121561201e578182fd5b823567ffffffffffffffff80821115612035578384fd5b818501915085601f830112612048578384fd5b81358181111561205a5761205a61249f565b8060051b915061206b848301612369565b8181528481019084860184860187018a1015612085578788fd5b8795505b838610156120a7578035835260019590950194918601918601612089565b5098975050505050505050565b6000602082840312156120c5578081fd5b8135611dfe816124ca565b6000602082840312156120e1578081fd5b8151611dfe816124ca565b6000602082840312156120fd578081fd5b813567ffffffffffffffff811115612113578182fd5b8201601f81018413612123578182fd5b61143b84823560208401611d8a565b600060208284031215612143578081fd5b5035919050565b600081518084526121628160208601602086016123dd565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061219057607f831692505b60208084108214156121b057634e487b7160e01b86526022600452602486fd5b8180156121c457600181146121d557612202565b60ff19861689528489019650612202565b60008881526020902060005b868110156121fa5781548b8201529085019083016121e1565b505084890196505b50505050505092915050565b600061221a8286612176565b845161222a8183602089016123dd565b61223681830186612176565b979650505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906122749083018461214a565b9695505050505050565b602081526000611dfe602083018461214a565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156123925761239261249f565b604052919050565b600082198211156123ad576123ad612473565b500190565b6000826123c1576123c1612489565b500490565b6000828210156123d8576123d8612473565b500390565b60005b838110156123f85781810151838201526020016123e0565b838111156111205750506000910152565b600181811c9082168061241d57607f821691505b6020821081141561243e57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561245857612458612473565b5060010190565b60008261246e5761246e612489565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146108a757600080fd5b6001600160e01b0319811681146108a757600080fdfea2646970667358221220bf31260e0594340f131fe31d3dd0f06e35efae8d0050f1275646186cb3bb4d2764736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ae16529ed90fafc927d774ea7be1b95d826664e3
-----Decoded View---------------
Arg [0] : _demonzv1 (address): 0xAE16529eD90FAfc927D774Ea7bE1b95D826664E3
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000ae16529ed90fafc927d774ea7be1b95d826664e3
Deployed Bytecode Sourcemap
42129:3492:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35848:224;;;;;;:::i;:::-;;:::i;:::-;;;9582:14:1;;9575:22;9557:41;;9545:2;9530:18;35848:224:0;;;;;;;;20762:100;;;:::i;:::-;;;;;;;:::i;22305:219::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8500:32:1;;;8482:51;;8470:2;8455:18;22305:219:0;8437:102:1;21834:407:0;;;;;;:::i;:::-;;:::i;:::-;;42504:25;;;;;;;;-1:-1:-1;;;;;42504:25:0;;;42254:34;;;;;;;;;19010:25:1;;;18998:2;18983:18;42254:34:0;18965:76:1;45341:277:0;;;;;;:::i;:::-;45535:60;45341:277;;;;;;;;;;;-1:-1:-1;;;;;;9771:33:1;;;9753:52;;9741:2;9726:18;45341:277:0;9708:103:1;36484:113:0;36572:10;:17;36484:113;;23185:337;;;;;;:::i;:::-;;:::i;44431:105::-;;;;;;:::i;:::-;;:::i;36154:256::-;;;;;;:::i;:::-;;:::i;44197:109::-;;;:::i;23591:185::-;;;;;;:::i;:::-;;:::i;44645:113::-;;;;;;:::i;:::-;;:::i;36672:233::-;;;;;;:::i;:::-;;:::i;42421:34::-;;;:::i;45162:103::-;45241:16;;45162:103;;44314:111;;;;;;:::i;:::-;;:::i;42353:61::-;;;:::i;44542:97::-;;;:::i;42462:33::-;;;;;;;;;20458:239;;;;;;:::i;:::-;;:::i;20190:208::-;;;;;;:::i;:::-;;:::i;33455:94::-;;;:::i;43225:775::-;;;;;;:::i;:::-;;:::i;32808:87::-;32881:6;;-1:-1:-1;;;;;32881:6:0;32808:87;;20929:104;;;:::i;22594:293::-;;;;;;:::i;:::-;;:::i;23845:328::-;;;;;;:::i;:::-;;:::i;42912:192::-;;;;;;:::i;:::-;;:::i;44006:185::-;;;;;;:::i;:::-;;:::i;42295:35::-;;;;;;22956:164;;;;;;:::i;:::-;-1:-1:-1;;;;;23077:25:0;;;23053:4;23077:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;22956:164;33702:192;;;;;;:::i;:::-;;:::i;42215:32::-;;;;;;35848:224;35950:4;-1:-1:-1;;;;;;35974:50:0;;-1:-1:-1;;;35974:50:0;;:90;;;36028:36;36052:11;36028:23;:36::i;:::-;35967:97;35848:224;-1:-1:-1;;35848:224:0:o;20762:100::-;20816:13;20849:5;20842:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20762:100;:::o;22305:219::-;22381:7;25768:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25768:16:0;22401:73;;;;-1:-1:-1;;;22401:73:0;;15540:2:1;22401:73:0;;;15522:21:1;15579:2;15559:18;;;15552:30;15618:34;15598:18;;;15591:62;-1:-1:-1;;;15669:18:1;;;15662:42;15721:19;;22401:73:0;;;;;;;;;-1:-1:-1;22492:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;22492:24:0;;22305:219::o;21834:407::-;21915:13;21931:23;21946:7;21931:14;:23::i;:::-;21915:39;;21979:5;-1:-1:-1;;;;;21973:11:0;:2;-1:-1:-1;;;;;21973:11:0;;;21965:57;;;;-1:-1:-1;;;21965:57:0;;16724:2:1;21965:57:0;;;16706:21:1;16763:2;16743:18;;;16736:30;16802:34;16782:18;;;16775:62;-1:-1:-1;;;16853:18:1;;;16846:31;16894:19;;21965:57:0;16696:223:1;21965:57:0;15548:10;-1:-1:-1;;;;;22055:21:0;;;;:62;;-1:-1:-1;22080:37:0;22097:5;15548:10;22956:164;:::i;22080:37::-;22033:168;;;;-1:-1:-1;;;22033:168:0;;13933:2:1;22033:168:0;;;13915:21:1;13972:2;13952:18;;;13945:30;14011:34;13991:18;;;13984:62;14082:26;14062:18;;;14055:54;14126:19;;22033:168:0;13905:246:1;22033:168:0;22212:21;22221:2;22225:7;22212:8;:21::i;:::-;21834:407;;;:::o;23185:337::-;23380:41;15548:10;23413:7;23380:18;:41::i;:::-;23372:103;;;;-1:-1:-1;;;23372:103:0;;;;;;;:::i;:::-;23486:28;23496:4;23502:2;23506:7;23486:9;:28::i;44431:105::-;32881:6;;-1:-1:-1;;;;;32881:6:0;15548:10;33026:23;33018:68;;;;-1:-1:-1;;;33018:68:0;;;;;;;:::i;:::-;44507:21;;::::1;::::0;:10:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;44431:105:::0;:::o;36154:256::-;36251:7;36287:23;36304:5;36287:16;:23::i;:::-;36279:5;:31;36271:87;;;;-1:-1:-1;;;36271:87:0;;10468:2:1;36271:87:0;;;10450:21:1;10507:2;10487:18;;;10480:30;10546:34;10526:18;;;10519:62;-1:-1:-1;;;10597:18:1;;;10590:41;10648:19;;36271:87:0;10440:233:1;36271:87:0;-1:-1:-1;;;;;;36376:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;36154:256::o;44197:109::-;32881:6;;-1:-1:-1;;;;;32881:6:0;15548:10;33026:23;33018:68;;;;-1:-1:-1;;;33018:68:0;;;;;;;:::i;:::-;44247:51:::1;::::0;44255:10:::1;::::0;44276:21:::1;44247:51:::0;::::1;;;::::0;::::1;::::0;;;44276:21;44255:10;44247:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;44197:109::o:0;23591:185::-;23729:39;23746:4;23752:2;23756:7;23729:39;;;;;;;;;;;;:16;:39::i;44645:113::-;32881:6;;-1:-1:-1;;;;;32881:6:0;15548:10;33026:23;33018:68;;;;-1:-1:-1;;;33018:68:0;;;;;;;:::i;:::-;44726:14:::1;:24:::0;44645:113::o;36672:233::-;36747:7;36783:30;36572:10;:17;;36484:113;36783:30;36775:5;:38;36767:95;;;;-1:-1:-1;;;36767:95:0;;18653:2:1;36767:95:0;;;18635:21:1;18692:2;18672:18;;;18665:30;18731:34;18711:18;;;18704:62;-1:-1:-1;;;18782:18:1;;;18775:42;18834:19;;36767:95:0;18625:234:1;36767:95:0;36880:10;36891:5;36880:17;;;;;;-1:-1:-1;;;36880:17:0;;;;;;;;;;;;;;;;;36873:24;;36672:233;;;:::o;42421:34::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44314:111::-;32881:6;;-1:-1:-1;;;;;32881:6:0;15548:10;33026:23;33018:68;;;;-1:-1:-1;;;33018:68:0;;;;;;;:::i;:::-;44393:24;;::::1;::::0;:13:::1;::::0;:24:::1;::::0;::::1;::::0;::::1;:::i;42353:61::-:0;;;;;;;:::i;44542:97::-;32881:6;;-1:-1:-1;;;;;32881:6:0;15548:10;33026:23;33018:68;;;;-1:-1:-1;;;33018:68:0;;;;;;;:::i;:::-;44617:14:::1;::::0;;-1:-1:-1;;44599:32:0;::::1;44617:14;::::0;;::::1;44616:15;44599:32;::::0;;44542:97::o;20458:239::-;20530:7;20566:16;;;:7;:16;;;;;;-1:-1:-1;;;;;20566:16:0;20601:19;20593:73;;;;-1:-1:-1;;;20593:73:0;;14769:2:1;20593:73:0;;;14751:21:1;14808:2;14788:18;;;14781:30;14847:34;14827:18;;;14820:62;-1:-1:-1;;;14898:18:1;;;14891:39;14947:19;;20593:73:0;14741:231:1;20190:208:0;20262:7;-1:-1:-1;;;;;20290:19:0;;20282:74;;;;-1:-1:-1;;;20282:74:0;;14358:2:1;20282:74:0;;;14340:21:1;14397:2;14377:18;;;14370:30;14436:34;14416:18;;;14409:62;-1:-1:-1;;;14487:18:1;;;14480:40;14537:19;;20282:74:0;14330:232:1;20282:74:0;-1:-1:-1;;;;;;20374:16:0;;;;;:9;:16;;;;;;;20190:208::o;33455:94::-;32881:6;;-1:-1:-1;;;;;32881:6:0;15548:10;33026:23;33018:68;;;;-1:-1:-1;;;33018:68:0;;;;;;;:::i;:::-;33520:21:::1;33538:1;33520:9;:21::i;:::-;33455:94::o:0;43225:775::-;42707:14;;;;42699:56;;;;-1:-1:-1;;;42699:56:0;;17529:2:1;42699:56:0;;;17511:21:1;17568:2;17548:18;;;17541:30;17607:31;17587:18;;;17580:59;17656:18;;42699:56:0;17501:179:1;42699:56:0;43300:9:::1;43346:1;43332:4;:11;:15;;;;:::i;:::-;:20:::0;:40;::::1;;;;43371:1;43356:4;:11;:16;;43332:40;43324:65;;;::::0;-1:-1:-1;;;43324:65:0;;13592:2:1;43324:65:0::1;::::0;::::1;13574:21:1::0;13631:2;13611:18;;;13604:30;-1:-1:-1;;;13650:18:1;;;13643:42;13702:18;;43324:65:0::1;13564:162:1::0;43324:65:0::1;43439:10;::::0;43424:11;;36572:10;:17;43408:27:::1;;;;:::i;:::-;:41;;43400:82;;;::::0;-1:-1:-1;;;43400:82:0;;11706:2:1;43400:82:0::1;::::0;::::1;11688:21:1::0;11745:2;11725:18;;;11718:30;11784;11764:18;;;11757:58;11832:18;;43400:82:0::1;11678:178:1::0;43400:82:0::1;43540:14;;43525:4;:11;43501:21;43511:10;43501:9;:21::i;:::-;:35;;;;:::i;:::-;:53;;43493:100;;;::::0;-1:-1:-1;;;43493:100:0;;17126:2:1;43493:100:0::1;::::0;::::1;17108:21:1::0;17165:2;17145:18;;;17138:30;17204:34;17184:18;;;17177:62;-1:-1:-1;;;17255:18:1;;;17248:32;17297:19;;43493:100:0::1;17098:224:1::0;43493:100:0::1;-1:-1:-1::0;43611:1:0::1;43604:249;43616:4;:11;43614:1;:13;43604:249;;;43657:8;::::0;43674:7;;43686:10:::1;::::0;43657:8:::1;::::0;::::1;-1:-1:-1::0;;;;;43657:8:0::1;::::0;:16:::1;::::0;43674:4;;43679:1;;43674:7;::::1;;;-1:-1:-1::0;;;43674:7:0::1;;;;;;;;;;;;;;;43657:25;;;;;;;;;;;;;19010::1::0;;18998:2;18983:18;;18965:76;43657:25:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;43657:39:0::1;;43649:71;;;::::0;-1:-1:-1;;;43649:71:0;;17887:2:1;43649:71:0::1;::::0;::::1;17869:21:1::0;17926:2;17906:18;;;17899:30;-1:-1:-1;;;17945:18:1;;;17938:49;18004:18;;43649:71:0::1;17859:169:1::0;43649:71:0::1;43735:8;;;;;;;;;-1:-1:-1::0;;;;;43735:8:0::1;-1:-1:-1::0;;;;;43735:25:0::1;;43761:10;43781:4;43788;43793:1;43788:7;;;;;;-1:-1:-1::0;;;43788:7:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;43735:61:::1;::::0;-1:-1:-1;;;;;;43735:61:0::1;::::0;;;;;;-1:-1:-1;;;;;8802:15:1;;;43735:61:0::1;::::0;::::1;8784:34:1::0;8854:15;;;;8834:18;;;8827:43;8886:18;;;8879:34;8719:18;;43735:61:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43811:8;;;;;;;;;-1:-1:-1::0;;;;;43811:8:0::1;-1:-1:-1::0;;;;;43811:18:0::1;;43830:4;43835:1;43830:7;;;;;;-1:-1:-1::0;;;43830:7:0::1;;;;;;;;;;;;;;;43811:27;;;;;;;;;;;;;19010:25:1::0;;18998:2;18983:18;;18965:76;43811:27:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43629:3;;;;:::i;:::-;;;43604:249;;;43863:39;43888:1;43874:4;:11;:15;;;;:::i;:::-;43891:10;43863;:39::i;:::-;43965:27;::::0;43981:10:::1;8482:51:1::0;;43965:27:0::1;::::0;8470:2:1;8455:18;43965:27:0::1;;;;;;;42766:1;43225:775:::0;:::o;20929:104::-;20985:13;21018:7;21011:14;;;;;:::i;22594:293::-;-1:-1:-1;;;;;22697:24:0;;15548:10;22697:24;;22689:62;;;;-1:-1:-1;;;22689:62:0;;12825:2:1;22689:62:0;;;12807:21:1;12864:2;12844:18;;;12837:30;12903:27;12883:18;;;12876:55;12948:18;;22689:62:0;12797:175:1;22689:62:0;15548:10;22762:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;22762:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;22762:53:0;;;;;;;;;;22831:48;;9557:41:1;;;22762:42:0;;15548:10;22831:48;;9530:18:1;22831:48:0;;;;;;;22594:293;;:::o;23845:328::-;24020:41;15548:10;24053:7;24020:18;:41::i;:::-;24012:103;;;;-1:-1:-1;;;24012:103:0;;;;;;;:::i;:::-;24126:39;24140:4;24146:2;24150:7;24159:5;24126:13;:39::i;:::-;23845:328;;;;:::o;42912:192::-;32881:6;;-1:-1:-1;;;;;32881:6:0;15548:10;33026:23;33018:68;;;;-1:-1:-1;;;33018:68:0;;;;;;;:::i;:::-;43011:10:::1;;43000:7;42984:13;36572:10:::0;:17;;36484:113;42984:13:::1;:23;;;;:::i;:::-;:37;;42976:78;;;::::0;-1:-1:-1;;;42976:78:0;;11706:2:1;42976:78:0::1;::::0;::::1;11688:21:1::0;11745:2;11725:18;;;11718:30;11784;11764:18;;;11757:58;11832:18;;42976:78:0::1;11678:178:1::0;42976:78:0::1;43065:31;43076:7;43085:10;43065;:31::i;44006:185::-:0;44079:13;44136;44151:18;:7;:16;:18::i;:::-;44171:10;44119:63;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44105:78;;44006:185;;;:::o;33702:192::-;32881:6;;-1:-1:-1;;;;;32881:6:0;15548:10;33026:23;33018:68;;;;-1:-1:-1;;;33018:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33791:22:0;::::1;33783:73;;;::::0;-1:-1:-1;;;33783:73:0;;11299:2:1;33783:73:0::1;::::0;::::1;11281:21:1::0;11338:2;11318:18;;;11311:30;11377:34;11357:18;;;11350:62;-1:-1:-1;;;11428:18:1;;;11421:36;11474:19;;33783:73:0::1;11271:228:1::0;33783:73:0::1;33867:19;33877:8;33867:9;:19::i;19823:305::-:0;19925:4;-1:-1:-1;;;;;;19962:40:0;;-1:-1:-1;;;19962:40:0;;:105;;-1:-1:-1;;;;;;;20019:48:0;;-1:-1:-1;;;20019:48:0;19962:105;:158;;;-1:-1:-1;;;;;;;;;;18528:40:0;;;20084:36;18419:157;29625:174;29700:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;29700:29:0;-1:-1:-1;;;;;29700:29:0;;;;;;;;:24;;29754:23;29700:24;29754:14;:23::i;:::-;-1:-1:-1;;;;;29745:46:0;;;;;;;;;;;29625:174;;:::o;25971:348::-;26064:4;25768:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25768:16:0;26081:73;;;;-1:-1:-1;;;26081:73:0;;13179:2:1;26081:73:0;;;13161:21:1;13218:2;13198:18;;;13191:30;13257:34;13237:18;;;13230:62;-1:-1:-1;;;13308:18:1;;;13301:42;13360:19;;26081:73:0;13151:234:1;26081:73:0;26165:13;26181:23;26196:7;26181:14;:23::i;:::-;26165:39;;26234:5;-1:-1:-1;;;;;26223:16:0;:7;-1:-1:-1;;;;;26223:16:0;;:51;;;;26267:7;-1:-1:-1;;;;;26243:31:0;:20;26255:7;26243:11;:20::i;:::-;-1:-1:-1;;;;;26243:31:0;;26223:51;:87;;;-1:-1:-1;;;;;;23077:25:0;;;23053:4;23077:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;26278:32;26215:96;25971:348;-1:-1:-1;;;;25971:348:0:o;28939:570::-;29098:4;-1:-1:-1;;;;;29071:31:0;:23;29086:7;29071:14;:23::i;:::-;-1:-1:-1;;;;;29071:31:0;;29063:85;;;;-1:-1:-1;;;29063:85:0;;16314:2:1;29063:85:0;;;16296:21:1;16353:2;16333:18;;;16326:30;16392:34;16372:18;;;16365:62;-1:-1:-1;;;16443:18:1;;;16436:39;16492:19;;29063:85:0;16286:231:1;29063:85:0;-1:-1:-1;;;;;29167:16:0;;29159:65;;;;-1:-1:-1;;;29159:65:0;;12420:2:1;29159:65:0;;;12402:21:1;12459:2;12439:18;;;12432:30;12498:34;12478:18;;;12471:62;-1:-1:-1;;;12549:18:1;;;12542:34;12593:19;;29159:65:0;12392:226:1;29159:65:0;29235:39;29256:4;29262:2;29266:7;29235:20;:39::i;:::-;29337:29;29354:1;29358:7;29337:8;:29::i;:::-;-1:-1:-1;;;;;29377:15:0;;;;;;:9;:15;;;;;:20;;29396:1;;29377:15;:20;;29396:1;;29377:20;:::i;:::-;;;;-1:-1:-1;;;;;;;29408:13:0;;;;;;:9;:13;;;;;:18;;29425:1;;29408:13;:18;;29425:1;;29408:18;:::i;:::-;;;;-1:-1:-1;;29437:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29437:21:0;-1:-1:-1;;;;;29437:21:0;;;;;;;;;29474:27;;29437:16;;29474:27;;;;;;;28939:570;;;:::o;33900:173::-;33975:6;;;-1:-1:-1;;;;;33992:17:0;;;-1:-1:-1;;;;;;33992:17:0;;;;;;;34025:40;;33975:6;;;33992:17;33975:6;;34025:40;;33956:16;;34025:40;33900:173;;:::o;44896:209::-;44975:9;44970:128;44990:7;44988:1;:9;44970:128;;;45019:33;45029:7;45038:13;36572:10;:17;;36484:113;45038:13;45019:9;:33::i;:::-;45067:19;:17;:19::i;:::-;44999:3;;;:::i;:::-;;;44970:128;;25053:315;25210:28;25220:4;25226:2;25230:7;25210:9;:28::i;:::-;25257:48;25280:4;25286:2;25290:7;25299:5;25257:22;:48::i;:::-;25249:111;;;;-1:-1:-1;;;25249:111:0;;;;;;;:::i;15939:721::-;15995:13;16214:10;16210:53;;-1:-1:-1;;16241:10:0;;;;;;;;;;;;-1:-1:-1;;;16241:10:0;;;;;15939:721::o;16210:53::-;16288:5;16273:12;16329:78;16336:9;;16329:78;;16362:8;;;;:::i;:::-;;-1:-1:-1;16385:10:0;;-1:-1:-1;16393:2:0;16385:10;;:::i;:::-;;;16329:78;;;16417:19;16449:6;16439:17;;;;;;-1:-1:-1;;;16439:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16439:17:0;;16417:39;;16467:154;16474:10;;16467:154;;16501:11;16511:1;16501:11;;:::i;:::-;;-1:-1:-1;16570:10:0;16578:2;16570:5;:10;:::i;:::-;16557:24;;:2;:24;:::i;:::-;16544:39;;16527:6;16534;16527:14;;;;;;-1:-1:-1;;;16527:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;16527:56:0;;;;;;;;-1:-1:-1;16598:11:0;16607:2;16598:11;;:::i;:::-;;;16467:154;;37516:587;-1:-1:-1;;;;;37720:18:0;;37716:187;;37755:40;37787:7;38926:10;:17;;38899:24;;;;:15;:24;;;;;:44;;;38954:24;;;;;;;;;;;;38822:164;37755:40;37716:187;;;37825:2;-1:-1:-1;;;;;37817:10:0;:4;-1:-1:-1;;;;;37817:10:0;;37813:90;;37844:47;37877:4;37883:7;37844:32;:47::i;:::-;-1:-1:-1;;;;;37917:16:0;;37913:183;;37950:45;37987:7;37950:36;:45::i;37913:183::-;38023:4;-1:-1:-1;;;;;38017:10:0;:2;-1:-1:-1;;;;;38017:10:0;;38013:83;;38044:40;38072:2;38076:7;38044:27;:40::i;26659:110::-;26735:26;26745:2;26749:7;26735:26;;;;;;;;;;;;:9;:26::i;44813:75::-;44864:16;;44862:18;;;;;:::i;:::-;;;;-1:-1:-1;44813:75:0:o;30362:803::-;30517:4;-1:-1:-1;;;;;30538:13:0;;8132:20;8180:8;30534:624;;30574:72;;-1:-1:-1;;;30574:72:0;;-1:-1:-1;;;;;30574:36:0;;;;;:72;;15548:10;;30625:4;;30631:7;;30640:5;;30574:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30574:72:0;;;;;;;;-1:-1:-1;;30574:72:0;;;;;;;;;;;;:::i;:::-;;;30570:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30820:13:0;;30816:272;;30863:60;;-1:-1:-1;;;30863:60:0;;;;;;;:::i;30816:272::-;31038:6;31032:13;31023:6;31019:2;31015:15;31008:38;30570:533;-1:-1:-1;;;;;;30697:55:0;-1:-1:-1;;;30697:55:0;;-1:-1:-1;30690:62:0;;30534:624;-1:-1:-1;31142:4:0;30362:803;;;;;;:::o;39611:980::-;39875:22;39925:1;39900:22;39917:4;39900:16;:22::i;:::-;:26;;;;:::i;:::-;39937:18;39958:26;;;:17;:26;;;;;;39875:51;;-1:-1:-1;40089:28:0;;;40085:326;;-1:-1:-1;;;;;40156:18:0;;40134:19;40156:18;;;:12;:18;;;;;;;;:34;;;;;;;;;40205:30;;;;;;:44;;;40322:30;;:17;:30;;;;;:43;;;40085:326;-1:-1:-1;40505:26:0;;;;:17;:26;;;;;;;;40498:33;;;-1:-1:-1;;;;;40549:18:0;;;;;:12;:18;;;;;:34;;;;;;;40542:41;39611:980::o;40884:1071::-;41160:10;:17;41135:22;;41160:21;;41180:1;;41160:21;:::i;:::-;41192:18;41213:24;;;:15;:24;;;;;;41584:10;:26;;41135:46;;-1:-1:-1;41213:24:0;;41135:46;;41584:26;;;;-1:-1:-1;;;41584:26:0;;;;;;;;;;;;;;;;;41562:48;;41646:11;41621:10;41632;41621:22;;;;;;-1:-1:-1;;;41621:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;41726:28;;;:15;:28;;;;;;;:41;;;41896:24;;;;;41889:31;41931:10;:16;;;;;-1:-1:-1;;;41931:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;40884:1071;;;;:::o;38402:221::-;38487:14;38504:20;38521:2;38504:16;:20::i;:::-;-1:-1:-1;;;;;38535:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;38580:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;38402:221:0:o;26994:321::-;27124:18;27130:2;27134:7;27124:5;:18::i;:::-;27175:54;27206:1;27210:2;27214:7;27223:5;27175:22;:54::i;:::-;27153:154;;;;-1:-1:-1;;;27153:154:0;;;;;;;:::i;27649:376::-;-1:-1:-1;;;;;27729:16:0;;27721:61;;;;-1:-1:-1;;;27721:61:0;;15179:2:1;27721:61:0;;;15161:21:1;;;15198:18;;;15191:30;15257:34;15237:18;;;15230:62;15309:18;;27721:61:0;15151:182:1;27721:61:0;25744:4;25768:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25768:16:0;:30;27793:58;;;;-1:-1:-1;;;27793:58:0;;12063:2:1;27793:58:0;;;12045:21:1;12102:2;12082:18;;;12075:30;12141;12121:18;;;12114:58;12189:18;;27793:58:0;12035:178:1;27793:58:0;27862:45;27891:1;27895:2;27899:7;27862:20;:45::i;:::-;-1:-1:-1;;;;;27918:13:0;;;;;;:9;:13;;;;;:18;;27935:1;;27918:13;:18;;27935:1;;27918:18;:::i;:::-;;;;-1:-1:-1;;27947:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;27947:21:0;-1:-1:-1;;;;;27947:21:0;;;;;;;;27984:33;;27947:16;;;27984:33;;27947:16;;27984:33;27649:376;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:2;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:2;;;309:1;306;299:12;268:2;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;88:332;;;;;:::o;425:257::-;484:6;537:2;525:9;516:7;512:23;508:32;505:2;;;558:6;550;543:22;505:2;602:9;589:23;621:31;646:5;621:31;:::i;:::-;671:5;495:187;-1:-1:-1;;;495:187:1:o;687:261::-;757:6;810:2;798:9;789:7;785:23;781:32;778:2;;;831:6;823;816:22;778:2;868:9;862:16;887:31;912:5;887:31;:::i;953:398::-;1021:6;1029;1082:2;1070:9;1061:7;1057:23;1053:32;1050:2;;;1103:6;1095;1088:22;1050:2;1147:9;1134:23;1166:31;1191:5;1166:31;:::i;:::-;1216:5;-1:-1:-1;1273:2:1;1258:18;;1245:32;1286:33;1245:32;1286:33;:::i;:::-;1338:7;1328:17;;;1040:311;;;;;:::o;1356:466::-;1433:6;1441;1449;1502:2;1490:9;1481:7;1477:23;1473:32;1470:2;;;1523:6;1515;1508:22;1470:2;1567:9;1554:23;1586:31;1611:5;1586:31;:::i;:::-;1636:5;-1:-1:-1;1693:2:1;1678:18;;1665:32;1706:33;1665:32;1706:33;:::i;:::-;1460:362;;1758:7;;-1:-1:-1;;;1812:2:1;1797:18;;;;1784:32;;1460:362::o;1827:986::-;1924:6;1932;1940;1948;1956;2009:3;1997:9;1988:7;1984:23;1980:33;1977:2;;;2031:6;2023;2016:22;1977:2;2075:9;2062:23;2094:31;2119:5;2094:31;:::i;:::-;2144:5;-1:-1:-1;2201:2:1;2186:18;;2173:32;2214:33;2173:32;2214:33;:::i;:::-;2266:7;-1:-1:-1;2320:2:1;2305:18;;2292:32;;-1:-1:-1;2375:2:1;2360:18;;2347:32;2398:18;2428:14;;;2425:2;;;2460:6;2452;2445:22;2425:2;2503:6;2492:9;2488:22;2478:32;;2548:7;2541:4;2537:2;2533:13;2529:27;2519:2;;2575:6;2567;2560:22;2519:2;2620;2607:16;2646:2;2638:6;2635:14;2632:2;;;2667:6;2659;2652:22;2632:2;2717:7;2712:2;2703:6;2699:2;2695:15;2691:24;2688:37;2685:2;;;2743:6;2735;2728:22;2685:2;1967:846;;;;-1:-1:-1;1967:846:1;;-1:-1:-1;2779:2:1;2771:11;;2801:6;1967:846;-1:-1:-1;;;1967:846:1:o;2818:824::-;2913:6;2921;2929;2937;2990:3;2978:9;2969:7;2965:23;2961:33;2958:2;;;3012:6;3004;2997:22;2958:2;3056:9;3043:23;3075:31;3100:5;3075:31;:::i;:::-;3125:5;-1:-1:-1;3182:2:1;3167:18;;3154:32;3195:33;3154:32;3195:33;:::i;:::-;3247:7;-1:-1:-1;3301:2:1;3286:18;;3273:32;;-1:-1:-1;3356:2:1;3341:18;;3328:32;3383:18;3372:30;;3369:2;;;3420:6;3412;3405:22;3369:2;3448:22;;3501:4;3493:13;;3489:27;-1:-1:-1;3479:2:1;;3535:6;3527;3520:22;3479:2;3563:73;3628:7;3623:2;3610:16;3605:2;3601;3597:11;3563:73;:::i;:::-;3553:83;;;2948:694;;;;;;;:::o;3647:436::-;3712:6;3720;3773:2;3761:9;3752:7;3748:23;3744:32;3741:2;;;3794:6;3786;3779:22;3741:2;3838:9;3825:23;3857:31;3882:5;3857:31;:::i;:::-;3907:5;-1:-1:-1;3964:2:1;3949:18;;3936:32;4006:15;;3999:23;3987:36;;3977:2;;4042:6;4034;4027:22;4088:325;4156:6;4164;4217:2;4205:9;4196:7;4192:23;4188:32;4185:2;;;4238:6;4230;4223:22;4185:2;4282:9;4269:23;4301:31;4326:5;4301:31;:::i;:::-;4351:5;4403:2;4388:18;;;;4375:32;;-1:-1:-1;;;4175:238:1:o;4418:1002::-;4502:6;4533:2;4576;4564:9;4555:7;4551:23;4547:32;4544:2;;;4597:6;4589;4582:22;4544:2;4642:9;4629:23;4671:18;4712:2;4704:6;4701:14;4698:2;;;4733:6;4725;4718:22;4698:2;4776:6;4765:9;4761:22;4751:32;;4821:7;4814:4;4810:2;4806:13;4802:27;4792:2;;4848:6;4840;4833:22;4792:2;4889;4876:16;4911:2;4907;4904:10;4901:2;;;4917:18;;:::i;:::-;4963:2;4960:1;4956:10;4946:20;;4986:28;5010:2;5006;5002:11;4986:28;:::i;:::-;5048:15;;;5079:12;;;;5111:11;;;5141;;;5137:20;;5134:33;-1:-1:-1;5131:2:1;;;5185:6;5177;5170:22;5131:2;5212:6;5203:15;;5227:163;5241:2;5238:1;5235:9;5227:163;;;5298:17;;5286:30;;5259:1;5252:9;;;;;5336:12;;;;5368;;5227:163;;;-1:-1:-1;5409:5:1;4513:907;-1:-1:-1;;;;;;;;4513:907:1:o;5425:255::-;5483:6;5536:2;5524:9;5515:7;5511:23;5507:32;5504:2;;;5557:6;5549;5542:22;5504:2;5601:9;5588:23;5620:30;5644:5;5620:30;:::i;5685:259::-;5754:6;5807:2;5795:9;5786:7;5782:23;5778:32;5775:2;;;5828:6;5820;5813:22;5775:2;5865:9;5859:16;5884:30;5908:5;5884:30;:::i;5949:480::-;6018:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:2;;;6092:6;6084;6077:22;6039:2;6137:9;6124:23;6170:18;6162:6;6159:30;6156:2;;;6207:6;6199;6192:22;6156:2;6235:22;;6288:4;6280:13;;6276:27;-1:-1:-1;6266:2:1;;6322:6;6314;6307:22;6266:2;6350:73;6415:7;6410:2;6397:16;6392:2;6388;6384:11;6350:73;:::i;6434:190::-;6493:6;6546:2;6534:9;6525:7;6521:23;6517:32;6514:2;;;6567:6;6559;6552:22;6514:2;-1:-1:-1;6595:23:1;;6504:120;-1:-1:-1;6504:120:1:o;6629:257::-;6670:3;6708:5;6702:12;6735:6;6730:3;6723:19;6751:63;6807:6;6800:4;6795:3;6791:14;6784:4;6777:5;6773:16;6751:63;:::i;:::-;6868:2;6847:15;-1:-1:-1;;6843:29:1;6834:39;;;;6875:4;6830:50;;6678:208;-1:-1:-1;;6678:208:1:o;6891:979::-;6976:12;;6941:3;;7033:1;7053:18;;;;7106;;;;7133:2;;7187:4;7179:6;7175:17;7165:27;;7133:2;7213;7261;7253:6;7250:14;7230:18;7227:38;7224:2;;;-1:-1:-1;;;7288:33:1;;7344:4;7341:1;7334:15;7374:4;7295:3;7362:17;7224:2;7405:18;7432:104;;;;7550:1;7545:319;;;;7398:466;;7432:104;-1:-1:-1;;7465:24:1;;7453:37;;7510:16;;;;-1:-1:-1;7432:104:1;;7545:319;19373:4;19392:17;;;19442:4;19426:21;;7639:1;7653:165;7667:6;7664:1;7661:13;7653:165;;;7745:14;;7732:11;;;7725:35;7788:16;;;;7682:10;;7653:165;;;7657:3;;7847:6;7842:3;7838:16;7831:23;;7398:466;;;;;;;6949:921;;;;:::o;7875:456::-;8096:3;8124:38;8158:3;8150:6;8124:38;:::i;:::-;8191:6;8185:13;8207:52;8252:6;8248:2;8241:4;8233:6;8229:17;8207:52;:::i;:::-;8275:50;8317:6;8313:2;8309:15;8301:6;8275:50;:::i;:::-;8268:57;8104:227;-1:-1:-1;;;;;;;8104:227:1:o;8924:488::-;-1:-1:-1;;;;;9193:15:1;;;9175:34;;9245:15;;9240:2;9225:18;;9218:43;9292:2;9277:18;;9270:34;;;9340:3;9335:2;9320:18;;9313:31;;;9118:4;;9361:45;;9386:19;;9378:6;9361:45;:::i;:::-;9353:53;9127:285;-1:-1:-1;;;;;;9127:285:1:o;10042:219::-;10191:2;10180:9;10173:21;10154:4;10211:44;10251:2;10240:9;10236:18;10228:6;10211:44;:::i;10678:414::-;10880:2;10862:21;;;10919:2;10899:18;;;10892:30;10958:34;10953:2;10938:18;;10931:62;-1:-1:-1;;;11024:2:1;11009:18;;11002:48;11082:3;11067:19;;10852:240::o;15751:356::-;15953:2;15935:21;;;15972:18;;;15965:30;16031:34;16026:2;16011:18;;16004:62;16098:2;16083:18;;15925:182::o;18033:413::-;18235:2;18217:21;;;18274:2;18254:18;;;18247:30;18313:34;18308:2;18293:18;;18286:62;-1:-1:-1;;;18379:2:1;18364:18;;18357:47;18436:3;18421:19;;18207:239::o;19046:275::-;19117:2;19111:9;19182:2;19163:13;;-1:-1:-1;;19159:27:1;19147:40;;19217:18;19202:34;;19238:22;;;19199:62;19196:2;;;19264:18;;:::i;:::-;19300:2;19293:22;19091:230;;-1:-1:-1;19091:230:1:o;19458:128::-;19498:3;19529:1;19525:6;19522:1;19519:13;19516:2;;;19535:18;;:::i;:::-;-1:-1:-1;19571:9:1;;19506:80::o;19591:120::-;19631:1;19657;19647:2;;19662:18;;:::i;:::-;-1:-1:-1;19696:9:1;;19637:74::o;19716:125::-;19756:4;19784:1;19781;19778:8;19775:2;;;19789:18;;:::i;:::-;-1:-1:-1;19826:9:1;;19765:76::o;19846:258::-;19918:1;19928:113;19942:6;19939:1;19936:13;19928:113;;;20018:11;;;20012:18;19999:11;;;19992:39;19964:2;19957:10;19928:113;;;20059:6;20056:1;20053:13;20050:2;;;-1:-1:-1;;20094:1:1;20076:16;;20069:27;19899:205::o;20109:380::-;20188:1;20184:12;;;;20231;;;20252:2;;20306:4;20298:6;20294:17;20284:27;;20252:2;20359;20351:6;20348:14;20328:18;20325:38;20322:2;;;20405:10;20400:3;20396:20;20393:1;20386:31;20440:4;20437:1;20430:15;20468:4;20465:1;20458:15;20322:2;;20164:325;;;:::o;20494:135::-;20533:3;-1:-1:-1;;20554:17:1;;20551:2;;;20574:18;;:::i;:::-;-1:-1:-1;20621:1:1;20610:13;;20541:88::o;20634:112::-;20666:1;20692;20682:2;;20697:18;;:::i;:::-;-1:-1:-1;20731:9:1;;20672:74::o;20751:127::-;20812:10;20807:3;20803:20;20800:1;20793:31;20843:4;20840:1;20833:15;20867:4;20864:1;20857:15;20883:127;20944:10;20939:3;20935:20;20932:1;20925:31;20975:4;20972:1;20965:15;20999:4;20996:1;20989:15;21015:127;21076:10;21071:3;21067:20;21064:1;21057:31;21107:4;21104:1;21097:15;21131:4;21128:1;21121:15;21147:131;-1:-1:-1;;;;;21222:31:1;;21212:42;;21202:2;;21268:1;21265;21258:12;21283:131;-1:-1:-1;;;;;;21357:32:1;;21347:43;;21337:2;;21404:1;21401;21394:12
Swarm Source
ipfs://bf31260e0594340f131fe31d3dd0f06e35efae8d0050f1275646186cb3bb4d27
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.